@agent-native/core 0.114.16 → 0.115.1

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 (456) hide show
  1. package/agent-native.eject.json +2 -0
  2. package/corpus/README.md +3 -3
  3. package/corpus/core/CHANGELOG.md +29 -0
  4. package/corpus/core/agent-native.eject.json +2 -0
  5. package/corpus/core/docs/content/agent-native-toolkit.mdx +16 -0
  6. package/corpus/core/docs/content/recurring-jobs.mdx +35 -6
  7. package/corpus/core/export-snapshot.json +4 -0
  8. package/corpus/core/package.json +5 -1
  9. package/corpus/core/src/action.ts +22 -1
  10. package/corpus/core/src/agent/production-agent.ts +105 -3
  11. package/corpus/core/src/cli/templates-meta.ts +12 -0
  12. package/corpus/core/src/client/AssistantChat.tsx +53 -26
  13. package/corpus/core/src/client/agent-page/AgentJobsTab.tsx +19 -0
  14. package/corpus/core/src/client/agent-page/use-jobs.ts +1 -0
  15. package/corpus/core/src/client/chat/message-components.tsx +35 -1
  16. package/corpus/core/src/client/chat/tool-call-display.tsx +38 -3
  17. package/corpus/core/src/connections/catalog.ts +20 -1
  18. package/corpus/core/src/connections/reader.ts +65 -0
  19. package/corpus/core/src/dashboard-storage/index.ts +27 -0
  20. package/corpus/core/src/dashboard-storage/panel-source.ts +168 -0
  21. package/corpus/core/src/dashboard-storage/schema.ts +62 -0
  22. package/corpus/core/src/dashboard-storage/store.ts +333 -0
  23. package/corpus/core/src/deploy/build.ts +95 -16
  24. package/corpus/core/src/eject/provider-api-definitions.ts +1 -0
  25. package/corpus/core/src/eject/workspace-connections.ts +1 -0
  26. package/corpus/core/src/extensions/actions.ts +199 -73
  27. package/corpus/core/src/jobs/actions/list-recurring-jobs.ts +2 -0
  28. package/corpus/core/src/jobs/scheduler.ts +71 -4
  29. package/corpus/core/src/jobs/tools.ts +31 -1
  30. package/corpus/core/src/localization/default-messages.ts +1 -0
  31. package/corpus/core/src/mcp-client/index.ts +6 -0
  32. package/corpus/core/src/provider-api/actions/provider-api.ts +1 -1
  33. package/corpus/core/src/provider-api/index.ts +190 -5
  34. package/corpus/core/src/secrets/register-framework-secrets.ts +8 -0
  35. package/corpus/core/src/server/agent-chat/context-tools.ts +9 -0
  36. package/corpus/core/src/server/agent-chat/framework-prompts.ts +2 -2
  37. package/corpus/core/src/server/agent-chat-plugin.ts +22 -2
  38. package/corpus/core/src/server/core-routes-plugin.ts +1 -0
  39. package/corpus/core/src/server/credential-provider.ts +9 -3
  40. package/corpus/core/src/server/workspace-provider-oauth.ts +181 -4
  41. package/corpus/core/src/styles/agent-native.css +45 -2
  42. package/corpus/core/src/templates/default/.agents/skills/agent-native-docs/SKILL.md +27 -0
  43. package/corpus/core/src/templates/default/.agents/skills/app-branding/SKILL.md +159 -0
  44. package/corpus/core/src/templates/default/.agents/skills/app-permissions/SKILL.md +155 -0
  45. package/corpus/core/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +27 -0
  46. package/corpus/core/src/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +27 -0
  47. package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +31 -18
  48. package/corpus/core/src/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +15 -0
  49. package/corpus/core/src/triggers/actions.ts +11 -2
  50. package/corpus/core/src/triggers/dispatcher.ts +20 -1
  51. package/corpus/core/src/triggers/types.ts +5 -0
  52. package/corpus/core/src/vite/action-types-plugin.ts +9 -1
  53. package/corpus/templates/analytics/.agents/skills/agent-native-docs/SKILL.md +115 -0
  54. package/corpus/templates/analytics/AGENTS.md +11 -11
  55. package/corpus/templates/analytics/_gitignore +39 -0
  56. package/corpus/templates/analytics/actions/query-dashboard-panel.ts +30 -0
  57. package/corpus/templates/analytics/actions/update-dashboard.ts +2 -1
  58. package/corpus/templates/analytics/app/lib/sql-query.ts +11 -25
  59. package/corpus/templates/analytics/changelog/2026-07-21-fixed-extension-updates-failing-before-changes-could-be-appl.md +6 -0
  60. package/corpus/templates/analytics/server/lib/dashboard-panel-query.ts +1 -0
  61. package/corpus/templates/analytics/server/lib/dashboard-panel-source-resolver.ts +51 -0
  62. package/corpus/templates/analytics/server/lib/prometheus.ts +1 -1
  63. package/corpus/templates/analytics/server/plugins/agent-chat.ts +1 -1
  64. package/corpus/templates/assets/.agents/skills/agent-native-docs/SKILL.md +115 -0
  65. package/corpus/templates/brain/.agents/skills/agent-native-docs/SKILL.md +115 -0
  66. package/corpus/templates/calendar/.agents/skills/agent-native-docs/SKILL.md +115 -0
  67. package/corpus/templates/calendar/_gitignore +39 -0
  68. package/corpus/templates/chat/.agents/skills/agent-native-docs/SKILL.md +27 -0
  69. package/corpus/templates/chat/AGENTS.md +1 -1
  70. package/corpus/templates/clips/.agents/skills/agent-native-docs/SKILL.md +115 -0
  71. package/corpus/templates/clips/AGENTS.md +7 -0
  72. package/corpus/templates/clips/actions/prepare-crm-call-evidence.ts +58 -0
  73. package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +88 -11
  74. package/corpus/templates/clips/changelog/2026-07-21-crm-call-evidence-handoff.md +6 -0
  75. package/corpus/templates/clips/changelog/2026-07-21-recording-retries-and-restarts-keep-their-upload-session-so-.md +6 -0
  76. package/corpus/templates/clips/chrome-extension/src/background.ts +20 -5
  77. package/corpus/templates/clips/chrome-extension/src/native-recording-state.ts +19 -0
  78. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +8 -0
  79. package/corpus/templates/clips/desktop/src/overlays/recording-pill.tsx +9 -0
  80. package/corpus/templates/clips/desktop/src-tauri/src/recording_indicator.rs +54 -28
  81. package/corpus/templates/clips/server/plugins/agent-chat.ts +1 -0
  82. package/corpus/templates/content/.agents/skills/agent-native-docs/SKILL.md +115 -0
  83. package/corpus/templates/content/_gitignore +39 -0
  84. package/corpus/templates/content/learnings.defaults.md +5 -0
  85. package/corpus/templates/crm/.agents/skills/agent-native-docs/SKILL.md +115 -0
  86. package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +133 -0
  87. package/corpus/templates/crm/.agents/skills/crm/SKILL.md +128 -0
  88. package/corpus/templates/crm/.agents/skills/customizing-agent-native/SKILL.md +145 -0
  89. package/corpus/templates/crm/.agents/skills/feature-flags/SKILL.md +169 -0
  90. package/corpus/templates/crm/.agents/skills/upgrade-agent-native/SKILL.md +100 -0
  91. package/corpus/templates/crm/.env.example +5 -0
  92. package/corpus/templates/crm/AGENTS.md +120 -0
  93. package/corpus/templates/crm/CHANGELOG.md +1 -0
  94. package/corpus/templates/crm/DEVELOPING.md +66 -0
  95. package/corpus/templates/crm/README.md +106 -0
  96. package/corpus/templates/crm/_gitignore +12 -0
  97. package/corpus/templates/crm/actions/_crm-action-utils.ts +87 -0
  98. package/corpus/templates/crm/actions/_crm-dashboard.ts +69 -0
  99. package/corpus/templates/crm/actions/_crm-signal-utils.ts +79 -0
  100. package/corpus/templates/crm/actions/apply-crm-proposals.ts +203 -0
  101. package/corpus/templates/crm/actions/attach-call-evidence.ts +170 -0
  102. package/corpus/templates/crm/actions/configure-crm-connection.ts +126 -0
  103. package/corpus/templates/crm/actions/configure-native-crm.ts +44 -0
  104. package/corpus/templates/crm/actions/create-crm-record.ts +148 -0
  105. package/corpus/templates/crm/actions/create-crm-signal-tracker.ts +58 -0
  106. package/corpus/templates/crm/actions/delete-staged-dataset.ts +14 -0
  107. package/corpus/templates/crm/actions/get-crm-automation-recipe.ts +36 -0
  108. package/corpus/templates/crm/actions/get-crm-dashboard-panel.ts +33 -0
  109. package/corpus/templates/crm/actions/get-crm-dashboard.ts +14 -0
  110. package/corpus/templates/crm/actions/get-crm-overview.ts +13 -0
  111. package/corpus/templates/crm/actions/get-crm-pipeline-data.ts +61 -0
  112. package/corpus/templates/crm/actions/get-crm-record.ts +75 -0
  113. package/corpus/templates/crm/actions/install-crm-pipeline-dashboard.ts +81 -0
  114. package/corpus/templates/crm/actions/list-crm-dashboard-revisions.ts +15 -0
  115. package/corpus/templates/crm/actions/list-crm-dashboards.ts +15 -0
  116. package/corpus/templates/crm/actions/list-crm-proposals.ts +31 -0
  117. package/corpus/templates/crm/actions/list-crm-records.ts +79 -0
  118. package/corpus/templates/crm/actions/list-crm-saved-views.ts +15 -0
  119. package/corpus/templates/crm/actions/list-crm-signal-hits.ts +43 -0
  120. package/corpus/templates/crm/actions/list-crm-signal-trackers.ts +32 -0
  121. package/corpus/templates/crm/actions/list-crm-tasks.ts +22 -0
  122. package/corpus/templates/crm/actions/list-staged-datasets.ts +14 -0
  123. package/corpus/templates/crm/actions/list-workspace-connections.ts +47 -0
  124. package/corpus/templates/crm/actions/manage-crm-signal-tracker.ts +87 -0
  125. package/corpus/templates/crm/actions/manage-crm-task.ts +132 -0
  126. package/corpus/templates/crm/actions/navigate.ts +63 -0
  127. package/corpus/templates/crm/actions/provider-api-catalog.ts +22 -0
  128. package/corpus/templates/crm/actions/provider-api-docs.ts +54 -0
  129. package/corpus/templates/crm/actions/provider-api-request.ts +92 -0
  130. package/corpus/templates/crm/actions/query-staged-dataset.ts +44 -0
  131. package/corpus/templates/crm/actions/record-crm-call-insight.ts +160 -0
  132. package/corpus/templates/crm/actions/record-crm-smart-signal.ts +150 -0
  133. package/corpus/templates/crm/actions/restore-crm-dashboard-revision.ts +23 -0
  134. package/corpus/templates/crm/actions/review-crm-signal.ts +31 -0
  135. package/corpus/templates/crm/actions/run-crm-saved-view-program.ts +103 -0
  136. package/corpus/templates/crm/actions/run-crm-signal-trackers.ts +275 -0
  137. package/corpus/templates/crm/actions/run.ts +11 -0
  138. package/corpus/templates/crm/actions/save-crm-dashboard.ts +51 -0
  139. package/corpus/templates/crm/actions/save-crm-saved-view.ts +119 -0
  140. package/corpus/templates/crm/actions/sync-crm.ts +146 -0
  141. package/corpus/templates/crm/actions/update-crm-record.ts +508 -0
  142. package/corpus/templates/crm/actions/view-screen.ts +218 -0
  143. package/corpus/templates/crm/agent-native.app-skill.json +58 -0
  144. package/corpus/templates/crm/app/components/crm/CreateCrmRecordDialog.tsx +158 -0
  145. package/corpus/templates/crm/app/components/crm/CrmDashboardPanel.tsx +83 -0
  146. package/corpus/templates/crm/app/components/crm/CrmSignalsPanel.tsx +225 -0
  147. package/corpus/templates/crm/app/components/crm/IntelligenceSettings.tsx +413 -0
  148. package/corpus/templates/crm/app/components/crm/RecordActions.tsx +510 -0
  149. package/corpus/templates/crm/app/components/crm/RecordGrid.tsx +134 -0
  150. package/corpus/templates/crm/app/components/crm/RecordWorkspace.tsx +367 -0
  151. package/corpus/templates/crm/app/components/crm/SavedViewDataProgram.tsx +92 -0
  152. package/corpus/templates/crm/app/components/crm/Surface.tsx +96 -0
  153. package/corpus/templates/crm/app/components/crm/WorkOverview.tsx +180 -0
  154. package/corpus/templates/crm/app/components/layout/CrmLayout.tsx +106 -0
  155. package/corpus/templates/crm/app/components/layout/CrmSidebar.tsx +84 -0
  156. package/corpus/templates/crm/app/entry.client.tsx +16 -0
  157. package/corpus/templates/crm/app/entry.server.tsx +10 -0
  158. package/corpus/templates/crm/app/global.css +167 -0
  159. package/corpus/templates/crm/app/hooks/use-navigation-state.ts +60 -0
  160. package/corpus/templates/crm/app/i18n/en-US.ts +89 -0
  161. package/corpus/templates/crm/app/i18n/index.ts +34 -0
  162. package/corpus/templates/crm/app/lib/dashboard.ts +13 -0
  163. package/corpus/templates/crm/app/lib/navigation.ts +54 -0
  164. package/corpus/templates/crm/app/lib/tab-id.ts +1 -0
  165. package/corpus/templates/crm/app/lib/types.ts +172 -0
  166. package/corpus/templates/crm/app/lib/utils.ts +1 -0
  167. package/corpus/templates/crm/app/root.tsx +88 -0
  168. package/corpus/templates/crm/app/routes/_index.tsx +26 -0
  169. package/corpus/templates/crm/app/routes/accounts.tsx +41 -0
  170. package/corpus/templates/crm/app/routes/agent.tsx +5 -0
  171. package/corpus/templates/crm/app/routes/ask.tsx +53 -0
  172. package/corpus/templates/crm/app/routes/dashboard.tsx +118 -0
  173. package/corpus/templates/crm/app/routes/opportunities.tsx +41 -0
  174. package/corpus/templates/crm/app/routes/people.tsx +41 -0
  175. package/corpus/templates/crm/app/routes/proposals.tsx +266 -0
  176. package/corpus/templates/crm/app/routes/records.$recordId.tsx +35 -0
  177. package/corpus/templates/crm/app/routes/settings.tsx +63 -0
  178. package/corpus/templates/crm/app/routes/setup.tsx +308 -0
  179. package/corpus/templates/crm/app/routes/tasks.tsx +252 -0
  180. package/corpus/templates/crm/app/routes/views.tsx +333 -0
  181. package/corpus/templates/crm/app/routes.ts +17 -0
  182. package/corpus/templates/crm/app/vite-env.d.ts +6 -0
  183. package/corpus/templates/crm/changelog/2026-07-21-agent-native-crm.md +6 -0
  184. package/corpus/templates/crm/changelog/2026-07-21-clips-call-evidence-review-recipe.md +6 -0
  185. package/corpus/templates/crm/changelog/2026-07-21-crm-can-now-find-and-review-evidence-grounded-call-signals-w.md +6 -0
  186. package/corpus/templates/crm/changelog/2026-07-21-crm-can-now-manage-keyword-and-smart-call-signal-trackers-fr.md +6 -0
  187. package/corpus/templates/crm/changelog/2026-07-21-delegated-local-crm-automation.md +6 -0
  188. package/corpus/templates/crm/changelog/2026-07-21-native-sql.md +6 -0
  189. package/corpus/templates/crm/changelog/2026-07-21-pipeline-dashboard.md +6 -0
  190. package/corpus/templates/crm/changelog/2026-07-21-pipeline-dashboards-now-install-correctly-from-the-crm-actio.md +6 -0
  191. package/corpus/templates/crm/changelog/2026-07-21-salesforce-connection.md +6 -0
  192. package/corpus/templates/crm/components.json +20 -0
  193. package/corpus/templates/crm/docs/architecture/crm-contract.md +180 -0
  194. package/corpus/templates/crm/learnings.defaults.md +5 -0
  195. package/corpus/templates/crm/package.json +59 -0
  196. package/corpus/templates/crm/public/favicon.svg +1 -0
  197. package/corpus/templates/crm/public/icon-180.svg +1 -0
  198. package/corpus/templates/crm/public/manifest.json +11 -0
  199. package/corpus/templates/crm/react-router.config.ts +7 -0
  200. package/corpus/templates/crm/server/crm/adapter.ts +32 -0
  201. package/corpus/templates/crm/server/crm/crm-field-firewall.ts +64 -0
  202. package/corpus/templates/crm/server/crm/crm-mirror.ts +711 -0
  203. package/corpus/templates/crm/server/crm/hubspot-adapter.ts +1143 -0
  204. package/corpus/templates/crm/server/crm/native-adapter.ts +1715 -0
  205. package/corpus/templates/crm/server/crm/read-through.ts +207 -0
  206. package/corpus/templates/crm/server/crm/salesforce-adapter.ts +1255 -0
  207. package/corpus/templates/crm/server/db/crm-store.ts +1170 -0
  208. package/corpus/templates/crm/server/db/index.ts +169 -0
  209. package/corpus/templates/crm/server/db/schema.ts +441 -0
  210. package/corpus/templates/crm/server/lib/intelligence/default-detectors.ts +65 -0
  211. package/corpus/templates/crm/server/lib/intelligence/evidence.ts +105 -0
  212. package/corpus/templates/crm/server/lib/intelligence/keyword-detector.ts +100 -0
  213. package/corpus/templates/crm/server/lib/intelligence/smart-detector.ts +144 -0
  214. package/corpus/templates/crm/server/lib/intelligence/summary.ts +141 -0
  215. package/corpus/templates/crm/server/lib/provider-api.ts +64 -0
  216. package/corpus/templates/crm/server/middleware/auth.ts +4 -0
  217. package/corpus/templates/crm/server/plugins/agent-chat.ts +68 -0
  218. package/corpus/templates/crm/server/plugins/auth.ts +14 -0
  219. package/corpus/templates/crm/server/plugins/core-routes.ts +17 -0
  220. package/corpus/templates/crm/server/plugins/db.ts +454 -0
  221. package/corpus/templates/crm/server/routes/[...page].get.ts +5 -0
  222. package/corpus/templates/crm/shared/crm-automation-recipes.ts +132 -0
  223. package/corpus/templates/crm/shared/crm-contract.ts +254 -0
  224. package/corpus/templates/crm/shared/crm-sales-config.ts +63 -0
  225. package/corpus/templates/crm/ssr-entry.ts +11 -0
  226. package/corpus/templates/crm/tsconfig.json +24 -0
  227. package/corpus/templates/crm/vite.config.ts +15 -0
  228. package/corpus/templates/crm/vitest.config.ts +5 -0
  229. package/corpus/templates/design/.agents/skills/agent-native-docs/SKILL.md +115 -0
  230. package/corpus/templates/dispatch/.agents/skills/agent-native-docs/SKILL.md +115 -0
  231. package/corpus/templates/forms/.agents/skills/agent-native-docs/SKILL.md +115 -0
  232. package/corpus/templates/forms/_gitignore +39 -0
  233. package/corpus/templates/forms/learnings.defaults.md +5 -0
  234. package/corpus/templates/macros/.agents/skills/agent-native-docs/SKILL.md +115 -0
  235. package/corpus/templates/macros/_gitignore +39 -0
  236. package/corpus/templates/macros/learnings.defaults.md +5 -0
  237. package/corpus/templates/mail/.agents/skills/agent-native-docs/SKILL.md +115 -0
  238. package/corpus/templates/mail/_gitignore +39 -0
  239. package/corpus/templates/plan/.agents/skills/agent-native-docs/SKILL.md +115 -0
  240. package/corpus/templates/slides/.agents/skills/agent-native-docs/SKILL.md +115 -0
  241. package/corpus/templates/slides/_gitignore +39 -0
  242. package/corpus/templates/tasks/.agents/skills/agent-native-docs/SKILL.md +27 -0
  243. package/corpus/templates/tasks/_gitignore +39 -0
  244. package/corpus/toolkit/CHANGELOG.md +12 -0
  245. package/corpus/toolkit/README.md +30 -0
  246. package/corpus/toolkit/agent-native.eject.json +33 -0
  247. package/corpus/toolkit/package.json +15 -1
  248. package/corpus/toolkit/src/dashboard/DataTable.tsx +273 -0
  249. package/corpus/toolkit/src/dashboard/DateRangePicker.tsx +57 -0
  250. package/corpus/toolkit/src/dashboard/GenericChartPanel.tsx +461 -0
  251. package/corpus/toolkit/src/dashboard/MetricCard.tsx +54 -0
  252. package/corpus/toolkit/src/dashboard/StatsCard.tsx +49 -0
  253. package/corpus/toolkit/src/dashboard/dashboard-layout.ts +329 -0
  254. package/corpus/toolkit/src/dashboard/index.ts +6 -0
  255. package/corpus/toolkit/src/index.ts +1 -0
  256. package/corpus/toolkit/src/ui/calendar.tsx +8 -8
  257. package/corpus/toolkit/src/ui/date-picker.tsx +4 -1
  258. package/dist/action.d.ts +14 -1
  259. package/dist/action.d.ts.map +1 -1
  260. package/dist/action.js.map +1 -1
  261. package/dist/agent/production-agent.d.ts +3 -1
  262. package/dist/agent/production-agent.d.ts.map +1 -1
  263. package/dist/agent/production-agent.js +83 -3
  264. package/dist/agent/production-agent.js.map +1 -1
  265. package/dist/cli/templates-meta.d.ts.map +1 -1
  266. package/dist/cli/templates-meta.js +12 -0
  267. package/dist/cli/templates-meta.js.map +1 -1
  268. package/dist/client/AssistantChat.d.ts +4 -0
  269. package/dist/client/AssistantChat.d.ts.map +1 -1
  270. package/dist/client/AssistantChat.js +30 -17
  271. package/dist/client/AssistantChat.js.map +1 -1
  272. package/dist/client/agent-page/AgentJobsTab.d.ts.map +1 -1
  273. package/dist/client/agent-page/AgentJobsTab.js +3 -1
  274. package/dist/client/agent-page/AgentJobsTab.js.map +1 -1
  275. package/dist/client/agent-page/use-jobs.d.ts +1 -0
  276. package/dist/client/agent-page/use-jobs.d.ts.map +1 -1
  277. package/dist/client/agent-page/use-jobs.js.map +1 -1
  278. package/dist/client/chat/message-components.d.ts +5 -0
  279. package/dist/client/chat/message-components.d.ts.map +1 -1
  280. package/dist/client/chat/message-components.js +17 -1
  281. package/dist/client/chat/message-components.js.map +1 -1
  282. package/dist/client/chat/tool-call-display.d.ts +3 -1
  283. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  284. package/dist/client/chat/tool-call-display.js +17 -7
  285. package/dist/client/chat/tool-call-display.js.map +1 -1
  286. package/dist/collab/awareness.d.ts +2 -2
  287. package/dist/collab/awareness.d.ts.map +1 -1
  288. package/dist/collab/routes.d.ts +1 -1
  289. package/dist/collab/struct-routes.d.ts +1 -1
  290. package/dist/connections/catalog.d.ts +17 -3
  291. package/dist/connections/catalog.d.ts.map +1 -1
  292. package/dist/connections/catalog.js +16 -1
  293. package/dist/connections/catalog.js.map +1 -1
  294. package/dist/connections/reader.d.ts +18 -0
  295. package/dist/connections/reader.d.ts.map +1 -1
  296. package/dist/connections/reader.js +41 -0
  297. package/dist/connections/reader.js.map +1 -1
  298. package/dist/dashboard-storage/index.d.ts +4 -0
  299. package/dist/dashboard-storage/index.d.ts.map +1 -0
  300. package/dist/dashboard-storage/index.js +4 -0
  301. package/dist/dashboard-storage/index.js.map +1 -0
  302. package/dist/dashboard-storage/panel-source.d.ts +68 -0
  303. package/dist/dashboard-storage/panel-source.d.ts.map +1 -0
  304. package/dist/dashboard-storage/panel-source.js +76 -0
  305. package/dist/dashboard-storage/panel-source.js.map +1 -0
  306. package/dist/dashboard-storage/schema.d.ts +562 -0
  307. package/dist/dashboard-storage/schema.d.ts.map +1 -0
  308. package/dist/dashboard-storage/schema.js +32 -0
  309. package/dist/dashboard-storage/schema.js.map +1 -0
  310. package/dist/dashboard-storage/store.d.ts +62 -0
  311. package/dist/dashboard-storage/store.d.ts.map +1 -0
  312. package/dist/dashboard-storage/store.js +227 -0
  313. package/dist/dashboard-storage/store.js.map +1 -0
  314. package/dist/deploy/build.d.ts +7 -0
  315. package/dist/deploy/build.d.ts.map +1 -1
  316. package/dist/deploy/build.js +78 -14
  317. package/dist/deploy/build.js.map +1 -1
  318. package/dist/eject/provider-api-definitions.d.ts +2 -1
  319. package/dist/eject/provider-api-definitions.d.ts.map +1 -1
  320. package/dist/eject/provider-api-definitions.js +1 -0
  321. package/dist/eject/provider-api-definitions.js.map +1 -1
  322. package/dist/eject/workspace-connections.d.ts.map +1 -1
  323. package/dist/eject/workspace-connections.js +1 -0
  324. package/dist/eject/workspace-connections.js.map +1 -1
  325. package/dist/extensions/actions.d.ts.map +1 -1
  326. package/dist/extensions/actions.js +165 -67
  327. package/dist/extensions/actions.js.map +1 -1
  328. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  329. package/dist/jobs/actions/list-recurring-jobs.d.ts +1 -0
  330. package/dist/jobs/actions/list-recurring-jobs.d.ts.map +1 -1
  331. package/dist/jobs/actions/list-recurring-jobs.js +1 -0
  332. package/dist/jobs/actions/list-recurring-jobs.js.map +1 -1
  333. package/dist/jobs/scheduler.d.ts +17 -2
  334. package/dist/jobs/scheduler.d.ts.map +1 -1
  335. package/dist/jobs/scheduler.js +51 -2
  336. package/dist/jobs/scheduler.js.map +1 -1
  337. package/dist/jobs/tools.d.ts.map +1 -1
  338. package/dist/jobs/tools.js +32 -2
  339. package/dist/jobs/tools.js.map +1 -1
  340. package/dist/localization/default-messages.d.ts +1 -0
  341. package/dist/localization/default-messages.d.ts.map +1 -1
  342. package/dist/localization/default-messages.js +1 -0
  343. package/dist/localization/default-messages.js.map +1 -1
  344. package/dist/mcp-client/index.d.ts +2 -0
  345. package/dist/mcp-client/index.d.ts.map +1 -1
  346. package/dist/mcp-client/index.js +5 -0
  347. package/dist/mcp-client/index.js.map +1 -1
  348. package/dist/notifications/routes.d.ts +3 -3
  349. package/dist/observability/routes.d.ts +5 -5
  350. package/dist/provider-api/actions/custom-provider-registration.d.ts +8 -8
  351. package/dist/provider-api/actions/provider-api.d.ts +8 -6
  352. package/dist/provider-api/actions/provider-api.d.ts.map +1 -1
  353. package/dist/provider-api/actions/provider-api.js +1 -1
  354. package/dist/provider-api/actions/provider-api.js.map +1 -1
  355. package/dist/provider-api/index.d.ts +11 -7
  356. package/dist/provider-api/index.d.ts.map +1 -1
  357. package/dist/provider-api/index.js +143 -5
  358. package/dist/provider-api/index.js.map +1 -1
  359. package/dist/resources/handlers.d.ts +1 -1
  360. package/dist/secrets/register-framework-secrets.d.ts.map +1 -1
  361. package/dist/secrets/register-framework-secrets.js +7 -0
  362. package/dist/secrets/register-framework-secrets.js.map +1 -1
  363. package/dist/secrets/routes.d.ts +9 -9
  364. package/dist/server/agent-chat/context-tools.d.ts.map +1 -1
  365. package/dist/server/agent-chat/context-tools.js +9 -0
  366. package/dist/server/agent-chat/context-tools.js.map +1 -1
  367. package/dist/server/agent-chat/framework-prompts.js +2 -2
  368. package/dist/server/agent-chat/framework-prompts.js.map +1 -1
  369. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  370. package/dist/server/agent-chat-plugin.js +18 -2
  371. package/dist/server/agent-chat-plugin.js.map +1 -1
  372. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  373. package/dist/server/core-routes-plugin.js +1 -0
  374. package/dist/server/core-routes-plugin.js.map +1 -1
  375. package/dist/server/credential-provider.d.ts +4 -3
  376. package/dist/server/credential-provider.d.ts.map +1 -1
  377. package/dist/server/credential-provider.js +9 -3
  378. package/dist/server/credential-provider.js.map +1 -1
  379. package/dist/server/transcribe-voice.d.ts +1 -1
  380. package/dist/server/workspace-provider-oauth.d.ts +6 -1
  381. package/dist/server/workspace-provider-oauth.d.ts.map +1 -1
  382. package/dist/server/workspace-provider-oauth.js +141 -4
  383. package/dist/server/workspace-provider-oauth.js.map +1 -1
  384. package/dist/styles/agent-native.css +45 -2
  385. package/dist/templates/chat/.agents/skills/agent-native-docs/SKILL.md +27 -0
  386. package/dist/templates/chat/AGENTS.md +1 -1
  387. package/dist/templates/default/.agents/skills/agent-native-docs/SKILL.md +27 -0
  388. package/dist/templates/default/.agents/skills/app-branding/SKILL.md +159 -0
  389. package/dist/templates/default/.agents/skills/app-permissions/SKILL.md +155 -0
  390. package/dist/templates/headless/.agents/skills/agent-native-docs/SKILL.md +27 -0
  391. package/dist/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +27 -0
  392. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +31 -18
  393. package/dist/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +15 -0
  394. package/dist/triggers/actions.d.ts.map +1 -1
  395. package/dist/triggers/actions.js +10 -2
  396. package/dist/triggers/actions.js.map +1 -1
  397. package/dist/triggers/dispatcher.d.ts.map +1 -1
  398. package/dist/triggers/dispatcher.js +15 -0
  399. package/dist/triggers/dispatcher.js.map +1 -1
  400. package/dist/triggers/types.d.ts +5 -0
  401. package/dist/triggers/types.d.ts.map +1 -1
  402. package/dist/triggers/types.js.map +1 -1
  403. package/dist/vite/action-types-plugin.d.ts.map +1 -1
  404. package/dist/vite/action-types-plugin.js +4 -1
  405. package/dist/vite/action-types-plugin.js.map +1 -1
  406. package/docs/content/agent-native-toolkit.mdx +16 -0
  407. package/docs/content/recurring-jobs.mdx +35 -6
  408. package/package.json +6 -2
  409. package/src/action.ts +22 -1
  410. package/src/agent/production-agent.ts +105 -3
  411. package/src/cli/templates-meta.ts +12 -0
  412. package/src/client/AssistantChat.tsx +53 -26
  413. package/src/client/agent-page/AgentJobsTab.tsx +19 -0
  414. package/src/client/agent-page/use-jobs.ts +1 -0
  415. package/src/client/chat/message-components.tsx +35 -1
  416. package/src/client/chat/tool-call-display.tsx +38 -3
  417. package/src/connections/catalog.ts +20 -1
  418. package/src/connections/reader.ts +65 -0
  419. package/src/dashboard-storage/index.ts +27 -0
  420. package/src/dashboard-storage/panel-source.ts +168 -0
  421. package/src/dashboard-storage/schema.ts +62 -0
  422. package/src/dashboard-storage/store.ts +333 -0
  423. package/src/deploy/build.ts +95 -16
  424. package/src/eject/provider-api-definitions.ts +1 -0
  425. package/src/eject/workspace-connections.ts +1 -0
  426. package/src/extensions/actions.ts +199 -73
  427. package/src/jobs/actions/list-recurring-jobs.ts +2 -0
  428. package/src/jobs/scheduler.ts +71 -4
  429. package/src/jobs/tools.ts +31 -1
  430. package/src/localization/default-messages.ts +1 -0
  431. package/src/mcp-client/index.ts +6 -0
  432. package/src/provider-api/actions/provider-api.ts +1 -1
  433. package/src/provider-api/index.ts +190 -5
  434. package/src/secrets/register-framework-secrets.ts +8 -0
  435. package/src/server/agent-chat/context-tools.ts +9 -0
  436. package/src/server/agent-chat/framework-prompts.ts +2 -2
  437. package/src/server/agent-chat-plugin.ts +22 -2
  438. package/src/server/core-routes-plugin.ts +1 -0
  439. package/src/server/credential-provider.ts +9 -3
  440. package/src/server/workspace-provider-oauth.ts +181 -4
  441. package/src/styles/agent-native.css +45 -2
  442. package/src/templates/chat/.agents/skills/agent-native-docs/SKILL.md +27 -0
  443. package/src/templates/chat/AGENTS.md +1 -1
  444. package/src/templates/default/.agents/skills/agent-native-docs/SKILL.md +27 -0
  445. package/src/templates/default/.agents/skills/app-branding/SKILL.md +159 -0
  446. package/src/templates/default/.agents/skills/app-permissions/SKILL.md +155 -0
  447. package/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +27 -0
  448. package/src/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +27 -0
  449. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +31 -18
  450. package/src/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +15 -0
  451. package/src/triggers/actions.ts +11 -2
  452. package/src/triggers/dispatcher.ts +20 -1
  453. package/src/triggers/types.ts +5 -0
  454. package/src/vite/action-types-plugin.ts +9 -1
  455. package/corpus/templates/analytics/server/handlers/sql-query.ts +0 -36
  456. package/corpus/templates/analytics/server/routes/api/sql-query.post.ts +0 -1
