@agent-native/core 0.7.13 → 0.7.14

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 (381) hide show
  1. package/dist/a2a/client.d.ts +44 -1
  2. package/dist/a2a/client.d.ts.map +1 -1
  3. package/dist/a2a/client.js +88 -11
  4. package/dist/a2a/client.js.map +1 -1
  5. package/dist/a2a/handlers.d.ts +10 -0
  6. package/dist/a2a/handlers.d.ts.map +1 -1
  7. package/dist/a2a/handlers.js +287 -62
  8. package/dist/a2a/handlers.js.map +1 -1
  9. package/dist/a2a/server.d.ts.map +1 -1
  10. package/dist/a2a/server.js +95 -17
  11. package/dist/a2a/server.js.map +1 -1
  12. package/dist/a2a/task-store.d.ts +11 -1
  13. package/dist/a2a/task-store.d.ts.map +1 -1
  14. package/dist/a2a/task-store.js +38 -2
  15. package/dist/a2a/task-store.js.map +1 -1
  16. package/dist/agent/engine/builder-engine.d.ts +1 -1
  17. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  18. package/dist/agent/engine/builder-engine.js +7 -25
  19. package/dist/agent/engine/builder-engine.js.map +1 -1
  20. package/dist/agent/engine/builtin.js +1 -1
  21. package/dist/agent/engine/builtin.js.map +1 -1
  22. package/dist/chat-threads/store.d.ts +3 -0
  23. package/dist/chat-threads/store.d.ts.map +1 -1
  24. package/dist/chat-threads/store.js +32 -0
  25. package/dist/chat-threads/store.js.map +1 -1
  26. package/dist/cli/templates-meta.d.ts.map +1 -1
  27. package/dist/cli/templates-meta.js +11 -0
  28. package/dist/cli/templates-meta.js.map +1 -1
  29. package/dist/client/AgentPanel.d.ts +3 -1
  30. package/dist/client/AgentPanel.d.ts.map +1 -1
  31. package/dist/client/AgentPanel.js +21 -10
  32. package/dist/client/AgentPanel.js.map +1 -1
  33. package/dist/client/AgentTaskCard.d.ts.map +1 -1
  34. package/dist/client/AgentTaskCard.js +2 -0
  35. package/dist/client/AgentTaskCard.js.map +1 -1
  36. package/dist/client/AssistantChat.d.ts +2 -0
  37. package/dist/client/AssistantChat.d.ts.map +1 -1
  38. package/dist/client/AssistantChat.js +111 -75
  39. package/dist/client/AssistantChat.js.map +1 -1
  40. package/dist/client/ErrorBoundary.d.ts +1 -3
  41. package/dist/client/ErrorBoundary.d.ts.map +1 -1
  42. package/dist/client/ErrorBoundary.js +37 -9
  43. package/dist/client/ErrorBoundary.js.map +1 -1
  44. package/dist/client/FeedbackButton.d.ts.map +1 -1
  45. package/dist/client/FeedbackButton.js +4 -3
  46. package/dist/client/FeedbackButton.js.map +1 -1
  47. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  48. package/dist/client/MultiTabAssistantChat.js +145 -49
  49. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  50. package/dist/client/agent-chat.d.ts +11 -0
  51. package/dist/client/agent-chat.d.ts.map +1 -1
  52. package/dist/client/agent-chat.js +1 -1
  53. package/dist/client/agent-chat.js.map +1 -1
  54. package/dist/client/components/AgentPresenceChip.d.ts +12 -0
  55. package/dist/client/components/AgentPresenceChip.d.ts.map +1 -0
  56. package/dist/client/components/AgentPresenceChip.js +42 -0
  57. package/dist/client/components/AgentPresenceChip.js.map +1 -0
  58. package/dist/client/components/PresenceBar.d.ts +17 -0
  59. package/dist/client/components/PresenceBar.d.ts.map +1 -0
  60. package/dist/client/components/PresenceBar.js +118 -0
  61. package/dist/client/components/PresenceBar.js.map +1 -0
  62. package/dist/client/composer/ComposerPlusMenu.d.ts +6 -1
  63. package/dist/client/composer/ComposerPlusMenu.d.ts.map +1 -1
  64. package/dist/client/composer/ComposerPlusMenu.js +22 -83
  65. package/dist/client/composer/ComposerPlusMenu.js.map +1 -1
  66. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  67. package/dist/client/composer/TiptapComposer.js +237 -16
  68. package/dist/client/composer/TiptapComposer.js.map +1 -1
  69. package/dist/client/composer/types.d.ts +1 -0
  70. package/dist/client/composer/types.d.ts.map +1 -1
  71. package/dist/client/composer/useVoiceDictation.d.ts +2 -0
  72. package/dist/client/composer/useVoiceDictation.d.ts.map +1 -1
  73. package/dist/client/composer/useVoiceDictation.js +85 -10
  74. package/dist/client/composer/useVoiceDictation.js.map +1 -1
  75. package/dist/client/index.d.ts +3 -0
  76. package/dist/client/index.d.ts.map +1 -1
  77. package/dist/client/index.js +5 -0
  78. package/dist/client/index.js.map +1 -1
  79. package/dist/client/org/RequireActiveOrg.d.ts.map +1 -1
  80. package/dist/client/org/RequireActiveOrg.js +15 -10
  81. package/dist/client/org/RequireActiveOrg.js.map +1 -1
  82. package/dist/client/org/TeamPage.d.ts.map +1 -1
  83. package/dist/client/org/TeamPage.js +125 -4
  84. package/dist/client/org/TeamPage.js.map +1 -1
  85. package/dist/client/org/hooks.d.ts +30 -0
  86. package/dist/client/org/hooks.d.ts.map +1 -1
  87. package/dist/client/org/hooks.js +65 -0
  88. package/dist/client/org/hooks.js.map +1 -1
  89. package/dist/client/org/index.d.ts +2 -2
  90. package/dist/client/org/index.d.ts.map +1 -1
  91. package/dist/client/org/index.js +1 -1
  92. package/dist/client/org/index.js.map +1 -1
  93. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  94. package/dist/client/resources/ResourcesPanel.js +5 -1
  95. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  96. package/dist/client/settings/AutomationsSection.d.ts.map +1 -1
  97. package/dist/client/settings/AutomationsSection.js +1 -0
  98. package/dist/client/settings/AutomationsSection.js.map +1 -1
  99. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  100. package/dist/client/settings/SettingsPanel.js +24 -11
  101. package/dist/client/settings/SettingsPanel.js.map +1 -1
  102. package/dist/client/sse-event-processor.d.ts.map +1 -1
  103. package/dist/client/sse-event-processor.js +10 -0
  104. package/dist/client/sse-event-processor.js.map +1 -1
  105. package/dist/client/tools/ToolEditor.d.ts +5 -0
  106. package/dist/client/tools/ToolEditor.d.ts.map +1 -0
  107. package/dist/client/tools/ToolEditor.js +98 -0
  108. package/dist/client/tools/ToolEditor.js.map +1 -0
  109. package/dist/client/tools/ToolViewer.d.ts +5 -0
  110. package/dist/client/tools/ToolViewer.d.ts.map +1 -0
  111. package/dist/client/tools/ToolViewer.js +309 -0
  112. package/dist/client/tools/ToolViewer.js.map +1 -0
  113. package/dist/client/tools/ToolViewerPage.d.ts +2 -0
  114. package/dist/client/tools/ToolViewerPage.d.ts.map +1 -0
  115. package/dist/client/tools/ToolViewerPage.js +23 -0
  116. package/dist/client/tools/ToolViewerPage.js.map +1 -0
  117. package/dist/client/tools/ToolsListPage.d.ts +2 -0
  118. package/dist/client/tools/ToolsListPage.d.ts.map +1 -0
  119. package/dist/client/tools/ToolsListPage.js +72 -0
  120. package/dist/client/tools/ToolsListPage.js.map +1 -0
  121. package/dist/client/tools/ToolsSidebarSection.d.ts +2 -0
  122. package/dist/client/tools/ToolsSidebarSection.d.ts.map +1 -0
  123. package/dist/client/tools/ToolsSidebarSection.js +188 -0
  124. package/dist/client/tools/ToolsSidebarSection.js.map +1 -0
  125. package/dist/client/tools/index.d.ts +6 -0
  126. package/dist/client/tools/index.d.ts.map +1 -0
  127. package/dist/client/tools/index.js +6 -0
  128. package/dist/client/tools/index.js.map +1 -0
  129. package/dist/client/use-chat-threads.d.ts +1 -0
  130. package/dist/client/use-chat-threads.d.ts.map +1 -1
  131. package/dist/client/use-chat-threads.js +29 -0
  132. package/dist/client/use-chat-threads.js.map +1 -1
  133. package/dist/client/use-db-sync.js +6 -6
  134. package/dist/client/use-db-sync.js.map +1 -1
  135. package/dist/collab/agent-identity.d.ts +15 -0
  136. package/dist/collab/agent-identity.d.ts.map +1 -0
  137. package/dist/collab/agent-identity.js +14 -0
  138. package/dist/collab/agent-identity.js.map +1 -0
  139. package/dist/collab/agent-presence.d.ts +59 -0
  140. package/dist/collab/agent-presence.d.ts.map +1 -0
  141. package/dist/collab/agent-presence.js +165 -0
  142. package/dist/collab/agent-presence.js.map +1 -0
  143. package/dist/collab/awareness.d.ts +7 -0
  144. package/dist/collab/awareness.d.ts.map +1 -1
  145. package/dist/collab/awareness.js +2 -2
  146. package/dist/collab/awareness.js.map +1 -1
  147. package/dist/collab/client-struct.d.ts +43 -0
  148. package/dist/collab/client-struct.d.ts.map +1 -0
  149. package/dist/collab/client-struct.js +272 -0
  150. package/dist/collab/client-struct.js.map +1 -0
  151. package/dist/collab/client.d.ts +2 -0
  152. package/dist/collab/client.d.ts.map +1 -1
  153. package/dist/collab/client.js +15 -1
  154. package/dist/collab/client.js.map +1 -1
  155. package/dist/collab/index.d.ts +6 -1
  156. package/dist/collab/index.d.ts.map +1 -1
  157. package/dist/collab/index.js +11 -1
  158. package/dist/collab/index.js.map +1 -1
  159. package/dist/collab/json-to-yjs.d.ts +72 -0
  160. package/dist/collab/json-to-yjs.d.ts.map +1 -0
  161. package/dist/collab/json-to-yjs.js +456 -0
  162. package/dist/collab/json-to-yjs.js.map +1 -0
  163. package/dist/collab/struct-routes.d.ts +52 -0
  164. package/dist/collab/struct-routes.d.ts.map +1 -0
  165. package/dist/collab/struct-routes.js +74 -0
  166. package/dist/collab/struct-routes.js.map +1 -0
  167. package/dist/collab/ydoc-manager.d.ts +19 -0
  168. package/dist/collab/ydoc-manager.d.ts.map +1 -1
  169. package/dist/collab/ydoc-manager.js +49 -0
  170. package/dist/collab/ydoc-manager.js.map +1 -1
  171. package/dist/deploy/build.js +1 -1
  172. package/dist/file-upload/builder.d.ts.map +1 -1
  173. package/dist/file-upload/builder.js +2 -1
  174. package/dist/file-upload/builder.js.map +1 -1
  175. package/dist/integrations/adapters/email.d.ts +17 -0
  176. package/dist/integrations/adapters/email.d.ts.map +1 -0
  177. package/dist/integrations/adapters/email.js +620 -0
  178. package/dist/integrations/adapters/email.js.map +1 -0
  179. package/dist/integrations/adapters/telegram.d.ts.map +1 -1
  180. package/dist/integrations/adapters/telegram.js +19 -3
  181. package/dist/integrations/adapters/telegram.js.map +1 -1
  182. package/dist/integrations/index.d.ts +1 -0
  183. package/dist/integrations/index.d.ts.map +1 -1
  184. package/dist/integrations/index.js +1 -0
  185. package/dist/integrations/index.js.map +1 -1
  186. package/dist/integrations/internal-token.d.ts +18 -0
  187. package/dist/integrations/internal-token.d.ts.map +1 -0
  188. package/dist/integrations/internal-token.js +86 -0
  189. package/dist/integrations/internal-token.js.map +1 -0
  190. package/dist/integrations/pending-tasks-retry-job.d.ts +15 -0
  191. package/dist/integrations/pending-tasks-retry-job.d.ts.map +1 -0
  192. package/dist/integrations/pending-tasks-retry-job.js +199 -0
  193. package/dist/integrations/pending-tasks-retry-job.js.map +1 -0
  194. package/dist/integrations/pending-tasks-store.d.ts +40 -0
  195. package/dist/integrations/pending-tasks-store.d.ts.map +1 -0
  196. package/dist/integrations/pending-tasks-store.js +151 -0
  197. package/dist/integrations/pending-tasks-store.js.map +1 -0
  198. package/dist/integrations/plugin.d.ts.map +1 -1
  199. package/dist/integrations/plugin.js +151 -9
  200. package/dist/integrations/plugin.js.map +1 -1
  201. package/dist/integrations/task-queue-stats.d.ts +22 -0
  202. package/dist/integrations/task-queue-stats.d.ts.map +1 -0
  203. package/dist/integrations/task-queue-stats.js +117 -0
  204. package/dist/integrations/task-queue-stats.js.map +1 -0
  205. package/dist/integrations/types.d.ts +2 -0
  206. package/dist/integrations/types.d.ts.map +1 -1
  207. package/dist/integrations/webhook-handler.d.ts +23 -4
  208. package/dist/integrations/webhook-handler.d.ts.map +1 -1
  209. package/dist/integrations/webhook-handler.js +217 -59
  210. package/dist/integrations/webhook-handler.js.map +1 -1
  211. package/dist/mcp-client/manager.d.ts +3 -0
  212. package/dist/mcp-client/manager.d.ts.map +1 -1
  213. package/dist/mcp-client/manager.js +5 -0
  214. package/dist/mcp-client/manager.js.map +1 -1
  215. package/dist/oauth-tokens/google-refresh.d.ts.map +1 -1
  216. package/dist/oauth-tokens/google-refresh.js +6 -0
  217. package/dist/oauth-tokens/google-refresh.js.map +1 -1
  218. package/dist/onboarding/default-steps.d.ts.map +1 -1
  219. package/dist/onboarding/default-steps.js +10 -3
  220. package/dist/onboarding/default-steps.js.map +1 -1
  221. package/dist/org/context.d.ts +35 -0
  222. package/dist/org/context.d.ts.map +1 -1
  223. package/dist/org/context.js +136 -0
  224. package/dist/org/context.js.map +1 -1
  225. package/dist/org/handlers.d.ts +76 -0
  226. package/dist/org/handlers.d.ts.map +1 -1
  227. package/dist/org/handlers.js +411 -2
  228. package/dist/org/handlers.js.map +1 -1
  229. package/dist/org/index.d.ts +2 -2
  230. package/dist/org/index.d.ts.map +1 -1
  231. package/dist/org/index.js +2 -2
  232. package/dist/org/index.js.map +1 -1
  233. package/dist/org/migrations.d.ts.map +1 -1
  234. package/dist/org/migrations.js +8 -0
  235. package/dist/org/migrations.js.map +1 -1
  236. package/dist/org/plugin.d.ts +6 -0
  237. package/dist/org/plugin.d.ts.map +1 -1
  238. package/dist/org/plugin.js +71 -7
  239. package/dist/org/plugin.js.map +1 -1
  240. package/dist/org/schema.d.ts +38 -0
  241. package/dist/org/schema.d.ts.map +1 -1
  242. package/dist/org/schema.js +2 -0
  243. package/dist/org/schema.js.map +1 -1
  244. package/dist/org/types.d.ts +7 -0
  245. package/dist/org/types.d.ts.map +1 -1
  246. package/dist/scripts/call-agent.d.ts.map +1 -1
  247. package/dist/scripts/call-agent.js +90 -18
  248. package/dist/scripts/call-agent.js.map +1 -1
  249. package/dist/scripts/db/index.d.ts.map +1 -1
  250. package/dist/scripts/db/index.js +2 -0
  251. package/dist/scripts/db/index.js.map +1 -1
  252. package/dist/scripts/db/migrate-user-api-keys.d.ts +24 -0
  253. package/dist/scripts/db/migrate-user-api-keys.d.ts.map +1 -0
  254. package/dist/scripts/db/migrate-user-api-keys.js +224 -0
  255. package/dist/scripts/db/migrate-user-api-keys.js.map +1 -0
  256. package/dist/scripts/db/wipe-leaked-builder-keys.d.ts +27 -0
  257. package/dist/scripts/db/wipe-leaked-builder-keys.d.ts.map +1 -0
  258. package/dist/scripts/db/wipe-leaked-builder-keys.js +163 -0
  259. package/dist/scripts/db/wipe-leaked-builder-keys.js.map +1 -0
  260. package/dist/secrets/register-framework-secrets.d.ts +5 -0
  261. package/dist/secrets/register-framework-secrets.d.ts.map +1 -1
  262. package/dist/secrets/register-framework-secrets.js +7 -44
  263. package/dist/secrets/register-framework-secrets.js.map +1 -1
  264. package/dist/secrets/substitution.d.ts.map +1 -1
  265. package/dist/secrets/substitution.js +14 -2
  266. package/dist/secrets/substitution.js.map +1 -1
  267. package/dist/server/action-discovery.d.ts.map +1 -1
  268. package/dist/server/action-discovery.js +39 -0
  269. package/dist/server/action-discovery.js.map +1 -1
  270. package/dist/server/action-routes.js +1 -1
  271. package/dist/server/action-routes.js.map +1 -1
  272. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  273. package/dist/server/agent-chat-plugin.js +192 -45
  274. package/dist/server/agent-chat-plugin.js.map +1 -1
  275. package/dist/server/auth.d.ts +14 -0
  276. package/dist/server/auth.d.ts.map +1 -1
  277. package/dist/server/auth.js +232 -17
  278. package/dist/server/auth.js.map +1 -1
  279. package/dist/server/builder-browser.d.ts +1 -1
  280. package/dist/server/builder-browser.d.ts.map +1 -1
  281. package/dist/server/builder-browser.js +12 -12
  282. package/dist/server/builder-browser.js.map +1 -1
  283. package/dist/server/collab-plugin.d.ts +4 -0
  284. package/dist/server/collab-plugin.d.ts.map +1 -1
  285. package/dist/server/collab-plugin.js +30 -4
  286. package/dist/server/collab-plugin.js.map +1 -1
  287. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  288. package/dist/server/core-routes-plugin.js +106 -100
  289. package/dist/server/core-routes-plugin.js.map +1 -1
  290. package/dist/server/credential-provider.d.ts +43 -2
  291. package/dist/server/credential-provider.d.ts.map +1 -1
  292. package/dist/server/credential-provider.js +115 -2
  293. package/dist/server/credential-provider.js.map +1 -1
  294. package/dist/server/design-token-utils.d.ts +132 -0
  295. package/dist/server/design-token-utils.d.ts.map +1 -0
  296. package/dist/server/design-token-utils.js +714 -0
  297. package/dist/server/design-token-utils.js.map +1 -0
  298. package/dist/server/email.d.ts +10 -0
  299. package/dist/server/email.d.ts.map +1 -1
  300. package/dist/server/email.js +63 -16
  301. package/dist/server/email.js.map +1 -1
  302. package/dist/server/framework-request-handler.d.ts.map +1 -1
  303. package/dist/server/framework-request-handler.js +38 -3
  304. package/dist/server/framework-request-handler.js.map +1 -1
  305. package/dist/server/google-oauth.d.ts +18 -1
  306. package/dist/server/google-oauth.d.ts.map +1 -1
  307. package/dist/server/google-oauth.js +21 -4
  308. package/dist/server/google-oauth.js.map +1 -1
  309. package/dist/server/index.d.ts +3 -3
  310. package/dist/server/index.d.ts.map +1 -1
  311. package/dist/server/index.js +3 -3
  312. package/dist/server/index.js.map +1 -1
  313. package/dist/server/onboarding-html.d.ts.map +1 -1
  314. package/dist/server/onboarding-html.js +14 -1
  315. package/dist/server/onboarding-html.js.map +1 -1
  316. package/dist/server/transcribe-voice.d.ts.map +1 -1
  317. package/dist/server/transcribe-voice.js +89 -24
  318. package/dist/server/transcribe-voice.js.map +1 -1
  319. package/dist/sharing/schema.d.ts +1 -1
  320. package/dist/styles/agent-native.css +5 -0
  321. package/dist/templates/default/app/root.tsx +50 -13
  322. package/dist/templates/default/react-router.config.ts +3 -0
  323. package/dist/terminal/terminal-plugin.d.ts.map +1 -1
  324. package/dist/terminal/terminal-plugin.js +23 -3
  325. package/dist/terminal/terminal-plugin.js.map +1 -1
  326. package/dist/tools/actions.d.ts +3 -0
  327. package/dist/tools/actions.d.ts.map +1 -0
  328. package/dist/tools/actions.js +140 -0
  329. package/dist/tools/actions.js.map +1 -0
  330. package/dist/tools/fetch-tool.js +1 -1
  331. package/dist/tools/fetch-tool.js.map +1 -1
  332. package/dist/tools/html-shell.d.ts +2 -0
  333. package/dist/tools/html-shell.d.ts.map +1 -0
  334. package/dist/tools/html-shell.js +387 -0
  335. package/dist/tools/html-shell.js.map +1 -0
  336. package/dist/tools/routes.d.ts +2 -0
  337. package/dist/tools/routes.d.ts.map +1 -0
  338. package/dist/tools/routes.js +576 -0
  339. package/dist/tools/routes.js.map +1 -0
  340. package/dist/tools/schema.d.ts +575 -0
  341. package/dist/tools/schema.d.ts.map +1 -0
  342. package/dist/tools/schema.js +112 -0
  343. package/dist/tools/schema.js.map +1 -0
  344. package/dist/tools/store.d.ts +40 -0
  345. package/dist/tools/store.d.ts.map +1 -0
  346. package/dist/tools/store.js +190 -0
  347. package/dist/tools/store.js.map +1 -0
  348. package/dist/tools/theme.d.ts +2 -0
  349. package/dist/tools/theme.d.ts.map +1 -0
  350. package/dist/tools/theme.js +67 -0
  351. package/dist/tools/theme.js.map +1 -0
  352. package/dist/transcription/builder-transcription.d.ts.map +1 -1
  353. package/dist/transcription/builder-transcription.js +26 -14
  354. package/dist/transcription/builder-transcription.js.map +1 -1
  355. package/dist/vite/action-types-plugin.d.ts.map +1 -1
  356. package/dist/vite/action-types-plugin.js +10 -2
  357. package/dist/vite/action-types-plugin.js.map +1 -1
  358. package/dist/vite/client.d.ts.map +1 -1
  359. package/dist/vite/client.js +26 -6
  360. package/dist/vite/client.js.map +1 -1
  361. package/docs/content/a2a-protocol.md +2 -2
  362. package/docs/content/authentication.md +51 -0
  363. package/docs/content/cloneable-saas.md +59 -62
  364. package/docs/content/faq.md +73 -43
  365. package/docs/content/getting-started.md +37 -61
  366. package/docs/content/mcp-clients.md +14 -1
  367. package/docs/content/messaging.md +284 -0
  368. package/docs/content/pure-agent-apps.md +55 -28
  369. package/docs/content/template-calendar.md +61 -56
  370. package/docs/content/template-clips.md +22 -18
  371. package/docs/content/template-content.md +36 -26
  372. package/docs/content/template-dispatch.md +2 -1
  373. package/docs/content/template-forms.md +13 -11
  374. package/docs/content/template-slides.md +43 -31
  375. package/docs/content/template-video.md +49 -22
  376. package/docs/content/tools.md +107 -0
  377. package/docs/content/what-is-agent-native.md +89 -105
  378. package/package.json +4 -1
  379. package/src/templates/default/app/root.tsx +50 -13
  380. package/src/templates/default/react-router.config.ts +3 -0
  381. package/docs/content/integrations.md +0 -198
