@agent-native/core 0.163.4 → 0.164.3

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 (228) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/templates/analytics/app/components/agents/FeatureFlagsFleetPanel.tsx +78 -19
  3. package/corpus/templates/analytics/app/hooks/use-dashboard-chat-context.ts +29 -0
  4. package/corpus/templates/analytics/app/lib/use-auto-focus-select.ts +4 -4
  5. package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +3 -0
  6. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +6 -0
  7. package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +1 -2
  8. package/corpus/templates/analytics/app/routes/_index.tsx +3 -2
  9. package/corpus/templates/analytics/app/routes/adhoc.$id.tsx +7 -2
  10. package/corpus/templates/analytics/app/routes/dashboard.tsx +3 -2
  11. package/corpus/templates/analytics/app/routes/overview.tsx +3 -2
  12. package/corpus/templates/analytics/app/routes/traffic.tsx +3 -2
  13. package/corpus/templates/analytics/changelog/2026-08-18-verify-cross-app-feature-flag-changes.md +6 -0
  14. package/corpus/templates/analytics/netlify.toml +2 -0
  15. package/corpus/templates/analytics/server/lib/workspace-feature-flags.ts +196 -48
  16. package/corpus/templates/analytics/server/plugins/feature-flags.ts +5 -0
  17. package/corpus/templates/analytics/shared/feature-flags.ts +10 -0
  18. package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +5 -1
  19. package/corpus/templates/assets/app/routes/brand-kits._index.tsx +4 -1
  20. package/corpus/templates/assets/app/routes/libraries.tsx +4 -1
  21. package/corpus/templates/assets/app/routes/picker.tsx +4 -1
  22. package/corpus/templates/assets/netlify.toml +2 -0
  23. package/corpus/templates/brain/netlify.toml +2 -0
  24. package/corpus/templates/calendar/app/components/calendar/DayView.tsx +2 -1
  25. package/corpus/templates/calendar/changelog/2026-08-19-calendar-page-loads-stay-fast-after-idle-periods.md +6 -0
  26. package/corpus/templates/calendar/netlify.toml +2 -0
  27. package/corpus/templates/chat/netlify.toml +2 -0
  28. package/corpus/templates/clips/app/components/player/player-controls.tsx +3 -3
  29. package/corpus/templates/clips/app/components/player/reaction-emojis.ts +12 -0
  30. package/corpus/templates/clips/app/components/player/reactions-tray.tsx +90 -9
  31. package/corpus/templates/clips/app/components/player/scrubber.tsx +43 -10
  32. package/corpus/templates/clips/app/components/player/video-player.tsx +105 -15
  33. package/corpus/templates/clips/app/routes/_app.settings._index.tsx +1 -2
  34. package/corpus/templates/clips/app/routes/_app.wispr.tsx +2 -1
  35. package/corpus/templates/clips/app/routes/_index.tsx +7 -3
  36. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +13 -8
  37. package/corpus/templates/clips/app/routes/share.$shareId.tsx +15 -8
  38. package/corpus/templates/clips/netlify.toml +2 -0
  39. package/corpus/templates/clips/server/routes/[...page].head.ts +5 -0
  40. package/corpus/templates/content/netlify.toml +2 -0
  41. package/corpus/templates/design/.agents/skills/design-editor-architecture/SKILL.md +103 -0
  42. package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +2 -1
  43. package/corpus/templates/design/AGENTS.md +3 -1
  44. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +3 -2
  45. package/corpus/templates/design/app/components/design/editor/AgentNativeMenuMark.tsx +25 -0
  46. package/corpus/templates/design/app/components/design/editor/DesignBottomToolbar.tsx +411 -0
  47. package/corpus/templates/design/app/components/design/editor/DesignCollaborators.tsx +153 -0
  48. package/corpus/templates/design/app/components/design/editor/DesignWorkspaceRail.tsx +231 -0
  49. package/corpus/templates/design/app/components/design/editor/MakeRealDialog.tsx +223 -0
  50. package/corpus/templates/design/app/components/design/editor/PendingScreenDeletionDialog.tsx +58 -0
  51. package/corpus/templates/design/app/components/design/editor/PendingVisualStyleWarningDialog.tsx +56 -0
  52. package/corpus/templates/design/app/components/design/editor/ReadOnlyEditorPanel.tsx +23 -0
  53. package/corpus/templates/design/app/components/design/editor/SaveTemplateDialog.tsx +161 -0
  54. package/corpus/templates/design/app/components/design/editor/toolbar-controls.tsx +185 -0
  55. package/corpus/templates/design/app/pages/DesignEditor.tsx +20913 -0
  56. package/corpus/templates/design/app/pages/design-editor/command-types.ts +120 -0
  57. package/corpus/templates/design/app/pages/design-editor/commands/README.md +193 -0
  58. package/corpus/templates/design/app/pages/design-editor/commands/add-auto-layout.ts +416 -0
  59. package/corpus/templates/design/app/pages/design-editor/commands/add-screen.ts +112 -0
  60. package/corpus/templates/design/app/pages/design-editor/commands/align-selection.ts +183 -0
  61. package/corpus/templates/design/app/pages/design-editor/commands/apply-design-editor-command.ts +243 -0
  62. package/corpus/templates/design/app/pages/design-editor/commands/apply-file-content-update.ts +236 -0
  63. package/corpus/templates/design/app/pages/design-editor/commands/apply-local-content-update.ts +304 -0
  64. package/corpus/templates/design/app/pages/design-editor/commands/apply-pending-visual-styles-with-agent.ts +376 -0
  65. package/corpus/templates/design/app/pages/design-editor/commands/apply-to-source.ts +132 -0
  66. package/corpus/templates/design/app/pages/design-editor/commands/can-move-layer.ts +117 -0
  67. package/corpus/templates/design/app/pages/design-editor/commands/change-selected-z-index.ts +212 -0
  68. package/corpus/templates/design/app/pages/design-editor/commands/commit-relative-style-delta-to-selected-layers.ts +176 -0
  69. package/corpus/templates/design/app/pages/design-editor/commands/commit-styles-to-selected-layers.ts +175 -0
  70. package/corpus/templates/design/app/pages/design-editor/commands/commit-visual-styles.ts +710 -0
  71. package/corpus/templates/design/app/pages/design-editor/commands/confirm-make-real.ts +99 -0
  72. package/corpus/templates/design/app/pages/design-editor/commands/copy-as-figma-svg.ts +95 -0
  73. package/corpus/templates/design/app/pages/design-editor/commands/copy-selection.ts +156 -0
  74. package/corpus/templates/design/app/pages/design-editor/commands/create-primitive.ts +291 -0
  75. package/corpus/templates/design/app/pages/design-editor/commands/create-screen-frame.ts +131 -0
  76. package/corpus/templates/design/app/pages/design-editor/commands/cross-screen-element-drop.ts +577 -0
  77. package/corpus/templates/design/app/pages/design-editor/commands/delete-files.ts +364 -0
  78. package/corpus/templates/design/app/pages/design-editor/commands/delete-selection.ts +521 -0
  79. package/corpus/templates/design/app/pages/design-editor/commands/detach-instance-menu-action.ts +88 -0
  80. package/corpus/templates/design/app/pages/design-editor/commands/distribute-selection.ts +114 -0
  81. package/corpus/templates/design/app/pages/design-editor/commands/download-all-screens-pdf.ts +116 -0
  82. package/corpus/templates/design/app/pages/design-editor/commands/download-pdf.ts +103 -0
  83. package/corpus/templates/design/app/pages/design-editor/commands/download-svg.ts +159 -0
  84. package/corpus/templates/design/app/pages/design-editor/commands/duplicate-screen.ts +201 -0
  85. package/corpus/templates/design/app/pages/design-editor/commands/duplicate-selection.ts +279 -0
  86. package/corpus/templates/design/app/pages/design-editor/commands/editor-paste.ts +81 -0
  87. package/corpus/templates/design/app/pages/design-editor/commands/enter-hotkey.ts +155 -0
  88. package/corpus/templates/design/app/pages/design-editor/commands/enter-single-screen.ts +168 -0
  89. package/corpus/templates/design/app/pages/design-editor/commands/escape-hotkey.ts +212 -0
  90. package/corpus/templates/design/app/pages/design-editor/commands/frame-selection.ts +119 -0
  91. package/corpus/templates/design/app/pages/design-editor/commands/geometry-commit.ts +169 -0
  92. package/corpus/templates/design/app/pages/design-editor/commands/get-selected-layer-snapshots.ts +177 -0
  93. package/corpus/templates/design/app/pages/design-editor/commands/group-selection.ts +127 -0
  94. package/corpus/templates/design/app/pages/design-editor/commands/iframe-context-menu.ts +121 -0
  95. package/corpus/templates/design/app/pages/design-editor/commands/import-figma-clipboard-into-design.ts +119 -0
  96. package/corpus/templates/design/app/pages/design-editor/commands/layer-marquee-selection-change.ts +163 -0
  97. package/corpus/templates/design/app/pages/design-editor/commands/layer-move-to-screen.ts +331 -0
  98. package/corpus/templates/design/app/pages/design-editor/commands/layer-move.ts +517 -0
  99. package/corpus/templates/design/app/pages/design-editor/commands/layer-rename.ts +247 -0
  100. package/corpus/templates/design/app/pages/design-editor/commands/layer-selection-change.ts +161 -0
  101. package/corpus/templates/design/app/pages/design-editor/commands/mode-change.ts +122 -0
  102. package/corpus/templates/design/app/pages/design-editor/commands/nudge-selection.ts +213 -0
  103. package/corpus/templates/design/app/pages/design-editor/commands/overview-primitive-reparent.ts +318 -0
  104. package/corpus/templates/design/app/pages/design-editor/commands/paste-copied-screens.ts +114 -0
  105. package/corpus/templates/design/app/pages/design-editor/commands/paste-over-selection.ts +70 -0
  106. package/corpus/templates/design/app/pages/design-editor/commands/paste-selection.ts +436 -0
  107. package/corpus/templates/design/app/pages/design-editor/commands/paste-to-replace.ts +135 -0
  108. package/corpus/templates/design/app/pages/design-editor/commands/pasted-image-files.ts +209 -0
  109. package/corpus/templates/design/app/pages/design-editor/commands/persist-frame-geometry-save.ts +113 -0
  110. package/corpus/templates/design/app/pages/design-editor/commands/persist-tweak-save.ts +160 -0
  111. package/corpus/templates/design/app/pages/design-editor/commands/primitive-created.ts +168 -0
  112. package/corpus/templates/design/app/pages/design-editor/commands/record-pending-live-layer-state-edit.ts +149 -0
  113. package/corpus/templates/design/app/pages/design-editor/commands/record-pending-live-structure-edit.ts +200 -0
  114. package/corpus/templates/design/app/pages/design-editor/commands/record-pending-live-text-edit.ts +152 -0
  115. package/corpus/templates/design/app/pages/design-editor/commands/record-pending-visual-style-edit.ts +247 -0
  116. package/corpus/templates/design/app/pages/design-editor/commands/redo.ts +1086 -0
  117. package/corpus/templates/design/app/pages/design-editor/commands/render-png-blob.ts +200 -0
  118. package/corpus/templates/design/app/pages/design-editor/commands/save-file-content.ts +207 -0
  119. package/corpus/templates/design/app/pages/design-editor/commands/screen-element-select.ts +262 -0
  120. package/corpus/templates/design/app/pages/design-editor/commands/screen-text-content-change.ts +216 -0
  121. package/corpus/templates/design/app/pages/design-editor/commands/screen-visual-duplicate-change.ts +108 -0
  122. package/corpus/templates/design/app/pages/design-editor/commands/screen-visual-structure-change.ts +280 -0
  123. package/corpus/templates/design/app/pages/design-editor/commands/screen-visual-style-change.ts +151 -0
  124. package/corpus/templates/design/app/pages/design-editor/commands/send-overview-annotations.ts +88 -0
  125. package/corpus/templates/design/app/pages/design-editor/commands/send-runtime-layer-move-semantic-handoff.ts +122 -0
  126. package/corpus/templates/design/app/pages/design-editor/commands/send-runtime-layer-semantic-handoff.ts +143 -0
  127. package/corpus/templates/design/app/pages/design-editor/commands/send-runtime-layer-state-semantic-handoff.ts +115 -0
  128. package/corpus/templates/design/app/pages/design-editor/commands/start-retry-generation.ts +152 -0
  129. package/corpus/templates/design/app/pages/design-editor/commands/start-sidebar-resize.ts +99 -0
  130. package/corpus/templates/design/app/pages/design-editor/commands/style-change.ts +152 -0
  131. package/corpus/templates/design/app/pages/design-editor/commands/styles-change.ts +155 -0
  132. package/corpus/templates/design/app/pages/design-editor/commands/suggest-auto-layout.ts +125 -0
  133. package/corpus/templates/design/app/pages/design-editor/commands/text-content-change.ts +201 -0
  134. package/corpus/templates/design/app/pages/design-editor/commands/tidy-up.ts +123 -0
  135. package/corpus/templates/design/app/pages/design-editor/commands/toggle-layer-hidden.ts +167 -0
  136. package/corpus/templates/design/app/pages/design-editor/commands/toggle-layer-locked.ts +175 -0
  137. package/corpus/templates/design/app/pages/design-editor/commands/toggle-motion-keyframe.ts +99 -0
  138. package/corpus/templates/design/app/pages/design-editor/commands/tweak-prompt-submit.ts +84 -0
  139. package/corpus/templates/design/app/pages/design-editor/commands/undo.ts +906 -0
  140. package/corpus/templates/design/app/pages/design-editor/commands/ungroup-selection.ts +170 -0
  141. package/corpus/templates/design/app/pages/design-editor/commands/visual-duplicate-change.ts +119 -0
  142. package/corpus/templates/design/app/pages/design-editor/commands/visual-structure-change.ts +274 -0
  143. package/corpus/templates/design/app/pages/design-editor/commands/write-frame-geometry-snapshot.ts +99 -0
  144. package/corpus/templates/design/app/pages/design-editor/derive/design-breakpoints.ts +56 -0
  145. package/corpus/templates/design/app/pages/design-editor/derive/overview-screens.ts +146 -0
  146. package/corpus/templates/design/app/pages/design-editor/domains/use-tweaks.ts +326 -0
  147. package/corpus/templates/design/app/pages/design-editor/editor-constants.ts +54 -0
  148. package/corpus/templates/design/app/pages/design-editor/editor-helpers.ts +183 -0
  149. package/corpus/templates/design/app/pages/design-editor/effects/adopt-db-file-content.ts +270 -0
  150. package/corpus/templates/design/app/pages/design-editor/effects/mirror-selection-to-agent-chat.ts +134 -0
  151. package/corpus/templates/design/app/pages/design-editor/effects/motion-autosave.ts +335 -0
  152. package/corpus/templates/design/app/pages/design-editor/effects/observe-collab-text.ts +183 -0
  153. package/corpus/templates/design/app/pages/design-editor/effects/publish-agent-selection-context.ts +252 -0
  154. package/corpus/templates/design/app/pages/design-editor/effects/resume-pending-generation.ts +178 -0
  155. package/corpus/templates/design/app/pages/design-editor/effects/seed-collab-content.ts +157 -0
  156. package/corpus/templates/design/app/pages/design-editor/preview-html.ts +19 -0
  157. package/corpus/templates/design/app/routes/examples.tsx +2 -1
  158. package/corpus/templates/design/netlify.toml +2 -0
  159. package/corpus/templates/design/shared/board-file.ts +2 -1
  160. package/corpus/templates/dispatch/netlify.toml +2 -0
  161. package/corpus/templates/forms/app/routes/_index.tsx +3 -2
  162. package/corpus/templates/forms/netlify.toml +2 -0
  163. package/corpus/templates/mail/app/routes/_index.tsx +3 -2
  164. package/corpus/templates/mail/netlify.toml +2 -0
  165. package/corpus/templates/plan/netlify.toml +2 -0
  166. package/corpus/templates/slides/netlify.toml +2 -0
  167. package/corpus/templates/tasks/app/routes/_index.tsx +2 -1
  168. package/dist/agent/engine/builder-engine.d.ts +6 -4
  169. package/dist/agent/engine/builder-engine.js +91 -26
  170. package/dist/agent/engine/registry.js +16 -0
  171. package/dist/cli/code-agent-agent-tools.d.ts +2 -0
  172. package/dist/cli/code-agent-agent-tools.js +188 -0
  173. package/dist/cli/code-agent-collaboration.d.ts +34 -0
  174. package/dist/cli/code-agent-collaboration.js +104 -0
  175. package/dist/cli/code-agent-executor.js +6 -0
  176. package/dist/cli/code-agent-schedules.d.ts +54 -0
  177. package/dist/cli/code-agent-schedules.js +198 -0
  178. package/dist/client/AgentPanel.js +1 -1
  179. package/dist/client/ConnectBuilderCard.js +5 -2
  180. package/dist/client/EnvironmentBadge.js +6 -5
  181. package/dist/client/chat/run-recovery.js +3 -2
  182. package/dist/client/chat/tool-call-display.js +2 -3
  183. package/dist/client/components/CodeRequiredDialog.js +4 -2
  184. package/dist/client/i18n.js +5 -4
  185. package/dist/client/settings/SettingsPanel.js +1 -1
  186. package/dist/client/settings/VoiceTranscriptionSection.js +1 -1
  187. package/dist/client/settings/useBuilderStatus.d.ts +6 -1
  188. package/dist/client/settings/useBuilderStatus.js +22 -33
  189. package/dist/client/transcription/BuilderTranscriptionCta.js +1 -1
  190. package/dist/code-agents/index.d.ts +2 -0
  191. package/dist/code-agents/index.js +2 -0
  192. package/dist/collab/awareness.d.ts +2 -2
  193. package/dist/collab/routes.d.ts +1 -1
  194. package/dist/deploy/build.js +10 -4
  195. package/dist/localization/shared.d.ts +2 -0
  196. package/dist/localization/shared.js +5 -0
  197. package/dist/mcp-client/oauth-client.d.ts +1 -0
  198. package/dist/mcp-client/oauth-client.js +50 -1
  199. package/dist/notifications/routes.d.ts +3 -3
  200. package/dist/observability/routes.d.ts +1 -1
  201. package/dist/provider-api/actions/provider-api.d.ts +2 -2
  202. package/dist/server/auth-marketing-locales.d.ts +7 -0
  203. package/dist/server/auth-marketing-locales.js +1322 -0
  204. package/dist/server/auth-marketing.d.ts +1 -0
  205. package/dist/server/auth-marketing.js +35 -6
  206. package/dist/server/auth.js +4 -17
  207. package/dist/server/builder-browser.d.ts +22 -0
  208. package/dist/server/builder-browser.js +77 -1
  209. package/dist/server/builder-oauth.d.ts +50 -0
  210. package/dist/server/builder-oauth.js +263 -0
  211. package/dist/server/core-routes-plugin.d.ts +11 -0
  212. package/dist/server/core-routes-plugin.js +291 -415
  213. package/dist/server/credential-provider.d.ts +1 -1
  214. package/dist/server/credential-provider.js +1 -1
  215. package/dist/server/csrf.js +2 -2
  216. package/dist/server/onboarding-html.js +52 -120
  217. package/dist/server/ssr-handler.js +13 -4
  218. package/dist/settings/store.d.ts +9 -0
  219. package/dist/settings/store.js +19 -0
  220. package/dist/shared/cache-control.d.ts +22 -0
  221. package/dist/shared/cache-control.js +25 -0
  222. package/dist/shared/index.d.ts +1 -0
  223. package/dist/shared/index.js +1 -0
  224. package/dist/templates/chat/netlify.toml +2 -0
  225. package/docs/content/deployment.mdx +2 -0
  226. package/docs/content/multi-app-workspace.mdx +1 -1
  227. package/package.json +2 -2
  228. package/src/templates/chat/netlify.toml +2 -0
