@agent-native/core 0.121.1 → 0.122.0

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 (465) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +145 -0
  3. package/corpus/core/docs/content/actions.mdx +2 -2
  4. package/corpus/core/docs/content/agent-surfaces.mdx +1 -1
  5. package/corpus/core/docs/content/authentication.mdx +2 -0
  6. package/corpus/core/docs/content/deployment.mdx +36 -0
  7. package/corpus/core/docs/content/getting-started.mdx +477 -115
  8. package/corpus/core/docs/content/http-api.mdx +266 -0
  9. package/corpus/core/docs/content/syncing-template-changes.mdx +159 -0
  10. package/corpus/core/package.json +2 -1
  11. package/corpus/core/src/a2a/activity.ts +38 -27
  12. package/corpus/core/src/agent/engine/builder-engine.ts +35 -4
  13. package/corpus/core/src/agent/run-manager.ts +20 -1
  14. package/corpus/core/src/agent/run-store.ts +4 -1
  15. package/corpus/core/src/agent/types.ts +28 -8
  16. package/corpus/core/src/chat-threads/store.ts +45 -0
  17. package/corpus/core/src/checkpoints/index.ts +2 -0
  18. package/corpus/core/src/checkpoints/route-match.ts +13 -0
  19. package/corpus/core/src/cli/create.ts +105 -17
  20. package/corpus/core/src/cli/index.ts +20 -0
  21. package/corpus/core/src/cli/template-baseline.ts +410 -0
  22. package/corpus/core/src/cli/template-sync.ts +1004 -0
  23. package/corpus/core/src/cli/templates-meta.ts +1 -0
  24. package/corpus/core/src/client/AssistantChat.tsx +38 -12
  25. package/corpus/core/src/client/NewWorkspaceAppFlow.tsx +75 -10
  26. package/corpus/core/src/client/chat/message-components.tsx +127 -66
  27. package/corpus/core/src/client/chat/tool-call-display.tsx +29 -5
  28. package/corpus/core/src/client/error-format.ts +18 -0
  29. package/corpus/core/src/client/org/OrgSwitcher.tsx +30 -8
  30. package/corpus/core/src/client/org/TeamPage.tsx +7 -6
  31. package/corpus/core/src/client/sse-event-processor.ts +3 -0
  32. package/corpus/core/src/data-widgets/index.ts +41 -0
  33. package/corpus/core/src/deploy/build.ts +11 -9
  34. package/corpus/core/src/integrations/webhook-handler.ts +63 -9
  35. package/corpus/core/src/org/auto-join-domain.ts +4 -3
  36. package/corpus/core/src/org/context.ts +108 -39
  37. package/corpus/core/src/org/index.ts +5 -0
  38. package/corpus/core/src/org/service-identity.ts +60 -0
  39. package/corpus/core/src/provider-api/index.ts +22 -1
  40. package/corpus/core/src/scripts/docs/search.ts +12 -1
  41. package/corpus/core/src/server/agent-chat/context-tools.ts +9 -4
  42. package/corpus/core/src/server/agent-chat/framework-prompts.ts +38 -66
  43. package/corpus/core/src/server/agent-chat-plugin.ts +17 -10
  44. package/corpus/core/src/server/agents-bundle.ts +84 -5
  45. package/corpus/core/src/server/auth.ts +4 -3
  46. package/corpus/core/src/server/builder-browser.ts +47 -19
  47. package/corpus/core/src/server/core-routes-plugin.ts +2 -2
  48. package/corpus/core/src/server/credential-provider.ts +209 -68
  49. package/corpus/core/src/server/index.ts +3 -0
  50. package/corpus/core/src/server/prompts/framework-core-compact.ts +6 -13
  51. package/corpus/core/src/server/prompts/framework-core.ts +9 -21
  52. package/corpus/core/src/server/prompts/index.ts +0 -1
  53. package/corpus/core/src/server/prompts/shared-rules.ts +19 -11
  54. package/corpus/core/src/server/ssr-handler.ts +13 -2
  55. package/corpus/core/src/settings/user-settings.ts +13 -1
  56. package/corpus/core/src/shared/cache-control.ts +141 -0
  57. package/corpus/core/src/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  58. package/corpus/core/src/templates/chat/_gitignore +1 -0
  59. package/corpus/core/src/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  60. package/corpus/core/src/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  61. package/corpus/core/src/templates/workspace-core/.agents/skills/performance/SKILL.md +19 -0
  62. package/corpus/core/src/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  63. package/corpus/core/src/templates/workspace-core/.agents/skills/visual-answer/SKILL.md +1 -0
  64. package/corpus/core/src/vite/agents-bundle-plugin.ts +7 -6
  65. package/corpus/core/src/vite/client.ts +5 -0
  66. package/corpus/templates/analytics/.agents/skills/adhoc-analysis/SKILL.md +4 -5
  67. package/corpus/templates/analytics/.agents/skills/admin-surfaces/SKILL.md +55 -0
  68. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +10 -0
  69. package/corpus/templates/analytics/.agents/skills/dashboard-management/references/template-catalog-and-demo.md +62 -0
  70. package/corpus/templates/analytics/.agents/skills/dashboard-ops/SKILL.md +85 -0
  71. package/corpus/templates/analytics/.agents/skills/data-querying/SKILL.md +27 -2
  72. package/corpus/templates/analytics/.agents/skills/data-querying/references/inline-chart-embeds.md +139 -0
  73. package/corpus/templates/analytics/.agents/skills/monitoring/SKILL.md +77 -0
  74. package/corpus/templates/analytics/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  75. package/corpus/templates/analytics/AGENTS.md +91 -563
  76. package/corpus/templates/analytics/_gitignore +1 -0
  77. package/corpus/templates/analytics/actions/bigquery.ts +12 -4
  78. package/corpus/templates/analytics/actions/generate-chart.ts +5 -5
  79. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +30 -1
  80. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/DashboardFilterBar.tsx +3 -0
  81. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +1 -1
  82. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +1 -0
  83. package/corpus/templates/analytics/changelog/2026-07-24-analytics-finds-saved-dashboards-and-queries-far-more-reliab.md +6 -0
  84. package/corpus/templates/analytics/changelog/2026-07-24-notion-access-errors-now-explain-that-a-page-needs-sharing-w.md +6 -0
  85. package/corpus/templates/analytics/server/lib/agent-chat-plan-mode.ts +7 -0
  86. package/corpus/templates/analytics/server/lib/analytics-query-catalog.ts +191 -30
  87. package/corpus/templates/analytics/server/lib/bigquery.ts +11 -1
  88. package/corpus/templates/analytics/server/lib/notion.ts +15 -4
  89. package/corpus/templates/analytics/server/plugins/agent-chat.ts +10 -0
  90. package/corpus/templates/assets/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  91. package/corpus/templates/brain/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  92. package/corpus/templates/brain/_gitignore +1 -0
  93. package/corpus/templates/calendar/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  94. package/corpus/templates/calendar/_gitignore +1 -0
  95. package/corpus/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  96. package/corpus/templates/chat/_gitignore +1 -0
  97. package/corpus/templates/clips/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  98. package/corpus/templates/clips/.agents/skills/video-sharing/SKILL.md +34 -0
  99. package/corpus/templates/clips/AGENTS.md +5 -4
  100. package/corpus/templates/clips/_gitignore +1 -0
  101. package/corpus/templates/clips/actions/cleanup-transcript.ts +5 -0
  102. package/corpus/templates/clips/actions/get-recording-insights.ts +44 -8
  103. package/corpus/templates/clips/actions/get-recording-player-data.ts +39 -70
  104. package/corpus/templates/clips/actions/list-clip-views.ts +2 -4
  105. package/corpus/templates/clips/actions/list-recordings.ts +69 -19
  106. package/corpus/templates/clips/actions/list-viewers.ts +5 -2
  107. package/corpus/templates/clips/actions/regenerate-summary.ts +5 -1
  108. package/corpus/templates/clips/actions/request-transcript.ts +28 -1
  109. package/corpus/templates/clips/app/components/editor/stitch-manager.tsx +21 -1
  110. package/corpus/templates/clips/app/components/meetings/quick-ask-sidebar.tsx +14 -1
  111. package/corpus/templates/clips/app/components/player/insights-panel.tsx +8 -20
  112. package/corpus/templates/clips/app/components/player/recording-views-badge.tsx +335 -0
  113. package/corpus/templates/clips/app/components/player/video-player.tsx +13 -8
  114. package/corpus/templates/clips/app/components/sharing/share-ui.tsx +2 -1
  115. package/corpus/templates/clips/app/i18n/en-US.ts +13 -2
  116. package/corpus/templates/clips/app/lib/capture-permissions.ts +110 -0
  117. package/corpus/templates/clips/app/lib/recording-link.ts +32 -0
  118. package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +27 -0
  119. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +46 -15
  120. package/corpus/templates/clips/app/routes/record.tsx +77 -31
  121. package/corpus/templates/clips/app/routes/share.$shareId.tsx +42 -31
  122. package/corpus/templates/clips/changelog/2026-07-24-clip-pages-now-show-a-view-count-with-viewer-avatars-next-to.md +6 -0
  123. package/corpus/templates/clips/changelog/2026-07-24-clip-summaries-read-like-a-description-you-d-write-yourself-.md +6 -0
  124. package/corpus/templates/clips/changelog/2026-07-24-clip-view-counts-now-separate-human-views-from-agent-views-s.md +6 -0
  125. package/corpus/templates/clips/changelog/2026-07-24-clips-actions-can-now-be-called-by-org-service-tokens-so-ext.md +6 -0
  126. package/corpus/templates/clips/changelog/2026-07-24-clips-no-longer-briefly-shows-a-dock-icon-while-launching.md +6 -0
  127. package/corpus/templates/clips/changelog/2026-07-24-fixed-owner-and-editor-share-links-redirecting-to-the-record.md +6 -0
  128. package/corpus/templates/clips/changelog/2026-07-24-meeting-and-note-recordings-now-start-as-a-compact-pill-on-t.md +6 -0
  129. package/corpus/templates/clips/changelog/2026-07-24-new-clips-now-copy-a-shareable-link-instead-of-the-owner-onl.md +6 -0
  130. package/corpus/templates/clips/changelog/2026-07-24-opening-a-share-link-as-the-clip-s-owner-now-goes-straight-t.md +6 -0
  131. package/corpus/templates/clips/changelog/2026-07-24-permissions-and-rewind-controls-now-use-compact-consistent-h.md +6 -0
  132. package/corpus/templates/clips/changelog/2026-07-24-quitting-the-desktop-app-no-longer-shows-a-false-macos-crash.md +6 -0
  133. package/corpus/templates/clips/changelog/2026-07-24-screen-recording-permission-errors-now-name-the-exact-app-to.md +6 -0
  134. package/corpus/templates/clips/changelog/2026-07-24-the-desktop-app-now-copies-a-new-clip-s-share-link-to-your-c.md +6 -0
  135. package/corpus/templates/clips/changelog/2026-07-24-the-recording-toolbar-now-stays-above-other-apps-including-o.md +6 -0
  136. package/corpus/templates/clips/changelog/2026-07-24-transcript-captions-now-use-real-speech-timings-instead-of-a.md +6 -0
  137. package/corpus/templates/clips/changelog/2026-07-24-video-playback-no-longer-stutters-and-replays-the-last-momen.md +6 -0
  138. package/corpus/templates/clips/chrome-extension/src/background.ts +17 -1
  139. package/corpus/templates/clips/desktop/package.json +2 -0
  140. package/corpus/templates/clips/desktop/src/app.tsx +89 -0
  141. package/corpus/templates/clips/desktop/src/hooks/useMeetingTranscription.ts +9 -3
  142. package/corpus/templates/clips/desktop/src/lib/audio-meter.ts +51 -0
  143. package/corpus/templates/clips/desktop/src/lib/native-notification.ts +44 -0
  144. package/corpus/templates/clips/desktop/src/lib/recording-link.ts +67 -0
  145. package/corpus/templates/clips/desktop/src/overlays/live-audio-bars.tsx +35 -35
  146. package/corpus/templates/clips/desktop/src/overlays/live-transcript.tsx +3 -2
  147. package/corpus/templates/clips/desktop/src/overlays/recording-pill.tsx +47 -46
  148. package/corpus/templates/clips/desktop/src/styles.css +127 -78
  149. package/corpus/templates/clips/desktop/src-tauri/Cargo.toml +7 -0
  150. package/corpus/templates/clips/desktop/src-tauri/Info.plist +6 -0
  151. package/corpus/templates/clips/desktop/src-tauri/capabilities/default.json +1 -0
  152. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +7 -3
  153. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +4 -1
  154. package/corpus/templates/clips/desktop/src-tauri/src/main.rs +8 -0
  155. package/corpus/templates/clips/desktop/src-tauri/src/recording_indicator.rs +21 -10
  156. package/corpus/templates/clips/desktop/src-tauri/src/util.rs +40 -0
  157. package/corpus/templates/clips/server/db/schema.ts +25 -0
  158. package/corpus/templates/clips/server/lib/agent-views.ts +145 -0
  159. package/corpus/templates/clips/server/lib/public-agent-context.ts +7 -0
  160. package/corpus/templates/clips/server/lib/recording-share-grant.ts +79 -0
  161. package/corpus/templates/clips/server/lib/recordings.ts +51 -3
  162. package/corpus/templates/clips/server/plugins/db.ts +23 -0
  163. package/corpus/templates/clips/server/routes/api/public-recording.get.ts +49 -17
  164. package/corpus/templates/clips/shared/recording-link.ts +43 -0
  165. package/corpus/templates/clips/shared/share-attribution.ts +4 -0
  166. package/corpus/templates/clips/shared/share-dashboard-redirect.ts +42 -0
  167. package/corpus/templates/clips/shared/view-analytics.ts +26 -0
  168. package/corpus/templates/content/.agents/skills/content/SKILL.md +5 -0
  169. package/corpus/templates/content/.agents/skills/content/references/local-file-mode.md +135 -0
  170. package/corpus/templates/content/.agents/skills/document-editing/SKILL.md +12 -0
  171. package/corpus/templates/content/.agents/skills/document-editing/references/databases.md +238 -0
  172. package/corpus/templates/content/.agents/skills/document-editing/references/document-behavior.md +91 -0
  173. package/corpus/templates/content/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  174. package/corpus/templates/content/AGENTS.md +62 -583
  175. package/corpus/templates/content/_gitignore +1 -0
  176. package/corpus/templates/design/.agents/skills/creative-context/SKILL.md +11 -0
  177. package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +50 -8
  178. package/corpus/templates/design/.agents/skills/design-generation/references/code-layers.md +81 -0
  179. package/corpus/templates/design/.agents/skills/design-generation/references/code-workspace.md +42 -0
  180. package/corpus/templates/design/.agents/skills/design-generation/references/editor-extensions.md +34 -0
  181. package/corpus/templates/design/.agents/skills/responsive-breakpoints/SKILL.md +4 -1
  182. package/corpus/templates/design/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  183. package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +17 -0
  184. package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +8196 -0
  185. package/corpus/templates/design/.generated/bridge/embedded-wheel.generated.ts +265 -0
  186. package/corpus/templates/design/.generated/bridge/hit-test.generated.ts +642 -0
  187. package/corpus/templates/design/.generated/bridge/motion-preview.generated.ts +571 -0
  188. package/corpus/templates/design/.generated/bridge/nav.generated.ts +91 -0
  189. package/corpus/templates/design/.generated/bridge/sample.generated.ts +23 -0
  190. package/corpus/templates/design/.generated/bridge/shader-fill-preview.generated.ts +263 -0
  191. package/corpus/templates/design/.generated/bridge/shader-runtime.generated.ts +518 -0
  192. package/corpus/templates/design/.generated/bridge/tweak.generated.ts +20 -0
  193. package/corpus/templates/design/.generated/bridge/zoom.generated.ts +32 -0
  194. package/corpus/templates/design/AGENTS.md +88 -503
  195. package/corpus/templates/design/_gitignore +1 -0
  196. package/corpus/templates/dispatch/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  197. package/corpus/templates/dispatch/_gitignore +1 -0
  198. package/corpus/templates/dispatch/changelog/2026-07-24-signing-in-now-puts-you-in-your-companys-workspace.md +6 -0
  199. package/corpus/templates/forms/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  200. package/corpus/templates/forms/_gitignore +1 -0
  201. package/corpus/templates/forms/server/lib/public-form-ssr.ts +2 -2
  202. package/corpus/templates/macros/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  203. package/corpus/templates/macros/_gitignore +1 -0
  204. package/corpus/templates/mail/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  205. package/corpus/templates/mail/_gitignore +1 -0
  206. package/corpus/templates/plan/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  207. package/corpus/templates/plan/_gitignore +1 -0
  208. package/corpus/templates/slides/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  209. package/corpus/templates/slides/_gitignore +1 -0
  210. package/corpus/templates/slides/server/plugins/db.ts +4 -0
  211. package/corpus/templates/tasks/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  212. package/corpus/templates/tasks/AGENTS.md +1 -1
  213. package/corpus/templates/tasks/_gitignore +1 -0
  214. package/dist/a2a/activity.d.ts +4 -1
  215. package/dist/a2a/activity.d.ts.map +1 -1
  216. package/dist/a2a/activity.js +27 -16
  217. package/dist/a2a/activity.js.map +1 -1
  218. package/dist/agent/engine/builder-engine.d.ts +1 -0
  219. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  220. package/dist/agent/engine/builder-engine.js +31 -4
  221. package/dist/agent/engine/builder-engine.js.map +1 -1
  222. package/dist/agent/run-manager.d.ts.map +1 -1
  223. package/dist/agent/run-manager.js +18 -1
  224. package/dist/agent/run-manager.js.map +1 -1
  225. package/dist/agent/run-store.d.ts +1 -0
  226. package/dist/agent/run-store.d.ts.map +1 -1
  227. package/dist/agent/run-store.js +2 -1
  228. package/dist/agent/run-store.js.map +1 -1
  229. package/dist/agent/types.d.ts +12 -1
  230. package/dist/agent/types.d.ts.map +1 -1
  231. package/dist/agent/types.js +21 -1
  232. package/dist/agent/types.js.map +1 -1
  233. package/dist/chat-threads/store.d.ts +10 -0
  234. package/dist/chat-threads/store.d.ts.map +1 -1
  235. package/dist/chat-threads/store.js +41 -0
  236. package/dist/chat-threads/store.js.map +1 -1
  237. package/dist/checkpoints/index.d.ts +1 -0
  238. package/dist/checkpoints/index.d.ts.map +1 -1
  239. package/dist/checkpoints/index.js +1 -0
  240. package/dist/checkpoints/index.js.map +1 -1
  241. package/dist/checkpoints/route-match.d.ts +8 -0
  242. package/dist/checkpoints/route-match.d.ts.map +1 -0
  243. package/dist/checkpoints/route-match.js +13 -0
  244. package/dist/checkpoints/route-match.js.map +1 -0
  245. package/dist/cli/create.d.ts +35 -4
  246. package/dist/cli/create.d.ts.map +1 -1
  247. package/dist/cli/create.js +69 -19
  248. package/dist/cli/create.js.map +1 -1
  249. package/dist/cli/index.js +19 -0
  250. package/dist/cli/index.js.map +1 -1
  251. package/dist/cli/template-baseline.d.ts +54 -0
  252. package/dist/cli/template-baseline.d.ts.map +1 -0
  253. package/dist/cli/template-baseline.js +334 -0
  254. package/dist/cli/template-baseline.js.map +1 -0
  255. package/dist/cli/template-sync.d.ts +57 -0
  256. package/dist/cli/template-sync.d.ts.map +1 -0
  257. package/dist/cli/template-sync.js +787 -0
  258. package/dist/cli/template-sync.js.map +1 -0
  259. package/dist/cli/templates-meta.d.ts.map +1 -1
  260. package/dist/cli/templates-meta.js +1 -0
  261. package/dist/cli/templates-meta.js.map +1 -1
  262. package/dist/client/AssistantChat.d.ts +2 -1
  263. package/dist/client/AssistantChat.d.ts.map +1 -1
  264. package/dist/client/AssistantChat.js +38 -10
  265. package/dist/client/AssistantChat.js.map +1 -1
  266. package/dist/client/NewWorkspaceAppFlow.d.ts.map +1 -1
  267. package/dist/client/NewWorkspaceAppFlow.js +32 -2
  268. package/dist/client/NewWorkspaceAppFlow.js.map +1 -1
  269. package/dist/client/chat/message-components.d.ts +20 -0
  270. package/dist/client/chat/message-components.d.ts.map +1 -1
  271. package/dist/client/chat/message-components.js +81 -46
  272. package/dist/client/chat/message-components.js.map +1 -1
  273. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  274. package/dist/client/chat/tool-call-display.js +14 -6
  275. package/dist/client/chat/tool-call-display.js.map +1 -1
  276. package/dist/client/error-format.d.ts.map +1 -1
  277. package/dist/client/error-format.js +13 -0
  278. package/dist/client/error-format.js.map +1 -1
  279. package/dist/client/org/OrgSwitcher.d.ts +8 -1
  280. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  281. package/dist/client/org/OrgSwitcher.js +3 -2
  282. package/dist/client/org/OrgSwitcher.js.map +1 -1
  283. package/dist/client/org/TeamPage.d.ts.map +1 -1
  284. package/dist/client/org/TeamPage.js +1 -1
  285. package/dist/client/org/TeamPage.js.map +1 -1
  286. package/dist/client/sse-event-processor.d.ts.map +1 -1
  287. package/dist/client/sse-event-processor.js +3 -0
  288. package/dist/client/sse-event-processor.js.map +1 -1
  289. package/dist/collab/awareness.d.ts +2 -2
  290. package/dist/collab/awareness.d.ts.map +1 -1
  291. package/dist/data-widgets/index.d.ts +3 -0
  292. package/dist/data-widgets/index.d.ts.map +1 -1
  293. package/dist/data-widgets/index.js +33 -0
  294. package/dist/data-widgets/index.js.map +1 -1
  295. package/dist/deploy/build.d.ts.map +1 -1
  296. package/dist/deploy/build.js +11 -7
  297. package/dist/deploy/build.js.map +1 -1
  298. package/dist/eject/provider-api-definitions.d.ts +1 -0
  299. package/dist/eject/provider-api-definitions.d.ts.map +1 -1
  300. package/dist/integrations/webhook-handler.d.ts.map +1 -1
  301. package/dist/integrations/webhook-handler.js +46 -9
  302. package/dist/integrations/webhook-handler.js.map +1 -1
  303. package/dist/notifications/routes.d.ts +3 -3
  304. package/dist/observability/routes.d.ts +3 -3
  305. package/dist/org/auto-join-domain.d.ts +3 -2
  306. package/dist/org/auto-join-domain.d.ts.map +1 -1
  307. package/dist/org/auto-join-domain.js +1 -1
  308. package/dist/org/auto-join-domain.js.map +1 -1
  309. package/dist/org/context.d.ts.map +1 -1
  310. package/dist/org/context.js +84 -28
  311. package/dist/org/context.js.map +1 -1
  312. package/dist/org/index.d.ts +1 -0
  313. package/dist/org/index.d.ts.map +1 -1
  314. package/dist/org/index.js +1 -0
  315. package/dist/org/index.js.map +1 -1
  316. package/dist/org/service-identity.d.ts +43 -0
  317. package/dist/org/service-identity.d.ts.map +1 -0
  318. package/dist/org/service-identity.js +34 -0
  319. package/dist/org/service-identity.js.map +1 -0
  320. package/dist/provider-api/actions/custom-provider-registration.d.ts +14 -14
  321. package/dist/provider-api/actions/provider-api.d.ts +13 -11
  322. package/dist/provider-api/actions/provider-api.d.ts.map +1 -1
  323. package/dist/provider-api/index.d.ts +4 -0
  324. package/dist/provider-api/index.d.ts.map +1 -1
  325. package/dist/provider-api/index.js +17 -1
  326. package/dist/provider-api/index.js.map +1 -1
  327. package/dist/resources/handlers.d.ts +1 -1
  328. package/dist/scripts/docs/search.d.ts.map +1 -1
  329. package/dist/scripts/docs/search.js +12 -1
  330. package/dist/scripts/docs/search.js.map +1 -1
  331. package/dist/server/agent-chat/context-tools.d.ts.map +1 -1
  332. package/dist/server/agent-chat/context-tools.js +3 -3
  333. package/dist/server/agent-chat/context-tools.js.map +1 -1
  334. package/dist/server/agent-chat/framework-prompts.d.ts +8 -3
  335. package/dist/server/agent-chat/framework-prompts.d.ts.map +1 -1
  336. package/dist/server/agent-chat/framework-prompts.js +33 -62
  337. package/dist/server/agent-chat/framework-prompts.js.map +1 -1
  338. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  339. package/dist/server/agent-chat-plugin.js +16 -10
  340. package/dist/server/agent-chat-plugin.js.map +1 -1
  341. package/dist/server/agents-bundle.d.ts +18 -0
  342. package/dist/server/agents-bundle.d.ts.map +1 -1
  343. package/dist/server/agents-bundle.js +70 -4
  344. package/dist/server/agents-bundle.js.map +1 -1
  345. package/dist/server/auth.d.ts.map +1 -1
  346. package/dist/server/auth.js +4 -3
  347. package/dist/server/auth.js.map +1 -1
  348. package/dist/server/builder-browser.d.ts.map +1 -1
  349. package/dist/server/builder-browser.js +43 -19
  350. package/dist/server/builder-browser.js.map +1 -1
  351. package/dist/server/core-routes-plugin.js +2 -2
  352. package/dist/server/core-routes-plugin.js.map +1 -1
  353. package/dist/server/credential-provider.d.ts +38 -2
  354. package/dist/server/credential-provider.d.ts.map +1 -1
  355. package/dist/server/credential-provider.js +142 -64
  356. package/dist/server/credential-provider.js.map +1 -1
  357. package/dist/server/index.d.ts +1 -1
  358. package/dist/server/index.d.ts.map +1 -1
  359. package/dist/server/index.js +1 -1
  360. package/dist/server/index.js.map +1 -1
  361. package/dist/server/prompts/framework-core-compact.d.ts +1 -1
  362. package/dist/server/prompts/framework-core-compact.d.ts.map +1 -1
  363. package/dist/server/prompts/framework-core-compact.js +7 -13
  364. package/dist/server/prompts/framework-core-compact.js.map +1 -1
  365. package/dist/server/prompts/framework-core.d.ts +1 -1
  366. package/dist/server/prompts/framework-core.d.ts.map +1 -1
  367. package/dist/server/prompts/framework-core.js +10 -21
  368. package/dist/server/prompts/framework-core.js.map +1 -1
  369. package/dist/server/prompts/index.d.ts +1 -1
  370. package/dist/server/prompts/index.d.ts.map +1 -1
  371. package/dist/server/prompts/index.js +1 -1
  372. package/dist/server/prompts/index.js.map +1 -1
  373. package/dist/server/prompts/shared-rules.d.ts +16 -10
  374. package/dist/server/prompts/shared-rules.d.ts.map +1 -1
  375. package/dist/server/prompts/shared-rules.js +19 -10
  376. package/dist/server/prompts/shared-rules.js.map +1 -1
  377. package/dist/server/ssr-handler.d.ts +1 -1
  378. package/dist/server/ssr-handler.d.ts.map +1 -1
  379. package/dist/server/ssr-handler.js +10 -3
  380. package/dist/server/ssr-handler.js.map +1 -1
  381. package/dist/server/transcribe-voice.d.ts +1 -1
  382. package/dist/settings/user-settings.d.ts.map +1 -1
  383. package/dist/settings/user-settings.js +13 -1
  384. package/dist/settings/user-settings.js.map +1 -1
  385. package/dist/shared/cache-control.d.ts +52 -0
  386. package/dist/shared/cache-control.d.ts.map +1 -1
  387. package/dist/shared/cache-control.js +107 -0
  388. package/dist/shared/cache-control.js.map +1 -1
  389. package/dist/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  390. package/dist/templates/chat/_gitignore +1 -0
  391. package/dist/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  392. package/dist/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  393. package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +19 -0
  394. package/dist/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  395. package/dist/templates/workspace-core/.agents/skills/visual-answer/SKILL.md +1 -0
  396. package/dist/vite/agents-bundle-plugin.d.ts.map +1 -1
  397. package/dist/vite/agents-bundle-plugin.js +8 -7
  398. package/dist/vite/agents-bundle-plugin.js.map +1 -1
  399. package/dist/vite/client.d.ts.map +1 -1
  400. package/dist/vite/client.js +2 -0
  401. package/dist/vite/client.js.map +1 -1
  402. package/docs/content/actions.mdx +2 -2
  403. package/docs/content/agent-surfaces.mdx +1 -1
  404. package/docs/content/authentication.mdx +2 -0
  405. package/docs/content/deployment.mdx +36 -0
  406. package/docs/content/getting-started.mdx +477 -115
  407. package/docs/content/http-api.mdx +266 -0
  408. package/docs/content/syncing-template-changes.mdx +159 -0
  409. package/package.json +4 -3
  410. package/src/a2a/activity.ts +38 -27
  411. package/src/agent/engine/builder-engine.ts +35 -4
  412. package/src/agent/run-manager.ts +20 -1
  413. package/src/agent/run-store.ts +4 -1
  414. package/src/agent/types.ts +28 -8
  415. package/src/chat-threads/store.ts +45 -0
  416. package/src/checkpoints/index.ts +2 -0
  417. package/src/checkpoints/route-match.ts +13 -0
  418. package/src/cli/create.ts +105 -17
  419. package/src/cli/index.ts +20 -0
  420. package/src/cli/template-baseline.ts +410 -0
  421. package/src/cli/template-sync.ts +1004 -0
  422. package/src/cli/templates-meta.ts +1 -0
  423. package/src/client/AssistantChat.tsx +38 -12
  424. package/src/client/NewWorkspaceAppFlow.tsx +75 -10
  425. package/src/client/chat/message-components.tsx +127 -66
  426. package/src/client/chat/tool-call-display.tsx +29 -5
  427. package/src/client/error-format.ts +18 -0
  428. package/src/client/org/OrgSwitcher.tsx +30 -8
  429. package/src/client/org/TeamPage.tsx +7 -6
  430. package/src/client/sse-event-processor.ts +3 -0
  431. package/src/data-widgets/index.ts +41 -0
  432. package/src/deploy/build.ts +11 -9
  433. package/src/integrations/webhook-handler.ts +63 -9
  434. package/src/org/auto-join-domain.ts +4 -3
  435. package/src/org/context.ts +108 -39
  436. package/src/org/index.ts +5 -0
  437. package/src/org/service-identity.ts +60 -0
  438. package/src/provider-api/index.ts +22 -1
  439. package/src/scripts/docs/search.ts +12 -1
  440. package/src/server/__snapshots__/agent-chat-plugin.surface.spec.ts.snap +25 -36
  441. package/src/server/agent-chat/context-tools.ts +9 -4
  442. package/src/server/agent-chat/framework-prompts.ts +38 -66
  443. package/src/server/agent-chat-plugin.ts +17 -10
  444. package/src/server/agents-bundle.ts +84 -5
  445. package/src/server/auth.ts +4 -3
  446. package/src/server/builder-browser.ts +47 -19
  447. package/src/server/core-routes-plugin.ts +2 -2
  448. package/src/server/credential-provider.ts +209 -68
  449. package/src/server/index.ts +3 -0
  450. package/src/server/prompts/framework-core-compact.ts +6 -13
  451. package/src/server/prompts/framework-core.ts +9 -21
  452. package/src/server/prompts/index.ts +0 -1
  453. package/src/server/prompts/shared-rules.ts +19 -11
  454. package/src/server/ssr-handler.ts +13 -2
  455. package/src/settings/user-settings.ts +13 -1
  456. package/src/shared/cache-control.ts +141 -0
  457. package/src/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  458. package/src/templates/chat/_gitignore +1 -0
  459. package/src/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  460. package/src/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  461. package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +19 -0
  462. package/src/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
  463. package/src/templates/workspace-core/.agents/skills/visual-answer/SKILL.md +1 -0
  464. package/src/vite/agents-bundle-plugin.ts +7 -6
  465. package/src/vite/client.ts +5 -0