@@ -0,0 +1,284 @@
1
+ ---
2
+ title: "Messaging"
3
+ description: "Talk to your agent from Slack, email, Telegram, or WhatsApp — same agent, same memory, same tools."
4
+ ---
5
+
6
+ # Messaging
7
+
8
+ Talk to your agent from the platforms you already use. Send a Slack DM, reply to an email, message a Telegram bot, or ping over WhatsApp — same agent, same memory, same tools, same thread history as the web chat.
9
+
10
+ ## Overview {#overview}
11
+
12
+ Messaging integrations let users reach their agent from external messaging platforms instead of opening the web UI. Whichever platform a message comes in on, the agent processes it with the same system prompt, the same actions, and the same database — and replies in the same thread.
13
+
14
+ Each integration works through webhooks. The platform delivers incoming messages over HTTP, the agent processes them in the background, and the response is posted back. No polling, no long-lived connections.
15
+
16
+ > Note: this doc is specifically about platforms you can _message_ your agent over. Other kinds of integrations — Google Docs, OAuth providers, SQL databases, MCP servers, etc. — are covered in their own docs.
17
+
18
+ ## How it works {#how-it-works}
19
+
20
+ The flow is the same for every platform:
21
+
22
+ 1. A user sends a message on the external platform (Slack, email, Telegram, WhatsApp)
23
+ 2. The platform delivers the message to your app via a webhook at `/_agent-native/integrations/<platform>/webhook`
24
+ 3. The integrations plugin validates the request, extracts the message text and thread context, and maps it to an internal conversation thread
25
+ 4. The agent processes the message in the background using the same pipeline as the web chat
26
+ 5. The response is posted back to the external platform in the same thread
27
+
28
+ `User (Slack/Email/Telegram/WhatsApp)` → `Webhook` → `Agent Processing` → `Response posted back`
29
+
30
+ ## Setup {#setup}
31
+
32
+ The integrations plugin auto-mounts when no custom version exists in your template. To customize it, create a plugin file:
33
+
34
+ ```ts
35
+ // server/plugins/integrations.ts
36
+ import { createIntegrationsPlugin } from "@agent-native/core/server";
37
+ import { scriptRegistry } from "../../agent.config";
38
+
39
+ export default createIntegrationsPlugin({
40
+ actions: scriptRegistry,
41
+ systemPrompt: "You are a helpful assistant...",
42
+ });
43
+ ```
44
+
45
+ The plugin registers webhook routes for each enabled platform under `/_agent-native/integrations/`. Which platforms are active depends on which environment variables are configured.
46
+
47
+ ## Dispatch as the orchestrator {#dispatch}
48
+
49
+ Messaging integrations are most powerful when set up in the **Dispatch template** (`templates/dispatch/`). Dispatch is a central control plane that:
50
+
51
+ - Receives inbound messages from every configured platform (Slack, email, Telegram, WhatsApp) in one place
52
+ - Delegates domain-specific work to specialist agents over the [A2A protocol](/docs/a2a-protocol) via the `call-agent` action
53
+ - Sends the result back to the original platform in the same thread
54
+
55
+ The pattern is one inbox, many specialist agents. A user emails the Dispatch agent "make me a slide deck about Q3" → Dispatch delegates to the slides agent → the slides agent returns a URL → Dispatch emails the user back with the link. Same flow for analytics queries, calendar invites, content drafts, anything else you have a specialist agent for.
56
+
57
+ You don't have to use Dispatch — any template that mounts the integrations plugin can receive messages — but Dispatch is the recommended home for messaging because it can route across your whole agent fleet.
58
+
59
+ See [Dispatch template](/docs/template-dispatch) and [A2A protocol](/docs/a2a-protocol) for details.
60
+
61
+ ## Slack {#slack}
62
+
63
+ ### 1. Create a Slack app
64
+
65
+ Go to [api.slack.com/apps](https://api.slack.com/apps) and create a new app. Under **OAuth & Permissions**, add the following bot token scopes:
66
+
67
+ - `chat:write` — send messages
68
+ - `app_mentions:read` — receive @-mentions (optional)
69
+
70
+ ### 2. Enable Event Subscriptions
71
+
72
+ Under **Event Subscriptions**, set the Request URL to:
73
+
74
+ ```text
75
+ https://your-app.example.com/_agent-native/integrations/slack/webhook
76
+ ```
77
+
78
+ Subscribe to the `message.im` bot event (and optionally `app_mention` for channel mentions).
79
+
80
+ ### 3. Set environment variables
81
+
82
+ ```bash
83
+ SLACK_BOT_TOKEN=xoxb-your-bot-token
84
+ SLACK_SIGNING_SECRET=your-signing-secret
85
+ ```
86
+
87
+ The bot token is found under **OAuth & Permissions** after installing the app to your workspace. The signing secret is under **Basic Information**.
88
+
89
+ ## Email {#email}
90
+
91
+ The email adapter receives inbound mail via Resend or SendGrid webhooks and replies in-thread using standard `Message-ID` / `In-Reply-To` / `References` headers. Sender email addresses are treated as identities — if a user emails the agent from `alice@acme.com`, that maps directly to the workspace user with that email.
92
+
93
+ Adapter file: `packages/core/src/integrations/adapters/email.ts`
94
+
95
+ ### 1. Set environment variables
96
+
97
+ ```bash
98
+ EMAIL_AGENT_ADDRESS=agent@your-domain.com
99
+ # Configure ONE of these (Resend or SendGrid):
100
+ RESEND_API_KEY=re_...
101
+ SENDGRID_API_KEY=SG...
102
+ # Optional — recommended for production:
103
+ EMAIL_INBOUND_WEBHOOK_SECRET=your-shared-secret
104
+ ```
105
+
106
+ `EMAIL_AGENT_ADDRESS` is the address users send mail to. Set either `RESEND_API_KEY` _or_ `SENDGRID_API_KEY` — whichever provider you use. `EMAIL_INBOUND_WEBHOOK_SECRET` enables Svix signature verification (Resend) or basic-auth / `x-webhook-secret` header verification (SendGrid).
107
+
108
+ ### 2. Configure the webhook URL
109
+
110
+ ```text
111
+ https://your-app.example.com/_agent-native/integrations/email/webhook
112
+ ```
113
+
114
+ ### 3. Provider setup — Resend
115
+
116
+ Two options for the agent address:
117
+
118
+ - **Free `<slug>.resend.app` address** — no DNS setup required. Pick a slug in the Resend dashboard and your agent gets `agent@<slug>.resend.app`.
119
+ - **Custom domain** — add MX records pointing to Resend per the dashboard's instructions.
120
+
121
+ Then in the Resend dashboard:
122
+
123
+ 1. Go to **Webhooks** → **Add Endpoint**
124
+ 2. Set the URL to `https://your-app.example.com/_agent-native/integrations/email/webhook`
125
+ 3. Subscribe to the `email.received` event
126
+ 4. Copy the signing secret into `EMAIL_INBOUND_WEBHOOK_SECRET`
127
+
128
+ ### 3. Provider setup — SendGrid
129
+
130
+ 1. In your DNS, add an MX record for the agent's domain pointing to `mx.sendgrid.net` (priority 10)
131
+ 2. In the SendGrid dashboard, go to **Settings** → **Inbound Parse** → **Add Host & URL**
132
+ 3. Set the host to your domain and the destination URL to `https://your-app.example.com/_agent-native/integrations/email/webhook`
133
+ 4. (Recommended) Set basic auth or a custom `x-webhook-secret` header matching `EMAIL_INBOUND_WEBHOOK_SECRET`
134
+
135
+ ### Threading and CC behavior
136
+
137
+ - **Threading** uses the standard email headers: the agent's reply sets `In-Reply-To` to the inbound `Message-ID` and accumulates the `References` chain. Most clients (Gmail, Outlook, Apple Mail) thread the conversation automatically.
138
+ - **Direct vs CC'd** — the adapter detects whether the agent was in `To` (directly addressed) or `Cc` (overheard). When CC'd, the agent's reply goes to all original recipients (reply-all). The Dispatch system prompt also instructs the agent to only respond when input is clearly being requested, so it stays out of the way on threads it's only copied on.
139
+ - **Identity** — the sender's email address is the identity. It maps directly to a workspace user with that email; the agent acts on behalf of that user.
140
+
141
+ ### Rich responses
142
+
143
+ Agent replies render as HTML email. The adapter converts markdown to HTML (headings, lists, links, bold, inline code, paragraphs) and wraps it in a minimal styled template, with a plain-text fallback. So tables, bullet lists, and links from the agent come through as proper rich email — not raw markdown.
144
+
145
+ ### Rate limiting and allowed domains
146
+
147
+ - **Rate limit** — 20 inbound messages per sender per hour, enforced in-memory per process. Excess messages are dropped.
148
+ - **Allowed domains** — the `integration_configs` row for `email` accepts an optional `allowedDomains: string[]`. When set, only senders whose domain is in the list are accepted. Use this to restrict the agent to a specific company or tenant.
149
+
150
+ ### Proactive sends
151
+
152
+ The agent can email users on its own (not just reply) by calling the `send-platform-message` action with `platform: "email"`. Useful for digest emails, alerts, or follow-ups from automations and recurring jobs.
153
+
154
+ ## Telegram {#telegram}
155
+
156
+ ### 1. Create a bot
157
+
158
+ Message [@BotFather](https://t.me/BotFather) on Telegram and use the `/newbot` command. You will receive a bot token.
159
+
160
+ ### 2. Set environment variables
161
+
162
+ ```bash
163
+ TELEGRAM_BOT_TOKEN=your-bot-token
164
+ ```
165
+
166
+ ### 3. Register the webhook
167
+
168
+ After deploying your app, call the setup endpoint to register the webhook with Telegram:
169
+
170
+ ```text
171
+ // The integrations plugin exposes a setup endpoint
172
+ POST /_agent-native/integrations/telegram/setup
173
+
174
+ // This calls Telegram's setWebhook API pointing to:
175
+ // https://your-app.example.com/_agent-native/integrations/telegram/webhook
176
+ ```
177
+
178
+ You can also register the webhook manually using the Telegram Bot API if you prefer.
179
+
180
+ ## WhatsApp {#whatsapp}
181
+
182
+ ### 1. Set up the WhatsApp Cloud API
183
+
184
+ Go to the [Meta Developer Portal](https://developers.facebook.com/), create an app, and enable the WhatsApp product. Configure a phone number for your business.
185
+
186
+ ### 2. Set environment variables
187
+
188
+ ```bash
189
+ WHATSAPP_ACCESS_TOKEN=your-access-token
190
+ WHATSAPP_VERIFY_TOKEN=your-verify-token
191
+ WHATSAPP_PHONE_NUMBER_ID=your-phone-number-id
192
+ ```
193
+
194
+ The verify token is a string you choose — Meta uses it during webhook verification. The access token and phone number ID come from the Meta Developer Portal.
195
+
196
+ ### 3. Configure the webhook
197
+
198
+ In the Meta Developer Portal, set the webhook URL to:
199
+
200
+ ```text
201
+ https://your-app.example.com/_agent-native/integrations/whatsapp/webhook
202
+ ```
203
+
204
+ Subscribe to the `messages` webhook field.
205
+
206
+ ## Configuration {#configuration}
207
+
208
+ Integrations can be managed from the settings UI in the sidebar. Each platform shows its connection status and webhook URL. You can enable/disable individual integrations without removing environment variables.
209
+
210
+ The webhook URLs follow a consistent pattern:
211
+
212
+ ```text
213
+ /_agent-native/integrations/<platform>/webhook
214
+
215
+ # Examples:
216
+ /_agent-native/integrations/slack/webhook
217
+ /_agent-native/integrations/email/webhook
218
+ /_agent-native/integrations/telegram/webhook
219
+ /_agent-native/integrations/whatsapp/webhook
220
+ ```
221
+
222
+ ## Thread continuity {#thread-continuity}
223
+
224
+ Conversations from external platforms are mapped to internal threads. Each Slack DM, email thread, Telegram chat, or WhatsApp conversation becomes a persistent thread in the agent-native database. This means:
225
+
226
+ - The agent retains context across messages in the same external conversation
227
+ - External conversations appear in the web UI alongside web-originated threads, tagged with their source platform
228
+ - You can continue a conversation that started in Slack from the web UI, or vice versa
229
+
230
+ For email specifically, threading uses the `Message-ID`, `In-Reply-To`, and `References` headers — the oldest Message-ID in the References chain is treated as the thread root, matching Gmail's behavior.
231
+
232
+ ## Custom adapters {#custom-adapters}
233
+
234
+ To add support for a new messaging platform, implement the `PlatformAdapter` interface:
235
+
236
+ ```ts
237
+ import type { PlatformAdapter } from "@agent-native/core/server";
238
+
239
+ const myAdapter: PlatformAdapter = {
240
+ platform: "discord",
241
+
242
+ // Verify the incoming webhook request is authentic
243
+ verifyRequest(request: Request): Promise<boolean> {
244
+ // Validate signature headers
245
+ },
246
+
247
+ // Extract the message text and thread context from the webhook payload
248
+ parseMessage(body: unknown): Promise<{
249
+ text: string;
250
+ threadId: string;
251
+ senderId: string;
252
+ metadata?: Record<string, unknown>;
253
+ }> {
254
+ // Parse platform-specific payload
255
+ },
256
+
257
+ // Send the agent's response back to the platform
258
+ sendResponse(threadId: string, text: string): Promise<void> {
259
+ // Call the platform's API to post the message
260
+ },
261
+ };
262
+ ```
263
+
264
+ Register your adapter in the integrations plugin config:
265
+
266
+ ```ts
267
+ export default createIntegrationsPlugin({
268
+ actions: scriptRegistry,
269
+ systemPrompt: "You are a helpful assistant...",
270
+ adapters: [myAdapter],
271
+ });
272
+ ```
273
+
274
+ ## Security {#security}
275
+
276
+ Every incoming webhook is verified before processing:
277
+
278
+ - **Slack** — HMAC-SHA256 signature verification using `SLACK_SIGNING_SECRET`. The `X-Slack-Signature` header is checked against the request body.
279
+ - **Email (Resend)** — Svix signature verification using `EMAIL_INBOUND_WEBHOOK_SECRET`, with a 5-minute replay window.
280
+ - **Email (SendGrid)** — basic auth or `x-webhook-secret` header matching `EMAIL_INBOUND_WEBHOOK_SECRET`. Plus optional `allowedDomains` filtering on the sender.
281
+ - **Telegram** — requests are validated by checking the secret token set during webhook registration via the Telegram Bot API.
282
+ - **WhatsApp** — Meta's webhook verification challenge (using `WHATSAPP_VERIFY_TOKEN`) and payload signature validation.
283
+
284
+ All platform credentials (tokens, secrets, API keys) are stored as environment variables and never persisted in the database or source code. Use the settings UI or your deployment platform's env var management to configure them.
@@ -1,69 +1,96 @@
1
1
  ---
2
2
  title: "Pure-Agent Apps"
3
- description: "Build an agent without a heavy UIjust the agent plus a minimal observability/management surface. All the framework benefits, none of the dashboard work."
3
+ description: "Apps where the agent is the whole productopen it, ask for what you want, and the agent does the rest."
4
4
  ---
5
5
 
6
6
  # Pure-Agent Apps
7
7
 
8
- Not every agent-native app needs a full SaaS-style interface. Sometimes the agent _is_ the product. A support triage agent. A daily report generator. A research bot. An email auto-responder. An ops runbook executor.
8
+ Imagine opening an app and seeing… just a chat. No dashboard. No sidebar full of menus. No forms. You ask for what you want — "summarize my unread emails," "post the daily metrics to Slack," "find the candidates who replied last week" — and the agent goes off and does it. The output shows up in chat, in Slack, in your inbox, wherever it belongs.
9
9
 
10
- For these, the "app" is mostly just the agent doing work in the background. You still want a UI — but a minimal one, focused on **observability, management, and steering** rather than hand-crafted dashboards and forms.
10
+ That's a pure-agent app. The agent _is_ the product.
11
11
 
12
- This is the "agents benefit from a UI even when there's no rich app around them" pattern. The hot take is "agents will replace apps." The reality is "every agent eventually needs a UI for humans to supervise, configure, and debug it." Agent-native gives you that UI for free.
12
+ ## What it feels like to use one {#user-experience}
13
13
 
14
- ## The minimum viable UI {#minimum-ui}
14
+ Most apps are built around a UI: a database table you browse, a form you fill, a chart you read. The agent is a sidekick.
15
15
 
16
- A pure-agent app ships with five surfaces, all provided by the framework — you don't build them:
16
+ In a pure-agent app, that's flipped. The chat is the front door. You type a request; the agent takes action; you see the result. Everything else settings, history, what's currently running — is one click away, but most of the time you don't need it.
17
17
 
18
- 1. **Chat** the main input. Users talk to the agent, steer it, queue tasks. (`<AgentSidebar>` or `<AgentPanel>`)
19
- 2. **Workspace** — skills, memory (`learnings.md`), `AGENTS.md`, custom sub-agents, connected MCP servers, scheduled jobs. Customize the agent's behavior without shipping code. (Workspace tab in the sidebar)
20
- 3. **Job history** — which scheduled jobs ran, when, whether they succeeded, what they did. (Workspace tab → `jobs/`)
21
- 4. **Thread history** — every past conversation, each preserved with its tool calls and final output. (Chat tab)
22
- 5. **Settings** — API keys, connected accounts, onboarding status. (Sidebar settings)
18
+ Examples of where this works really well:
23
19
 
24
- Those five together are enough UI for most pure-agent use cases. No analytics dashboard. No Kanban. No forms. Just: talk to it, see what it's done, configure how it behaves.
20
+ - **Background workers** a triage agent that watches your inbox and labels things, a daily-report agent that posts to Slack each morning, an on-call agent that responds to alerts.
21
+ - **One-shot helpers** — "research this company and write a one-pager," "scan my GitHub issues and tell me which ones look stale."
22
+ - **Channel-driven assistants** — agents you mostly talk to from Slack, Telegram, email, or another agent (via [A2A](/docs/a2a-protocol)). The "app" itself is mostly a control panel.
23
+ - **Internal tools** — an agent that knows your runbooks, your APIs, your conventions, and can act on them.
25
24
 
26
- ## When to pick this pattern {#when-to-pick}
25
+ The hot take is "agents will replace apps." The honest version is "agents still need a UI — for humans to supervise, configure, and steer them." Pure-agent apps give you that UI without the dashboard sprawl.
27
26
 
28
- Pure-agent makes sense when:
27
+ ## When this beats a traditional app {#when}
29
28
 
30
- - **The work happens in the background.** Scheduled jobs, webhook-triggered handlers, Slack/Telegram responders. Users rarely sit in the app.
31
- - **The output leaves the app.** The agent posts to Slack, sends email, writes to a third-party system. There's nothing to view in-app; the value is elsewhere.
32
- - **The domain is one-shot.** A research bot that returns a report. No persistent object to dashboard.
33
- - **You're prototyping.** Ship the agent now; add a rich UI only when you've proven users need it.
29
+ Pick the pure-agent pattern when:
34
30
 
35
- Pick a full [cloneable SaaS](/docs/cloneable-saas) template instead when the app has real persistent objects (emails, events, documents, charts) users need to browse, pivot, and share.
31
+ - **The work happens in the background.** Most of the value is created while the user isn't looking.
32
+ - **The output leaves the app.** The agent posts to Slack, sends email, updates a third-party system. There's nothing to browse in-app — the value is elsewhere.
33
+ - **The domain is one-shot.** Research bot, summary generator, report writer. There's no persistent object that needs a list view.
34
+ - **You're prototyping.** Ship the agent now; add a richer UI later if it turns out users actually want one.
36
35
 
37
- ## The minimal scaffold {#scaffold}
36
+ If your product is built around persistent objects users browse, pivot, and share — emails, events, documents, charts — pick a [cloneable SaaS](/docs/cloneable-saas) template instead. Those have full UIs _plus_ the agent.
38
37
 
39
- Start from the **Starter** template:
38
+ ## What ships in the box {#minimum-ui}
39
+
40
+ Every pure-agent app gets five built-in surfaces, all provided by the framework — you don't build them:
41
+
42
+ 1. **Chat** — the main input. Users talk to the agent, steer it, queue tasks.
43
+ 2. **Workspace** — skills, memory, instructions, custom sub-agents, connected MCP servers, scheduled jobs. Customize the agent's behavior without shipping code.
44
+ 3. **Job history** — which scheduled jobs ran, when, whether they succeeded, what they did.
45
+ 4. **Thread history** — every past conversation, each preserved with its tool calls and final output.
46
+ 5. **Settings** — API keys, connected accounts, onboarding status.
47
+
48
+ Those five are usually enough. No analytics dashboard. No Kanban. No forms. Just: talk to it, see what it's done, configure how it behaves.
49
+
50
+ ## Why you'd pick this over "an app with an AI sidebar" {#vs-traditional}
51
+
52
+ Two reasons:
53
+
54
+ 1. **You don't have to build the UI.** A pure-agent app skips weeks of dashboard work. The chat handles input; the framework handles supervision and history; the agent handles output.
55
+ 2. **It's channel-agnostic from day one.** The same agent that runs in your web UI also runs from Slack, Telegram, email, and other agents — because everything goes through the agent, not the UI. See [Messaging the agent](/docs/messaging) for how that works.
56
+
57
+ The trade-off: pure-agent apps don't give users a "browse-everything-at-a-glance" view. If your users need that, mix patterns: start pure-agent, add a small status page or list view if you discover users want one.
58
+
59
+ ## Building one {#building}
60
+
61
+ If you're not a developer, you can usually start with the [Dispatch template](/docs/template-dispatch) — it's a workspace-style pure-agent app with Slack/Telegram, scheduled jobs, and shared secrets out of the box.
62
+
63
+ For developers who want the absolute minimum, start from the **Starter** template:
40
64
 
41
65
  ```bash
42
66
  pnpm dlx @agent-native/core create my-agent --template starter
43
67
  ```
44
68
 
45
- Starter gives you the six-rules architecture, the agent panel, the workspace, auth, polling, and one example action — and nothing else. Add your own actions in `actions/`, connect any MCP servers you need, write the relevant skills into the workspace, and you're done. The "UI" is the agent sidebar — which is already complete.
69
+ Starter gives you the architecture, the agent panel, the workspace, auth, polling, and one example action — and nothing else. Add your own actions in `actions/`, connect any MCP servers you need, write the relevant skills into the workspace, and you're done.
46
70
 
47
- If you really want _zero_ UI except the agent, `app/routes/index.tsx` can just render `<AgentPanel defaultMode="chat" />` fullscreen. The only thing the user sees is the chat. Everything else — job history, workspace, settings — is one click away in the panel's tabs.
71
+ If you really want _zero_ UI except the agent, `app/routes/index.tsx` can render `<AgentPanel defaultMode="chat" />` fullscreen. The only thing the user sees is the chat. Everything else — job history, workspace, settings — is one click away in the panel's tabs.
48
72
 
49
- ## What you still get for free {#still-free}
73
+ ### What you still get for free {#still-free}
50
74
 
51
75
  Even with no custom UI, you still inherit every framework benefit:
52
76
 
53
- - **Actions** as agent tools + HTTP endpoints + MCP tools + A2A tools. External agents, Claude Desktop, and your own HTTP clients can drive the agent without going through the chat UI.
54
- - **Recurring jobs** for scheduled work — "every morning at 7 summarize my unread emails and post to Slack."
77
+ - **Actions** as agent tools, HTTP endpoints, MCP tools, and A2A tools. External agents, Claude Desktop, and your own HTTP clients can drive the agent without going through the chat UI.
78
+ - **Recurring jobs** for scheduled work — "every morning at 7, summarize my unread emails and post to Slack."
55
79
  - **The workspace** for per-user customization, skills, memory, MCP connections.
56
80
  - **Sub-agent delegation** via [agent teams](/docs/agent-teams).
57
81
  - **Portability** — deploys to any serverless host, any SQL database.
58
82
  - **Multi-tenant by default** — each user gets their own workspace without a dev-box.
59
83
 
60
- ## Adding a tiny bit of UI {#tiny-ui}
84
+ ### Adding a tiny bit of UI {#tiny-ui}
61
85
 
62
- Most "pure-agent" apps eventually want a little bit of custom UI — not a dashboard, but maybe a status page, a job history, or a config screen. The [drop-in agent](/docs/drop-in-agent) components coexist with anything else you render. Add a single `/status` route that lists recent runs; keep everything else in the chat. That's usually enough.
86
+ Most pure-agent apps eventually want a little custom UI — not a dashboard, but maybe a status page, a job history, or a config screen. The [drop-in agent](/docs/drop-in-agent) components coexist with anything else you render. Add a single `/status` route that lists recent runs; keep everything else in the chat. That's usually enough.
63
87
 
64
88
  ## What's next
65
89
 
90
+ - [**Getting Started**](/docs/getting-started) — clone the Starter template
91
+ - [**Messaging the agent**](/docs/messaging) — how users talk to the agent across web, Slack, Telegram, email
66
92
  - [**Recurring Jobs**](/docs/recurring-jobs) — scheduled prompts the agent runs on its own
93
+ - [**Dispatch**](/docs/template-dispatch) — the workspace template that's a great starting point for pure-agent apps
67
94
  - [**Drop-in Agent**](/docs/drop-in-agent) — mounting `<AgentPanel>` fullscreen or in a sidebar
68
95
  - [**Actions**](/docs/actions) — the tools your pure-agent will call
69
96
  - [**Workspace**](/docs/workspace) — the customization surface for skills, memory, and MCP servers
@@ -1,26 +1,61 @@
1
1
  ---
2
- title: "Calendar Template"
3
- description: "AI-native calendar with Google Calendar sync and a Calendly-style public booking page."
2
+ title: "Calendar"
3
+ description: "An agent-powered calendar with Google Calendar sync and Calendly-style booking links. Schedule, find slots, and manage availability through plain English."
4
4
  ---
5
5
 
6
- # Calendar Template
6
+ # Calendar
7
7
 
8
- The Calendar template is a complete scheduling app: a full calendar UI on top of Google Calendar, plus Calendly-style public booking links, all driven by an agent that can schedule, search, and manage availability on your behalf. It replaces the Google Calendar + Calendly combo with something you own and can extend.
8
+ An agent-powered calendar app. Connect your Google Calendar and the agent can read your schedule, find free slots, create events, and manage Calendly-style booking links all in plain English. It replaces the Google Calendar + Calendly combo with one app you own.
9
9
 
10
- ## Overview {#overview}
10
+ When you open the app, you'll see your calendar in the middle and the agent in the sidebar. The agent always knows which day, week, or event you're looking at, so you can say "schedule a 30-minute call with Alex on this day" without spelling everything out.
11
11
 
12
- Calendar is for anyone who currently juggles Google Calendar for their own schedule and Calendly (or similar) for letting other people book time. It gives you:
12
+ ## What you can do with it
13
13
 
14
- - Day, week, and month calendar views backed by the Google Calendar API.
15
- - Multi-account Google OAuth, so several calendars can overlay in one view.
16
- - External ICS calendar subscriptions (webcal feeds).
17
- - Configurable weekly availability with timezone support.
18
- - Public booking links at `/book/{slug}` or `/meet/{username}/{slug}` with custom durations, custom fields, and meeting-link options.
19
- - An agent that can answer schedule questions, create events, find free slots, and manage booking links through natural language.
14
+ - **See your real Google Calendar** in day, week, or month view, with multiple accounts overlayed.
15
+ - **Subscribe to ICS feeds** (HR time off, conference schedules, team calendars) read-only, mixed into the same view.
16
+ - **Set weekly availability** with timezone support — the agent uses this when finding free slots.
17
+ - **Create public booking links** at `/book/{slug}` for things like "15-minute intro" or "30-minute demo." Configure durations, custom fields, and which conferencing tool to use.
18
+ - **Ask the agent anything schedule-related**: "Am I free Thursday afternoon?" "Find a 1-hour slot next week and put 'Planning with Alex' on it." "Pause my demo booking link."
19
+ - **Share booking links** with teammates so they can manage them too.
20
20
 
21
- Events themselves are not copied into the local database. The app reads them from Google Calendar on every request. Bookings, booking links, and settings live in SQL.
21
+ ## Getting started
22
22
 
23
- ## Quick start {#quick-start}
23
+ Live demo: [calendar.agent-native.com](https://calendar.agent-native.com).
24
+
25
+ When you first open the app:
26
+
27
+ 1. Click **Settings**.
28
+ 2. Click **Connect Google Calendar** and approve.
29
+ 3. (Optional) Connect more Google accounts if you want personal + work overlayed.
30
+ 4. Open the main view — your real calendar will load.
31
+
32
+ To create your first booking link:
33
+
34
+ 1. Click **Booking Links** in the sidebar.
35
+ 2. Click **New booking link**, set a title and duration.
36
+ 3. Share the public URL — visitors pick from your available slots.
37
+
38
+ Or just ask the agent: "Create a 15-minute intro booking link with a name field."
39
+
40
+ ### Useful prompts
41
+
42
+ - "What is on my calendar today?"
43
+ - "Am I free Thursday afternoon for 30 minutes?"
44
+ - "Find a 1-hour slot next week and put 'Planning with Alex' on it."
45
+ - "Reschedule this event to Friday at 2pm." (when an event is selected)
46
+ - "Switch to day view and jump to next Monday."
47
+ - "Create a booking link called '15 min intro' at 15 minutes with a note field."
48
+ - "Pause my '30 min demo' booking link."
49
+ - "Block Friday afternoons on my availability."
50
+ - "What meetings do I have about 'launch' this month?"
51
+
52
+ The agent will query Google Calendar live for any schedule question — it never guesses.
53
+
54
+ ## For developers
55
+
56
+ The rest of this doc is for anyone forking the Calendar template or extending it.
57
+
58
+ ### Quick start
24
59
 
25
60
  Create a new workspace with the Calendar template:
26
61
 
@@ -33,29 +68,17 @@ pnpm dev
33
68
 
34
69
  Open `http://localhost:8082` (the default Calendar dev port).
35
70
 
36
- Live demo: [https://calendar.agent-native.com](https://calendar.agent-native.com).
71
+ To connect Google Calendar in dev, open the Settings view, paste a `GOOGLE_CLIENT_ID` and `GOOGLE_CLIENT_SECRET` from [Google Cloud Console](https://console.cloud.google.com/), and click "Connect Google Calendar". The OAuth redirect URI is `http://localhost:8082/_agent-native/google/callback` in dev. Tokens are stored in the `oauth_tokens` SQL table and refresh automatically.
37
72
 
38
- To connect Google Calendar, open the Settings view, paste a `GOOGLE_CLIENT_ID` and `GOOGLE_CLIENT_SECRET` from [Google Cloud Console](https://console.cloud.google.com/), and click "Connect Google Calendar". The OAuth redirect URI is `http://localhost:8082/_agent-native/google/callback` in dev. Tokens are stored in the `oauth_tokens` SQL table and refresh automatically.
73
+ ### Key features (technical)
39
74
 
40
- ## Key features {#key-features}
75
+ **Calendar views.** The main view at `/` (route `app/routes/_app._index.tsx`) renders the calendar in day, week, or month mode. Switch views from the toolbar, or ask the agent to switch for you. Events are fetched live from Google Calendar — no local sync step is required to see the latest state.
41
76
 
42
- ### Calendar views
77
+ **Multi-account Google Calendar sync.** Connect as many Google accounts as you like. Each connection appears in Settings, and events from every connected calendar overlay in the main view. Sync is pull-based, so no webhooks or background workers are required. The `sync-google-calendar` action refetches a date range on demand. Supporting actions: `list-events`, `search-events`, `get-event`, `create-event`, `sync-google-calendar`.
43
78
 
44
- The main view at `/` (route `app/routes/_app._index.tsx`) renders the calendar in day, week, or month mode. Switch views from the toolbar, or ask the agent to switch for you. Events are fetched live from Google Calendar no local sync step is required to see the latest state.
79
+ **External calendars (ICS subscriptions).** Subscribe to read-only ICS or `webcal://` feeds useful for HR time off, conference schedules, or shared team calendars. Feeds are added in Settings and stored per user. Relevant actions: `add-external-calendar`, `list-external-calendars`, `remove-external-calendar`, `update-external-calendars`.
45
80
 
46
- ### Multi-account Google Calendar sync
47
-
48
- Connect as many Google accounts as you like. Each connection appears in Settings, and events from every connected calendar overlay in the main view. Sync is pull-based, so no webhooks or background workers are required. The `sync-google-calendar` action refetches a date range on demand.
49
-
50
- Supporting actions: `list-events`, `search-events`, `get-event`, `create-event`, `sync-google-calendar`.
51
-
52
- ### External calendars (ICS subscriptions)
53
-
54
- Subscribe to read-only ICS or `webcal://` feeds — useful for HR time off, conference schedules, or shared team calendars. Feeds are added in Settings and stored per user. Relevant actions: `add-external-calendar`, `list-external-calendars`, `remove-external-calendar`, `update-external-calendars`.
55
-
56
- ### Availability rules
57
-
58
- Availability is a weekly schedule of time windows per day, plus a timezone. It is stored in the settings table under the key `calendar-availability`:
81
+ **Availability rules.** Availability is a weekly schedule of time windows per day, plus a timezone. It is stored in the settings table under the key `calendar-availability`:
59
82
 
60
83
  ```json
61
84
  {
@@ -77,9 +100,7 @@ Availability is a weekly schedule of time windows per day, plus a timezone. It i
77
100
 
78
101
  Edit it at `/availability` (`app/routes/_app.availability.tsx`) or via the `update-availability` action. The `check-availability` action reads this schedule, subtracts your existing Google Calendar events, and returns free slots of the requested duration.
79
102
 
80
- ### Public booking pages
81
-
82
- Booking links are the Calendly replacement. Create one in the UI at `/booking-links` (`app/routes/_app.booking-links._index.tsx`), configure it in the editor at `/booking-links/{id}`, and share the public URL.
103
+ **Public booking pages.** Booking links are the Calendly replacement. Create one in the UI at `/booking-links` (`app/routes/_app.booking-links._index.tsx`), configure it in the editor at `/booking-links/{id}`, and share the public URL.
83
104
 
84
105
  Every link has:
85
106
 
@@ -93,9 +114,7 @@ Visitors land on the public page, pick a date and time from the available slots,
93
114
 
94
115
  There is also a per-user public URL at `/meet/{username}/{slug}` for clean personal sharing.
95
116
 
96
- ### Sharing booking links with teammates
97
-
98
- Booking links are private by default — only the creator can edit or delete them. To let a teammate manage a link, either change the link's visibility or grant explicit access. The framework ships these actions, auto-mounted for any `booking-link` resource:
117
+ **Sharing booking links with teammates.** Booking links are private by default — only the creator can edit or delete them. To let a teammate manage a link, either change the link's visibility or grant explicit access. The framework ships these actions, auto-mounted for any `booking-link` resource:
99
118
 
100
119
  - `share-resource` — grant a user or org `viewer`, `editor`, or `admin` access.
101
120
  - `unshare-resource` — revoke a grant.
@@ -104,29 +123,15 @@ Booking links are private by default — only the creator can edit or delete the
104
123
 
105
124
  Sharing only controls who can manage the link. The public booking URL always accepts bookings from unauthenticated visitors as long as `isActive` is true.
106
125
 
107
- ### Inline event previews in chat
126
+ **Inline event previews in chat.** The `/event` route (`app/routes/event.tsx`) renders a compact, chromeless event card that the agent can embed in chat when you ask about a specific event. Title, time, location, attendees, and a description snippet are shown with a button to jump into the main calendar.
108
127
 
109
- The `/event` route (`app/routes/event.tsx`) renders a compact, chromeless event card that the agent can embed in chat when you ask about a specific event. Title, time, location, attendees, and a description snippet are shown with a button to jump into the main calendar.
110
-
111
- ## Working with the agent {#working-with-the-agent}
128
+ ### Working with the agent
112
129
 
113
130
  The agent sees what you are looking at. The current calendar view, the selected date, and the selected event are included in every message as a `current-screen` block, so you can say "this event" or "this day" and it resolves correctly.
114
131
 
115
- Example prompts:
116
-
117
- - "What is on my calendar today?"
118
- - "Am I free Thursday afternoon for 30 minutes?"
119
- - "Find a 1-hour slot next week and put 'Planning with Alex' on it."
120
- - "Reschedule this event to Friday at 2pm." (when an event is selected)
121
- - "Switch to day view and jump to next Monday."
122
- - "Create a booking link called '15 min intro' at 15 minutes with a note field."
123
- - "Pause my '30 min demo' booking link."
124
- - "Block Friday afternoons on my availability."
125
- - "What meetings do I have about 'launch' this month?"
126
-
127
132
  Under the hood the agent calls actions like `list-events`, `check-availability`, `create-event`, `navigate`, and `update-availability`. Because events live in Google Calendar, the agent always queries the API instead of guessing — it will not return empty results without running a script first.
128
133
 
129
- ## Data model {#data-model}
134
+ ### Data model
130
135
 
131
136
  Defined in `templates/calendar/server/db/schema.ts`. Only non-event data is stored locally:
132
137
 
@@ -137,7 +142,7 @@ Defined in `templates/calendar/server/db/schema.ts`. Only non-event data is stor
137
142
 
138
143
  Availability rules and per-user configuration live in the settings table, keyed by `calendar-availability`. Google OAuth tokens live in the framework `oauth_tokens` table. Ephemeral UI state (current view, date, selected event) lives in `application_state` under the `navigation` key.
139
144
 
140
- ## Customizing it {#customizing-it}
145
+ ### Customizing it
141
146
 
142
147
  Every part of the app is editable source. Start here:
143
148