@@ -7,7 +7,7 @@
7
7
  * directly. That way the same feature can work in three modes:
8
8
  *
9
9
  * 1. User set their own key in .env → use it directly
10
- * 2. User connected Builder via `/cli-auth` → route through Builder proxy
10
+ * 2. User connected Builder via OAuth → authorize managed Builder requests
11
11
  * 3. Neither → throw FeatureNotConfigured
12
12
  *
13
13
  * Templates catch FeatureNotConfigured and show a "Connect Builder (1 click) /
@@ -7,7 +7,7 @@
7
7
  * directly. That way the same feature can work in three modes:
8
8
  *
9
9
  * 1. User set their own key in .env → use it directly
10
- * 2. User connected Builder via `/cli-auth` → route through Builder proxy
10
+ * 2. User connected Builder via OAuth → authorize managed Builder requests
11
11
  * 3. Neither → throw FeatureNotConfigured
12
12
  *
13
13
  * Templates catch FeatureNotConfigured and show a "Connect Builder (1 click) /
@@ -99,8 +99,8 @@ const CSRF_ALLOWLIST_PREFIXES = [
99
99
  // state token. Each callback handler is responsible for its own CSRF
100
100
  // check (signed state tokens).
101
101
  "/oauth/",
102
- // Builder's CLI-auth callback — uses the BUILDER_STATE_PARAM signed token
103
- // to authenticate the round-trip; framework CSRF check would block it.
102
+ // Builder's OAuth callback is a top-level GET whose route validates OAuth
103
+ // state and the signed-in owner before exchanging the code.
104
104
  "/builder/callback",
105
105
  ];
