@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
@@ -1,6 +1,6 @@
1
1
  [build]
2
2
  ignore = "node ./scripts/netlify-ignore-build.mjs macros"
3
- command = "export DATABASE_URL=${NETLIFY_DATABASE_URL:-$DATABASE_URL} && pnpm install && DATABASE_URL=${NETLIFY_DATABASE_URL_UNPOOLED:-$DATABASE_URL} NITRO_PRESET=netlify pnpm --filter macros build"
3
+ command = "export DATABASE_URL=${NETLIFY_DATABASE_URL:-$DATABASE_URL} && pnpm install && DATABASE_URL=${NETLIFY_DATABASE_URL_UNPOOLED:-$DATABASE_URL} NITRO_PRESET=netlify pnpm --filter macros build && if [ \"${CONTEXT:-}\" = \"production\" ]; then DATABASE_URL=${NETLIFY_DATABASE_URL_UNPOOLED:-$DATABASE_URL} pnpm --filter macros migrate:production; fi"
4
4
  publish = "templates/macros/dist"
5
5
  functions = "templates/macros/.netlify/functions-internal"
6
6
 
@@ -10,6 +10,7 @@
10
10
  "test": "vitest --run --passWithNoTests",
11
11
  "format.fix": "oxfmt --write .",
12
12
  "typecheck": "agent-native typecheck",
13
+ "migrate:production": "tsx scripts/migrate-production.ts",
13
14
  "action": "agent-native action",
14
15
  "script": "agent-native script",
15
16
  "db:push": "drizzle-kit push",
@@ -0,0 +1,24 @@
1
+ import { closeDbExec, withMigrationRuntime } from "@agent-native/core/db";
2
+ import { runFrameworkReleaseMigrations } from "@agent-native/core/server";
3
+
4
+ import { runMacrosMigrations } from "../server/plugins/db.js";
5
+
6
+ /**
7
+ * Release-time schema entrypoint for Macros.
8
+ *
9
+ * This script is the production owner of schema changes. It runs against the
10
+ * direct migration endpoint selected by core, while request functions skip
11
+ * all migration and ensure-table work automatically.
12
+ */
13
+ async function main(): Promise<void> {
14
+ await withMigrationRuntime(async () => {
15
+ await runFrameworkReleaseMigrations(null);
16
+ await runMacrosMigrations(null);
17
+ });
18
+ }
19
+
20
+ try {
21
+ await main();
22
+ } finally {
23
+ await closeDbExec();
24
+ }
@@ -37,7 +37,7 @@ const schemaTables = Object.values(schema).filter(isDrizzleTable);
37
37
  // packages/core/src/db/migrations.ts for the full rationale). Version numbers
38
38
  // alone are not a safe identity across parallel branches that each extend
39
39
  // this list independently.
