@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.
- package/dist/a2a/client.d.ts +44 -1
- package/dist/a2a/client.d.ts.map +1 -1
- package/dist/a2a/client.js +88 -11
- package/dist/a2a/client.js.map +1 -1
- package/dist/a2a/handlers.d.ts +10 -0
- package/dist/a2a/handlers.d.ts.map +1 -1
- package/dist/a2a/handlers.js +287 -62
- package/dist/a2a/handlers.js.map +1 -1
- package/dist/a2a/server.d.ts.map +1 -1
- package/dist/a2a/server.js +95 -17
- package/dist/a2a/server.js.map +1 -1
- package/dist/a2a/task-store.d.ts +11 -1
- package/dist/a2a/task-store.d.ts.map +1 -1
- package/dist/a2a/task-store.js +38 -2
- package/dist/a2a/task-store.js.map +1 -1
- package/dist/agent/engine/builder-engine.d.ts +1 -1
- package/dist/agent/engine/builder-engine.d.ts.map +1 -1
- package/dist/agent/engine/builder-engine.js +7 -25
- package/dist/agent/engine/builder-engine.js.map +1 -1
- package/dist/agent/engine/builtin.js +1 -1
- package/dist/agent/engine/builtin.js.map +1 -1
- package/dist/chat-threads/store.d.ts +3 -0
- package/dist/chat-threads/store.d.ts.map +1 -1
- package/dist/chat-threads/store.js +32 -0
- package/dist/chat-threads/store.js.map +1 -1
- package/dist/cli/templates-meta.d.ts.map +1 -1
- package/dist/cli/templates-meta.js +11 -0
- package/dist/cli/templates-meta.js.map +1 -1
- package/dist/client/AgentPanel.d.ts +3 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +21 -10
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AgentTaskCard.d.ts.map +1 -1
- package/dist/client/AgentTaskCard.js +2 -0
- package/dist/client/AgentTaskCard.js.map +1 -1
- package/dist/client/AssistantChat.d.ts +2 -0
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +111 -75
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/ErrorBoundary.d.ts +1 -3
- package/dist/client/ErrorBoundary.d.ts.map +1 -1
- package/dist/client/ErrorBoundary.js +37 -9
- package/dist/client/ErrorBoundary.js.map +1 -1
- package/dist/client/FeedbackButton.d.ts.map +1 -1
- package/dist/client/FeedbackButton.js +4 -3
- package/dist/client/FeedbackButton.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +145 -49
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/agent-chat.d.ts +11 -0
- package/dist/client/agent-chat.d.ts.map +1 -1
- package/dist/client/agent-chat.js +1 -1
- package/dist/client/agent-chat.js.map +1 -1
- package/dist/client/components/AgentPresenceChip.d.ts +12 -0
- package/dist/client/components/AgentPresenceChip.d.ts.map +1 -0
- package/dist/client/components/AgentPresenceChip.js +42 -0
- package/dist/client/components/AgentPresenceChip.js.map +1 -0
- package/dist/client/components/PresenceBar.d.ts +17 -0
- package/dist/client/components/PresenceBar.d.ts.map +1 -0
- package/dist/client/components/PresenceBar.js +118 -0
- package/dist/client/components/PresenceBar.js.map +1 -0
- package/dist/client/composer/ComposerPlusMenu.d.ts +6 -1
- package/dist/client/composer/ComposerPlusMenu.d.ts.map +1 -1
- package/dist/client/composer/ComposerPlusMenu.js +22 -83
- package/dist/client/composer/ComposerPlusMenu.js.map +1 -1
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +237 -16
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/composer/types.d.ts +1 -0
- package/dist/client/composer/types.d.ts.map +1 -1
- package/dist/client/composer/useVoiceDictation.d.ts +2 -0
- package/dist/client/composer/useVoiceDictation.d.ts.map +1 -1
- package/dist/client/composer/useVoiceDictation.js +85 -10
- package/dist/client/composer/useVoiceDictation.js.map +1 -1
- package/dist/client/index.d.ts +3 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +5 -0
- package/dist/client/index.js.map +1 -1
- package/dist/client/org/RequireActiveOrg.d.ts.map +1 -1
- package/dist/client/org/RequireActiveOrg.js +15 -10
- package/dist/client/org/RequireActiveOrg.js.map +1 -1
- package/dist/client/org/TeamPage.d.ts.map +1 -1
- package/dist/client/org/TeamPage.js +125 -4
- package/dist/client/org/TeamPage.js.map +1 -1
- package/dist/client/org/hooks.d.ts +30 -0
- package/dist/client/org/hooks.d.ts.map +1 -1
- package/dist/client/org/hooks.js +65 -0
- package/dist/client/org/hooks.js.map +1 -1
- package/dist/client/org/index.d.ts +2 -2
- package/dist/client/org/index.d.ts.map +1 -1
- package/dist/client/org/index.js +1 -1
- package/dist/client/org/index.js.map +1 -1
- package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
- package/dist/client/resources/ResourcesPanel.js +5 -1
- package/dist/client/resources/ResourcesPanel.js.map +1 -1
- package/dist/client/settings/AutomationsSection.d.ts.map +1 -1
- package/dist/client/settings/AutomationsSection.js +1 -0
- package/dist/client/settings/AutomationsSection.js.map +1 -1
- package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
- package/dist/client/settings/SettingsPanel.js +24 -11
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +10 -0
- package/dist/client/sse-event-processor.js.map +1 -1
- package/dist/client/tools/ToolEditor.d.ts +5 -0
- package/dist/client/tools/ToolEditor.d.ts.map +1 -0
- package/dist/client/tools/ToolEditor.js +98 -0
- package/dist/client/tools/ToolEditor.js.map +1 -0
- package/dist/client/tools/ToolViewer.d.ts +5 -0
- package/dist/client/tools/ToolViewer.d.ts.map +1 -0
- package/dist/client/tools/ToolViewer.js +309 -0
- package/dist/client/tools/ToolViewer.js.map +1 -0
- package/dist/client/tools/ToolViewerPage.d.ts +2 -0
- package/dist/client/tools/ToolViewerPage.d.ts.map +1 -0
- package/dist/client/tools/ToolViewerPage.js +23 -0
- package/dist/client/tools/ToolViewerPage.js.map +1 -0
- package/dist/client/tools/ToolsListPage.d.ts +2 -0
- package/dist/client/tools/ToolsListPage.d.ts.map +1 -0
- package/dist/client/tools/ToolsListPage.js +72 -0
- package/dist/client/tools/ToolsListPage.js.map +1 -0
- package/dist/client/tools/ToolsSidebarSection.d.ts +2 -0
- package/dist/client/tools/ToolsSidebarSection.d.ts.map +1 -0
- package/dist/client/tools/ToolsSidebarSection.js +188 -0
- package/dist/client/tools/ToolsSidebarSection.js.map +1 -0
- package/dist/client/tools/index.d.ts +6 -0
- package/dist/client/tools/index.d.ts.map +1 -0
- package/dist/client/tools/index.js +6 -0
- package/dist/client/tools/index.js.map +1 -0
- package/dist/client/use-chat-threads.d.ts +1 -0
- package/dist/client/use-chat-threads.d.ts.map +1 -1
- package/dist/client/use-chat-threads.js +29 -0
- package/dist/client/use-chat-threads.js.map +1 -1
- package/dist/client/use-db-sync.js +6 -6
- package/dist/client/use-db-sync.js.map +1 -1
- package/dist/collab/agent-identity.d.ts +15 -0
- package/dist/collab/agent-identity.d.ts.map +1 -0
- package/dist/collab/agent-identity.js +14 -0
- package/dist/collab/agent-identity.js.map +1 -0
- package/dist/collab/agent-presence.d.ts +59 -0
- package/dist/collab/agent-presence.d.ts.map +1 -0
- package/dist/collab/agent-presence.js +165 -0
- package/dist/collab/agent-presence.js.map +1 -0
- package/dist/collab/awareness.d.ts +7 -0
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/collab/awareness.js +2 -2
- package/dist/collab/awareness.js.map +1 -1
- package/dist/collab/client-struct.d.ts +43 -0
- package/dist/collab/client-struct.d.ts.map +1 -0
- package/dist/collab/client-struct.js +272 -0
- package/dist/collab/client-struct.js.map +1 -0
- package/dist/collab/client.d.ts +2 -0
- package/dist/collab/client.d.ts.map +1 -1
- package/dist/collab/client.js +15 -1
- package/dist/collab/client.js.map +1 -1
- package/dist/collab/index.d.ts +6 -1
- package/dist/collab/index.d.ts.map +1 -1
- package/dist/collab/index.js +11 -1
- package/dist/collab/index.js.map +1 -1
- package/dist/collab/json-to-yjs.d.ts +72 -0
- package/dist/collab/json-to-yjs.d.ts.map +1 -0
- package/dist/collab/json-to-yjs.js +456 -0
- package/dist/collab/json-to-yjs.js.map +1 -0
- package/dist/collab/struct-routes.d.ts +52 -0
- package/dist/collab/struct-routes.d.ts.map +1 -0
- package/dist/collab/struct-routes.js +74 -0
- package/dist/collab/struct-routes.js.map +1 -0
- package/dist/collab/ydoc-manager.d.ts +19 -0
- package/dist/collab/ydoc-manager.d.ts.map +1 -1
- package/dist/collab/ydoc-manager.js +49 -0
- package/dist/collab/ydoc-manager.js.map +1 -1
- package/dist/deploy/build.js +1 -1
- package/dist/file-upload/builder.d.ts.map +1 -1
- package/dist/file-upload/builder.js +2 -1
- package/dist/file-upload/builder.js.map +1 -1
- package/dist/integrations/adapters/email.d.ts +17 -0
- package/dist/integrations/adapters/email.d.ts.map +1 -0
- package/dist/integrations/adapters/email.js +620 -0
- package/dist/integrations/adapters/email.js.map +1 -0
- package/dist/integrations/adapters/telegram.d.ts.map +1 -1
- package/dist/integrations/adapters/telegram.js +19 -3
- package/dist/integrations/adapters/telegram.js.map +1 -1
- package/dist/integrations/index.d.ts +1 -0
- package/dist/integrations/index.d.ts.map +1 -1
- package/dist/integrations/index.js +1 -0
- package/dist/integrations/index.js.map +1 -1
- package/dist/integrations/internal-token.d.ts +18 -0
- package/dist/integrations/internal-token.d.ts.map +1 -0
- package/dist/integrations/internal-token.js +86 -0
- package/dist/integrations/internal-token.js.map +1 -0
- package/dist/integrations/pending-tasks-retry-job.d.ts +15 -0
- package/dist/integrations/pending-tasks-retry-job.d.ts.map +1 -0
- package/dist/integrations/pending-tasks-retry-job.js +199 -0
- package/dist/integrations/pending-tasks-retry-job.js.map +1 -0
- package/dist/integrations/pending-tasks-store.d.ts +40 -0
- package/dist/integrations/pending-tasks-store.d.ts.map +1 -0
- package/dist/integrations/pending-tasks-store.js +151 -0
- package/dist/integrations/pending-tasks-store.js.map +1 -0
- package/dist/integrations/plugin.d.ts.map +1 -1
- package/dist/integrations/plugin.js +151 -9
- package/dist/integrations/plugin.js.map +1 -1
- package/dist/integrations/task-queue-stats.d.ts +22 -0
- package/dist/integrations/task-queue-stats.d.ts.map +1 -0
- package/dist/integrations/task-queue-stats.js +117 -0
- package/dist/integrations/task-queue-stats.js.map +1 -0
- package/dist/integrations/types.d.ts +2 -0
- package/dist/integrations/types.d.ts.map +1 -1
- package/dist/integrations/webhook-handler.d.ts +23 -4
- package/dist/integrations/webhook-handler.d.ts.map +1 -1
- package/dist/integrations/webhook-handler.js +217 -59
- package/dist/integrations/webhook-handler.js.map +1 -1
- package/dist/mcp-client/manager.d.ts +3 -0
- package/dist/mcp-client/manager.d.ts.map +1 -1
- package/dist/mcp-client/manager.js +5 -0
- package/dist/mcp-client/manager.js.map +1 -1
- package/dist/oauth-tokens/google-refresh.d.ts.map +1 -1
- package/dist/oauth-tokens/google-refresh.js +6 -0
- package/dist/oauth-tokens/google-refresh.js.map +1 -1
- package/dist/onboarding/default-steps.d.ts.map +1 -1
- package/dist/onboarding/default-steps.js +10 -3
- package/dist/onboarding/default-steps.js.map +1 -1
- package/dist/org/context.d.ts +35 -0
- package/dist/org/context.d.ts.map +1 -1
- package/dist/org/context.js +136 -0
- package/dist/org/context.js.map +1 -1
- package/dist/org/handlers.d.ts +76 -0
- package/dist/org/handlers.d.ts.map +1 -1
- package/dist/org/handlers.js +411 -2
- package/dist/org/handlers.js.map +1 -1
- package/dist/org/index.d.ts +2 -2
- package/dist/org/index.d.ts.map +1 -1
- package/dist/org/index.js +2 -2
- package/dist/org/index.js.map +1 -1
- package/dist/org/migrations.d.ts.map +1 -1
- package/dist/org/migrations.js +8 -0
- package/dist/org/migrations.js.map +1 -1
- package/dist/org/plugin.d.ts +6 -0
- package/dist/org/plugin.d.ts.map +1 -1
- package/dist/org/plugin.js +71 -7
- package/dist/org/plugin.js.map +1 -1
- package/dist/org/schema.d.ts +38 -0
- package/dist/org/schema.d.ts.map +1 -1
- package/dist/org/schema.js +2 -0
- package/dist/org/schema.js.map +1 -1
- package/dist/org/types.d.ts +7 -0
- package/dist/org/types.d.ts.map +1 -1
- package/dist/scripts/call-agent.d.ts.map +1 -1
- package/dist/scripts/call-agent.js +90 -18
- package/dist/scripts/call-agent.js.map +1 -1
- package/dist/scripts/db/index.d.ts.map +1 -1
- package/dist/scripts/db/index.js +2 -0
- package/dist/scripts/db/index.js.map +1 -1
- package/dist/scripts/db/migrate-user-api-keys.d.ts +24 -0
- package/dist/scripts/db/migrate-user-api-keys.d.ts.map +1 -0
- package/dist/scripts/db/migrate-user-api-keys.js +224 -0
- package/dist/scripts/db/migrate-user-api-keys.js.map +1 -0
- package/dist/scripts/db/wipe-leaked-builder-keys.d.ts +27 -0
- package/dist/scripts/db/wipe-leaked-builder-keys.d.ts.map +1 -0
- package/dist/scripts/db/wipe-leaked-builder-keys.js +163 -0
- package/dist/scripts/db/wipe-leaked-builder-keys.js.map +1 -0
- package/dist/secrets/register-framework-secrets.d.ts +5 -0
- package/dist/secrets/register-framework-secrets.d.ts.map +1 -1
- package/dist/secrets/register-framework-secrets.js +7 -44
- package/dist/secrets/register-framework-secrets.js.map +1 -1
- package/dist/secrets/substitution.d.ts.map +1 -1
- package/dist/secrets/substitution.js +14 -2
- package/dist/secrets/substitution.js.map +1 -1
- package/dist/server/action-discovery.d.ts.map +1 -1
- package/dist/server/action-discovery.js +39 -0
- package/dist/server/action-discovery.js.map +1 -1
- package/dist/server/action-routes.js +1 -1
- package/dist/server/action-routes.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +192 -45
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/auth.d.ts +14 -0
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +232 -17
- package/dist/server/auth.js.map +1 -1
- package/dist/server/builder-browser.d.ts +1 -1
- package/dist/server/builder-browser.d.ts.map +1 -1
- package/dist/server/builder-browser.js +12 -12
- package/dist/server/builder-browser.js.map +1 -1
- package/dist/server/collab-plugin.d.ts +4 -0
- package/dist/server/collab-plugin.d.ts.map +1 -1
- package/dist/server/collab-plugin.js +30 -4
- package/dist/server/collab-plugin.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +106 -100
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/credential-provider.d.ts +43 -2
- package/dist/server/credential-provider.d.ts.map +1 -1
- package/dist/server/credential-provider.js +115 -2
- package/dist/server/credential-provider.js.map +1 -1
- package/dist/server/design-token-utils.d.ts +132 -0
- package/dist/server/design-token-utils.d.ts.map +1 -0
- package/dist/server/design-token-utils.js +714 -0
- package/dist/server/design-token-utils.js.map +1 -0
- package/dist/server/email.d.ts +10 -0
- package/dist/server/email.d.ts.map +1 -1
- package/dist/server/email.js +63 -16
- package/dist/server/email.js.map +1 -1
- package/dist/server/framework-request-handler.d.ts.map +1 -1
- package/dist/server/framework-request-handler.js +38 -3
- package/dist/server/framework-request-handler.js.map +1 -1
- package/dist/server/google-oauth.d.ts +18 -1
- package/dist/server/google-oauth.d.ts.map +1 -1
- package/dist/server/google-oauth.js +21 -4
- package/dist/server/google-oauth.js.map +1 -1
- package/dist/server/index.d.ts +3 -3
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +3 -3
- package/dist/server/index.js.map +1 -1
- package/dist/server/onboarding-html.d.ts.map +1 -1
- package/dist/server/onboarding-html.js +14 -1
- package/dist/server/onboarding-html.js.map +1 -1
- package/dist/server/transcribe-voice.d.ts.map +1 -1
- package/dist/server/transcribe-voice.js +89 -24
- package/dist/server/transcribe-voice.js.map +1 -1
- package/dist/sharing/schema.d.ts +1 -1
- package/dist/styles/agent-native.css +5 -0
- package/dist/templates/default/app/root.tsx +50 -13
- package/dist/templates/default/react-router.config.ts +3 -0
- package/dist/terminal/terminal-plugin.d.ts.map +1 -1
- package/dist/terminal/terminal-plugin.js +23 -3
- package/dist/terminal/terminal-plugin.js.map +1 -1
- package/dist/tools/actions.d.ts +3 -0
- package/dist/tools/actions.d.ts.map +1 -0
- package/dist/tools/actions.js +140 -0
- package/dist/tools/actions.js.map +1 -0
- package/dist/tools/fetch-tool.js +1 -1
- package/dist/tools/fetch-tool.js.map +1 -1
- package/dist/tools/html-shell.d.ts +2 -0
- package/dist/tools/html-shell.d.ts.map +1 -0
- package/dist/tools/html-shell.js +387 -0
- package/dist/tools/html-shell.js.map +1 -0
- package/dist/tools/routes.d.ts +2 -0
- package/dist/tools/routes.d.ts.map +1 -0
- package/dist/tools/routes.js +576 -0
- package/dist/tools/routes.js.map +1 -0
- package/dist/tools/schema.d.ts +575 -0
- package/dist/tools/schema.d.ts.map +1 -0
- package/dist/tools/schema.js +112 -0
- package/dist/tools/schema.js.map +1 -0
- package/dist/tools/store.d.ts +40 -0
- package/dist/tools/store.d.ts.map +1 -0
- package/dist/tools/store.js +190 -0
- package/dist/tools/store.js.map +1 -0
- package/dist/tools/theme.d.ts +2 -0
- package/dist/tools/theme.d.ts.map +1 -0
- package/dist/tools/theme.js +67 -0
- package/dist/tools/theme.js.map +1 -0
- package/dist/transcription/builder-transcription.d.ts.map +1 -1
- package/dist/transcription/builder-transcription.js +26 -14
- package/dist/transcription/builder-transcription.js.map +1 -1
- package/dist/vite/action-types-plugin.d.ts.map +1 -1
- package/dist/vite/action-types-plugin.js +10 -2
- package/dist/vite/action-types-plugin.js.map +1 -1
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +26 -6
- package/dist/vite/client.js.map +1 -1
- package/docs/content/a2a-protocol.md +2 -2
- package/docs/content/authentication.md +51 -0
- package/docs/content/cloneable-saas.md +59 -62
- package/docs/content/faq.md +73 -43
- package/docs/content/getting-started.md +37 -61
- package/docs/content/mcp-clients.md +14 -1
- package/docs/content/messaging.md +284 -0
- package/docs/content/pure-agent-apps.md +55 -28
- package/docs/content/template-calendar.md +61 -56
- package/docs/content/template-clips.md +22 -18
- package/docs/content/template-content.md +36 -26
- package/docs/content/template-dispatch.md +2 -1
- package/docs/content/template-forms.md +13 -11
- package/docs/content/template-slides.md +43 -31
- package/docs/content/template-video.md +49 -22
- package/docs/content/tools.md +107 -0
- package/docs/content/what-is-agent-native.md +89 -105
- package/package.json +4 -1
- package/src/templates/default/app/root.tsx +50 -13
- package/src/templates/default/react-router.config.ts +3 -0
- 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: "
|
|
3
|
+
description: "Apps where the agent is the whole product — open it, ask for what you want, and the agent does the rest."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Pure-Agent Apps
|
|
7
7
|
|
|
8
|
-
|
|
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
|
-
|
|
10
|
+
That's a pure-agent app. The agent _is_ the product.
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
## What it feels like to use one {#user-experience}
|
|
13
13
|
|
|
14
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
27
|
+
## When this beats a traditional app {#when}
|
|
29
28
|
|
|
30
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
84
|
+
### Adding a tiny bit of UI {#tiny-ui}
|
|
61
85
|
|
|
62
|
-
Most
|
|
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
|
|
3
|
-
description: "
|
|
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
|
|
6
|
+
# Calendar
|
|
7
7
|
|
|
8
|
-
|
|
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
|
-
|
|
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
|
-
|
|
12
|
+
## What you can do with it
|
|
13
13
|
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
19
|
-
-
|
|
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
|
-
|
|
21
|
+
## Getting started
|
|
22
22
|
|
|
23
|
-
|
|
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
|
-
|
|
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
|
-
|
|
73
|
+
### Key features (technical)
|
|
39
74
|
|
|
40
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
145
|
+
### Customizing it
|
|
141
146
|
|
|
142
147
|
Every part of the app is editable source. Start here:
|
|
143
148
|
|