106
106
  const STATE_CHANGING_METHODS = new Set(["POST", "PUT", "PATCH", "DELETE"]);
@@ -8,14 +8,15 @@
8
8
  */
9
9
  import { getAppConfig } from "../app-config/index.js";
10
10
  import { getLocaleInitScript } from "../localization/server.js";
11
- import { DEFAULT_LOCALE, LOCALE_METADATA, LOCALE_STORAGE_KEY, SUPPORTED_LOCALES, } from "../localization/shared.js";
11
+ import { DEFAULT_LOCALE, LOCALE_METADATA, LOCALE_STORAGE_KEY, SUPPORTED_LOCALES, localeDisplayName, } from "../localization/shared.js";
12
12
  import { NATIVE_AUTH_COPY } from "../shared/auth-copy.js";
13
13
  import { docsUrl } from "../shared/docs-url.js";
14
14
  import { PASSWORD_MAX_LENGTH, PASSWORD_MIN_LENGTH, } from "../shared/password-policy.js";
15
15
  import { signInJourneyInlineScript } from "../shared/sign-in-journey.js";
16
16
  import { AGENT_NATIVE_SOCIAL_IMAGE_ALT, AGENT_NATIVE_SOCIAL_IMAGE_HEIGHT, AGENT_NATIVE_SOCIAL_IMAGE_PATH, AGENT_NATIVE_SOCIAL_IMAGE_TYPE, AGENT_NATIVE_SOCIAL_IMAGE_WIDTH, withAgentNativeSocialImageCacheBuster, } from "../shared/social-meta.js";