40
- const runMacrosMigrations = runMigrations(
40
+ export const runMacrosMigrations = runMigrations(
41
41
  [
42
42
  {
43
43
  version: 1,
@@ -13,6 +13,7 @@
13
13
  "app/**/*",
14
14
  "server/**/*",
15
15
  "shared/**/*",
16
+ "scripts/**/*",
16
17
  "actions/**/*",
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
@@ -1,6 +1,6 @@
1
1
  [build]
2
2
  ignore = "node ./scripts/netlify-ignore-build.mjs mail"
3
- command = "export DATABASE_URL=${NETLIFY_DATABASE_URL:-$DATABASE_URL} && pnpm install && DATABASE_URL=${NETLIFY_DATABASE_URL_UNPOOLED:-$DATABASE_URL} NITRO_PRESET=netlify pnpm --filter mail build"
3
+ command = "export DATABASE_URL=${NETLIFY_DATABASE_URL:-$DATABASE_URL} && pnpm install && DATABASE_URL=${NETLIFY_DATABASE_URL_UNPOOLED:-$DATABASE_URL} NITRO_PRESET=netlify pnpm --filter mail build && if [ \"${CONTEXT:-}\" = \"production\" ]; then DATABASE_URL=${NETLIFY_DATABASE_URL_UNPOOLED:-$DATABASE_URL} pnpm --filter mail migrate:production; fi"
4
4
  publish = "templates/mail/dist"
5
5
  functions = "templates/mail/.netlify/functions-internal"
6
6
 
@@ -10,6 +10,7 @@
10
10
  "test": "vitest --run",
11
11
  "format.fix": "oxfmt --write .",
12
12
  "typecheck": "agent-native typecheck",
13
+ "migrate:production": "tsx scripts/migrate-production.ts",
13
14
  "action": "agent-native action",
14
15
  "script": "agent-native script",
15
16
  "db:push": "drizzle-kit push",
@@ -0,0 +1,24 @@
1
+ import { closeDbExec, withMigrationRuntime } from "@agent-native/core/db";
2
+ import { runFrameworkReleaseMigrations } from "@agent-native/core/server";
3
+
4
+ import { runMailMigrations } from "../server/plugins/db.js";
5
+
6
+ /**
7
+ * Release-time schema entrypoint for Mail.
8
+ *
9
+ * This script is the production owner of schema changes. It runs against the
10
+ * direct migration endpoint selected by core, while request functions skip
11
+ * all migration and ensure-table work automatically.
12
+ */
13
+ async function main(): Promise<void> {
14
+ await withMigrationRuntime(async () => {
15
+ await runFrameworkReleaseMigrations(null);
16
+ await runMailMigrations(null);
17
+ });
18
+ }
19
+
20
+ try {
21
+ await main();
22
+ } finally {
23
+ await closeDbExec();
24
+ }
@@ -29,7 +29,7 @@ const schemaTables = Object.values(schema).filter(isDrizzleTable);
29
29
  // packages/core/src/db/migrations.ts for the full rationale). Version numbers
30
30
  // alone are not a safe identity across parallel branches that each extend
31
31
  // this list independently.
32
- const runMailMigrations = runMigrations(
32
+ export const runMailMigrations = runMigrations(
33
33
  [
34
34
  {
35
35
  version: 1,
@@ -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
@@ -1,6 +1,6 @@
1
1
  [build]
2
2
  ignore = "node ./scripts/netlify-ignore-build.mjs plan"
3
- command = "export DATABASE_URL=${NETLIFY_DATABASE_URL:-$DATABASE_URL} && pnpm install && NITRO_PRESET=netlify pnpm --filter plan build"
3
+ command = "export DATABASE_URL=${NETLIFY_DATABASE_URL:-$DATABASE_URL} && pnpm install && NITRO_PRESET=netlify pnpm --filter plan build && if [ \"${CONTEXT:-}\" = \"production\" ]; then pnpm --filter plan migrate:production; fi"
4
4
  publish = "templates/plan/dist"
5
5
  functions = "templates/plan/.netlify/functions-internal"
6
6
 
@@ -9,6 +9,7 @@
9
9
  "build": "agent-native build",
10
10
  "start": "agent-native start",
11
11
  "typecheck": "agent-native typecheck",
12
+ "migrate:production": "tsx scripts/migrate-production.ts",
12
13
  "action": "agent-native action",
13
14
  "script": "agent-native script",
14
15
  "test": "vitest --run"
@@ -0,0 +1,24 @@
1
+ import { closeDbExec, withMigrationRuntime } from "@agent-native/core/db";
2
+ import { runFrameworkReleaseMigrations } from "@agent-native/core/server";
3
+
4
+ import { runPlanMigrations } from "../server/plugins/db.js";
5
+
6
+ /**
7
+ * Release-time schema entrypoint for Plan.
8
+ *
9
+ * This script is the production owner of schema changes. It runs against the
10
+ * direct migration endpoint selected by core, while request functions skip
11
+ * all migration and ensure-table work automatically.
12
+ */
13
+ async function main(): Promise<void> {
14
+ await withMigrationRuntime(async () => {
15
+ await runFrameworkReleaseMigrations(null);
16
+ await runPlanMigrations(null);
17
+ });
18
+ }
19
+
20
+ try {
21
+ await main();
22
+ } finally {
23
+ await closeDbExec();
24
+ }
@@ -37,8 +37,9 @@ export default function planMcpPlugin(nitroApp: any) {
37
37
  {
38
38
  ...loadActionsFromStaticRegistry(actionsRegistry),
39
39
  ...(frameworkTools.isEnabled("automation")
40
- ? createAutomationToolEntries(() =>
41
- requireMcpOwner("manage automations"),
40
+ ? createAutomationToolEntries(
41
+ () => requireMcpOwner("manage automations"),
42
+ "plan",
42
43
  )
43
44
  : {}),
44
45
  },
@@ -30,7 +30,7 @@ const schemaTables = Object.values(schema).filter(isDrizzleTable);
30
30
  // packages/core/src/db/migrations.ts for the full rationale). Version numbers
31
31
  // alone are not a safe identity across parallel branches that each extend
32
32
  // this list independently.
33
- const runPlanMigrations = runMigrations(
33
+ export const runPlanMigrations = runMigrations(
34
34
  [
35
35
  {
36
36
  version: 1,
@@ -15,6 +15,7 @@
15
15
  "app/**/*",
16
16
  "server/**/*",
17
17
  "shared/**/*",
18
+ "scripts/**/*",
18
19
  "vite.config.ts",
19
20
  "react-router.config.ts",
20
21
  ".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
@@ -2,7 +2,7 @@
2
2
  ignore = "node ./scripts/netlify-ignore-build.mjs slides"
3
3
  # Rebuild Core explicitly so a cached Netlify install cannot bundle an older
4
4
  # agent loop or A2A handler into Slides' server functions.
5
- command = "export DATABASE_URL=${NETLIFY_DATABASE_URL:-$DATABASE_URL} && pnpm install && pnpm --filter @agent-native/core build && NITRO_PRESET=netlify pnpm --filter slides build"
5
+ command = "export DATABASE_URL=${NETLIFY_DATABASE_URL:-$DATABASE_URL} && pnpm install && pnpm --filter @agent-native/core build && NITRO_PRESET=netlify pnpm --filter slides build && if [ \"${CONTEXT:-}\" = \"production\" ]; then pnpm --filter slides migrate:production; fi"
6
6
  publish = "templates/slides/dist"
7
7
  functions = "templates/slides/.netlify/functions-internal"
8
8
 
@@ -10,6 +10,7 @@
10
10
  "test": "vitest --run",
11
11
  "format.fix": "oxfmt --write .",
12
12
  "typecheck": "agent-native typecheck",
13
+ "migrate:production": "tsx scripts/migrate-production.ts",
13
14
  "action": "agent-native action",
14
15
  "script": "agent-native script"
15
16
  },
@@ -0,0 +1,24 @@
1
+ import { closeDbExec, withMigrationRuntime } from "@agent-native/core/db";
2
+ import { runFrameworkReleaseMigrations } from "@agent-native/core/server";
3
+
4
+ import { runSlidesMigrations } from "../server/plugins/db.js";
5
+
6
+ /**
7
+ * Release-time schema entrypoint for Slides.
8
+ *
9
+ * This script is the production owner of schema changes. It runs against the
10
+ * direct migration endpoint selected by core, while request functions skip
11
+ * all migration and ensure-table work automatically.
12
+ */
13
+ async function main(): Promise<void> {
14
+ await withMigrationRuntime(async () => {
15
+ await runFrameworkReleaseMigrations(null);
16
+ await runSlidesMigrations(null);
17
+ });
18
+ }
19
+
20
+ try {
21
+ await main();
22
+ } finally {
23
+ await closeDbExec();
24
+ }
@@ -33,7 +33,7 @@ const schemaTables = Object.values(schema).filter(isDrizzleTable);
33
33
  // packages/core/src/db/migrations.ts for the full rationale). Version numbers
34
34
  // alone are not a safe identity across parallel branches that each extend
35
35
  // this list independently.
36
- const runSlidesMigrations = runMigrations(
36
+ export const runSlidesMigrations = runMigrations(
37
37
  [
38
38
  {
39
39
  version: 1,
@@ -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
@@ -1,6 +1,6 @@
1
1
  [build]
2
2
  ignore = "node ./scripts/netlify-ignore-build.mjs tasks"
3
- command = "export DATABASE_URL=${NETLIFY_DATABASE_URL:-$DATABASE_URL} && pnpm install && NITRO_PRESET=netlify pnpm --filter tasks build"
3
+ command = "export DATABASE_URL=${NETLIFY_DATABASE_URL:-$DATABASE_URL} && pnpm install && NITRO_PRESET=netlify pnpm --filter tasks build && if [ \"${CONTEXT:-}\" = \"production\" ]; then pnpm --filter tasks migrate:production; fi"
4
4
  publish = "templates/tasks/dist"
5
5
  functions = "templates/tasks/.netlify/functions-internal"
6
6
 
@@ -10,6 +10,7 @@
10
10
  "start": "agent-native start",
11
11
  "format.fix": "oxfmt --write .",
12
12
  "typecheck": "agent-native typecheck",
13
+ "migrate:production": "tsx scripts/migrate-production.ts",
13
14
  "action": "agent-native action",
14
15
  "script": "agent-native script",
15
16
  "db:push": "drizzle-kit push",
@@ -0,0 +1,24 @@
1
+ import { closeDbExec, withMigrationRuntime } from "@agent-native/core/db";
2
+ import { runFrameworkReleaseMigrations } from "@agent-native/core/server";
3
+
4
+ import { runTasksMigrations } from "../server/plugins/db.js";
5
+
6
+ /**
7
+ * Release-time schema entrypoint for Tasks.
8
+ *
9
+ * This script is the production owner of schema changes. It runs against the
10
+ * direct migration endpoint selected by core, while request functions skip
11
+ * all migration and ensure-table work automatically.
12
+ */
13
+ async function main(): Promise<void> {
14
+ await withMigrationRuntime(async () => {
15
+ await runFrameworkReleaseMigrations(null);
16
+ await runTasksMigrations(null);
17
+ });
18
+ }
19
+
20
+ try {
21
+ await main();
22
+ } finally {
23
+ await closeDbExec();
24
+ }
@@ -8,7 +8,7 @@ import * as schema from "../db/schema.js";
8
8
 
9
9
  // Keep historical entries unnamed for legacy-ledger compatibility; every new
10
10
  // migration must add a stable, unique `name` slug.
11
- const runTasksMigrations = runMigrations(
11
+ export const runTasksMigrations = runMigrations(
12
12
  [
13
13
  {
14
14
  version: 1,
@@ -14,6 +14,7 @@
14
14
  "server/**/*",
15
15
  "shared/**/*",
16
16
  "actions/**/*",
17
+ "scripts/**/*",
17
18
  "vite.config.ts",
18
19
  "vitest.config.ts",
19
20
  "react-router.config.ts",
package/dist/action.d.ts CHANGED
@@ -60,6 +60,8 @@ export interface ActionRunContext {
60
60
  requestHeaders?: Headers;
61
61
  /** Resolved org id, or `null` when the request has no org. */
62
62
  orgId?: string | null;
63
+ /** Hosting app/template id used for app-owned resource boundaries. */
64
+ appId?: string;
63
65
  /** How this action was invoked. */
64
66
  caller: ActionCaller;
65
67
  /** Present only for trigger-dispatched automation calls. */
@@ -697,6 +697,7 @@ export declare function runAgentLoop(opts: {
697
697
  onOutcome?: (outcome: AgentLoopOutcome) => void;
698
698
  ownerEmail?: string | null;
699
699
  orgId?: string | null;
700
+ appId?: string;
700
701
  /** Action invocation attribution. Defaults to the normal agent tool loop. */
701
702
  actionCaller?: ActionCaller;
702
703
  /** Trusted trigger lineage for automation-dispatched action calls. */
@@ -3974,6 +3974,7 @@ export async function runAgentLoop(opts) {
3974
3974
  ? Boolean(await actionEntry.needsApproval(toolCall.input, {
3975
3975
  userEmail: getRequestUserEmail(),
3976
3976
  orgId: getRequestOrgId() ?? null,
3977
+ appId: opts.appId,
3977
3978
  caller: opts.actionCaller ?? "tool",
3978
3979
  automation: opts.automation,
3979
3980
  networkProtocol: opts.networkProtocol,
@@ -4370,6 +4371,7 @@ export async function runAgentLoop(opts) {
4370
4371
  send,
4371
4372
  userEmail: actionUserEmail ?? undefined,
4372
4373
  orgId: actionOrgId,
4374
+ appId: opts.appId,
4373
4375
  caller: opts.actionCaller ?? "tool",
4374
4376
  automation: opts.automation,
4375
4377
  networkProtocol: opts.networkProtocol,
@@ -17,6 +17,10 @@ interface ContentPart {
17
17
  completedSideEffect?: boolean;
18
18
  mcpApp?: AgentMcpAppPayload;
19
19
  chatUI?: ActionChatUIConfig;
20
+ approval?: {
21
+ approvalKey: string;
22
+ dismissed?: boolean;
23
+ };
20
24
  }
21
25
  interface BuildAssistantMessageOptions {
22
26
  suppressInternalContinuation?: boolean;
@@ -114,6 +114,14 @@ export function buildAssistantMessage(events, runId, options = {}) {
114
114
  });
115
115
  continue;
116
116
  }
117
+ if (event.type === "approval_required") {
118
+ const matchingIndex = findApprovalToolCallIndex(content, event.tool ?? "unknown", event.toolCallId);
119
+ const part = content[matchingIndex];
120
+ if (part?.type === "tool-call") {
121
+ part.approval = { approvalKey: event.approvalKey };
122
+ }
123
+ continue;
124
+ }
117
125
  if (event.type === "tool_done") {
118
126
  const eventToolCallId = event.id?.trim();
119
127
  let matchingIndex = -1;
@@ -339,6 +347,42 @@ function normalizeAttachmentIdentity(attachments) {
339
347
  contentType: att?.contentType,
340
348
  }));
341
349
  }
350
+ function findApprovalToolCallIndex(content, toolName, toolCallId) {
351
+ if (toolCallId) {
352
+ for (let i = content.length - 1; i >= 0; i--) {
353
+ const part = content[i];
354
+ if (part.type === "tool-call" &&
355
+ part.toolCallId === toolCallId &&
356
+ part.result === undefined) {
357
+ return i;
358
+ }
359
+ }
360
+ // Older tool_start events without an id use one reader-local tc_N id.
361
+ // Only accept that fallback when it is unambiguous, so a replayed approval
362
+ // cannot attach its key to another same-name call.
363
+ const readerLocalCandidates = [];
364
+ for (let i = 0; i < content.length; i += 1) {
365
+ const part = content[i];
366
+ if (part.type === "tool-call" &&
367
+ part.toolName === toolName &&
368
+ part.result === undefined &&
369
+ typeof part.toolCallId === "string" &&
370
+ /^tc_\d+$/.test(part.toolCallId)) {
371
+ readerLocalCandidates.push(i);
372
+ }
373
+ }
374
+ return readerLocalCandidates.length === 1 ? readerLocalCandidates[0] : -1;
375
+ }
376
+ for (let i = content.length - 1; i >= 0; i--) {
377
+ const part = content[i];
378
+ if (part.type === "tool-call" &&
379
+ part.toolName === toolName &&
380
+ part.result === undefined) {
381
+ return i;
382
+ }
383
+ }
384
+ return -1;
385
+ }
342
386
  // Strip the render-only `toolCallId` before fingerprinting. The id is generated
343
387
  // differently depending on who built the message — the server now scopes it by
344
388
  // run (`${runId}:tc_1`) while the client's live stream uses a bare counter