@@ -3,8 +3,9 @@
3
3
  * Single source of truth so the two variants can't drift on rules that are
4
4
  * identical between them.
5
5
  *
6
- * Rules 8–10 (db-* tools, no fabrication, no false success) are reproduced
7
- * verbatim in both prompts keep them here.
6
+ * Rules 8–9 (db-* tools; the consolidated no-fabrication / verify / recover
7
+ * rule) and 12–13 (planning discipline; collaborate through uncertainty) are
8
+ * reproduced verbatim in both prompts — keep them here.
8
9
  */
9
10
  import {
10
11
  normalizeDatabaseToolsMode,
@@ -83,14 +84,21 @@ export function sharedRule8(
83
84
  }, or any external data source. If the user asks about a table that is NOT in the app schema (e.g. \`dbt_analytics.*\`, \`dbt_mart.*\`, or any fully-qualified \`project.dataset.table\`), use the appropriate template action instead — ${warehouseExample}${providerExamples ? `${providerExamples} for their respective providers, ` : ""}etc. When the user names an external provider, that named provider action wins; do not substitute a warehouse tool like BigQuery unless the user explicitly asks for the warehouse copy. **Never use \`db-query\` for external data — it will fail.** When \`provider-api-catalog\`, \`provider-api-docs\`, and \`provider-api-request\` are available, first-class provider actions are shortcuts, not limits: call the endpoint/filter/body/pagination the question needs. For broad searches, joins, counts/classification, or absence claims, fetch every relevant page or a bounded cohort, stage/save large responses, and reduce with \`query-staged-dataset\` or \`run-code\`. Report filters, row counts, failed pages, and gaps; never infer "none found" from sampled, truncated, default-limited, or aborted results.${extensionAdvice}`;
84
85
  }
85
86
 
86
- /** Rule 9 — Never fabricate factual claims (shared). */
87
- export const SHARED_RULE_9 = `9. **Never fabricate factual claims or records** Do NOT invent numbers, metrics, records, query results, URLs, citations, source attributions, customer names, dates, or success rates. This applies inside generated artifacts too: decks, documents, reports, dashboards, Slack/email replies, and charts must not contain unsupported factual specifics. Only state factual numbers/claims when the user provided them or you retrieved them with an action/tool. If a data source is unavailable, returns no rows, is missing credentials, or has a connection error, say so clearly; do not create placeholder rows or fetch unrelated external providers to make the answer look complete unless the user explicitly asked you to import/sync/backfill. If a specific metric would be useful but is not known, use qualitative wording, placeholders like \`[metric TBD]\`, or clearly labeled draft assumptions instead of plausible-looking facts. Presenting made-up data as real is a critical failure — it is worse than admitting the limitation.`;
88
-
89
- /** Rule 10 Never fabricate success from tool errors (shared). */
90
- export const SHARED_RULE_10 = `10. **Never fabricate success from tool errors** — When any tool call returns an error (marked \`isError: true\`, contains "Command failed", "Error:", or non-zero exit output), the operation FAILED. Do NOT synthesize a success narrative or describe what the action "would have" produced. Report the failure verbatim from the tool output. This applies especially to \`bash(command="pnpm action ...")\` calls: if the action threw, it did NOT succeed.`;
87
+ /**
88
+ * Rule 9 — Consolidated anti-fabrication rule (shared). Formerly three
89
+ * separate rules (fabricating facts, fabricating success, and Rule 11's
90
+ * "verify before you claim done") merged because they are one behavior,
91
+ * honesty about what actually happened, viewed from three angles. Keep all
92
+ * three sub-behaviors distinct; do not re-split them back into separate
93
+ * numbered rules.
94
+ */
95
+ export const SHARED_RULE_9 = `9. **Never fabricate — verify results, report failures honestly, and recover instead of giving up.**
96
+ - **Never fabricate factual claims or records** — do not invent numbers, metrics, records, query results, URLs, citations, source attributions, customer names, dates, or success rates. This applies inside generated artifacts too: decks, documents, reports, dashboards, Slack/email replies, and charts. Only state factual numbers/claims the user provided or you retrieved with an action/tool. If a data source is unavailable, returns no rows, is missing credentials, or has a connection error, say so clearly; do not create placeholder rows or fetch unrelated providers to look complete unless the user explicitly asked you to import/sync/backfill. Prefer qualitative wording, placeholders like \`[metric TBD]\`, or clearly labeled draft assumptions over plausible-looking facts — presenting made-up data as real is worse than admitting the limitation.
97
+ - **Never fabricate success from tool errors** — when a tool call returns an error (marked \`isError: true\`, contains "Command failed", "Error:", or non-zero exit output), the operation FAILED; do not synthesize a success narrative or describe what it "would have" produced. Report the failure verbatim (this applies especially to \`bash(command="pnpm action ...")\` calls). Before telling the user a mutating action (create/update/delete/send/publish) is done, confirm it actually landed — check the tool result, or read the refreshed \`<current-screen>\` / re-query the data; having *called* an action is not proof it worked. If a result is ambiguous, check rather than assume.
98
+ - **Recover instead of giving up** — treat a failure or ambiguous result as a signal to retry the obvious fix, try an alternate tool or approach, or clearly hand the blocker back with what you tried; never silently give up, and never paper over a failure by claiming success.`;
91
99
 
92
- /** Rule 14 — Planning and progress (adapted from Codex's update_plan discipline). */
93
- export const SHARED_RULE_14 = `14. **Plan and track multi-step work** — For non-trivial tasks that span several actions or phases, use \`manage-progress\` to make work visible and keep it on track.
100
+ /** Rule 12 (const name retained as SHARED_RULE_14 for import stability) — Planning and progress (adapted from Codex's update_plan discipline). */
101
+ export const SHARED_RULE_14 = `12. **Plan and track multi-step work** — For non-trivial tasks that span several actions or phases, use \`manage-progress\` to make work visible and keep it on track.
94
102
 
95
103
  - Call \`manage-progress\` with \`action: "start"\` at the beginning of multi-step work; include a descriptive \`title\` and the first \`step\`.
96
104
  - Update with \`action: "update"\` after each meaningful milestone — include \`step\` (what you just did or are doing now) and \`percent\` when there is a known upper bound. Do not batch-complete multiple steps after the fact; update as you go.
@@ -100,5 +108,5 @@ export const SHARED_RULE_14 = `14. **Plan and track multi-step work** — For no
100
108
  - Never create single-step plans — if everything fits in one \`start\`+\`complete\`, just call the action and report the outcome directly.
101
109
  - If the task pivots mid-run (unexpected blocker, scope change), update the current step to reflect the new direction before continuing.`;
102
110
 
103
- /** Rule 15 — Collaborate through uncertainty (better-specified version). */
104
- export const SHARED_RULE_15 = `15. **Collaborate through uncertainty** — If a task stalls, errors, or depends on setup the user may not know about, shift into builder-coach mode instead of repeating the same attempt. State what you verified, name the most likely next checks, and proactively try common unblockers you can inspect (for example prompt size, missing environment variables, unavailable connections, current screen state, or tool choice). When you finish a meaningful step, offer one or two concrete next steps or improvements so non-technical users can keep iterating. When you are genuinely blocked on a decision you cannot resolve from context — and a wrong guess would be costly — use \`ask-question\` to present the choice instead of guessing; otherwise prefer a reasonable assumption and keep moving.`;
111
+ /** Rule 13 (const name retained as SHARED_RULE_15 for import stability) — Collaborate through uncertainty (better-specified version). */
112
+ export const SHARED_RULE_15 = `13. **Collaborate through uncertainty** — If a task stalls, errors, or depends on setup the user may not know about, shift into builder-coach mode instead of repeating the same attempt. State what you verified, name the most likely next checks, and proactively try common unblockers you can inspect (for example prompt size, missing environment variables, unavailable connections, current screen state, or tool choice). When you finish a meaningful step, offer one or two concrete next steps or improvements so non-technical users can keep iterating. When you are genuinely blocked on a decision you cannot resolve from context — and a wrong guess would be costly — use \`ask-question\` to present the choice instead of guessing; otherwise prefer a reasonable assumption and keep moving.`;
@@ -20,8 +20,8 @@ import { createRequestHandler } from "react-router";
20
20
 
21
21
  import { isMcpPublicPath } from "../mcp/route-paths.js";
22
22
  import {
23
- DEFAULT_SSR_CACHE_HEADERS,
24
23
  DEFAULT_SPECULATION_RULES_PATH,
24
+ resolveSsrCacheHeaders,
25
25
  } from "../shared/cache-control.js";
26
26
  import {
27
27
  AGENT_NATIVE_SOCIAL_IMAGE_ALT,
@@ -46,6 +46,10 @@ export {
46
46
  DEFAULT_SSR_CACHE_HEADERS,
47
47
  DEFAULT_SPECULATION_RULES_HEADER,
48
48
  DEFAULT_SSR_CACHE_CONTROL,
49
+ DISABLED_SSR_CACHE_HEADERS,
50
+ isSsrCacheEnabled,
51
+ resolveSsrCacheHeaders,
52
+ SSR_CACHE_ENV_VAR,
49
53
  } from "../shared/cache-control.js";
50
54
 
51
55
  function getAppBasePath(): string {
@@ -244,6 +248,13 @@ function isSsrHtmlOrDataResponse(
244
248
  * │ resolved CLIENT-SIDE after load. Keep it that way: if you need the SSR │
245
249
  * │ output to differ per user, the fix is to move that work client-side, not │
246
250
  * │ to disable caching here. │
251
+ * │ │
252
+ * │ HOW LONG the shell is cached is deployment-wide and configurable through │
253
+ * │ AGENT_NATIVE_SSR_CACHE (see `resolveSsrCacheHeaders`), for hosts that do │
254
+ * │ not purge their CDN on deploy. What remains forbidden is PER-REQUEST / │
255
+ * │ PER-USER variation — no `private`, no `Vary: Cookie`, no per-route escape │
256
+ * │ hatch — because that is what poisons a shared CDN cache key. A value fixed │
257
+ * │ for the whole deployment cannot. │
247
258
  * └──────────────────────────────────────────────────────────────────────────┘
248
259
  */
249
260
  function applyDefaultSsrCacheHeader(
@@ -279,7 +290,7 @@ function applyDefaultSsrCacheHeader(
279
290
  // and Netlify-CDN-Cache-Control (with durable) so Netlify's shared cache
280
291
  // actually serves SSR HTML/.data from the edge instead of forwarding every
281
292
  // request to origin — for every visitor, authenticated or not.
282
- for (const [name, value] of Object.entries(DEFAULT_SSR_CACHE_HEADERS)) {
293
+ for (const [name, value] of Object.entries(resolveSsrCacheHeaders())) {
283
294
  headers.set(name, value);
284
295
  }
285
296
  }
@@ -16,6 +16,15 @@ import {
16
16
  } from "./store.js";
17
17
 
18
18
  function userKey(email: string, key: string): string {
19
+ return `u:${email.trim().toLowerCase()}:${key}`;
20
+ }
21
+
22
+ /**
23
+ * Pre-normalization spelling. Callers pass the session email verbatim, so the
24
+ * same user could be written under `Alice@Builder.IO` and read under
25
+ * `alice@builder.io` — silently losing settings such as `active-org-id`.
26
+ */
27
+ function legacyUserKey(email: string, key: string): string {
19
28
  return `u:${email}:${key}`;
20
29
  }
21
30
 
@@ -24,7 +33,10 @@ export async function getUserSetting(
24
33
  email: string,
25
34
  key: string,
26
35
  ): Promise<Record<string, unknown> | null> {
27
- return getSetting(userKey(email, key));
36
+ const normalized = await getSetting(userKey(email, key));
37
+ if (normalized !== null) return normalized;
38
+ const legacy = legacyUserKey(email, key);
39
+ return legacy === userKey(email, key) ? null : getSetting(legacy);
28
40
  }
29
41
 
30
42
  /** Write a user-scoped setting. Always writes to the prefixed key. */
@@ -14,6 +14,147 @@ export const DEFAULT_SSR_CACHE_HEADERS = {
14
14
  "netlify-cdn-cache-control": DEFAULT_SSR_NETLIFY_CDN_CACHE_CONTROL,
15
15
  } as const;
16
16
 
17
+ /**
18
+ * Deployment-wide override for the SSR shell cache policy.
19
+ *
20
+ * The default (`DEFAULT_SSR_CACHE_HEADERS`) is deliberately aggressive: SSR
21
+ * HTML and React Router `.data` are one impersonal public shell, so hosts that
22
+ * purge their CDN on deploy get near-static page loads for free. Two situations
23
+ * make that default wrong, and both are properties of the DEPLOYMENT, not of
24
+ * the request:
25
+ *
26
+ * 1. The host does not purge its CDN on deploy, so a shipped build can keep
27
+ * serving the previous shell for `max-age` + `stale-while-revalidate`.
28
+ * 2. The app's loaders return mutable public data, so a `useRevalidator()`
29
+ * after a mutation reads the browser's cached `.data` copy instead of
30
+ * fresh loader output.
31
+ *
32
+ * This override is intentionally global and env-driven rather than a
33
+ * per-route/per-request escape hatch. A response that varies by request is how
34
+ * one visitor's payload ends up in another visitor's shared CDN entry; a value
35
+ * fixed for the whole deployment cannot. Turning caching off does NOT make SSR
36
+ * personalized — `requestForAnonymousSsr` still strips cookies before render.
37
+ *
38
+ * Accepted values (case-insensitive):
39
+ * unset | "on" | "default" | "true" | "1" → the default policy, unchanged
40
+ * "off" | "false" | "0" | "none" | "no-store" | "disabled" → no caching
41
+ * "<n>" | "<n>s" | "<n>m" | "<n>h" → public caching with that freshness
42
+ */
43
+ export const SSR_CACHE_ENV_VAR = "AGENT_NATIVE_SSR_CACHE";
44
+
45
+ export const DISABLED_SSR_CACHE_CONTROL = "no-store";
46
+
47
+ export const DISABLED_SSR_CACHE_HEADERS = {
48
+ "cache-control": DISABLED_SSR_CACHE_CONTROL,
49
+ "cdn-cache-control": DISABLED_SSR_CACHE_CONTROL,
50
+ "netlify-cdn-cache-control": DISABLED_SSR_CACHE_CONTROL,
51
+ } as const;
52
+
53
+ export type SsrCachePolicy =
54
+ | { kind: "default" }
55
+ | { kind: "disabled" }
56
+ | { kind: "maxAge"; seconds: number };
57
+
58
+ export type SsrCacheHeaders = Record<
59
+ "cache-control" | "cdn-cache-control" | "netlify-cdn-cache-control",
60
+ string
61
+ >;
62
+
63
+ const ON_VALUES = new Set(["", "on", "default", "true", "1", "yes"]);
64
+ const OFF_VALUES = new Set([
65
+ "off",
66
+ "false",
67
+ "0",
68
+ "no",
69
+ "none",
70
+ "no-store",
71
+ "disabled",
72
+ ]);
73
+
74
+ const DURATION_RE = /^(\d+)\s*(s|sec|secs|seconds?|m|min|mins?|h|hours?)?$/;
75
+ const DURATION_MULTIPLIERS: Record<string, number> = {
76
+ s: 1,
77
+ m: 60,
78
+ h: 3600,
79
+ };
80
+
81
+ const MAX_SSR_CACHE_SECONDS = 31_536_000;
82
+
83
+ export function parseSsrCacheSetting(
84
+ raw: string | undefined | null,
85
+ ): SsrCachePolicy {
86
+ const value = (raw ?? "").trim().toLowerCase();
87
+ if (ON_VALUES.has(value)) return { kind: "default" };
88
+ if (OFF_VALUES.has(value)) return { kind: "disabled" };
89
+
90
+ const match = DURATION_RE.exec(value);
91
+ if (match) {
92
+ const multiplier = DURATION_MULTIPLIERS[match[2]?.[0] ?? "s"] ?? 1;
93
+ const seconds = Math.min(
94
+ Number(match[1]) * multiplier,
95
+ MAX_SSR_CACHE_SECONDS,
96
+ );
97
+ return seconds > 0 ? { kind: "maxAge", seconds } : { kind: "disabled" };
98
+ }
99
+
100
+ // Unrecognized values fall back to the default rather than failing the
101
+ // deployment: a typo in this env var must never silently disable the CDN.
102
+ console.warn(
103
+ `[agent-native] Ignoring unrecognized ${SSR_CACHE_ENV_VAR}=${raw}. ` +
104
+ `Expected "on", "off", or a duration such as "30s" / "5m".`,
105
+ );
106
+ return { kind: "default" };
107
+ }
108
+
109
+ export function ssrCacheHeadersForPolicy(
110
+ policy: SsrCachePolicy,
111
+ ): SsrCacheHeaders {
112
+ if (policy.kind === "default") return { ...DEFAULT_SSR_CACHE_HEADERS };
113
+ if (policy.kind === "disabled") return { ...DISABLED_SSR_CACHE_HEADERS };
114
+ // Mirror stale-while-revalidate onto the chosen freshness. Apps opt into a
115
+ // short max-age precisely because a long stale window is the problem; keeping
116
+ // the 7-day default SWR here would hand back the staleness they opted out of.
117
+ const control =
118
+ `public, max-age=${policy.seconds}, ` +
119
+ `stale-while-revalidate=${policy.seconds}, stale-if-error=3600`;
120
+ return {
121
+ "cache-control": control,
122
+ "cdn-cache-control": control,
123
+ "netlify-cdn-cache-control": control,
124
+ };
125
+ }
126
+
127
+ let memoizedRaw: string | undefined;
128
+ let memoizedHeaders: Readonly<SsrCacheHeaders> | undefined;
129
+
130
+ /**
131
+ * Resolve the SSR cache headers for this deployment. Reads
132
+ * `AGENT_NATIVE_SSR_CACHE` and memoizes per distinct value so the hot SSR path
133
+ * does not re-parse on every response. The result is frozen and shared by every
134
+ * response — copy it before mutating.
135
+ */
136
+ export function resolveSsrCacheHeaders(
137
+ env: Record<string, string | undefined> = typeof process === "undefined"
138
+ ? {}
139
+ : process.env,
140
+ ): Readonly<SsrCacheHeaders> {
141
+ const raw = env[SSR_CACHE_ENV_VAR];
142
+ if (memoizedHeaders && raw === memoizedRaw) return memoizedHeaders;
143
+ memoizedRaw = raw;
144
+ memoizedHeaders = Object.freeze(
145
+ ssrCacheHeadersForPolicy(parseSsrCacheSetting(raw)),
146
+ );
147
+ return memoizedHeaders;
148
+ }
149
+
150
+ export function isSsrCacheEnabled(
151
+ env: Record<string, string | undefined> = typeof process === "undefined"
152
+ ? {}
153
+ : process.env,
154
+ ): boolean {
155
+ return parseSsrCacheSetting(env[SSR_CACHE_ENV_VAR]).kind !== "disabled";
156
+ }
157
+
17
158
  export const DEFAULT_SPECULATION_RULES_PATH =
18
159
  "/_agent-native/speculation-rules.json";
19
160
 
@@ -56,7 +56,29 @@ install → refresh scaffold skills → verify, then fix **app** code only.
56
56
  - Runs `skills update scaffold --project`
57
57
  - Runs `typecheck` when the project has that script
58
58
 
59
- 3. **If upgrade or typecheck fails**
59
+ 3. **Pull upstream template changes (optional, separate from the bump)**
60
+
61
+ `agent-native upgrade` moves package versions. It never touches files that
62
+ were copied out of a template at scaffold time, so template fixes and
63
+ improvements do not arrive with a bump.
64
+
65
+ ```bash
66
+ agent-native template status # recorded ref vs latest, drift counts
67
+ agent-native template diff # what upstream changed, read-only
68
+ agent-native template sync # 3-way merge it into the app
69
+ ```
70
+
71
+ `sync` defaults to the ref matching the installed `@agent-native/core`, so
72
+ run it after `upgrade`. It merges per file against a pristine baseline
73
+ stored in `refs/agent-native/template-baseline/<app-path>`; files upstream
74
+ did not touch are left alone, and real collisions get conflict markers.
75
+ After resolving markers, run `agent-native template accept` — the baseline
76
+ deliberately does not advance past an unresolved merge.
77
+
78
+ Apps scaffolded before provenance existed have no baseline. Create one
79
+ with `agent-native template baseline` before the first sync.
80
+
81
+ 4. **If upgrade or typecheck fails**
60
82
 
61
83
  - Read the concrete error
62
84
  - Fix **app** source, actions, config, or env — not framework packages
@@ -68,7 +90,7 @@ install → refresh scaffold skills → verify, then fix **app** code only.
68
90
  copied component; do not use that path to reproduce framework runtime
69
91
  behavior or hide version skew.
70
92
 
71
- 4. **Dry-run / partial runs**
93
+ 5. **Dry-run / partial runs**
72
94
 
73
95
  ```bash
74
96
  agent-native upgrade --dry-run
@@ -41,3 +41,4 @@ data/.sessions.json
41
41
  learnings.md
42
42
 
43
43
  .vercel/
44
+ .agent-native/
@@ -56,7 +56,29 @@ install → refresh scaffold skills → verify, then fix **app** code only.
56
56
  - Runs `skills update scaffold --project`
57
57
  - Runs `typecheck` when the project has that script
58
58
 
59
- 3. **If upgrade or typecheck fails**
59
+ 3. **Pull upstream template changes (optional, separate from the bump)**
60
+
61
+ `agent-native upgrade` moves package versions. It never touches files that
62
+ were copied out of a template at scaffold time, so template fixes and
63
+ improvements do not arrive with a bump.
64
+
65
+ ```bash
66
+ agent-native template status # recorded ref vs latest, drift counts
67
+ agent-native template diff # what upstream changed, read-only
68
+ agent-native template sync # 3-way merge it into the app
69
+ ```
70
+
71
+ `sync` defaults to the ref matching the installed `@agent-native/core`, so
72
+ run it after `upgrade`. It merges per file against a pristine baseline
73
+ stored in `refs/agent-native/template-baseline/<app-path>`; files upstream
74
+ did not touch are left alone, and real collisions get conflict markers.
75
+ After resolving markers, run `agent-native template accept` — the baseline
76
+ deliberately does not advance past an unresolved merge.
77
+
78
+ Apps scaffolded before provenance existed have no baseline. Create one
79
+ with `agent-native template baseline` before the first sync.
80
+
81
+ 4. **If upgrade or typecheck fails**
60
82
 
61
83
  - Read the concrete error
62
84
  - Fix **app** source, actions, config, or env — not framework packages
@@ -68,7 +90,7 @@ install → refresh scaffold skills → verify, then fix **app** code only.
68
90
  copied component; do not use that path to reproduce framework runtime
69
91
  behavior or hide version skew.
70
92
 
71
- 4. **Dry-run / partial runs**
93
+ 5. **Dry-run / partial runs**
72
94
 
73
95
  ```bash
74
96
  agent-native upgrade --dry-run
@@ -56,7 +56,29 @@ install → refresh scaffold skills → verify, then fix **app** code only.
56
56
  - Runs `skills update scaffold --project`
57
57
  - Runs `typecheck` when the project has that script
58
58
 
59
- 3. **If upgrade or typecheck fails**
59
+ 3. **Pull upstream template changes (optional, separate from the bump)**
60
+
61
+ `agent-native upgrade` moves package versions. It never touches files that
62
+ were copied out of a template at scaffold time, so template fixes and
63
+ improvements do not arrive with a bump.
64
+
65
+ ```bash
66
+ agent-native template status # recorded ref vs latest, drift counts
67
+ agent-native template diff # what upstream changed, read-only
68
+ agent-native template sync # 3-way merge it into the app
69
+ ```
70
+
71
+ `sync` defaults to the ref matching the installed `@agent-native/core`, so
72
+ run it after `upgrade`. It merges per file against a pristine baseline
73
+ stored in `refs/agent-native/template-baseline/<app-path>`; files upstream
74
+ did not touch are left alone, and real collisions get conflict markers.
75
+ After resolving markers, run `agent-native template accept` — the baseline
76
+ deliberately does not advance past an unresolved merge.
77
+
78
+ Apps scaffolded before provenance existed have no baseline. Create one
79
+ with `agent-native template baseline` before the first sync.
80
+
81
+ 4. **If upgrade or typecheck fails**
60
82
 
61
83
  - Read the concrete error
62
84
  - Fix **app** source, actions, config, or env — not framework packages
@@ -68,7 +90,7 @@ install → refresh scaffold skills → verify, then fix **app** code only.
68
90
  copied component; do not use that path to reproduce framework runtime
69
91
  behavior or hide version skew.
70
92
 
71
- 4. **Dry-run / partial runs**
93
+ 5. **Dry-run / partial runs**
72
94
 
73
95
  ```bash
74
96
  agent-native upgrade --dry-run
@@ -151,6 +151,23 @@ See the `authentication` skill for the full model and `guard:ssr-cache-shell`
151
151
  plus `ssr-handler.spec.ts` (`packages/core/src/server/ssr-handler.ts`) for the
152
152
  enforced contract.
153
153
 
154
+ **Never route mutation-fresh reads through SSR loader data.** Data that changes
155
+ when a user acts belongs in an action, read from the client with
156
+ `useActionQuery` / `useActionMutation` and kept live by `useDbSync()` polling —
157
+ that path never touches the SSR shell cache. A `useRevalidator()` after a
158
+ mutation re-fetches `.data` with a plain GET and can legitimately be served the
159
+ cached copy. SSR loaders render the public shell; the client resolves anything
160
+ that must be fresh.
161
+
162
+ The one supported knob is the deployment-wide `AGENT_NATIVE_SSR_CACHE` env var:
163
+ unset/`on` keeps the default, `off` sends `no-store`, and a duration such as
164
+ `30s` / `5m` shortens freshness. It is for deployments whose host does not purge
165
+ its CDN on deploy, or whose loaders genuinely serve mutable public data. It
166
+ changes cache duration only — cookies are still stripped before render, so
167
+ turning it off does not make SSR personalized. There is deliberately no
168
+ per-route or per-request override; that is how one visitor's payload lands in
169
+ another visitor's shared CDN entry.
170
+
154
171
  ## 7. Big payloads and long lists
155
172
 
156
173
  - **Paginate or window** unbounded lists (messages, responses, events, activity).
@@ -176,3 +193,5 @@ enforced contract.
176
193
  - [ ] Unbounded lists are paginated/windowed; large blobs aren't inlined on the hot path.
177
194
  - [ ] SSR HTML/`.data` path stays session-blind and cacheable — no `private`,
178
195
  `no-store`, `Vary: Cookie`, or auth branch added to it.
196
+ - [ ] Mutation-fresh reads go through actions + `useActionQuery`, not SSR loader
197
+ data.
@@ -56,7 +56,29 @@ install → refresh scaffold skills → verify, then fix **app** code only.
56
56
  - Runs `skills update scaffold --project`
57
57
  - Runs `typecheck` when the project has that script
58
58
 
59
- 3. **If upgrade or typecheck fails**
59
+ 3. **Pull upstream template changes (optional, separate from the bump)**
60
+
61
+ `agent-native upgrade` moves package versions. It never touches files that
62
+ were copied out of a template at scaffold time, so template fixes and
63
+ improvements do not arrive with a bump.
64
+
65
+ ```bash
66
+ agent-native template status # recorded ref vs latest, drift counts
67
+ agent-native template diff # what upstream changed, read-only
68
+ agent-native template sync # 3-way merge it into the app
69
+ ```
70
+
71
+ `sync` defaults to the ref matching the installed `@agent-native/core`, so
72
+ run it after `upgrade`. It merges per file against a pristine baseline
73
+ stored in `refs/agent-native/template-baseline/<app-path>`; files upstream
74
+ did not touch are left alone, and real collisions get conflict markers.
75
+ After resolving markers, run `agent-native template accept` — the baseline
76
+ deliberately does not advance past an unresolved merge.
77
+
78
+ Apps scaffolded before provenance existed have no baseline. Create one
79
+ with `agent-native template baseline` before the first sync.
80
+
81
+ 4. **If upgrade or typecheck fails**
60
82
 
61
83
  - Read the concrete error
62
84
  - Fix **app** source, actions, config, or env — not framework packages
@@ -68,7 +90,7 @@ install → refresh scaffold skills → verify, then fix **app** code only.
68
90
  copied component; do not use that path to reproduce framework runtime
69
91
  behavior or hide version skew.
70
92
 
71
- 4. **Dry-run / partial runs**
93
+ 5. **Dry-run / partial runs**
72
94
 
73
95
  ```bash
74
96
  agent-native upgrade --dry-run
@@ -3,6 +3,7 @@ name: visual-answer
3
3
  description: >-
4
4
  Answer code/product questions as visual Plan artifacts using repo, bridge, or
5
5
  GitHub context; use for API specs, UI look, schema models, and architecture.
6
+ scope: dev
6
7
  metadata:
7
8
  visibility: exported
8
9
  ---
@@ -118,10 +118,12 @@ export function agentsBundlePlugin(): Plugin {
118
118
  const rel = path.relative(projectRoot, file);
119
119
  if (!rel.startsWith("..")) {
120
120
  if (rel === "AGENTS.md") return true;
121
- if (rel.endsWith("SKILL.md")) {
122
- for (const skillsDir of TEMPLATE_SKILLS_DIRS) {
123
- if (rel.startsWith(skillsDir + path.sep)) return true;
124
- }
121
+ for (const skillsDir of TEMPLATE_SKILLS_DIRS) {
122
+ // Any file under a skills directory can affect the bundle now —
123
+ // `readSkillsDir` reads reference sub-files (not just SKILL.md)
124
+ // into `Skill.files`, so dev HMR must match that or reference
125
+ // edits go stale until a manual restart.
126
+ if (rel.startsWith(skillsDir + path.sep)) return true;
125
127
  }
126
128
  }
127
129
  // Workspace-core files
@@ -130,8 +132,7 @@ export function agentsBundlePlugin(): Plugin {
130
132
  }
131
133
  if (
132
134
  workspaceSkillsDir &&
133
- file.startsWith(workspaceSkillsDir + path.sep) &&
134
- file.endsWith("SKILL.md")
135
+ file.startsWith(workspaceSkillsDir + path.sep)
135
136
  ) {
136
137
  return true;
137
138
  }
@@ -872,6 +872,7 @@ const CORE_CLIENT_SUBPATHS = [
872
872
  // entry.client.tsx imports from here so it never pulls the full client barrel
873
873
  // (and its transitive ~650-700 KB gzip chat stack) onto the critical path.
874
874
  "@agent-native/core/client/api-path",
875
+ "@agent-native/core/client/clipboard",
875
876
  "@agent-native/core/blocks",
876
877
  "@agent-native/core/blocks/server",
877
878
  "@agent-native/core/client/extensions",
@@ -1265,6 +1266,10 @@ function getCoreSourceAliases(
1265
1266
  coreSrc,
1266
1267
  "client/api-path.ts",
1267
1268
  ),
1269
+ "@agent-native/core/client/clipboard": path.join(
1270
+ coreSrc,
1271
+ "client/clipboard.ts",
1272
+ ),
1268
1273
  "@agent-native/core/blocks": path.join(coreSrc, "client/blocks/index.ts"),
1269
1274
  "@agent-native/core/blocks/server": path.join(
1270
1275
  coreSrc,
@@ -68,11 +68,10 @@ Use the available actions to pull data. Read the relevant `.agents/skills/<provi
68
68
  associated companies/contacts/tickets/notes/emails, Gong call detail, compact
69
69
  transcript excerpts, coverage counts, and gaps. Use targeted `hubspot-records`
70
70
  or `gong-calls` follow-ups only when that bundle leaves a specific gap.
71
- - Structure named deal/account reports like Fusion Analytics: executive summary,
72
- company/deal overview, key contacts and roles, dated timeline, Gong evidence
73
- with call dates/titles, current state, risks/blockers, recommended next steps,
74
- and methodology/gaps. Do not answer from an all-deals dump or Gong metadata
75
- alone.
71
+ - Structure named deal/account reports as: executive summary, company/deal
72
+ overview, key contacts and roles, dated timeline, Gong evidence with call
73
+ dates/titles, current state, risks/blockers, recommended next steps, and
74
+ methodology/gaps. Do not answer from an all-deals dump or Gong metadata alone.
76
75
  - Use action filters such as `query`, `properties`, `objectType`, `company`, and
77
76
  `limit` to narrow results before cross-referencing
78
77
  - For HubSpot deal cohorts, use `hubspot-deals` structured filters (`product`,
@@ -0,0 +1,55 @@
1
+ ---
2
+ name: admin-surfaces
3
+ description: >-
4
+ The /agents admin home for Analytics: fleet feature-flag control plane,
5
+ dashboard usage audit, and connected-app database admin. Use when an admin
6
+ asks about feature flags/rollouts, dashboard usage stats, or connecting
7
+ another agent-native app's database.
8
+ ---
9
+
10
+ # Admin Surfaces (`/agents`)
11
+
12
+ `/agents` is the Analytics home for admin surfaces. The default Monitoring
13
+ view embeds the shared observability dashboard for traces, conversations,
14
+ evals, agent experiments, and feedback.
15
+
16
+ ## Feature Flags (`?view=flags`)
17
+
18
+ `/agents?view=flags` is the sole admin-only fleet feature-flag control plane.
19
+
20
+ - Call `list-workspace-feature-flags` before changing a flag.
21
+ - Preserve each app's explicit state: `unsupported`, `unreachable`,
22
+ `forbidden`, and `unknown-legacy` are unknown states, **never** synonyms for
23
+ off. Do not collapse them to a disabled toggle.
24
+ - Use `set-workspace-feature-flag` for app-qualified changes; target apps
25
+ remain the source of truth and are resolved only through the trusted
26
+ organization directory.
27
+ - Treat only a versioned mutation response whose key, org scope, and
28
+ requested rules match as success. Report a failed target mutation instead
29
+ of claiming the rollout changed.
30
+ - Flags are source-declared booleans; do not create variants, metrics,
31
+ exposure tracking, or per-app management panels.
32
+
33
+ ## Dashboard Usage (`?view=dashboards`)
34
+
35
+ `/agents?view=dashboards` shows the admin-only dashboard usage audit. Call
36
+ `list-dashboard-usage-stats` when admins ask about dashboard created/modified
37
+ dates, owners, last tracked modifier, views, edits, engagements, saved views,
38
+ or cleanup candidates. The dashboard overflow menu shows created/updated
39
+ timestamps and their tracked actors for both SQL and Explorer dashboards.
40
+
41
+ ## Connected Database Admin (`?view=database`)
42
+
43
+ The Advanced menu opens `/agents?view=database`, where organization
44
+ owners/admins can connect other agent-native app databases and use the
45
+ shared database admin tool for table browsing, row editing, and SQL
46
+ inspection. This surface is for connected target app databases, not broad
47
+ access to all Analytics data.
48
+
49
+ Keep future admin additions inside this route instead of adding many
50
+ top-level sidebar tabs.
51
+
52
+ ## Related Skills
53
+
54
+ - Root **feature-flags** (dev-scope) — how to declare and register a flag in
55
+ app code; this skill covers only the Analytics fleet control-plane UI/actions.
@@ -615,6 +615,16 @@ state or tracker context, but docs traffic is not app usage and should not appea
615
615
  as an app/template series. Use a minimum cohort-size threshold for retention
616
616
  rates so one or two identities cannot create misleading 100% or 0% spikes.
617
617
 
618
+ ## Template Catalog And Demo Dashboards
619
+
620
+ `list-dashboard-templates` / `install-dashboard-template` install shipped
621
+ dashboard templates (Node Exporter, the canonical Agent Native observability
622
+ dashboard, etc.), and `ensure-demo-dashboards` auto-installs a per-user demo
623
+ on first app open. See
624
+ `references/template-catalog-and-demo.md` for the canonical-dashboard panel
625
+ rule, Node Exporter template specifics, and the full demo-dashboard lifecycle
626
+ (source routing, env var overrides, tombstoning, reset).
627
+
618
628
  ## Building Large First-Party Dashboards (compose-dashboard)
619
629
 
620
630
  For a **first-party analytics** dashboard, prefer `compose-dashboard` over hand-authoring a big `update-dashboard` config. You name the metrics; the SERVER expands each into a full, validated panel (SQL + chart config) from the shipped metric catalog and saves them in ONE atomic call. This avoids the failure mode where the agent must stream a giant multi-panel `update-dashboard` argument inside the ~40s budget — that big tool-call can't be resumed mid-stream and is all-or-nothing on validation, so the agent thrashes (repeated update-dashboard + tool-search, never landing).