17
17
  import { normalizeAppBasePath } from "./app-base-path.js";
18
- import { BUILT_IN_AUTH_MARKETING, resolveBuiltInAuthMarketing, } from "./auth-marketing.js";
18
+ import { AUTH_MARKETING_LOCALE_COPY, } from "./auth-marketing-locales.js";
19
+ import { BUILT_IN_AUTH_MARKETING, resolveBuiltInAuthMarketing, resolveBuiltInAuthMarketingSlug, } from "./auth-marketing.js";
19
20
  import { resolveGoogleAuthMode, } from "./google-auth-mode.js";
20
21
  import { hasGoogleSignInCredentials } from "./google-oauth-credentials.js";
21
22
  import { identitySsoLoginButtonHtml } from "./identity-sso-store.js";
@@ -876,114 +877,27 @@ const AUTH_LOCALE_COPY = {
876
877
  },
877
878
  };
878
879
  const defaultAuthCopy = AUTH_LOCALE_COPY[DEFAULT_LOCALE];
879
- const AUTH_MARKETING_LOCALE_COPY = {
880
- "zh-CN": {
881
- forms: {
882
- tagline: "你的 AI 代理与你一起构建、发布和分析表单。",
883
- features: [
884
- "用一句话创建完整表单",
885
- "即时发布,生成可分享链接和验证码",
886
- "按需获取回复摘要、导出和趋势分析",
887
- ],
888
- },
889
- },
890
- "zh-TW": {
891
- forms: {
892
- tagline: "你的 AI 代理會和你一起建立、發布與分析表單。",
893
- features: [
894
- "用一句話建立完整表單",
895
- "立即發布,產生可分享連結與驗證碼",
896
- "依需求取得回覆摘要、匯出與趨勢分析",
897
- ],
898
- },
899
- },
900
- "es-ES": {
901
- forms: {
902
- tagline: "Tu agente de IA crea, publica y analiza formularios contigo.",
903
- features: [
904
- "Crea formularios completos con una sola frase",
905
- "Publicación instantánea con enlaces compartibles y captcha",
906
- "Resúmenes de respuestas, exportaciones y análisis de tendencias al instante",
907
- ],
908
- },
909
- },
910
- "fr-FR": {
911
- forms: {
912
- tagline: "Votre agent IA crée, publie et analyse des formulaires avec vous.",
913
- features: [
914
- "Créez des formulaires complets à partir d'une seule phrase",
915
- "Publication instantanée avec liens partageables et captcha",
916
- "Résumés de réponses, exports et analyse des tendances à la demande",
917
- ],
918
- },
919
- },
920
- "de-DE": {
921
- forms: {
922
- tagline: "Dein KI-Agent erstellt, veröffentlicht und analysiert Formulare mit dir.",
923
- features: [
924
- "Erstelle vollständige Formulare aus einem einzigen Satz",
925
- "Sofortige Veröffentlichung mit teilbaren Links und Captcha",
926
- "Antwortzusammenfassungen, Exporte und Trendanalysen auf Abruf",
927
- ],
928
- },
929
- },
930
- "ja-JP": {
931
- forms: {
932
- tagline: "AI エージェントがフォームの作成、公開、分析を一緒に進めます。",
933
- features: [
934
- "一文から完全なフォームを作成",
935
- "共有リンクと CAPTCHA 付きで即時公開",
936
- "回答の要約、エクスポート、トレンド分析を必要なときに実行",
937
- ],
938
- },
939
- },
940
- "ko-KR": {
941
- forms: {
942
- tagline: "AI 에이전트가 양식 생성, 게시, 분석을 함께 도와줍니다.",
943
- features: [
944
- "한 문장으로 완성된 양식 만들기",
945
- "공유 링크와 captcha로 즉시 게시",
946
- "응답 요약, 내보내기, 추세 분석을 필요할 때 실행",
947
- ],
948
- },
949
- },
950
- "pt-BR": {
951
- forms: {
952
- tagline: "Seu agente de IA cria, publica e analisa formulários junto com você.",
953
- features: [
954
- "Crie formulários completos a partir de uma única frase",
955
- "Publicação instantânea com links compartilháveis e captcha",
956
- "Resumos de respostas, exportações e análise de tendências sob demanda",
957
- ],
958
- },
959
- },
960
- "hi-IN": {
961
- forms: {
962
- tagline: "आपका AI एजेंट आपके साथ फ़ॉर्म बनाता, प्रकाशित करता और उनका विश्लेषण करता है।",
963
- features: [
964
- "एक वाक्य से पूरे फ़ॉर्म बनाएं",
965
- "शेयर करने योग्य लिंक और captcha के साथ तुरंत प्रकाशित करें",
966
- "ज़रूरत पड़ने पर प्रतिक्रिया सारांश, exports और trend analysis पाएं",
967
- ],
968
- },
969
- },
970
- "ar-SA": {
971
- forms: {
972
- tagline: "يساعدك وكيل الذكاء الاصطناعي على إنشاء النماذج ونشرها وتحليلها.",
973
- features: [
974
- "أنشئ نماذج كاملة من جملة واحدة",
975
- "نشر فوري مع روابط قابلة للمشاركة وcaptcha",
976
- "ملخصات للإجابات وتصدير وتحليل اتجاهات عند الطلب",
977
- ],
978
- },
979
- },
980
- };
981
- function resolveBuiltInMarketingSlug(marketing) {
880
+ function resolveBuiltInMarketingSlug(marketing, opts = {}) {
982
881
  if (!marketing)
983
882
  return undefined;
883
+ const matchesBuiltInMarketing = (builtIn) => marketing.appName === builtIn.appName &&
884
+ marketing.tagline === builtIn.tagline &&
885
+ marketing.description === builtIn.description &&
886
+ JSON.stringify(marketing.features ?? []) ===
887
+ JSON.stringify(builtIn.features ?? []) &&
888
+ JSON.stringify(marketing.signupLocalModeNote ?? null) ===
889
+ JSON.stringify(builtIn.signupLocalModeNote ?? null);
890
+ const requestSlug = resolveBuiltInAuthMarketingSlug(opts);
891
+ if (requestSlug) {
892
+ const builtIn = BUILT_IN_AUTH_MARKETING[requestSlug];
893
+ if (builtIn && matchesBuiltInMarketing(builtIn))
894
+ return requestSlug;
895
+ }
984
896
  for (const [slug, builtIn] of Object.entries(BUILT_IN_AUTH_MARKETING)) {
985
- if (marketing.appName === builtIn.appName &&
986
- marketing.tagline === builtIn.tagline) {
897
+ // Caller-supplied marketing can reuse a built-in app name. Only an exact
898
+ // content match may claim a slug, or localized copy would overwrite the
899
+ // custom description/features.
900
+ if (matchesBuiltInMarketing(builtIn)) {
987
901
  return slug;
988
902
  }
989
903
  }
@@ -1041,7 +955,10 @@ export function getOnboardingHtml(opts = {}) {
1041
955
  requestPath: opts.requestPath,
1042
956
  });
1043
957
  const hasMarketing = !!marketing && !simplifiedAuth;
1044
- const marketingSlug = resolveBuiltInMarketingSlug(marketing);
958
+ const marketingSlug = resolveBuiltInMarketingSlug(marketing, {
959
+ requestHost: opts.requestHost,
960
+ requestPath: opts.requestPath,
961
+ });
1045
962
  const defaultMarketingCopy = marketing
1046
963
  ? {
1047
964
  tagline: marketing.tagline,
@@ -1049,6 +966,14 @@ export function getOnboardingHtml(opts = {}) {
1049
966
  features: marketing.features,
1050
967
  }
1051
968
  : undefined;
969
+ const localizedMarketingCopy = {};
970
+ if (marketingSlug) {
971
+ for (const [locale, copyBySlug] of Object.entries(AUTH_MARKETING_LOCALE_COPY)) {
972
+ const copy = copyBySlug?.[marketingSlug];
973
+ if (copy)
974
+ localizedMarketingCopy[locale] = copy;
975
+ }
976
+ }
1052
977
  const signupLocalModeNote = isAgentNativeHostedHost(opts.requestHost) &&
1053
978
  marketing?.signupLocalModeNote?.command.trim()
1054
979
  ? {
@@ -1076,13 +1001,10 @@ export function getOnboardingHtml(opts = {}) {
1076
1001
  const localeMenuItemsHtml = [
1077
1002
  ` <button type="button" class="locale-menu-item" role="menuitemradio" aria-checked="false" data-locale-value="system">
1078
1003
  <span class="locale-menu-check" aria-hidden="true">✓</span>
1079
- <span${i18nAttr("systemLanguage")}>${esc(t("systemLanguage"))}</span>
1004
+ <span data-system-language>${esc(t("systemLanguage"))}</span>
1080
1005
  </button>`,
1081
1006
  ...SUPPORTED_LOCALES.map((locale) => {
1082
- const metadata = LOCALE_METADATA[locale];
1083
- const label = metadata.nativeName === metadata.englishName
1084
- ? `${metadata.nativeName} (${metadata.code})`
1085
- : `${metadata.nativeName} (${metadata.englishName})`;
1007
+ const label = localeDisplayName(locale);
1086
1008
  return ` <button type="button" class="locale-menu-item" role="menuitemradio" aria-checked="false" data-locale-value="${esc(locale)}">
1087
1009
  <span class="locale-menu-check" aria-hidden="true">✓</span>
1088
1010
  <span>${esc(label)}</span>
@@ -2184,7 +2106,7 @@ ${signInJourneyInlineScript()}
2184
2106
  var __AN_AUTH_HAS_MARKETING = ${JSON.stringify(hasMarketing)};
2185
2107
  var __AN_AUTH_MARKETING_SLUG = ${JSON.stringify(marketingSlug ?? "")};
2186
2108
  var __AN_AUTH_MARKETING_DEFAULT = ${JSON.stringify(defaultMarketingCopy ?? {})};
2187
- var __AN_AUTH_MARKETING_LOCALES = ${JSON.stringify(AUTH_MARKETING_LOCALE_COPY)};
2109
+ var __AN_AUTH_MARKETING_LOCALES = ${JSON.stringify(localizedMarketingCopy)};
2188
2110
  var __anAuthLocale = __AN_AUTH_DEFAULT_LOCALE;
2189
2111
  var __anAuthLocalePreference = 'system';
2190
2112
  var __AN_AUTH_MODE = ${JSON.stringify(authMode)};
@@ -2229,11 +2151,7 @@ ${signInJourneyInlineScript()}
2229
2151
  } catch(e) {}
2230
2152
  return [];
2231
2153
  }
2232
- function __anResolveAuthLocale(preference) {
2233
- var normalizedPreference = __anNormalizeAuthLocalePreference(preference) || 'system';
2234
- if (normalizedPreference !== 'system') return normalizedPreference;
2235
- var rootLocale = __anNormalizeAuthLocale(document.documentElement.getAttribute('data-locale'));
2236
- if (rootLocale) return rootLocale;
2154
+ function __anResolveAuthSystemLocale() {
2237
2155
  var locales = __anBrowserAuthLocales();
2238
2156
  for (var i = 0; i < locales.length; i++) {
2239
2157
  var match = __anNormalizeAuthLocale(locales[i]);
@@ -2241,6 +2159,19 @@ ${signInJourneyInlineScript()}
2241
2159
  }
2242
2160
  return __AN_AUTH_DEFAULT_LOCALE;
2243
2161
  }
2162
+ function __anResolveAuthLocale(preference) {
2163
+ var normalizedPreference = __anNormalizeAuthLocalePreference(preference) || 'system';
2164
+ return normalizedPreference === 'system'
2165
+ ? __anResolveAuthSystemLocale()
2166
+ : normalizedPreference;
2167
+ }
2168
+ function __anApplyAuthSystemLanguage() {
2169
+ var systemLanguage = document.querySelector('[data-system-language]');
2170
+ if (!systemLanguage) return;
2171
+ var systemLocale = __anResolveAuthSystemLocale();
2172
+ var localized = __AN_AUTH_LOCALES[systemLocale] || __AN_AUTH_LOCALES[__AN_AUTH_DEFAULT_LOCALE] || {};
2173
+ systemLanguage.textContent = localized.systemLanguage || 'System';
2174
+ }
2244
2175
  function __anT(key) {
2245
2176
  var localized = __AN_AUTH_LOCALES[__anAuthLocale] || __AN_AUTH_LOCALES[__AN_AUTH_DEFAULT_LOCALE] || {};
2246
2177
  var fallback = __AN_AUTH_LOCALES[__AN_AUTH_DEFAULT_LOCALE] || {};
@@ -2293,7 +2224,7 @@ ${signInJourneyInlineScript()}
2293
2224
  }
2294
2225
  function __anMarketingCopy() {
2295
2226
  if (!__AN_AUTH_MARKETING_SLUG) return __AN_AUTH_MARKETING_DEFAULT || {};
2296
- var localeMarketing = (__AN_AUTH_MARKETING_LOCALES[__anAuthLocale] || {})[__AN_AUTH_MARKETING_SLUG] || {};
2227
+ var localeMarketing = __AN_AUTH_MARKETING_LOCALES[__anAuthLocale] || {};
2297
2228
  return {
2298
2229
  tagline: localeMarketing.tagline || __AN_AUTH_MARKETING_DEFAULT.tagline,
2299
2230
  description: localeMarketing.description || __AN_AUTH_MARKETING_DEFAULT.description,
@@ -2342,6 +2273,7 @@ ${signInJourneyInlineScript()}
2342
2273
  document.title = __AN_AUTH_HAS_MARKETING && __AN_AUTH_MARKETING_APP_NAME
2343
2274
  ? __AN_AUTH_MARKETING_APP_NAME + ' — ' + __anT('pageTitleSignIn')
2344
2275
  : __anT('pageTitleWelcome');
2276
+ __anApplyAuthSystemLanguage();
2345
2277
  __anApplyAuthMarketingCopy();
2346
2278
  __anRefreshAuthViewCopy();
2347
2279
  }
@@ -18,7 +18,7 @@ import { defineEventHandler } from "h3";
18
18
  */
19
19
  import { createRequestHandler } from "react-router";
20
20
  import { isMcpPublicPath } from "../mcp/route-paths.js";
21
- import { DEFAULT_SPECULATION_RULES_PATH, resolveSsrCacheHeaders, resolveSsrCacheKeyHeaders, } from "../shared/cache-control.js";
21
+ import { DEFAULT_SPECULATION_RULES_PATH, resolveSsrCacheHeaders, resolveSsrCacheKeyHeaders, SSR_QUERY_CACHE_KEY_HEADER, } from "../shared/cache-control.js";
22
22
  import { AGENT_NATIVE_SOCIAL_IMAGE_ALT, AGENT_NATIVE_SOCIAL_IMAGE_HEIGHT, AGENT_NATIVE_SOCIAL_IMAGE_PATH, AGENT_NATIVE_SOCIAL_IMAGE_TYPE, AGENT_NATIVE_SOCIAL_IMAGE_WIDTH, withAgentNativeSocialImageCacheBuster, } from "../shared/social-meta.js";
23
23
  import { getAppBasePathFromViteEnv, stripAppBasePath as canonicalStripAppBasePath, } from "./app-base-path.js";
24
24
  import { getAppOriginClientConfigScript } from "./app-origin-config.js";
@@ -204,6 +204,8 @@ function isSsrHtmlOrDataResponse(headers, status, pathname) {
204
204
  * that contradicts that.
205
205
  */
206
206
  function applyDefaultSsrCacheHeader(headers, status, pathname) {
207
+ const varyByQuery = headers.get(SSR_QUERY_CACHE_KEY_HEADER)?.trim().toLowerCase() === "query";
208
+ headers.delete(SSR_QUERY_CACHE_KEY_HEADER);
207
209
  if (!isSsrHtmlOrDataResponse(headers, status, pathname))
208
210
  return;
209
211
  // A public shell must never set a viewer cookie or vary by credentials.
@@ -234,9 +236,16 @@ function applyDefaultSsrCacheHeader(headers, status, pathname) {
234
236
  for (const [name, value] of Object.entries(resolveSsrCacheHeaders())) {
235
237
  headers.set(name, value);
236
238
  }
237
- for (const [name, value] of Object.entries(resolveSsrCacheKeyHeaders())) {
238
- headers.set(name, value);
239
- }
239
+ const cacheKeyHeaders = resolveSsrCacheKeyHeaders();
240
+ const netlifyVary = varyByQuery
241
+ ? cacheKeyHeaders["netlify-vary"]
242
+ ? "query"
243
+ : undefined
244
+ : cacheKeyHeaders["netlify-vary"];
245
+ if (netlifyVary)
246
+ headers.set("netlify-vary", netlifyVary);
247
+ else
248
+ headers.delete("netlify-vary");
240
249
  }
241
250
  function applyDefaultSpeculationRulesHeader(headers, status, basePath) {
242
251
  if (status < 200 || status >= 400)
@@ -21,4 +21,13 @@ export declare function deleteSetting(key: string, options?: StoreWriteOptions):
21
21
  * takes its `o:<orgId>:*` keys with it).
22
22
  */
23
23
  export declare function deleteSettingsByPrefix(prefix: string, options?: StoreWriteOptions): Promise<number>;
24
+ /**
25
+ * Read every setting whose key starts with `prefix`. Callers that only need
26
+ * one namespace must not use {@link getAllSettings} — that loads the whole
27
+ * table.
28
+ */
29
+ export declare function listSettingsByPrefix(prefix: string): Promise<Array<{
30
+ key: string;
31
+ value: Record<string, unknown>;
32
+ }>>;
24
33
  export declare function getAllSettings(): Promise<Record<string, Record<string, unknown>>>;
@@ -247,6 +247,25 @@ export async function deleteSettingsByPrefix(prefix, options) {
247
247
  }
248
248
  return result.rowsAffected;
249
249
  }
250
+ /**
251
+ * Read every setting whose key starts with `prefix`. Callers that only need
252
+ * one namespace must not use {@link getAllSettings} — that loads the whole
253
+ * table.
254
+ */
255
+ export async function listSettingsByPrefix(prefix) {
256
+ await ensureTable();
257
+ const client = getDbExec();
258
+ const table = settingsTable();
259
+ const escaped = prefix.replace(/[!%_]/g, (c) => `!${c}`);
260
+ const { rows } = await client.execute({
261
+ sql: `SELECT key, value FROM ${table} WHERE key LIKE ? ESCAPE '!'`,
262
+ args: [`${escaped}%`],
263
+ });
264
+ return rows.map((row) => ({
265
+ key: String(row.key),
266
+ value: JSON.parse(String(row.value)),
267
+ }));
268
+ }
250
269
  export async function getAllSettings() {
251
270
  const raw = await loadAllSettingsRaw();
252
271
  const result = {};
@@ -7,6 +7,28 @@ export declare const DEFAULT_SSR_CACHE_HEADERS: {
7
7
  readonly "cdn-cache-control": "public, max-age=600, stale-while-revalidate=604800, stale-if-error=3600";
8
8
  readonly "netlify-cdn-cache-control": "public, durable, s-maxage=31536000, stale-while-revalidate=604800, stale-if-error=3600";
9
9
  };
10
+ /**
11
+ * Content type used by impersonal HTML redirects that should enter the
12
+ * deployment adapter's shared SSR cache path.
13
+ */
14
+ export declare const SSR_HTML_CONTENT_TYPE = "text/html; charset=utf-8";
15
+ /**
16
+ * Internal response marker for public HTML whose redirect target preserves
17
+ * request query parameters. The SSR adapters consume this marker and emit a
18
+ * provider-specific full-query cache key only where the provider supports it.
19
+ */
20
+ export declare const SSR_QUERY_CACHE_KEY_HEADER = "x-agent-native-ssr-key";
21
+ export type SsrHtmlContentTypeOptions = {
22
+ varyByQuery?: boolean;
23
+ };
24
+ /**
25
+ * Mark an already-built HTML response as HTML without changing its redirect
26
+ * status, location, or other headers. Only use this for redirects whose
27
+ * target is independent of the viewer and request credentials. Set
28
+ * `varyByQuery` when the target preserves request query parameters so the SSR
29
+ * adapter can request a full-query cache key on providers that support it.
30
+ */
31
+ export declare function withSsrHtmlContentType<T extends Response>(response: T, options?: SsrHtmlContentTypeOptions): T;
10
32
  /**
11
33
  * Deployment-wide override for the SSR shell cache policy.
12
34
  *
@@ -7,6 +7,31 @@ export const DEFAULT_SSR_CACHE_HEADERS = {
7
7
  "cdn-cache-control": DEFAULT_SSR_CDN_CACHE_CONTROL,
8
8
  "netlify-cdn-cache-control": DEFAULT_SSR_NETLIFY_CDN_CACHE_CONTROL,
9
9
  };
10
+ /**
11
+ * Content type used by impersonal HTML redirects that should enter the
12
+ * deployment adapter's shared SSR cache path.
13
+ */
14
+ export const SSR_HTML_CONTENT_TYPE = "text/html; charset=utf-8";
15
+ /**
16
+ * Internal response marker for public HTML whose redirect target preserves
17
+ * request query parameters. The SSR adapters consume this marker and emit a
18
+ * provider-specific full-query cache key only where the provider supports it.
19
+ */
20
+ export const SSR_QUERY_CACHE_KEY_HEADER = "x-agent-native-ssr-key";
21
+ /**
22
+ * Mark an already-built HTML response as HTML without changing its redirect
23
+ * status, location, or other headers. Only use this for redirects whose
24
+ * target is independent of the viewer and request credentials. Set
25
+ * `varyByQuery` when the target preserves request query parameters so the SSR
26
+ * adapter can request a full-query cache key on providers that support it.
27
+ */
28
+ export function withSsrHtmlContentType(response, options = {}) {
29
+ response.headers.set("content-type", SSR_HTML_CONTENT_TYPE);
30
+ if (options.varyByQuery) {
31
+ response.headers.set(SSR_QUERY_CACHE_KEY_HEADER, "query");
32
+ }
33
+ return response;
34
+ }
10
35
  /**
11
36
  * Deployment-wide override for the SSR shell cache policy.
12
37
  *
@@ -6,6 +6,7 @@ export { truncate } from "./truncate.js";
6
6
  export { isHumanReadableDocumentTitle, normalizeDocumentTitle, } from "./document-title.js";
7
7
  export { injectDocumentMarkup } from "./html-document.js";
8
8
  export { withBuilderUtmTrackingParams } from "./builder-link-tracking.js";
9
+ export { SSR_HTML_CONTENT_TYPE, SSR_QUERY_CACHE_KEY_HEADER, type SsrHtmlContentTypeOptions, withSsrHtmlContentType, } from "./cache-control.js";
9
10
  export { AGENT_NATIVE_DOCS_ORIGIN, docsUrl, type DocsUrlOptions, } from "./docs-url.js";
10
11
  export { buildRuntimeConfigPrompt, formatRuntimeConfigReport, getRuntimeConfigReport, parseRuntimeConfigReport, runtimeConfigRequirementsFromSearchParams, type RuntimeConfigEnvironment, type RuntimeConfigIssue, type RuntimeConfigIssueCode, type RuntimeConfigIssueSeverity, type RuntimeConfigPhase, type RuntimeConfigReport, type RuntimeConfigRequirements, } from "./runtime-config.js";
11
12
  export { llmConnectionTrackingProperties, normalizeLlmConnection, type LlmConnectionStatus, } from "./llm-connection.js";
@@ -6,6 +6,7 @@ export { truncate } from "./truncate.js";
6
6
  export { isHumanReadableDocumentTitle, normalizeDocumentTitle, } from "./document-title.js";
7
7
  export { injectDocumentMarkup } from "./html-document.js";
8
8
  export { withBuilderUtmTrackingParams } from "./builder-link-tracking.js";
9
+ export { SSR_HTML_CONTENT_TYPE, SSR_QUERY_CACHE_KEY_HEADER, withSsrHtmlContentType, } from "./cache-control.js";
9
10
  export { AGENT_NATIVE_DOCS_ORIGIN, docsUrl, } from "./docs-url.js";
10
11
  export { buildRuntimeConfigPrompt, formatRuntimeConfigReport, getRuntimeConfigReport, parseRuntimeConfigReport, runtimeConfigRequirementsFromSearchParams, } from "./runtime-config.js";
11
12
  export { llmConnectionTrackingProperties, normalizeLlmConnection, } from "./llm-connection.js";
@@ -12,3 +12,5 @@ NPM_CONFIG_PRODUCTION = "false"
12
12
 
13
13
  [context.production.environment]
14
14
  AGENT_NATIVE_HOSTED_HARNESS = "true"
15
+ AGENT_NATIVE_ENABLE_KEEP_WARM = "1"
16
+ AGENT_NATIVE_DISABLE_KEEP_WARM_BACKGROUND = "1"
@@ -820,6 +820,8 @@ In a standard production deployment with [production code execution](#production
820
820
 
821
821
  [Builder.io](https://www.builder.io?utm_source=agent-native&utm_medium=docs&utm_campaign=framework&utm_content=deployment) is a separate managed code-capable workflow where an agent can modify your app's UI in production. Connect your repo to Builder.io (free tier available) and prompt for UI changes directly — no redeploy needed.
822
822
 
823
+ **Connect Builder** in Settings uses Builder OAuth (`builder:ai:invoke`) with a same-origin HTTPS callback under `/_agent-native/builder/callback`, so hosted origins such as Railway work without a domain allowlist. Legacy `BUILDER_*` private keys remain a runtime fallback for existing connections.
824
+
823
825
  **How it works:**
824
826
 
825
827
  1. Connect your agent-native repo to Builder.io (free tier available)
@@ -260,7 +260,7 @@ my-company-platform/
260
260
 
261
261
  A few onboarding flows are workspace-aware out of the box:
262
262
 
263
- - **Builder `/cli-auth`**: clicking "Connect Builder" (free tier available) from any app writes `BUILDER_PRIVATE_KEY` and friends to scoped DB secrets, so every app can resolve the connection without sharing a deploy-global key.
263
+ - **Builder OAuth**: clicking "Connect Builder" authorizes the signed-in user with the least-privilege `builder:ai:invoke` scope and stores the token in encrypted per-user custody. Legacy Builder keys remain available only to existing uncovered integrations.
264
264
  - **Compatibility key route** (`POST /_agent-native/env-vars`): older onboarding forms still call this route name, but it now saves values as scoped DB secrets. Pass `scope: "workspace"` to share with the active org, or omit it for a per-user key.
265
265
 
266
266
  This works because every app in the same workspace points at the same `DATABASE_URL` by default, so framework credential storage (`@agent-native/core/credentials`) makes a credential available to every app without per-app config. Add a thin helper in `packages/shared` if your workspace wants a stricter naming convention.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/core",
3
- "version": "0.163.4",
3
+ "version": "0.164.3",
4
4
  "description": "Framework for agent-native application development — where AI agents and UI share SQL state, actions, and context",
5
5
  "homepage": "https://github.com/BuilderIO/agent-native#readme",
6
6
  "bugs": {
@@ -428,7 +428,7 @@
428
428
  "yjs": "^13.6.32",
429
429
  "zod": "^4.3.6",
430
430
  "@agent-native/recap-cli": "0.5.5",
431
- "@agent-native/toolkit": "^0.16.5"
431
+ "@agent-native/toolkit": "^0.16.6"
432
432
  },
433
433
  "devDependencies": {
434
434
  "@ai-sdk/anthropic": "^3.0.71",
@@ -12,3 +12,5 @@ NPM_CONFIG_PRODUCTION = "false"
12
12
 
13
13
  [context.production.environment]
14
14
  AGENT_NATIVE_HOSTED_HARNESS = "true"
15
+ AGENT_NATIVE_ENABLE_KEEP_WARM = "1"
16
+ AGENT_NATIVE_DISABLE_KEEP_WARM_BACKGROUND = "1"