@@ -39,6 +39,7 @@ export type GenericWorkspaceOAuthProvider =
39
39
  | "google_drive"
40
40
  | "github"
41
41
  | "hubspot"
42
+ | "salesforce"
42
43
  | "jira"
43
44
  | "sentry"
44
45
  | "notion";
@@ -48,6 +49,7 @@ const SUPPORTED_PROVIDERS = new Set<GenericWorkspaceOAuthProvider>([
48
49
  "google_drive",
49
50
  "github",
50
51
  "hubspot",
52
+ "salesforce",
51
53
  "jira",
52
54
  "sentry",
53
55
  "notion",
@@ -55,6 +57,8 @@ const SUPPORTED_PROVIDERS = new Set<GenericWorkspaceOAuthProvider>([
55
57
  const FLOW_TTL_SECONDS = 10 * 60;
56
58
  const PROVIDER_REQUEST_TIMEOUT_MS = 10_000;
57
59
  const PROVIDER_RESPONSE_MAX_BYTES = 256 * 1024;
60
+ const SALESFORCE_PRODUCTION_LOGIN_URL = "https://login.salesforce.com";
61
+ const SALESFORCE_SANDBOX_LOGIN_URL = "https://test.salesforce.com";
58
62
 
59
63
  export interface WorkspaceProviderOAuthFlow {
60
64
  provider: GenericWorkspaceOAuthProvider;
@@ -64,6 +68,7 @@ export interface WorkspaceProviderOAuthFlow {
64
68
  owner: string;
65
69
  orgId?: string;
66
70
  appId: string;
71
+ salesforceLoginUrl?: string;
67
72
  expiresAt: number;
68
73
  }
69
74
 
@@ -112,6 +117,14 @@ export async function handleWorkspaceProviderOAuthStart(
112
117
  }
113
118
  const provider = requiredProvider(providerId);
114
119
  const query = getQuery(event);
120
+ const salesforceLoginUrl =
121
+ providerId === "salesforce"
122
+ ? resolveSalesforceOAuthLoginUrl(text(query.environment))
123
+ : undefined;
124
+ if (providerId === "salesforce" && !salesforceLoginUrl) {
125
+ setResponseStatus(event, 400);
126
+ return { error: "Salesforce environment must be production or sandbox." };
127
+ }
115
128
  const appId = normalizeAppId(
116
129
  text(query.appId) ??
117
130
  process.env.AGENT_NATIVE_WORKSPACE_APP_ID ??
@@ -163,6 +176,7 @@ export async function handleWorkspaceProviderOAuthStart(
163
176
  owner: session.email,
164
177
  orgId,
165
178
  appId,
179
+ ...(salesforceLoginUrl ? { salesforceLoginUrl } : {}),
166
180
  expiresAt: Date.now() + FLOW_TTL_SECONDS * 1_000,
167
181
  };
168
182
  setCookie(
@@ -183,6 +197,14 @@ export async function handleWorkspaceProviderOAuthStart(
183
197
  redirectUri,
184
198
  state,
185
199
  challenge,
200
+ ...(salesforceLoginUrl
201
+ ? {
202
+ authorizationUrl: salesforceOAuthEndpoint(
203
+ salesforceLoginUrl,
204
+ "authorize",
205
+ ),
206
+ }
207
+ : {}),
186
208
  });
187
209
  return Response.redirect(authorizationUrl, 302);
188
210
  },
@@ -259,6 +281,14 @@ export async function handleWorkspaceProviderOAuthCallback(
259
281
  code,
260
282
  verifier: flow.verifier,
261
283
  redirectUri: flow.redirectUri,
284
+ ...(providerId === "salesforce"
285
+ ? {
286
+ tokenUrl: salesforceOAuthEndpoint(
287
+ flow.salesforceLoginUrl ?? SALESFORCE_PRODUCTION_LOGIN_URL,
288
+ "token",
289
+ ),
290
+ }
291
+ : {}),
262
292
  });
263
293
  const identities = await resolveWorkspaceProviderIdentities(
264
294
  providerId,
@@ -299,10 +329,18 @@ export async function handleWorkspaceProviderOAuthCallback(
299
329
  );
300
330
  const connectionConfig = {
301
331
  credentialMode: "oauth",
302
- ...(providerId === "hubspot" || providerId === "jira"
332
+ ...(providerId === "hubspot" ||
333
+ providerId === "salesforce" ||
334
+ providerId === "jira"
303
335
  ? { externalAccountId: identity.accountId }
304
336
  : {}),
305
337
  ...(identity.config ?? {}),
338
+ ...(providerId === "salesforce"
339
+ ? {
340
+ salesforceLoginUrl:
341
+ flow.salesforceLoginUrl ?? SALESFORCE_PRODUCTION_LOGIN_URL,
342
+ }
343
+ : {}),
306
344
  };
307
345
  const connection = await upsertWorkspaceConnection({
308
346
  ...(existing ? { id: existing.id } : {}),
@@ -339,10 +377,13 @@ export function buildWorkspaceProviderAuthorizationUrl(input: {
339
377
  redirectUri: string;
340
378
  state: string;
341
379
  challenge: string;
380
+ authorizationUrl?: string;
342
381
  }): string {
343
382
  if (!input.provider.oauth)
344
383
  throw new Error("Provider does not support OAuth.");
345
- const url = new URL(input.provider.oauth.authorizationUrl);
384
+ const url = new URL(
385
+ input.authorizationUrl ?? input.provider.oauth.authorizationUrl,
386
+ );
346
387
  url.searchParams.set("client_id", input.clientId);
347
388
  url.searchParams.set("redirect_uri", input.redirectUri);
348
389
  url.searchParams.set("response_type", "code");
@@ -378,8 +419,9 @@ export async function exchangeWorkspaceProviderOAuthCode(input: {
378
419
  code: string;
379
420
  verifier: string;
380
421
  redirectUri: string;
422
+ tokenUrl?: string;
381
423
  }): Promise<Record<string, unknown>> {
382
- const tokenUrl = input.provider.oauth?.tokenUrl;
424
+ const tokenUrl = input.tokenUrl ?? input.provider.oauth?.tokenUrl;
383
425
  if (!tokenUrl) throw new Error("Provider does not support OAuth.");
384
426
  const authorization = `Basic ${Buffer.from(`${input.clientId}:${input.clientSecret}`).toString("base64")}`;
385
427
  if (input.providerId === "github") {
@@ -444,6 +486,36 @@ export async function exchangeWorkspaceProviderOAuthCode(input: {
444
486
  : {}),
445
487
  };
446
488
  }
489
+ if (input.providerId === "salesforce") {
490
+ const { response, body } = await fetchBoundedProviderJson(
491
+ tokenUrl,
492
+ {
493
+ method: "POST",
494
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
495
+ body: new URLSearchParams({
496
+ grant_type: "authorization_code",
497
+ client_id: input.clientId,
498
+ client_secret: input.clientSecret,
499
+ code: input.code,
500
+ redirect_uri: input.redirectUri,
501
+ }),
502
+ },
503
+ input.provider.label,
504
+ );
505
+ const accessToken = text(body.access_token);
506
+ if (!response.ok || !accessToken) {
507
+ throw new Error(
508
+ `${input.provider.label} OAuth token exchange failed (${response.status}).`,
509
+ );
510
+ }
511
+ const expiresIn = Number(body.expires_in);
512
+ return {
513
+ ...body,
514
+ ...(Number.isFinite(expiresIn) && expiresIn > 0
515
+ ? { expiry_date: Date.now() + expiresIn * 1_000 }
516
+ : {}),
517
+ };
518
+ }
447
519
  if (input.providerId === "jira") {
448
520
  const { response, body } = await fetchBoundedProviderJsonValue(
449
521
  tokenUrl,
@@ -679,6 +751,26 @@ async function resolveWorkspaceProviderIdentitySingle(
679
751
  label: text(body.hub_domain) ?? `HubSpot portal ${accountId}`,
680
752
  };
681
753
  }
754
+ if (providerId === "salesforce") {
755
+ const instanceUrl = normalizeSalesforceInstanceUrl(
756
+ text(tokens.instance_url),
757
+ );
758
+ const identity = parseSalesforceIdentityUrl(text(tokens.id));
759
+ if (!instanceUrl || !identity) {
760
+ throw new Error(
761
+ "Salesforce OAuth response did not identify the connected organization.",
762
+ );
763
+ }
764
+ return {
765
+ accountId: identity.organizationId,
766
+ label: instanceUrl.hostname,
767
+ config: {
768
+ salesforceInstanceUrl: instanceUrl.origin,
769
+ salesforceIdentityUrl: identity.url.href,
770
+ salesforceOrganizationId: identity.organizationId,
771
+ },
772
+ };
773
+ }
682
774
  if (providerId === "sentry") {
683
775
  const accessToken = text(tokens.access_token)!;
684
776
  const { response, body: user } = await fetchBoundedProviderJson(
@@ -799,7 +891,13 @@ export function scopedOAuthAccountId(
799
891
  owner: string,
800
892
  accountId: string,
801
893
  ): string {
802
- if (provider !== "hubspot" && provider !== "jira") return accountId;
894
+ if (
895
+ provider !== "hubspot" &&
896
+ provider !== "salesforce" &&
897
+ provider !== "jira"
898
+ ) {
899
+ return accountId;
900
+ }
803
901
  const ownerKey = crypto
804
902
  .createHash("sha256")
805
903
  .update(`${provider}:${owner.trim().toLowerCase()}`)
@@ -902,9 +1000,88 @@ function clientCredentialKeys(
902
1000
  const integrationPrefix = `HUBSPOT_INTEGRATION_CLIENT_${suffix}`;
903
1001
  return [integrationPrefix, `HUBSPOT_CLIENT_${suffix}`];
904
1002
  }
1003
+ if (provider === "salesforce") {
1004
+ const integrationPrefix = `SALESFORCE_INTEGRATION_CLIENT_${suffix}`;
1005
+ const consumerCredential = `SALESFORCE_CONSUMER_${
1006
+ field === "id" ? "KEY" : "SECRET"
1007
+ }`;
1008
+ return [
1009
+ integrationPrefix,
1010
+ `SALESFORCE_CLIENT_${suffix}`,
1011
+ consumerCredential,
1012
+ ];
1013
+ }
905
1014
  return [`${prefix}_CLIENT_${suffix}`];
906
1015
  }
907
1016
 
1017
+ function normalizeSalesforceInstanceUrl(value: string | undefined): URL | null {
1018
+ if (!value) return null;
1019
+ try {
1020
+ const url = new URL(value);
1021
+ const host = url.hostname.toLowerCase();
1022
+ if (
1023
+ url.protocol !== "https:" ||
1024
+ url.username ||
1025
+ url.password ||
1026
+ url.port ||
1027
+ (host !== "salesforce.com" && !host.endsWith(".salesforce.com"))
1028
+ ) {
1029
+ return null;
1030
+ }
1031
+ return new URL(url.origin);
1032
+ } catch {
1033
+ return null;
1034
+ }
1035
+ }
1036
+
1037
+ function parseSalesforceIdentityUrl(
1038
+ value: string | undefined,
1039
+ ): { organizationId: string; url: URL } | null {
1040
+ if (!value) return null;
1041
+ try {
1042
+ const url = new URL(value);
1043
+ const host = url.hostname.toLowerCase();
1044
+ if (
1045
+ url.protocol !== "https:" ||
1046
+ url.username ||
1047
+ url.password ||
1048
+ url.port ||
1049
+ (host !== "salesforce.com" && !host.endsWith(".salesforce.com"))
1050
+ ) {
1051
+ return null;
1052
+ }
1053
+ const match = url.pathname.match(/^\/id\/([^/]+)\/[^/]+\/?$/);
1054
+ if (!match?.[1]) return null;
1055
+ return { organizationId: match[1], url };
1056
+ } catch {
1057
+ return null;
1058
+ }
1059
+ }
1060
+
1061
+ export function resolveSalesforceOAuthLoginUrl(
1062
+ environment: string | undefined,
1063
+ ): string | null {
1064
+ const normalized = environment?.trim().toLowerCase();
1065
+ if (!normalized || normalized === "production") {
1066
+ return SALESFORCE_PRODUCTION_LOGIN_URL;
1067
+ }
1068
+ if (normalized === "sandbox") return SALESFORCE_SANDBOX_LOGIN_URL;
1069
+ return null;
1070
+ }
1071
+
1072
+ export function salesforceOAuthEndpoint(
1073
+ loginUrl: string,
1074
+ phase: "authorize" | "token",
1075
+ ): string {
1076
+ if (
1077
+ loginUrl !== SALESFORCE_PRODUCTION_LOGIN_URL &&
1078
+ loginUrl !== SALESFORCE_SANDBOX_LOGIN_URL
1079
+ ) {
1080
+ throw new Error("Invalid Salesforce OAuth login URL.");
1081
+ }
1082
+ return `${loginUrl}/services/oauth2/${phase}`;
1083
+ }
1084
+
908
1085
  async function resolveProviderClientCredentials(
909
1086
  provider: GenericWorkspaceOAuthProvider,
910
1087
  ): Promise<[string | null, string | null]> {
@@ -771,6 +771,7 @@
771
771
 
772
772
  .agent-composer-missing-key-trigger {
773
773
  display: flex;
774
+ cursor: pointer;
774
775
  min-height: 4.5rem;
775
776
  width: 100%;
776
777
  flex: 1;
@@ -783,6 +784,9 @@
783
784
  text-align: start;
784
785
  color: hsl(var(--foreground));
785
786
  outline: none;
787
+ transition:
788
+ background-color 150ms ease-out,
789
+ box-shadow 150ms ease-out;
786
790
  }
787
791
 
788
792
  .agent-composer-missing-key-trigger:hover {
@@ -793,6 +797,14 @@
793
797
  box-shadow: inset 0 0 0 2px hsl(var(--ring));
794
798
  }
795
799
 
800
+ .agent-composer-missing-key-content {
801
+ display: flex;
802
+ min-width: 0;
803
+ flex-direction: column;
804
+ align-items: flex-start;
805
+ gap: 0.5rem;
806
+ }
807
+
796
808
  .agent-composer-missing-key-copy {
797
809
  display: flex;
798
810
  min-width: 0;
@@ -812,6 +824,31 @@
812
824
  color: hsl(var(--muted-foreground));
813
825
  }
814
826
 
827
+ .agent-composer-missing-key-cta {
828
+ display: inline-flex;
829
+ min-height: 2rem;
830
+ align-items: center;
831
+ justify-content: center;
832
+ border-radius: 0.375rem;
833
+ background: hsl(var(--foreground));
834
+ padding: 0.5rem 0.75rem;
835
+ color: hsl(var(--background));
836
+ font-size: 0.75rem;
837
+ font-weight: 600;
838
+ line-height: 1rem;
839
+ transition:
840
+ opacity 150ms ease-out,
841
+ transform 150ms ease-out;
842
+ }
843
+
844
+ .agent-composer-missing-key-trigger:hover .agent-composer-missing-key-cta {
845
+ opacity: 0.9;
846
+ }
847
+
848
+ .agent-composer-missing-key-trigger:active .agent-composer-missing-key-cta {
849
+ transform: scale(0.98);
850
+ }
851
+
815
852
  .agent-composer-root--hero .agent-composer-missing-key-trigger {
816
853
  min-height: 7.5rem;
817
854
  justify-content: center;
@@ -824,6 +861,10 @@
824
861
  line-height: 1.375rem;
825
862
  }
826
863
 
864
+ .agent-composer-root--hero .agent-composer-missing-key-content {
865
+ align-items: center;
866
+ }
867
+
827
868
  .agent-composer-stack {
828
869
  position: relative;
829
870
  flex-shrink: 0;
@@ -881,13 +922,15 @@
881
922
  line-height: 1.125rem;
882
923
  }
883
924
 
884
- .agent-thinking-indicator__text {
925
+ .agent-thinking-indicator__text,
926
+ .agent-running-shimmer {
885
927
  display: inline-block;
886
928
  }
887
929
 
888
930
  @media (prefers-reduced-motion: no-preference) {
889
931
  @supports ((background-clip: text) or (-webkit-background-clip: text)) {
890
- .agent-thinking-indicator__text {
932
+ .agent-thinking-indicator__text,
933
+ .agent-running-shimmer {
891
934
  color: transparent;
892
935
  background: linear-gradient(
893
936
  90deg,
@@ -66,6 +66,33 @@ state, auth, and agent-chat runtime contracts. Never edit `node_modules` or
66
66
  deep-import its private source. Manual copying is only the fallback described by
67
67
  an unknown third-party package's add-style blueprint.
68
68
 
69
+ ## Reuse Proven Patterns (rg + cp)
70
+
71
+ Version-matched installed source outranks web docs or memory: it is the exact
72
+ code shipping with this app. `node_modules/@agent-native/core/corpus/templates/`
73
+ holds source for every first-party template, not just the one this app started
74
+ from, so a pattern from the mail template is fair game for a tasks app. Grep
75
+ across it, then copy a whole file as a starting point instead of writing the
76
+ pattern from scratch:
77
+
78
+ ```bash
79
+ # Find how other templates solved a similar problem
80
+ rg -n "drag.*drop|reorder" node_modules/@agent-native/core/corpus/templates
81
+
82
+ # Grab a proven action file as a starting point, then adapt names/schema
83
+ cp node_modules/@agent-native/core/corpus/templates/mail/actions/archive-email.ts \
84
+ actions/archive-item.ts
85
+
86
+ # Read the full framework source behind an API, not just the corpus copy
87
+ rg -n "defineAction" node_modules/@agent-native/core/src/action.ts
88
+ ```
89
+
90
+ Copying template-level app code (actions, components, skill files) is the
91
+ expected reuse path — templates exist to be forked. This is different from
92
+ copying `core`/`toolkit` **runtime internals**: for those, follow
93
+ `customizing-agent-native`'s configure/compose/eject ladder instead of
94
+ hand-duplicating framework logic.
95
+
69
96
  ## Useful Slugs
70
97
 
71
98
  | Need | Slugs |
@@ -0,0 +1,159 @@
1
+ ---
2
+ name: app-branding
3
+ description: >-
4
+ How to rename or rebrand the app so every surface — title, package metadata,
5
+ PWA manifest, and icons — stays consistent. Use when a prompt establishes or
6
+ implies a new app name, title, or visual identity, OR when you generate an app
7
+ title, theme, or icon yourself while scaffolding an app from an initial prompt.
8
+ scope: dev
9
+ metadata:
10
+ internal: true
11
+ ---
12
+
13
+ # App Branding
14
+
15
+ ## Trigger
16
+
17
+ Read this skill whenever the app's name, title, or visual identity is being
18
+ established or changed — whether the user states it or **you derive it yourself**.
19
+
20
+ - **Explicit** — the prompt names the app: "rename this app to …", "this is a
21
+ Todo app called …", "call this app …".
22
+ - **Implicit / agent-generated** — the prompt describes what to build but leaves
23
+ the branding to you: "build me a habit tracker", "turn this into a recipe
24
+ manager", "make a CRM for my studio". The moment you decide on a title, theme
25
+ color, or icon from that prompt, treat it as a branding change and apply the
26
+ full checklist so your generated identity lands on every surface — not just
27
+ the one screen you happen to be building.
28
+
29
+ If you are inventing an app title, theme, or icon as part of scaffolding a new
30
+ app from an initial prompt, that counts — run the checklist in the same pass.
31
+
32
+ ## Rule
33
+
34
+ Apply **all** of the updates below in a single consistent pass. Depending on the
35
+ template, the app name may live in one source-of-truth module or be spread
36
+ across several files — either way, a partial rename leaves the app half-branded
37
+ (a stale tab title, launcher label, or icon).
38
+
39
+ Derive three values once, then reuse them everywhere:
40
+
41
+ - **Title** — human-readable display name, e.g. `"My Task App"`.
42
+ - **Slug** — URL/npm-safe form: lowercase letters, digits, and hyphens only,
43
+ e.g. `"my-task-app"`.
44
+ - **Description** — one sentence describing what the app does.
45
+
46
+ ## Locate the layout first
47
+
48
+ Branding lives in different places depending on the template. Detect which
49
+ layout you are in before editing:
50
+
51
+ - **Centralized layout** — `app/lib/app-config.ts` exists. It is the single
52
+ source of truth for the name and title; the frontend surfaces (`<title>`,
53
+ route `meta()`, header, sidebar, index heading, `apple-mobile-web-app-title`)
54
+ derive from its `APP_NAME` / `APP_TITLE` exports, so you change the name in one
55
+ place.
56
+ - **Inlined layout** — no `app/lib/app-config.ts`. The name and title are
57
+ written directly into `package.json`, each route's `meta()`, and
58
+ `app/root.tsx`. You must update each surface individually.
59
+
60
+ When in doubt, `grep -rn` the current title and slug across `app/`, `server/`,
61
+ `package.json`, and `public/` and fix every real hit — the two layouts share the
62
+ manifest and icon steps regardless.
63
+
64
+ ## The Checklist
65
+
66
+ ### Step 1 — App name + title source
67
+
68
+ **Centralized layout** (`app/lib/app-config.ts`): change both constants and stop —
69
+ the rest of the frontend derives from them.
70
+
71
+ - `rawAppName` → the **slug**.
72
+ - `rawAppTitle` → the **title**.
73
+
74
+ **Inlined layout** (no `app-config.ts`): set the title/slug at each surface.
75
+
76
+ - Every route `meta()` title under `app/routes/*.tsx` (e.g. `_index.tsx`,
77
+ `agent.tsx`, `settings.tsx`) — replace the app title. These are seeded from a
78
+ `{{APP_TITLE}}` placeholder at scaffold time and become plain literals
79
+ afterward.
80
+ - Any `useActionQuery("hello", { name: … })` in `app/routes/_index.tsx` seeded
81
+ with the title.
82
+ - `app/root.tsx` `apple-mobile-web-app-title` — a literal (often `"App"`); set it
83
+ to the **title**.
84
+
85
+ ### Step 2 — `package.json` (both layouts)
86
+
87
+ - `displayName` → the **title** (add the field if the template omits it).
88
+ - `description` → the **description** (add if absent).
89
+ - `name` → the **slug**. Only change this if the user explicitly asks to rename
90
+ the package (it is the npm package identifier).
91
+
92
+ ### Step 3 — Login / auth title (centralized layout only)
93
+
94
+ If `server/plugins/auth.ts` exists it keeps its **own** duplicate `rawAppTitle`,
95
+ used on the login/signup pages. Set it to the same **title** as
96
+ `app/lib/app-config.ts`. (The inlined layout's `server/middleware/auth.ts`
97
+ carries no app title — skip this step there.)
98
+
99
+ ### Step 4 — `public/manifest.json` (both layouts)
100
+
101
+ This is a static file (not generated by a plugin). Update:
102
+
103
+ - `name` → the **title** (full install name in OS app drawers).
104
+ - `short_name` → a compact launcher label; keep it ≤12 characters, abbreviating
105
+ the title if needed.
106
+ - `description` → the same **description** used in `package.json`.
107
+
108
+ ### Step 5 — Icon SVG files (both layouts)
109
+
110
+ Replace the icon files with a new mark that reflects the app's identity. The set
111
+ present depends on the template; update each one you find:
112
+
113
+ | File | Purpose |
114
+ | --- | --- |
115
+ | `public/favicon.svg` | Browser tab favicon |
116
+ | `public/icon-180.svg` | Apple touch icon (iOS home screen) |
117
+ | `public/icon-192.svg` | PWA install icon (Android / Chrome) |
118
+ | `public/icon-512.svg` | PWA install icon (large / splash) |
119
+
120
+ Build the icon from **SVG primitives** — do not embed a base64-encoded PNG. All
121
+ files should share the same visual design; only the `width` and `height`
122
+ attributes differ. A simple, reliable approach: a filled rounded square in the
123
+ brand color with the first letter (or a relevant glyph) centered in white.
124
+
125
+ Template to adapt (change `fill`, the letter/glyph, and `rx` to suit the brand):
126
+
127
+ ```svg
128
+ <svg xmlns="http://www.w3.org/2000/svg" width="192" height="192" viewBox="0 0 192 192">
129
+ <rect width="192" height="192" rx="40" fill="#2563EB"/>
130
+ <text x="96" y="130" font-family="system-ui, sans-serif" font-size="110"
131
+ font-weight="700" fill="white" text-anchor="middle">A</text>
132
+ </svg>
133
+ ```
134
+
135
+ Keep `width`/`height` at `180`, `192`, and `512` for the respective icon files;
136
+ `favicon.svg` can use any of these sizes (the `viewBox` keeps it scalable).
137
+
138
+ ## What NOT to change
139
+
140
+ These are stable identifiers or template-internal files, not user-facing brand:
141
+
142
+ - `configureTracking({ app, template })` in `app/root.tsx` — analytics
143
+ identifiers seeded at scaffold time; leave them. This holds even in the inlined
144
+ layout, where `app` was seeded from the slug — changing it re-keys analytics
145
+ history.
146
+ - `server/plugins/agent-chat.ts` `appId` (centralized layout) — a stable
147
+ platform analytics/routing key; leave it exactly as scaffolded.
148
+ - `.github/workflows/*.yml` — template automation; references the repo/template
149
+ identity, not the running app.
150
+ - `AGENTS.md` / `DEVELOPING.md` — developer docs for the template itself.
151
+
152
+ ## Verification
153
+
154
+ - `pnpm typecheck` passes.
155
+ - Grep for the old title/slug across `app/`, `server/`, `package.json`, and
156
+ `public/` — no unintended leftovers remain (except the intentional
157
+ "do not change" identifiers above).
158
+ - The browser tab title, sidebar/header, and index heading all show the new
159
+ title.