@agent-native/core 0.30.6 → 0.31.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/a2a/client.d.ts +2 -0
- package/dist/a2a/client.d.ts.map +1 -1
- package/dist/a2a/client.js +7 -5
- package/dist/a2a/client.js.map +1 -1
- package/dist/a2a/handlers.d.ts.map +1 -1
- package/dist/a2a/handlers.js +3 -0
- package/dist/a2a/handlers.js.map +1 -1
- package/dist/a2a/server.d.ts.map +1 -1
- package/dist/a2a/server.js.map +1 -1
- package/dist/a2a/task-store.d.ts.map +1 -1
- package/dist/a2a/task-store.js +5 -1
- package/dist/a2a/task-store.js.map +1 -1
- package/dist/action.js +22 -4
- package/dist/action.js.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.js +5 -0
- package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
- package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
- package/dist/agent/engine/anthropic-engine.js +0 -7
- package/dist/agent/engine/anthropic-engine.js.map +1 -1
- package/dist/agent/engine/builder-engine.d.ts.map +1 -1
- package/dist/agent/engine/builder-engine.js +4 -0
- package/dist/agent/engine/builder-engine.js.map +1 -1
- package/dist/agent/engine/registry.d.ts.map +1 -1
- package/dist/agent/engine/registry.js.map +1 -1
- package/dist/agent/engine/translate-ai-sdk.d.ts.map +1 -1
- package/dist/agent/engine/translate-ai-sdk.js +5 -3
- package/dist/agent/engine/translate-ai-sdk.js.map +1 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +31 -4
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/run-manager.d.ts.map +1 -1
- package/dist/agent/run-manager.js +21 -8
- package/dist/agent/run-manager.js.map +1 -1
- package/dist/agent/run-store.d.ts.map +1 -1
- package/dist/agent/run-store.js +5 -1
- package/dist/agent/run-store.js.map +1 -1
- package/dist/agent/tool-search.js.map +1 -1
- package/dist/application-state/store.d.ts.map +1 -1
- package/dist/application-state/store.js +18 -7
- package/dist/application-state/store.js.map +1 -1
- package/dist/brand-kit/brand-signals.d.ts +31 -0
- package/dist/brand-kit/brand-signals.d.ts.map +1 -0
- package/dist/brand-kit/brand-signals.js +101 -0
- package/dist/brand-kit/brand-signals.js.map +1 -0
- package/dist/brand-kit/index.d.ts +21 -0
- package/dist/brand-kit/index.d.ts.map +1 -0
- package/dist/brand-kit/index.js +34 -0
- package/dist/brand-kit/index.js.map +1 -0
- package/dist/brand-kit/types.d.ts +103 -0
- package/dist/brand-kit/types.d.ts.map +1 -0
- package/dist/brand-kit/types.js +17 -0
- package/dist/brand-kit/types.js.map +1 -0
- package/dist/browser-sessions/store.d.ts.map +1 -1
- package/dist/browser-sessions/store.js +6 -1
- package/dist/browser-sessions/store.js.map +1 -1
- package/dist/chat-threads/store.d.ts.map +1 -1
- package/dist/chat-threads/store.js +6 -2
- package/dist/chat-threads/store.js.map +1 -1
- package/dist/checkpoints/store.d.ts.map +1 -1
- package/dist/checkpoints/store.js +5 -1
- package/dist/checkpoints/store.js.map +1 -1
- package/dist/cli/code-agent-executor.d.ts.map +1 -1
- package/dist/cli/code-agent-executor.js.map +1 -1
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +0 -1
- package/dist/cli/create.js.map +1 -1
- package/dist/client/AgentNative.js.map +1 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +18 -20
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +69 -17
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/IframeEmbed.d.ts.map +1 -1
- package/dist/client/IframeEmbed.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +1 -1
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/RunStuckBanner.js.map +1 -1
- package/dist/client/agent-chat.d.ts +0 -3
- package/dist/client/agent-chat.d.ts.map +1 -1
- package/dist/client/agent-chat.js +0 -3
- package/dist/client/agent-chat.js.map +1 -1
- package/dist/client/builder-mark.d.ts.map +1 -1
- package/dist/client/builder-mark.js.map +1 -1
- package/dist/client/components/CodeRequiredDialog.js +0 -7
- package/dist/client/components/CodeRequiredDialog.js.map +1 -1
- package/dist/client/components/MissingKeyCard.d.ts.map +1 -1
- package/dist/client/components/MissingKeyCard.js.map +1 -1
- package/dist/client/composer/PromptComposer.d.ts.map +1 -1
- package/dist/client/composer/PromptComposer.js +6 -3
- package/dist/client/composer/PromptComposer.js.map +1 -1
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +5 -0
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/composer/VoiceButton.d.ts.map +1 -1
- package/dist/client/composer/VoiceButton.js +9 -0
- package/dist/client/composer/VoiceButton.js.map +1 -1
- package/dist/client/composer/extensions/FileReference.d.ts.map +1 -1
- package/dist/client/composer/extensions/FileReference.js.map +1 -1
- package/dist/client/composer/extensions/MentionReference.d.ts.map +1 -1
- package/dist/client/composer/extensions/MentionReference.js.map +1 -1
- package/dist/client/composer/extensions/SkillReference.d.ts.map +1 -1
- package/dist/client/composer/extensions/SkillReference.js.map +1 -1
- package/dist/client/composer/use-file-search.d.ts.map +1 -1
- package/dist/client/composer/use-file-search.js +14 -3
- package/dist/client/composer/use-file-search.js.map +1 -1
- package/dist/client/conversation/AgentConversation.js +8 -6
- package/dist/client/conversation/AgentConversation.js.map +1 -1
- package/dist/client/conversation/use-near-bottom-autoscroll.d.ts.map +1 -1
- package/dist/client/conversation/use-near-bottom-autoscroll.js +133 -35
- package/dist/client/conversation/use-near-bottom-autoscroll.js.map +1 -1
- package/dist/client/db-admin/DbAdminPage.js.map +1 -1
- package/dist/client/db-admin/EditableCell.js +1 -1
- package/dist/client/db-admin/EditableCell.js.map +1 -1
- package/dist/client/dev-overlay/DevOverlay.d.ts +0 -2
- package/dist/client/dev-overlay/DevOverlay.d.ts.map +1 -1
- package/dist/client/dev-overlay/DevOverlay.js +1 -2
- package/dist/client/dev-overlay/DevOverlay.js.map +1 -1
- package/dist/client/extensions/EmbeddedExtension.d.ts.map +1 -1
- package/dist/client/extensions/EmbeddedExtension.js +19 -0
- package/dist/client/extensions/EmbeddedExtension.js.map +1 -1
- package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionViewer.js +11 -3
- package/dist/client/extensions/ExtensionViewer.js.map +1 -1
- package/dist/client/integrations/IntegrationsPanel.d.ts.map +1 -1
- package/dist/client/integrations/IntegrationsPanel.js.map +1 -1
- package/dist/client/mcp-app-host.d.ts.map +1 -1
- package/dist/client/mcp-app-host.js +25 -3
- package/dist/client/mcp-app-host.js.map +1 -1
- package/dist/client/mcp-apps/McpAppRenderer.d.ts.map +1 -1
- package/dist/client/mcp-apps/McpAppRenderer.js +1 -1
- package/dist/client/mcp-apps/McpAppRenderer.js.map +1 -1
- package/dist/client/notifications/NotificationsBell.js.map +1 -1
- package/dist/client/onboarding/SetupButton.d.ts.map +1 -1
- package/dist/client/onboarding/SetupButton.js +6 -0
- package/dist/client/onboarding/SetupButton.js.map +1 -1
- package/dist/client/progress/RunsTray.js.map +1 -1
- package/dist/client/resources/McpServerDetail.d.ts.map +1 -1
- package/dist/client/resources/McpServerDetail.js.map +1 -1
- package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
- package/dist/client/resources/ResourcesPanel.js +0 -1
- package/dist/client/resources/ResourcesPanel.js.map +1 -1
- package/dist/client/settings/AgentsSection.d.ts.map +1 -1
- package/dist/client/settings/AgentsSection.js +1 -1
- package/dist/client/settings/AgentsSection.js.map +1 -1
- package/dist/client/settings/AutomationsSection.js.map +1 -1
- package/dist/client/settings/SettingsPanel.js +2 -2
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/sharing/ShareButton.d.ts.map +1 -1
- package/dist/client/sharing/ShareButton.js +0 -4
- package/dist/client/sharing/ShareButton.js.map +1 -1
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +13 -3
- package/dist/client/sse-event-processor.js.map +1 -1
- package/dist/client/terminal/AgentTerminal.d.ts.map +1 -1
- package/dist/client/terminal/AgentTerminal.js +1 -1
- package/dist/client/terminal/AgentTerminal.js.map +1 -1
- package/dist/client/use-agent-chat.d.ts.map +1 -1
- package/dist/client/use-agent-chat.js +20 -4
- package/dist/client/use-agent-chat.js.map +1 -1
- package/dist/client/use-chat-threads.d.ts.map +1 -1
- package/dist/client/use-chat-threads.js +39 -25
- package/dist/client/use-chat-threads.js.map +1 -1
- package/dist/client/use-db-sync.d.ts.map +1 -1
- package/dist/client/use-db-sync.js +24 -0
- package/dist/client/use-db-sync.js.map +1 -1
- package/dist/client/use-dev-mode.d.ts.map +1 -1
- package/dist/client/use-dev-mode.js +25 -9
- package/dist/client/use-dev-mode.js.map +1 -1
- package/dist/client/use-run-stuck-detection.d.ts.map +1 -1
- package/dist/client/use-run-stuck-detection.js +7 -1
- package/dist/client/use-run-stuck-detection.js.map +1 -1
- package/dist/client/useProductionAgent.d.ts.map +1 -1
- package/dist/client/useProductionAgent.js +6 -2
- package/dist/client/useProductionAgent.js.map +1 -1
- package/dist/collab/agent-presence.d.ts +0 -3
- package/dist/collab/agent-presence.d.ts.map +1 -1
- package/dist/collab/agent-presence.js +3 -5
- package/dist/collab/agent-presence.js.map +1 -1
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/collab/awareness.js +11 -1
- package/dist/collab/awareness.js.map +1 -1
- package/dist/collab/client-struct.js.map +1 -1
- package/dist/collab/storage.d.ts.map +1 -1
- package/dist/collab/storage.js +5 -1
- package/dist/collab/storage.js.map +1 -1
- package/dist/collab/ydoc-manager.d.ts.map +1 -1
- package/dist/collab/ydoc-manager.js +35 -8
- package/dist/collab/ydoc-manager.js.map +1 -1
- package/dist/deploy/build.js +0 -5
- package/dist/deploy/build.js.map +1 -1
- package/dist/extensions/content-patch.js +1 -1
- package/dist/extensions/content-patch.js.map +1 -1
- package/dist/extensions/fetch-tool.d.ts.map +1 -1
- package/dist/extensions/fetch-tool.js +4 -1
- package/dist/extensions/fetch-tool.js.map +1 -1
- package/dist/extensions/routes.js +12 -12
- package/dist/extensions/routes.js.map +1 -1
- package/dist/extensions/slots/store.d.ts.map +1 -1
- package/dist/extensions/slots/store.js +5 -1
- package/dist/extensions/slots/store.js.map +1 -1
- package/dist/file-upload/actions/upload-image.d.ts.map +1 -1
- package/dist/file-upload/actions/upload-image.js +39 -4
- package/dist/file-upload/actions/upload-image.js.map +1 -1
- package/dist/integrations/a2a-continuations-store.d.ts.map +1 -1
- package/dist/integrations/a2a-continuations-store.js +5 -1
- package/dist/integrations/a2a-continuations-store.js.map +1 -1
- package/dist/integrations/adapters/email.d.ts.map +1 -1
- package/dist/integrations/adapters/email.js +5 -2
- package/dist/integrations/adapters/email.js.map +1 -1
- package/dist/integrations/adapters/slack.d.ts.map +1 -1
- package/dist/integrations/adapters/slack.js.map +1 -1
- package/dist/integrations/google-docs-poller.d.ts.map +1 -1
- package/dist/integrations/google-docs-poller.js +16 -5
- package/dist/integrations/google-docs-poller.js.map +1 -1
- package/dist/integrations/pending-tasks-retry-job.d.ts.map +1 -1
- package/dist/integrations/pending-tasks-retry-job.js +6 -2
- package/dist/integrations/pending-tasks-retry-job.js.map +1 -1
- package/dist/integrations/pending-tasks-store.d.ts.map +1 -1
- package/dist/integrations/pending-tasks-store.js +5 -1
- package/dist/integrations/pending-tasks-store.js.map +1 -1
- package/dist/integrations/plugin.d.ts.map +1 -1
- package/dist/integrations/plugin.js +14 -3
- package/dist/integrations/plugin.js.map +1 -1
- package/dist/integrations/remote-commands-store.d.ts.map +1 -1
- package/dist/integrations/remote-commands-store.js +5 -1
- package/dist/integrations/remote-commands-store.js.map +1 -1
- package/dist/integrations/remote-devices-store.d.ts.map +1 -1
- package/dist/integrations/remote-devices-store.js +5 -1
- package/dist/integrations/remote-devices-store.js.map +1 -1
- package/dist/integrations/remote-push-store.d.ts.map +1 -1
- package/dist/integrations/remote-push-store.js +5 -1
- package/dist/integrations/remote-push-store.js.map +1 -1
- package/dist/integrations/remote-retry-job.js +1 -1
- package/dist/integrations/remote-retry-job.js.map +1 -1
- package/dist/integrations/remote-run-events-store.d.ts.map +1 -1
- package/dist/integrations/remote-run-events-store.js +5 -1
- package/dist/integrations/remote-run-events-store.js.map +1 -1
- package/dist/integrations/thread-mapping-store.d.ts.map +1 -1
- package/dist/integrations/thread-mapping-store.js +5 -1
- package/dist/integrations/thread-mapping-store.js.map +1 -1
- package/dist/integrations/webhook-handler.d.ts.map +1 -1
- package/dist/integrations/webhook-handler.js +10 -1
- package/dist/integrations/webhook-handler.js.map +1 -1
- package/dist/jobs/scheduler.d.ts.map +1 -1
- package/dist/jobs/scheduler.js +31 -15
- package/dist/jobs/scheduler.js.map +1 -1
- package/dist/jobs/tools.d.ts.map +1 -1
- package/dist/jobs/tools.js +4 -1
- package/dist/jobs/tools.js.map +1 -1
- package/dist/mcp/build-server.d.ts.map +1 -1
- package/dist/mcp/build-server.js +24 -9
- package/dist/mcp/build-server.js.map +1 -1
- package/dist/mcp/connect-store.d.ts +3 -4
- package/dist/mcp/connect-store.d.ts.map +1 -1
- package/dist/mcp/connect-store.js +5 -5
- package/dist/mcp/connect-store.js.map +1 -1
- package/dist/mcp-client/routes.js +6 -1
- package/dist/mcp-client/routes.js.map +1 -1
- package/dist/notifications/channels.d.ts.map +1 -1
- package/dist/notifications/channels.js +3 -2
- package/dist/notifications/channels.js.map +1 -1
- package/dist/oauth-tokens/store.d.ts.map +1 -1
- package/dist/oauth-tokens/store.js +5 -1
- package/dist/oauth-tokens/store.js.map +1 -1
- package/dist/observability/evals.d.ts.map +1 -1
- package/dist/observability/evals.js +7 -7
- package/dist/observability/evals.js.map +1 -1
- package/dist/observability/traces.d.ts.map +1 -1
- package/dist/observability/traces.js +15 -5
- package/dist/observability/traces.js.map +1 -1
- package/dist/org/accept-pending.js +1 -1
- package/dist/org/accept-pending.js.map +1 -1
- package/dist/org/handlers.d.ts.map +1 -1
- package/dist/org/handlers.js +3 -2
- package/dist/org/handlers.js.map +1 -1
- package/dist/progress/store.d.ts.map +1 -1
- package/dist/progress/store.js +11 -1
- package/dist/progress/store.js.map +1 -1
- package/dist/resources/handlers.d.ts +5 -5
- package/dist/resources/handlers.d.ts.map +1 -1
- package/dist/resources/handlers.js +0 -2
- package/dist/resources/handlers.js.map +1 -1
- package/dist/resources/store.d.ts.map +1 -1
- package/dist/resources/store.js +23 -13
- package/dist/resources/store.js.map +1 -1
- package/dist/scripts/db/query.d.ts.map +1 -1
- package/dist/scripts/db/query.js +1 -2
- package/dist/scripts/db/query.js.map +1 -1
- package/dist/scripts/db/schema.js.map +1 -1
- package/dist/server/action-discovery.d.ts.map +1 -1
- package/dist/server/action-discovery.js +10 -3
- package/dist/server/action-discovery.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +3 -6
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +13 -9
- package/dist/server/auth.js.map +1 -1
- package/dist/server/better-auth-instance.d.ts.map +1 -1
- package/dist/server/better-auth-instance.js +0 -3
- package/dist/server/better-auth-instance.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +1 -2
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/create-server.d.ts.map +1 -1
- package/dist/server/create-server.js +0 -23
- package/dist/server/create-server.js.map +1 -1
- package/dist/server/google-oauth.d.ts.map +1 -1
- package/dist/server/google-oauth.js +0 -3
- package/dist/server/google-oauth.js.map +1 -1
- package/dist/server/identity-sso-store.d.ts.map +1 -1
- package/dist/server/identity-sso-store.js +14 -3
- package/dist/server/identity-sso-store.js.map +1 -1
- package/dist/server/poll.d.ts.map +1 -1
- package/dist/server/poll.js +67 -18
- package/dist/server/poll.js.map +1 -1
- package/dist/server/schema-prompt.js +1 -1
- package/dist/server/schema-prompt.js.map +1 -1
- package/dist/server/security-headers.d.ts +5 -4
- package/dist/server/security-headers.d.ts.map +1 -1
- package/dist/server/security-headers.js +5 -4
- package/dist/server/security-headers.js.map +1 -1
- package/dist/settings/store.d.ts.map +1 -1
- package/dist/settings/store.js +5 -1
- package/dist/settings/store.js.map +1 -1
- package/dist/sharing/access.d.ts.map +1 -1
- package/dist/sharing/access.js +25 -4
- package/dist/sharing/access.js.map +1 -1
- package/dist/sharing/actions/set-resource-visibility.d.ts.map +1 -1
- package/dist/sharing/actions/set-resource-visibility.js +8 -1
- package/dist/sharing/actions/set-resource-visibility.js.map +1 -1
- package/dist/triggers/actions.d.ts.map +1 -1
- package/dist/triggers/actions.js +1 -2
- package/dist/triggers/actions.js.map +1 -1
- package/dist/triggers/dispatcher.d.ts.map +1 -1
- package/dist/triggers/dispatcher.js +36 -8
- package/dist/triggers/dispatcher.js.map +1 -1
- package/dist/usage/store.d.ts.map +1 -1
- package/dist/usage/store.js +5 -1
- package/dist/usage/store.js.map +1 -1
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +7 -5
- package/dist/vite/client.js.map +1 -1
- package/package.json +3 -2
- package/dist/client/conversation/AgentConversation.spec.d.ts +0 -2
- package/dist/client/conversation/AgentConversation.spec.d.ts.map +0 -1
- package/dist/client/conversation/AgentConversation.spec.js +0 -69
- package/dist/client/conversation/AgentConversation.spec.js.map +0 -1
- package/dist/client/extensions/AgentNativeExtensionFrame.e2e-host.d.ts +0 -2
- package/dist/client/extensions/AgentNativeExtensionFrame.e2e-host.d.ts.map +0 -1
- package/dist/client/extensions/AgentNativeExtensionFrame.e2e-host.js +0 -110
- package/dist/client/extensions/AgentNativeExtensionFrame.e2e-host.js.map +0 -1
- package/dist/client/extensions/AgentNativeExtensionFrame.spec.d.ts +0 -2
- package/dist/client/extensions/AgentNativeExtensionFrame.spec.d.ts.map +0 -1
- package/dist/client/extensions/AgentNativeExtensionFrame.spec.js +0 -68
- package/dist/client/extensions/AgentNativeExtensionFrame.spec.js.map +0 -1
- package/dist/client/extensions/ExtensionViewer.spec.d.ts +0 -2
- package/dist/client/extensions/ExtensionViewer.spec.d.ts.map +0 -1
- package/dist/client/extensions/ExtensionViewer.spec.js +0 -94
- package/dist/client/extensions/ExtensionViewer.spec.js.map +0 -1
- package/dist/client/guided-questions.flow.spec.d.ts +0 -2
- package/dist/client/guided-questions.flow.spec.d.ts.map +0 -1
- package/dist/client/guided-questions.flow.spec.js +0 -147
- package/dist/client/guided-questions.flow.spec.js.map +0 -1
- package/dist/client/settings/useBuilderStatus.spec.d.ts +0 -2
- package/dist/client/settings/useBuilderStatus.spec.d.ts.map +0 -1
- package/dist/client/settings/useBuilderStatus.spec.js +0 -487
- package/dist/client/settings/useBuilderStatus.spec.js.map +0 -1
- package/dist/client/sharing/ShareButton.spec.d.ts +0 -2
- package/dist/client/sharing/ShareButton.spec.d.ts.map +0 -1
- package/dist/client/sharing/ShareButton.spec.js +0 -196
- package/dist/client/sharing/ShareButton.spec.js.map +0 -1
- package/dist/client/use-chat-models.spec.d.ts +0 -2
- package/dist/client/use-chat-models.spec.d.ts.map +0 -1
- package/dist/client/use-chat-models.spec.js +0 -39
- package/dist/client/use-chat-models.spec.js.map +0 -1
- package/dist/client/use-chat-threads.spec.d.ts +0 -2
- package/dist/client/use-chat-threads.spec.d.ts.map +0 -1
- package/dist/client/use-chat-threads.spec.js +0 -760
- package/dist/client/use-chat-threads.spec.js.map +0 -1
- package/dist/client/use-db-sync.spec.d.ts +0 -2
- package/dist/client/use-db-sync.spec.d.ts.map +0 -1
- package/dist/client/use-db-sync.spec.js +0 -107
- package/dist/client/use-db-sync.spec.js.map +0 -1
- package/dist/server/script-discovery.d.ts +0 -6
- package/dist/server/script-discovery.d.ts.map +0 -1
- package/dist/server/script-discovery.js +0 -6
- package/dist/server/script-discovery.js.map +0 -1
|
@@ -16,6 +16,11 @@ let snapshot = {
|
|
|
16
16
|
capabilities: null,
|
|
17
17
|
version: null,
|
|
18
18
|
};
|
|
19
|
+
const EMPTY_HOST_CONTEXT_SNAPSHOT = {
|
|
20
|
+
context: null,
|
|
21
|
+
capabilities: null,
|
|
22
|
+
version: null,
|
|
23
|
+
};
|
|
19
24
|
const listeners = new Set();
|
|
20
25
|
const pending = new Map();
|
|
21
26
|
const jsonRpcPending = new Map();
|
|
@@ -79,7 +84,17 @@ function hasWrapperBridge() {
|
|
|
79
84
|
function isTrustedParentMessage(event) {
|
|
80
85
|
if (!isInChildFrame())
|
|
81
86
|
return false;
|
|
82
|
-
|
|
87
|
+
if (event.source !== window.parent)
|
|
88
|
+
return false;
|
|
89
|
+
// Defense in depth: once the parent's real origin is known (captured from the
|
|
90
|
+
// browser-stamped event.origin during the frameOrigin handshake, so it can't
|
|
91
|
+
// be spoofed), also require inbound messages to come from that origin. When
|
|
92
|
+
// it isn't known yet (null) or is opaque ("null"), fall back to source-only.
|
|
93
|
+
const expectedOrigin = getFrameOrigin();
|
|
94
|
+
if (expectedOrigin && expectedOrigin !== "null") {
|
|
95
|
+
return event.origin === expectedOrigin;
|
|
96
|
+
}
|
|
97
|
+
return true;
|
|
83
98
|
}
|
|
84
99
|
function requestId() {
|
|
85
100
|
return `mcp-host-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
|
|
@@ -324,7 +339,14 @@ async function ensureDirectMcpAppInitialized() {
|
|
|
324
339
|
updateSnapshotFromInitialize(result);
|
|
325
340
|
postJsonRpcNotification("ui/notifications/initialized", {});
|
|
326
341
|
return true;
|
|
327
|
-
})().catch(() =>
|
|
342
|
+
})().catch(() => {
|
|
343
|
+
// Reset so the next call retries the handshake. Otherwise one timed-out
|
|
344
|
+
// ui/initialize (e.g. host briefly unresponsive) leaves a permanently
|
|
345
|
+
// resolved `Promise<false>` cached here, and every later bridge call
|
|
346
|
+
// fails until full page reload.
|
|
347
|
+
directMcpAppInit = null;
|
|
348
|
+
return false;
|
|
349
|
+
});
|
|
328
350
|
}
|
|
329
351
|
return directMcpAppInit;
|
|
330
352
|
}
|
|
@@ -449,7 +471,7 @@ export function useMcpAppHostContext() {
|
|
|
449
471
|
return () => {
|
|
450
472
|
listeners.delete(listener);
|
|
451
473
|
};
|
|
452
|
-
}, () => snapshot, () =>
|
|
474
|
+
}, () => snapshot, () => EMPTY_HOST_CONTEXT_SNAPSHOT);
|
|
453
475
|
}
|
|
454
476
|
export function updateMcpAppModelContext(update) {
|
|
455
477
|
return postHostRequest(AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES.UPDATE_MODEL_CONTEXT, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-app-host.js","sourceRoot":"","sources":["../../src/client/mcp-app-host.ts"],"names":[],"mappings":"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","sourcesContent":["import { useSyncExternalStore } from \"react\";\nimport { getFrameOrigin } from \"./frame.js\";\nimport {\n getEmbedAuthToken,\n isEmbedAuthActive,\n markEmbedMcpChatBridgeActive,\n isEmbedMcpChatBridgeActive,\n readEmbedMcpChatBridgeFlagFromUrl,\n} from \"./embed-auth.js\";\nimport {\n EMBED_MODE_QUERY_PARAM,\n EMBED_TOKEN_QUERY_PARAM,\n MCP_APP_CHAT_BRIDGE_QUERY_PARAM,\n} from \"../shared/embed-auth.js\";\n\nexport const AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES = {\n HOST_CONTEXT: \"agentNative.mcpHostContext\",\n UPDATE_MODEL_CONTEXT: \"agentNative.mcpHost.updateModelContext\",\n OPEN_LINK: \"agentNative.mcpHost.openLink\",\n REQUEST_DISPLAY_MODE: \"agentNative.mcpHost.requestDisplayMode\",\n RESPONSE: \"agentNative.mcpHost.response\",\n} as const;\n\nexport type AgentNativeMcpAppHostMessageType =\n (typeof AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES)[keyof typeof AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES];\n\nexport type McpAppDisplayMode = \"inline\" | \"pip\" | \"fullscreen\" | (string & {});\n\nexport interface McpAppModelContextContentPart {\n type: string;\n [key: string]: unknown;\n}\n\nexport interface McpAppModelContextUpdate {\n content?: McpAppModelContextContentPart[];\n structuredContent?: unknown;\n}\n\nexport interface McpAppHostChatMessage {\n message: string;\n context?: string;\n content?: McpAppModelContextContentPart[];\n structuredContent?: unknown;\n}\n\nexport interface McpAppHostCapabilities {\n updateModelContext?: boolean;\n openLink?: boolean;\n displayModes?: McpAppDisplayMode[];\n [key: string]: unknown;\n}\n\nexport interface McpAppHostContext {\n capabilities?: McpAppHostCapabilities;\n [key: string]: unknown;\n}\n\nexport interface McpAppHostContextSnapshot {\n context: McpAppHostContext | null;\n capabilities: McpAppHostCapabilities | null;\n version: unknown;\n}\n\ntype PendingRequest = {\n resolve: (ok: boolean) => void;\n timeout: ReturnType<typeof setTimeout>;\n};\n\ntype PendingJsonRpcRequest = {\n resolve: (result: unknown) => void;\n reject: (error: Error) => void;\n timeout: ReturnType<typeof setTimeout>;\n};\n\ntype HostContextMessage = {\n type: typeof AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES.HOST_CONTEXT;\n data?: {\n context?: unknown;\n capabilities?: unknown;\n version?: unknown;\n };\n};\n\ntype HostResponseMessage = {\n type: typeof AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES.RESPONSE;\n data?: {\n requestId?: unknown;\n ok?: unknown;\n result?: unknown;\n error?: unknown;\n };\n};\n\nconst REQUEST_TIMEOUT_MS = 5000;\nconst DIRECT_MCP_APP_PROTOCOL_VERSION = \"2026-01-26\";\n\nlet snapshot: McpAppHostContextSnapshot = {\n context: null,\n capabilities: null,\n version: null,\n};\nconst listeners = new Set<() => void>();\nconst pending = new Map<string, PendingRequest>();\nconst jsonRpcPending = new Map<string, PendingJsonRpcRequest>();\nlet directMcpAppInit: Promise<boolean> | null = null;\nlet listenerInstalled = false;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isBrowserWindow(): boolean {\n return (\n typeof window !== \"undefined\" && typeof window.postMessage === \"function\"\n );\n}\n\nfunction isInChildFrame(): boolean {\n if (!isBrowserWindow()) return false;\n try {\n return window.parent !== window;\n } catch {\n return false;\n }\n}\n\nfunction isMcpAppBridgeEnabled(): boolean {\n if (!isBrowserWindow()) return false;\n if (readEmbedMcpChatBridgeFlagFromUrl()) markEmbedMcpChatBridgeActive();\n if (isEmbedMcpChatBridgeActive() && isEmbedAuthActive()) return true;\n const params = new URLSearchParams(window.location.search || \"\");\n return (\n params.get(EMBED_MODE_QUERY_PARAM) === \"1\" &&\n (params.has(EMBED_TOKEN_QUERY_PARAM) || Boolean(getEmbedAuthToken())) &&\n params.get(MCP_APP_CHAT_BRIDGE_QUERY_PARAM) === \"1\"\n );\n}\n\nfunction isClaudeMcpContentHost(): boolean {\n if (!isBrowserWindow()) return false;\n try {\n return /(^|\\.)claudemcpcontent\\.com$/i.test(window.location.hostname || \"\");\n } catch {\n return false;\n }\n}\n\nfunction hasWrapperBridge(): boolean {\n if (!isBrowserWindow()) return false;\n const params = new URLSearchParams(window.location.search || \"\");\n const mode =\n params.get(\"embedMode\") ??\n params.get(\"renderMode\") ??\n params.get(\"embed_mode\") ??\n \"\";\n if (mode === \"iframe\" || mode === \"nested\") return true;\n if (params.get(\"nested\") === \"1\" || params.get(\"frame\") === \"iframe\") {\n return true;\n }\n if (isClaudeMcpContentHost()) return false;\n return Boolean(getFrameOrigin());\n}\n\nfunction isTrustedParentMessage(event: MessageEvent): boolean {\n if (!isInChildFrame()) return false;\n return event.source === window.parent;\n}\n\nfunction requestId(): string {\n return `mcp-host-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction jsonRpcRequestId(): string {\n return `mcp-ui-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction notify() {\n for (const listener of listeners) listener();\n}\n\nfunction updateSnapshot(data: HostContextMessage[\"data\"]): void {\n if (!isRecord(data)) return;\n snapshot = {\n context: isRecord(data.context)\n ? (data.context as McpAppHostContext)\n : snapshot.context,\n capabilities: isRecord(data.capabilities)\n ? (data.capabilities as McpAppHostCapabilities)\n : snapshot.capabilities,\n version: data.version !== undefined ? data.version : snapshot.version,\n };\n notify();\n}\n\nfunction updateSnapshotFromInitialize(result: unknown): void {\n if (!isRecord(result)) return;\n updateSnapshot({\n context: result.hostContext,\n capabilities: result.hostCapabilities,\n version: result.hostInfo ?? result.protocolVersion,\n });\n}\n\nfunction updateSnapshotFromOpenAiBridge(bridge: OpenAiAppBridge): void {\n updateSnapshot({\n context: {\n displayMode: bridge.displayMode,\n availableDisplayModes:\n typeof bridge.requestDisplayMode === \"function\"\n ? [\"inline\", \"fullscreen\", \"pip\"]\n : [],\n maxHeight: bridge.maxHeight,\n locale: bridge.locale,\n theme: bridge.theme,\n view: bridge.view,\n },\n capabilities: {\n updateModelContext: typeof bridge.setWidgetState === \"function\",\n openLink: typeof bridge.openExternal === \"function\",\n displayModes:\n typeof bridge.requestDisplayMode === \"function\"\n ? [\"inline\", \"fullscreen\", \"pip\"]\n : [],\n openai: true,\n },\n version: bridge.userAgent,\n });\n}\n\nfunction resolvePending(data: HostResponseMessage[\"data\"]): void {\n if (!isRecord(data) || typeof data.requestId !== \"string\") return;\n const request = pending.get(data.requestId);\n if (!request) return;\n pending.delete(data.requestId);\n clearTimeout(request.timeout);\n request.resolve(data.ok === true);\n}\n\nfunction resolveJsonRpc(data: Record<string, unknown>): void {\n const id = typeof data.id === \"string\" ? data.id : String(data.id ?? \"\");\n if (!id) return;\n const request = jsonRpcPending.get(id);\n if (!request) return;\n jsonRpcPending.delete(id);\n clearTimeout(request.timeout);\n if (isRecord(data.error)) {\n const message =\n typeof data.error.message === \"string\"\n ? data.error.message\n : \"MCP Apps host request failed.\";\n request.reject(new Error(message));\n return;\n }\n request.resolve(data.result ?? {});\n}\n\nfunction handleJsonRpcNotification(message: Record<string, unknown>): void {\n if (message.method !== \"ui/notifications/host-context-changed\") return;\n updateSnapshot({\n context: isRecord(message.params) ? message.params : undefined,\n });\n}\n\nfunction onMessage(event: MessageEvent): void {\n if (!isTrustedParentMessage(event)) return;\n const message = event.data;\n if (!isRecord(message)) return;\n\n if (message.type === AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES.HOST_CONTEXT) {\n updateSnapshot((message as HostContextMessage).data);\n return;\n }\n\n if (message.type === AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES.RESPONSE) {\n resolvePending((message as HostResponseMessage).data);\n return;\n }\n\n if (message.jsonrpc === \"2.0\") {\n if (\"id\" in message && (\"result\" in message || \"error\" in message)) {\n resolveJsonRpc(message);\n return;\n }\n if (typeof message.method === \"string\") {\n handleJsonRpcNotification(message);\n }\n }\n}\n\nfunction ensureListener(): void {\n if (!isBrowserWindow() || listenerInstalled) return;\n window.addEventListener(\"message\", onMessage);\n listenerInstalled = true;\n}\n\nfunction postHostRequest(\n type:\n | typeof AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES.UPDATE_MODEL_CONTEXT\n | typeof AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES.OPEN_LINK\n | typeof AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES.REQUEST_DISPLAY_MODE,\n data: Record<string, unknown>,\n): Promise<boolean> | false {\n ensureListener();\n if (!isInChildFrame() || !isMcpAppBridgeEnabled()) return false;\n\n if (!hasWrapperBridge()) {\n return postDirectHostRequest(type, data);\n }\n\n const id =\n typeof data.requestId === \"string\" && data.requestId\n ? data.requestId\n : requestId();\n const payload = { ...data, requestId: id };\n\n return new Promise((resolve) => {\n const timeout = setTimeout(() => {\n pending.delete(id);\n resolve(false);\n }, REQUEST_TIMEOUT_MS);\n pending.set(id, { resolve, timeout });\n\n try {\n window.parent.postMessage({ type, data: payload }, \"*\");\n } catch {\n pending.delete(id);\n clearTimeout(timeout);\n resolve(false);\n }\n });\n}\n\nfunction postWrapperHostChat(chat: McpAppHostChatMessage): Promise<boolean> {\n ensureListener();\n const id = requestId();\n return new Promise((resolve) => {\n const timeout = setTimeout(() => {\n pending.delete(id);\n resolve(false);\n }, REQUEST_TIMEOUT_MS);\n pending.set(id, { resolve, timeout });\n\n try {\n window.parent.postMessage(\n {\n type: \"agentNative.submitChat\",\n data: {\n requestId: id,\n message: chat.message,\n context: chat.context?.trim() || \"\",\n submit: true,\n ...(chat.content?.length ? { content: chat.content } : {}),\n ...(chat.structuredContent !== undefined\n ? { structuredContent: chat.structuredContent }\n : {}),\n },\n },\n \"*\",\n );\n } catch {\n pending.delete(id);\n clearTimeout(timeout);\n resolve(false);\n }\n });\n}\n\ninterface OpenAiAppBridge {\n widgetState?: unknown;\n displayMode?: unknown;\n maxHeight?: unknown;\n locale?: unknown;\n theme?: unknown;\n view?: unknown;\n userAgent?: unknown;\n setWidgetState?: (state: unknown) => void;\n sendFollowUpMessage?: (args: {\n prompt: string;\n scrollToBottom?: boolean;\n }) => unknown | Promise<unknown>;\n openExternal?: (args: {\n href: string;\n redirectUrl?: boolean;\n }) => unknown | Promise<unknown>;\n requestDisplayMode?: (args: {\n mode: McpAppDisplayMode;\n }) => unknown | Promise<unknown>;\n}\n\nfunction readOpenAiBridge(): OpenAiAppBridge | null {\n if (!isBrowserWindow()) return null;\n const bridge = (window as unknown as { openai?: unknown }).openai;\n return bridge && typeof bridge === \"object\"\n ? (bridge as OpenAiAppBridge)\n : null;\n}\n\nfunction objectValue(value: unknown): Record<string, unknown> {\n return isRecord(value) ? value : {};\n}\n\nfunction postJsonRpcNotification(method: string, params?: unknown): void {\n if (!isInChildFrame()) return;\n try {\n window.parent.postMessage({ jsonrpc: \"2.0\", method, params }, \"*\");\n } catch {\n // Best-effort lifecycle notification.\n }\n}\n\nfunction postJsonRpcRequest(\n method: string,\n params?: unknown,\n): Promise<unknown> | false {\n ensureListener();\n if (!isInChildFrame()) return false;\n\n const id = jsonRpcRequestId();\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n jsonRpcPending.delete(id);\n reject(new Error(\"MCP Apps host did not respond.\"));\n }, REQUEST_TIMEOUT_MS);\n jsonRpcPending.set(id, { resolve, reject, timeout });\n\n try {\n window.parent.postMessage({ jsonrpc: \"2.0\", id, method, params }, \"*\");\n } catch (err) {\n jsonRpcPending.delete(id);\n clearTimeout(timeout);\n reject(err instanceof Error ? err : new Error(String(err)));\n }\n });\n}\n\nasync function ensureDirectMcpAppInitialized(): Promise<boolean> {\n if (!isInChildFrame() || !isMcpAppBridgeEnabled()) return false;\n if (hasWrapperBridge()) return true;\n\n const openAiBridge = readOpenAiBridge();\n if (openAiBridge) {\n updateSnapshotFromOpenAiBridge(openAiBridge);\n return true;\n }\n\n if (!directMcpAppInit) {\n directMcpAppInit = (async () => {\n const result = await postJsonRpcRequest(\"ui/initialize\", {\n protocolVersion: DIRECT_MCP_APP_PROTOCOL_VERSION,\n appInfo: { name: \"Agent Native App\", version: \"1.0.0\" },\n appCapabilities: {\n availableDisplayModes: [\"inline\", \"fullscreen\", \"pip\"],\n },\n });\n updateSnapshotFromInitialize(result);\n postJsonRpcNotification(\"ui/notifications/initialized\", {});\n return true;\n })().catch(() => false);\n }\n\n return directMcpAppInit;\n}\n\nasync function waitForDirectMcpAppInitialized(): Promise<void> {\n const ok = await ensureDirectMcpAppInitialized();\n if (!ok) throw new Error(\"MCP Apps host bridge is not available.\");\n}\n\nasync function postDirectHostRequest(\n type:\n | typeof AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES.UPDATE_MODEL_CONTEXT\n | typeof AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES.OPEN_LINK\n | typeof AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES.REQUEST_DISPLAY_MODE,\n data: Record<string, unknown>,\n): Promise<boolean> {\n const openAiBridge = readOpenAiBridge();\n if (openAiBridge) {\n updateSnapshotFromOpenAiBridge(openAiBridge);\n if (\n type === AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES.UPDATE_MODEL_CONTEXT &&\n typeof openAiBridge.setWidgetState === \"function\"\n ) {\n openAiBridge.setWidgetState({\n ...objectValue(openAiBridge.widgetState),\n agentNativeModelContext: {\n ...(Array.isArray(data.content) ? { content: data.content } : {}),\n ...(data.structuredContent !== undefined\n ? { structuredContent: data.structuredContent }\n : {}),\n },\n });\n return true;\n }\n if (\n type === AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES.OPEN_LINK &&\n typeof openAiBridge.openExternal === \"function\" &&\n typeof data.url === \"string\"\n ) {\n await openAiBridge.openExternal({\n href: data.url,\n redirectUrl: false,\n });\n return true;\n }\n if (\n type === AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES.REQUEST_DISPLAY_MODE &&\n typeof openAiBridge.requestDisplayMode === \"function\" &&\n typeof data.mode === \"string\"\n ) {\n await openAiBridge.requestDisplayMode({ mode: data.mode });\n updateSnapshotFromOpenAiBridge(openAiBridge);\n return true;\n }\n }\n\n await waitForDirectMcpAppInitialized();\n const method =\n type === AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES.UPDATE_MODEL_CONTEXT\n ? \"ui/update-model-context\"\n : type === AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES.OPEN_LINK\n ? \"ui/open-link\"\n : \"ui/request-display-mode\";\n await postJsonRpcRequest(method, data);\n return true;\n}\n\nexport function sendMcpAppHostMessage(\n chat: McpAppHostChatMessage,\n): Promise<boolean> | false {\n if (!chat.message.trim() || !isInChildFrame() || !isMcpAppBridgeEnabled()) {\n return false;\n }\n\n if (hasWrapperBridge()) return postWrapperHostChat(chat);\n\n return (async () => {\n const openAiBridge = readOpenAiBridge();\n const context = chat.context?.trim() || null;\n const content = chat.content?.length\n ? chat.content\n : [{ type: \"text\", text: chat.message }];\n const contextContent = context\n ? [\n { type: \"text\", text: context },\n ...content.filter((part) => part && part.type !== \"text\"),\n ]\n : content.filter((part) => part && part.type !== \"text\");\n if (\n openAiBridge &&\n typeof openAiBridge.sendFollowUpMessage === \"function\"\n ) {\n updateSnapshotFromOpenAiBridge(openAiBridge);\n if (typeof openAiBridge.setWidgetState === \"function\") {\n openAiBridge.setWidgetState({\n ...objectValue(openAiBridge.widgetState),\n agentNativeChatContext: context,\n agentNativeModelContext: {\n content: contextContent,\n ...(chat.structuredContent !== undefined\n ? { structuredContent: chat.structuredContent }\n : {}),\n },\n });\n }\n await openAiBridge.sendFollowUpMessage({\n prompt: chat.message,\n scrollToBottom: true,\n });\n return true;\n }\n\n await waitForDirectMcpAppInitialized();\n try {\n await postJsonRpcRequest(\"ui/update-model-context\", {\n content: contextContent,\n ...(chat.structuredContent !== undefined\n ? { structuredContent: chat.structuredContent }\n : {}),\n });\n } catch {\n // Best effort: a host without model-context support should still receive\n // the visible chat message.\n }\n await postJsonRpcRequest(\"ui/message\", {\n role: \"user\",\n content,\n });\n return true;\n })().catch(() => false);\n}\n\nexport function getMcpAppHostContext(): McpAppHostContextSnapshot {\n ensureListener();\n const bridge = readOpenAiBridge();\n if (bridge) updateSnapshotFromOpenAiBridge(bridge);\n return snapshot;\n}\n\nexport function useMcpAppHostContext(): McpAppHostContextSnapshot {\n ensureListener();\n return useSyncExternalStore(\n (listener) => {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n () => snapshot,\n () => ({ context: null, capabilities: null, version: null }),\n );\n}\n\nexport function updateMcpAppModelContext(\n update: McpAppModelContextUpdate,\n): Promise<boolean> | false {\n return postHostRequest(\n AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES.UPDATE_MODEL_CONTEXT,\n {\n ...(Array.isArray(update.content) ? { content: update.content } : {}),\n ...(update.structuredContent !== undefined\n ? { structuredContent: update.structuredContent }\n : {}),\n },\n );\n}\n\nexport function openMcpAppHostLink(url: string): Promise<boolean> | false {\n if (!url) return false;\n return postHostRequest(AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES.OPEN_LINK, {\n url,\n });\n}\n\nexport function requestMcpAppDisplayMode(\n mode: McpAppDisplayMode,\n): Promise<boolean> | false {\n if (!mode) return false;\n return postHostRequest(\n AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES.REQUEST_DISPLAY_MODE,\n { mode },\n );\n}\n\nensureListener();\n\n/** Internal test helper. Do not use in app code. */\nexport function _resetMcpAppHostForTests(): void {\n for (const request of pending.values()) clearTimeout(request.timeout);\n for (const request of jsonRpcPending.values()) clearTimeout(request.timeout);\n pending.clear();\n jsonRpcPending.clear();\n directMcpAppInit = null;\n snapshot = { context: null, capabilities: null, version: null };\n listeners.clear();\n}\n\nif (isBrowserWindow()) {\n window.addEventListener(\n \"openai:set_globals\",\n () => {\n const bridge = readOpenAiBridge();\n if (bridge) updateSnapshotFromOpenAiBridge(bridge);\n },\n { passive: true },\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"mcp-app-host.js","sourceRoot":"","sources":["../../src/client/mcp-app-host.ts"],"names":[],"mappings":"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","sourcesContent":["import { useSyncExternalStore } from \"react\";\nimport { getFrameOrigin } from \"./frame.js\";\nimport {\n getEmbedAuthToken,\n isEmbedAuthActive,\n markEmbedMcpChatBridgeActive,\n isEmbedMcpChatBridgeActive,\n readEmbedMcpChatBridgeFlagFromUrl,\n} from \"./embed-auth.js\";\nimport {\n EMBED_MODE_QUERY_PARAM,\n EMBED_TOKEN_QUERY_PARAM,\n MCP_APP_CHAT_BRIDGE_QUERY_PARAM,\n} from \"../shared/embed-auth.js\";\n\nexport const AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES = {\n HOST_CONTEXT: \"agentNative.mcpHostContext\",\n UPDATE_MODEL_CONTEXT: \"agentNative.mcpHost.updateModelContext\",\n OPEN_LINK: \"agentNative.mcpHost.openLink\",\n REQUEST_DISPLAY_MODE: \"agentNative.mcpHost.requestDisplayMode\",\n RESPONSE: \"agentNative.mcpHost.response\",\n} as const;\n\nexport type AgentNativeMcpAppHostMessageType =\n (typeof AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES)[keyof typeof AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES];\n\nexport type McpAppDisplayMode = \"inline\" | \"pip\" | \"fullscreen\" | (string & {});\n\nexport interface McpAppModelContextContentPart {\n type: string;\n [key: string]: unknown;\n}\n\nexport interface McpAppModelContextUpdate {\n content?: McpAppModelContextContentPart[];\n structuredContent?: unknown;\n}\n\nexport interface McpAppHostChatMessage {\n message: string;\n context?: string;\n content?: McpAppModelContextContentPart[];\n structuredContent?: unknown;\n}\n\nexport interface McpAppHostCapabilities {\n updateModelContext?: boolean;\n openLink?: boolean;\n displayModes?: McpAppDisplayMode[];\n [key: string]: unknown;\n}\n\nexport interface McpAppHostContext {\n capabilities?: McpAppHostCapabilities;\n [key: string]: unknown;\n}\n\nexport interface McpAppHostContextSnapshot {\n context: McpAppHostContext | null;\n capabilities: McpAppHostCapabilities | null;\n version: unknown;\n}\n\ntype PendingRequest = {\n resolve: (ok: boolean) => void;\n timeout: ReturnType<typeof setTimeout>;\n};\n\ntype PendingJsonRpcRequest = {\n resolve: (result: unknown) => void;\n reject: (error: Error) => void;\n timeout: ReturnType<typeof setTimeout>;\n};\n\ntype HostContextMessage = {\n type: typeof AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES.HOST_CONTEXT;\n data?: {\n context?: unknown;\n capabilities?: unknown;\n version?: unknown;\n };\n};\n\ntype HostResponseMessage = {\n type: typeof AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES.RESPONSE;\n data?: {\n requestId?: unknown;\n ok?: unknown;\n result?: unknown;\n error?: unknown;\n };\n};\n\nconst REQUEST_TIMEOUT_MS = 5000;\nconst DIRECT_MCP_APP_PROTOCOL_VERSION = \"2026-01-26\";\n\nlet snapshot: McpAppHostContextSnapshot = {\n context: null,\n capabilities: null,\n version: null,\n};\nconst EMPTY_HOST_CONTEXT_SNAPSHOT: McpAppHostContextSnapshot = {\n context: null,\n capabilities: null,\n version: null,\n};\nconst listeners = new Set<() => void>();\nconst pending = new Map<string, PendingRequest>();\nconst jsonRpcPending = new Map<string, PendingJsonRpcRequest>();\nlet directMcpAppInit: Promise<boolean> | null = null;\nlet listenerInstalled = false;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isBrowserWindow(): boolean {\n return (\n typeof window !== \"undefined\" && typeof window.postMessage === \"function\"\n );\n}\n\nfunction isInChildFrame(): boolean {\n if (!isBrowserWindow()) return false;\n try {\n return window.parent !== window;\n } catch {\n return false;\n }\n}\n\nfunction isMcpAppBridgeEnabled(): boolean {\n if (!isBrowserWindow()) return false;\n if (readEmbedMcpChatBridgeFlagFromUrl()) markEmbedMcpChatBridgeActive();\n if (isEmbedMcpChatBridgeActive() && isEmbedAuthActive()) return true;\n const params = new URLSearchParams(window.location.search || \"\");\n return (\n params.get(EMBED_MODE_QUERY_PARAM) === \"1\" &&\n (params.has(EMBED_TOKEN_QUERY_PARAM) || Boolean(getEmbedAuthToken())) &&\n params.get(MCP_APP_CHAT_BRIDGE_QUERY_PARAM) === \"1\"\n );\n}\n\nfunction isClaudeMcpContentHost(): boolean {\n if (!isBrowserWindow()) return false;\n try {\n return /(^|\\.)claudemcpcontent\\.com$/i.test(window.location.hostname || \"\");\n } catch {\n return false;\n }\n}\n\nfunction hasWrapperBridge(): boolean {\n if (!isBrowserWindow()) return false;\n const params = new URLSearchParams(window.location.search || \"\");\n const mode =\n params.get(\"embedMode\") ??\n params.get(\"renderMode\") ??\n params.get(\"embed_mode\") ??\n \"\";\n if (mode === \"iframe\" || mode === \"nested\") return true;\n if (params.get(\"nested\") === \"1\" || params.get(\"frame\") === \"iframe\") {\n return true;\n }\n if (isClaudeMcpContentHost()) return false;\n return Boolean(getFrameOrigin());\n}\n\nfunction isTrustedParentMessage(event: MessageEvent): boolean {\n if (!isInChildFrame()) return false;\n if (event.source !== window.parent) return false;\n // Defense in depth: once the parent's real origin is known (captured from the\n // browser-stamped event.origin during the frameOrigin handshake, so it can't\n // be spoofed), also require inbound messages to come from that origin. When\n // it isn't known yet (null) or is opaque (\"null\"), fall back to source-only.\n const expectedOrigin = getFrameOrigin();\n if (expectedOrigin && expectedOrigin !== \"null\") {\n return event.origin === expectedOrigin;\n }\n return true;\n}\n\nfunction requestId(): string {\n return `mcp-host-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction jsonRpcRequestId(): string {\n return `mcp-ui-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction notify() {\n for (const listener of listeners) listener();\n}\n\nfunction updateSnapshot(data: HostContextMessage[\"data\"]): void {\n if (!isRecord(data)) return;\n snapshot = {\n context: isRecord(data.context)\n ? (data.context as McpAppHostContext)\n : snapshot.context,\n capabilities: isRecord(data.capabilities)\n ? (data.capabilities as McpAppHostCapabilities)\n : snapshot.capabilities,\n version: data.version !== undefined ? data.version : snapshot.version,\n };\n notify();\n}\n\nfunction updateSnapshotFromInitialize(result: unknown): void {\n if (!isRecord(result)) return;\n updateSnapshot({\n context: result.hostContext,\n capabilities: result.hostCapabilities,\n version: result.hostInfo ?? result.protocolVersion,\n });\n}\n\nfunction updateSnapshotFromOpenAiBridge(bridge: OpenAiAppBridge): void {\n updateSnapshot({\n context: {\n displayMode: bridge.displayMode,\n availableDisplayModes:\n typeof bridge.requestDisplayMode === \"function\"\n ? [\"inline\", \"fullscreen\", \"pip\"]\n : [],\n maxHeight: bridge.maxHeight,\n locale: bridge.locale,\n theme: bridge.theme,\n view: bridge.view,\n },\n capabilities: {\n updateModelContext: typeof bridge.setWidgetState === \"function\",\n openLink: typeof bridge.openExternal === \"function\",\n displayModes:\n typeof bridge.requestDisplayMode === \"function\"\n ? [\"inline\", \"fullscreen\", \"pip\"]\n : [],\n openai: true,\n },\n version: bridge.userAgent,\n });\n}\n\nfunction resolvePending(data: HostResponseMessage[\"data\"]): void {\n if (!isRecord(data) || typeof data.requestId !== \"string\") return;\n const request = pending.get(data.requestId);\n if (!request) return;\n pending.delete(data.requestId);\n clearTimeout(request.timeout);\n request.resolve(data.ok === true);\n}\n\nfunction resolveJsonRpc(data: Record<string, unknown>): void {\n const id = typeof data.id === \"string\" ? data.id : String(data.id ?? \"\");\n if (!id) return;\n const request = jsonRpcPending.get(id);\n if (!request) return;\n jsonRpcPending.delete(id);\n clearTimeout(request.timeout);\n if (isRecord(data.error)) {\n const message =\n typeof data.error.message === \"string\"\n ? data.error.message\n : \"MCP Apps host request failed.\";\n request.reject(new Error(message));\n return;\n }\n request.resolve(data.result ?? {});\n}\n\nfunction handleJsonRpcNotification(message: Record<string, unknown>): void {\n if (message.method !== \"ui/notifications/host-context-changed\") return;\n updateSnapshot({\n context: isRecord(message.params) ? message.params : undefined,\n });\n}\n\nfunction onMessage(event: MessageEvent): void {\n if (!isTrustedParentMessage(event)) return;\n const message = event.data;\n if (!isRecord(message)) return;\n\n if (message.type === AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES.HOST_CONTEXT) {\n updateSnapshot((message as HostContextMessage).data);\n return;\n }\n\n if (message.type === AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES.RESPONSE) {\n resolvePending((message as HostResponseMessage).data);\n return;\n }\n\n if (message.jsonrpc === \"2.0\") {\n if (\"id\" in message && (\"result\" in message || \"error\" in message)) {\n resolveJsonRpc(message);\n return;\n }\n if (typeof message.method === \"string\") {\n handleJsonRpcNotification(message);\n }\n }\n}\n\nfunction ensureListener(): void {\n if (!isBrowserWindow() || listenerInstalled) return;\n window.addEventListener(\"message\", onMessage);\n listenerInstalled = true;\n}\n\nfunction postHostRequest(\n type:\n | typeof AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES.UPDATE_MODEL_CONTEXT\n | typeof AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES.OPEN_LINK\n | typeof AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES.REQUEST_DISPLAY_MODE,\n data: Record<string, unknown>,\n): Promise<boolean> | false {\n ensureListener();\n if (!isInChildFrame() || !isMcpAppBridgeEnabled()) return false;\n\n if (!hasWrapperBridge()) {\n return postDirectHostRequest(type, data);\n }\n\n const id =\n typeof data.requestId === \"string\" && data.requestId\n ? data.requestId\n : requestId();\n const payload = { ...data, requestId: id };\n\n return new Promise((resolve) => {\n const timeout = setTimeout(() => {\n pending.delete(id);\n resolve(false);\n }, REQUEST_TIMEOUT_MS);\n pending.set(id, { resolve, timeout });\n\n try {\n window.parent.postMessage({ type, data: payload }, \"*\");\n } catch {\n pending.delete(id);\n clearTimeout(timeout);\n resolve(false);\n }\n });\n}\n\nfunction postWrapperHostChat(chat: McpAppHostChatMessage): Promise<boolean> {\n ensureListener();\n const id = requestId();\n return new Promise((resolve) => {\n const timeout = setTimeout(() => {\n pending.delete(id);\n resolve(false);\n }, REQUEST_TIMEOUT_MS);\n pending.set(id, { resolve, timeout });\n\n try {\n window.parent.postMessage(\n {\n type: \"agentNative.submitChat\",\n data: {\n requestId: id,\n message: chat.message,\n context: chat.context?.trim() || \"\",\n submit: true,\n ...(chat.content?.length ? { content: chat.content } : {}),\n ...(chat.structuredContent !== undefined\n ? { structuredContent: chat.structuredContent }\n : {}),\n },\n },\n \"*\",\n );\n } catch {\n pending.delete(id);\n clearTimeout(timeout);\n resolve(false);\n }\n });\n}\n\ninterface OpenAiAppBridge {\n widgetState?: unknown;\n displayMode?: unknown;\n maxHeight?: unknown;\n locale?: unknown;\n theme?: unknown;\n view?: unknown;\n userAgent?: unknown;\n setWidgetState?: (state: unknown) => void;\n sendFollowUpMessage?: (args: {\n prompt: string;\n scrollToBottom?: boolean;\n }) => unknown | Promise<unknown>;\n openExternal?: (args: {\n href: string;\n redirectUrl?: boolean;\n }) => unknown | Promise<unknown>;\n requestDisplayMode?: (args: {\n mode: McpAppDisplayMode;\n }) => unknown | Promise<unknown>;\n}\n\nfunction readOpenAiBridge(): OpenAiAppBridge | null {\n if (!isBrowserWindow()) return null;\n const bridge = (window as unknown as { openai?: unknown }).openai;\n return bridge && typeof bridge === \"object\"\n ? (bridge as OpenAiAppBridge)\n : null;\n}\n\nfunction objectValue(value: unknown): Record<string, unknown> {\n return isRecord(value) ? value : {};\n}\n\nfunction postJsonRpcNotification(method: string, params?: unknown): void {\n if (!isInChildFrame()) return;\n try {\n window.parent.postMessage({ jsonrpc: \"2.0\", method, params }, \"*\");\n } catch {\n // Best-effort lifecycle notification.\n }\n}\n\nfunction postJsonRpcRequest(\n method: string,\n params?: unknown,\n): Promise<unknown> | false {\n ensureListener();\n if (!isInChildFrame()) return false;\n\n const id = jsonRpcRequestId();\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n jsonRpcPending.delete(id);\n reject(new Error(\"MCP Apps host did not respond.\"));\n }, REQUEST_TIMEOUT_MS);\n jsonRpcPending.set(id, { resolve, reject, timeout });\n\n try {\n window.parent.postMessage({ jsonrpc: \"2.0\", id, method, params }, \"*\");\n } catch (err) {\n jsonRpcPending.delete(id);\n clearTimeout(timeout);\n reject(err instanceof Error ? err : new Error(String(err)));\n }\n });\n}\n\nasync function ensureDirectMcpAppInitialized(): Promise<boolean> {\n if (!isInChildFrame() || !isMcpAppBridgeEnabled()) return false;\n if (hasWrapperBridge()) return true;\n\n const openAiBridge = readOpenAiBridge();\n if (openAiBridge) {\n updateSnapshotFromOpenAiBridge(openAiBridge);\n return true;\n }\n\n if (!directMcpAppInit) {\n directMcpAppInit = (async () => {\n const result = await postJsonRpcRequest(\"ui/initialize\", {\n protocolVersion: DIRECT_MCP_APP_PROTOCOL_VERSION,\n appInfo: { name: \"Agent Native App\", version: \"1.0.0\" },\n appCapabilities: {\n availableDisplayModes: [\"inline\", \"fullscreen\", \"pip\"],\n },\n });\n updateSnapshotFromInitialize(result);\n postJsonRpcNotification(\"ui/notifications/initialized\", {});\n return true;\n })().catch(() => {\n // Reset so the next call retries the handshake. Otherwise one timed-out\n // ui/initialize (e.g. host briefly unresponsive) leaves a permanently\n // resolved `Promise<false>` cached here, and every later bridge call\n // fails until full page reload.\n directMcpAppInit = null;\n return false as boolean;\n });\n }\n\n return directMcpAppInit;\n}\n\nasync function waitForDirectMcpAppInitialized(): Promise<void> {\n const ok = await ensureDirectMcpAppInitialized();\n if (!ok) throw new Error(\"MCP Apps host bridge is not available.\");\n}\n\nasync function postDirectHostRequest(\n type:\n | typeof AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES.UPDATE_MODEL_CONTEXT\n | typeof AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES.OPEN_LINK\n | typeof AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES.REQUEST_DISPLAY_MODE,\n data: Record<string, unknown>,\n): Promise<boolean> {\n const openAiBridge = readOpenAiBridge();\n if (openAiBridge) {\n updateSnapshotFromOpenAiBridge(openAiBridge);\n if (\n type === AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES.UPDATE_MODEL_CONTEXT &&\n typeof openAiBridge.setWidgetState === \"function\"\n ) {\n openAiBridge.setWidgetState({\n ...objectValue(openAiBridge.widgetState),\n agentNativeModelContext: {\n ...(Array.isArray(data.content) ? { content: data.content } : {}),\n ...(data.structuredContent !== undefined\n ? { structuredContent: data.structuredContent }\n : {}),\n },\n });\n return true;\n }\n if (\n type === AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES.OPEN_LINK &&\n typeof openAiBridge.openExternal === \"function\" &&\n typeof data.url === \"string\"\n ) {\n await openAiBridge.openExternal({\n href: data.url,\n redirectUrl: false,\n });\n return true;\n }\n if (\n type === AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES.REQUEST_DISPLAY_MODE &&\n typeof openAiBridge.requestDisplayMode === \"function\" &&\n typeof data.mode === \"string\"\n ) {\n await openAiBridge.requestDisplayMode({ mode: data.mode });\n updateSnapshotFromOpenAiBridge(openAiBridge);\n return true;\n }\n }\n\n await waitForDirectMcpAppInitialized();\n const method =\n type === AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES.UPDATE_MODEL_CONTEXT\n ? \"ui/update-model-context\"\n : type === AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES.OPEN_LINK\n ? \"ui/open-link\"\n : \"ui/request-display-mode\";\n await postJsonRpcRequest(method, data);\n return true;\n}\n\nexport function sendMcpAppHostMessage(\n chat: McpAppHostChatMessage,\n): Promise<boolean> | false {\n if (!chat.message.trim() || !isInChildFrame() || !isMcpAppBridgeEnabled()) {\n return false;\n }\n\n if (hasWrapperBridge()) return postWrapperHostChat(chat);\n\n return (async () => {\n const openAiBridge = readOpenAiBridge();\n const context = chat.context?.trim() || null;\n const content = chat.content?.length\n ? chat.content\n : [{ type: \"text\", text: chat.message }];\n const contextContent = context\n ? [\n { type: \"text\", text: context },\n ...content.filter((part) => part && part.type !== \"text\"),\n ]\n : content.filter((part) => part && part.type !== \"text\");\n if (\n openAiBridge &&\n typeof openAiBridge.sendFollowUpMessage === \"function\"\n ) {\n updateSnapshotFromOpenAiBridge(openAiBridge);\n if (typeof openAiBridge.setWidgetState === \"function\") {\n openAiBridge.setWidgetState({\n ...objectValue(openAiBridge.widgetState),\n agentNativeChatContext: context,\n agentNativeModelContext: {\n content: contextContent,\n ...(chat.structuredContent !== undefined\n ? { structuredContent: chat.structuredContent }\n : {}),\n },\n });\n }\n await openAiBridge.sendFollowUpMessage({\n prompt: chat.message,\n scrollToBottom: true,\n });\n return true;\n }\n\n await waitForDirectMcpAppInitialized();\n try {\n await postJsonRpcRequest(\"ui/update-model-context\", {\n content: contextContent,\n ...(chat.structuredContent !== undefined\n ? { structuredContent: chat.structuredContent }\n : {}),\n });\n } catch {\n // Best effort: a host without model-context support should still receive\n // the visible chat message.\n }\n await postJsonRpcRequest(\"ui/message\", {\n role: \"user\",\n content,\n });\n return true;\n })().catch(() => false);\n}\n\nexport function getMcpAppHostContext(): McpAppHostContextSnapshot {\n ensureListener();\n const bridge = readOpenAiBridge();\n if (bridge) updateSnapshotFromOpenAiBridge(bridge);\n return snapshot;\n}\n\nexport function useMcpAppHostContext(): McpAppHostContextSnapshot {\n ensureListener();\n return useSyncExternalStore(\n (listener) => {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n () => snapshot,\n () => EMPTY_HOST_CONTEXT_SNAPSHOT,\n );\n}\n\nexport function updateMcpAppModelContext(\n update: McpAppModelContextUpdate,\n): Promise<boolean> | false {\n return postHostRequest(\n AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES.UPDATE_MODEL_CONTEXT,\n {\n ...(Array.isArray(update.content) ? { content: update.content } : {}),\n ...(update.structuredContent !== undefined\n ? { structuredContent: update.structuredContent }\n : {}),\n },\n );\n}\n\nexport function openMcpAppHostLink(url: string): Promise<boolean> | false {\n if (!url) return false;\n return postHostRequest(AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES.OPEN_LINK, {\n url,\n });\n}\n\nexport function requestMcpAppDisplayMode(\n mode: McpAppDisplayMode,\n): Promise<boolean> | false {\n if (!mode) return false;\n return postHostRequest(\n AGENT_NATIVE_MCP_APP_HOST_MESSAGE_TYPES.REQUEST_DISPLAY_MODE,\n { mode },\n );\n}\n\nensureListener();\n\n/** Internal test helper. Do not use in app code. */\nexport function _resetMcpAppHostForTests(): void {\n for (const request of pending.values()) clearTimeout(request.timeout);\n for (const request of jsonRpcPending.values()) clearTimeout(request.timeout);\n pending.clear();\n jsonRpcPending.clear();\n directMcpAppInit = null;\n snapshot = { context: null, capabilities: null, version: null };\n listeners.clear();\n}\n\nif (isBrowserWindow()) {\n window.addEventListener(\n \"openai:set_globals\",\n () => {\n const bridge = readOpenAiBridge();\n if (bridge) updateSnapshotFromOpenAiBridge(bridge);\n },\n { passive: true },\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"McpAppRenderer.d.ts","sourceRoot":"","sources":["../../../src/client/mcp-apps/McpAppRenderer.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"McpAppRenderer.d.ts","sourceRoot":"","sources":["../../../src/client/mcp-apps/McpAppRenderer.tsx"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,gBAAgB,EACrB,KAAK,wBAAwB,EAC9B,MAAM,2CAA2C,CAAC;AAGnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAIzE,eAAO,MAAM,6BAA6B,MAAM,CAAC;AAKjD,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,kBAAkB,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAQD,wBAAgB,cAAc,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,mBAAmB,2CAqOrE;AAwBD,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,wBAAwB,GAAG,SAAS,GAChD,wBAAwB,CAE1B;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,gBAAgB,GAAG,SAAS,GAAG,MAAM,CAiBxE;AAoKD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,GACtC,MAAM,CAiBR;AAED,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,MAAM,EACrB,gBAAgB,EAAE,MAAM,GACvB,MAAM,CAOR"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useCallback, useEffect, useMemo, useRef, useState
|
|
2
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
3
3
|
import { AppBridge, PostMessageTransport, buildAllowAttribute, } from "@modelcontextprotocol/ext-apps/app-bridge";
|
|
4
4
|
import { IconAlertTriangle, IconLoader2 } from "@tabler/icons-react";
|
|
5
5
|
import { agentNativePath } from "../api-path.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"McpAppRenderer.js","sourceRoot":"","sources":["../../../src/client/mcp-apps/McpAppRenderer.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n AppBridge,\n PostMessageTransport,\n buildAllowAttribute,\n type McpUiResourceCsp,\n type McpUiResourcePermissions,\n} from \"@modelcontextprotocol/ext-apps/app-bridge\";\nimport type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport { IconAlertTriangle, IconLoader2 } from \"@tabler/icons-react\";\nimport type { AgentMcpAppPayload } from \"../../mcp-client/app-result.js\";\nimport { agentNativePath } from \"../api-path.js\";\nimport { cn } from \"../utils.js\";\n\nexport const DEFAULT_MCP_APP_IFRAME_HEIGHT = 650;\nconst MIN_IFRAME_HEIGHT = 220;\nconst VIEWPORT_MARGIN = 16;\nconst SANDBOX_FLAGS = \"allow-scripts allow-forms allow-popups\";\n\nexport interface McpAppRendererProps {\n app: AgentMcpAppPayload;\n className?: string;\n}\n\ntype ResourceUiMeta = {\n csp?: McpUiResourceCsp;\n permissions?: McpUiResourcePermissions;\n prefersBorder?: boolean;\n};\n\nexport function McpAppRenderer({ app, className }: McpAppRendererProps) {\n const iframeRef = useRef<HTMLIFrameElement | null>(null);\n const desiredHeightRef = useRef(DEFAULT_MCP_APP_IFRAME_HEIGHT);\n const [loadedSrcDoc, setLoadedSrcDoc] = useState<string | null>(null);\n const [height, setHeight] = useState(DEFAULT_MCP_APP_IFRAME_HEIGHT);\n const [error, setError] = useState<string | null>(null);\n const [ready, setReady] = useState(false);\n const resourceHtml = app.resource ? htmlFromResource(app.resource) : \"\";\n const uiMeta = useMemo(() => resourceUiMeta(app), [app]);\n const supportedPermissions = useMemo(\n () => supportedMcpAppPermissions(uiMeta.permissions),\n [uiMeta.permissions],\n );\n const csp = buildMcpAppCsp(uiMeta.csp);\n const srcDoc = useMemo(\n () => (resourceHtml ? injectCsp(resourceHtml, csp) : \"\"),\n [resourceHtml, csp],\n );\n\n useEffect(() => {\n desiredHeightRef.current = DEFAULT_MCP_APP_IFRAME_HEIGHT;\n setHeight(\n clampMcpAppHeight(\n DEFAULT_MCP_APP_IFRAME_HEIGHT,\n availableMcpAppHeight(iframeRef.current),\n ),\n );\n setLoadedSrcDoc(null);\n setReady(false);\n setError(null);\n }, [srcDoc]);\n\n const applyHeight = useCallback((desiredHeight?: number) => {\n if (\n typeof desiredHeight === \"number\" &&\n Number.isFinite(desiredHeight) &&\n desiredHeight > 0\n ) {\n desiredHeightRef.current = desiredHeight;\n }\n setHeight(\n clampMcpAppHeight(\n desiredHeightRef.current,\n availableMcpAppHeight(iframeRef.current),\n ),\n );\n }, []);\n\n useEffect(() => {\n let frame = 0;\n const update = () => {\n if (frame) cancelAnimationFrame(frame);\n frame = requestAnimationFrame(() => {\n frame = 0;\n applyHeight();\n });\n };\n\n update();\n window.addEventListener(\"resize\", update, { passive: true });\n window.visualViewport?.addEventListener(\"resize\", update, {\n passive: true,\n });\n document.addEventListener(\"scroll\", update, true);\n\n const observer =\n typeof ResizeObserver !== \"undefined\" ? new ResizeObserver(update) : null;\n if (observer) {\n observer.observe(document.documentElement);\n const parent = iframeRef.current?.parentElement;\n if (parent) observer.observe(parent);\n }\n\n return () => {\n if (frame) cancelAnimationFrame(frame);\n window.removeEventListener(\"resize\", update);\n window.visualViewport?.removeEventListener(\"resize\", update);\n document.removeEventListener(\"scroll\", update, true);\n observer?.disconnect();\n };\n }, [applyHeight, srcDoc]);\n\n useEffect(() => {\n const iframe = iframeRef.current;\n if (!iframe?.contentWindow || !srcDoc || loadedSrcDoc !== srcDoc) return;\n\n let closed = false;\n const bridge = new AppBridge(\n null,\n { name: \"Agent Native\", version: \"1.0.0\" },\n {\n openLinks: {},\n serverTools: {},\n serverResources: {},\n logging: {},\n sandbox: {\n permissions: supportedPermissions,\n csp: uiMeta.csp ?? {},\n },\n },\n {\n hostContext: buildHostContext(\n app,\n availableMcpAppHeight(iframe),\n ) as any,\n },\n );\n\n bridge.addEventListener(\"sizechange\", ({ height: nextHeight }) => {\n if (typeof nextHeight !== \"number\" || !Number.isFinite(nextHeight)) {\n return;\n }\n applyHeight(nextHeight);\n });\n bridge.addEventListener(\"initialized\", () => {\n if (closed) return;\n setReady(true);\n void bridge.sendToolInput({ arguments: app.toolInput });\n void bridge.sendToolResult(app.toolResult as CallToolResult);\n });\n bridge.addEventListener(\"loggingmessage\", ({ level, data }) => {\n if (level === \"error\" || level === \"critical\" || level === \"alert\") {\n console.warn(\"[mcp-app]\", data);\n }\n });\n bridge.onopenlink = async ({ url }) => {\n if (!isSafeExternalUrl(url)) return { isError: true };\n window.open(url, \"_blank\", \"noopener,noreferrer\");\n return {};\n };\n bridge.oncalltool = async ({ name, arguments: toolArguments }) => {\n const toolName = normalizeSameServerToolName(app.serverId, name);\n if (!toolName) {\n return errorToolResult(\"Cross-server MCP App tool calls are blocked.\");\n }\n try {\n return await postMcpAppEndpoint<CallToolResult>(\"call-tool\", {\n serverId: app.serverId,\n toolName,\n arguments:\n toolArguments && typeof toolArguments === \"object\"\n ? toolArguments\n : {},\n });\n } catch (err: any) {\n return errorToolResult(err?.message ?? \"MCP App tool call failed.\");\n }\n };\n (bridge as any).onlisttools = async () =>\n postMcpAppEndpoint(\"list-tools\", { serverId: app.serverId });\n bridge.onreadresource = async ({ uri }) =>\n postMcpAppEndpoint(\"read-resource\", { serverId: app.serverId, uri });\n bridge.onlistresources = async () => ({ resources: [] });\n bridge.onlistresourcetemplates = async () => ({ resourceTemplates: [] });\n bridge.ondownloadfile = async () => ({ isError: true });\n bridge.onmessage = async () => ({ isError: true });\n bridge.onupdatemodelcontext = async () => ({});\n\n const transport = new PostMessageTransport(\n iframe.contentWindow,\n iframe.contentWindow,\n );\n setReady(false);\n setError(null);\n bridge.connect(transport).catch((err: any) => {\n if (!closed) {\n setError(err?.message ?? \"Failed to initialize MCP App.\");\n }\n });\n\n return () => {\n closed = true;\n setReady(false);\n void bridge\n .teardownResource({}, { timeout: 500 })\n .catch(() => undefined)\n .finally(() => {\n void (bridge as any).close?.().catch?.(() => undefined);\n });\n };\n }, [\n app,\n applyHeight,\n loadedSrcDoc,\n srcDoc,\n supportedPermissions,\n uiMeta.csp,\n ]);\n\n if (!resourceHtml) {\n return (\n <div className={cn(\"agent-mcp-app agent-mcp-app--error\", className)}>\n <IconAlertTriangle size={15} />\n <span>MCP App resource was not available.</span>\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n \"agent-mcp-app\",\n uiMeta.prefersBorder === false && \"agent-mcp-app--flush\",\n className,\n )}\n >\n {!ready && !error && (\n <div className=\"agent-mcp-app__loading\">\n <IconLoader2 size={14} className=\"agent-conversation-spin\" />\n <span>Loading MCP App</span>\n </div>\n )}\n {error && (\n <div className=\"agent-mcp-app__error\">\n <IconAlertTriangle size={15} />\n <span>{error}</span>\n </div>\n )}\n <iframe\n ref={iframeRef}\n title={app.tool?.title ?? app.originalToolName}\n srcDoc={srcDoc}\n sandbox={SANDBOX_FLAGS}\n allow={buildAllowAttribute(supportedPermissions)}\n style={{ height }}\n onLoad={() => setLoadedSrcDoc(srcDoc)}\n />\n </div>\n );\n}\n\nfunction resourceUiMeta(app: AgentMcpAppPayload): ResourceUiMeta {\n const meta = app.resource?._meta;\n const ui =\n meta?.ui && typeof meta.ui === \"object\" && !Array.isArray(meta.ui)\n ? (meta.ui as ResourceUiMeta)\n : {};\n return ui;\n}\n\nfunction htmlFromResource(\n resource: NonNullable<AgentMcpAppPayload[\"resource\"]>,\n): string {\n if (typeof resource.text === \"string\") return resource.text;\n if (typeof resource.blob !== \"string\") return \"\";\n try {\n if (typeof atob !== \"function\") return \"\";\n return atob(resource.blob);\n } catch {\n return \"\";\n }\n}\n\nexport function supportedMcpAppPermissions(\n permissions: McpUiResourcePermissions | undefined,\n): McpUiResourcePermissions {\n return permissions?.clipboardWrite ? { clipboardWrite: {} } : {};\n}\n\nexport function buildMcpAppCsp(csp: McpUiResourceCsp | undefined): string {\n const connect = sanitizeCspSources(csp?.connectDomains);\n const resources = sanitizeCspSources(csp?.resourceDomains);\n const frames = sanitizeCspSources(csp?.frameDomains);\n const base = sanitizeCspSources(csp?.baseUriDomains);\n return [\n \"default-src 'none'\",\n `base-uri ${base.length ? base.join(\" \") : \"'none'\"}`,\n \"form-action 'none'\",\n `connect-src ${connect.length ? connect.join(\" \") : \"'none'\"}`,\n `img-src data: blob:${resources.length ? ` ${resources.join(\" \")}` : \"\"}`,\n `media-src data: blob:${resources.length ? ` ${resources.join(\" \")}` : \"\"}`,\n `font-src data:${resources.length ? ` ${resources.join(\" \")}` : \"\"}`,\n `style-src 'unsafe-inline'${resources.length ? ` ${resources.join(\" \")}` : \"\"}`,\n `script-src 'unsafe-inline'${resources.length ? ` ${resources.join(\" \")}` : \"\"}`,\n `frame-src ${frames.length ? frames.join(\" \") : \"'none'\"}`,\n ].join(\"; \");\n}\n\nfunction sanitizeCspSources(values: string[] | undefined): string[] {\n const out: string[] = [];\n for (const value of values ?? []) {\n const source = sanitizeCspSource(value);\n if (source) out.push(source);\n }\n return [...new Set(out)];\n}\n\nfunction sanitizeCspSource(value: string): string | null {\n const source = value.trim();\n if (!source || source.includes(\"'\") || /[\\s;]/.test(source)) return null;\n if (source === \"https:\") return source;\n if (/^http:\\/\\/(?:localhost|127\\.0\\.0\\.1|\\[::1\\]):\\*$/i.test(source)) {\n return source;\n }\n if (/^https:\\/\\/\\*\\.[a-z0-9.-]+(?::\\d+)?$/i.test(source)) return source;\n try {\n const url = new URL(source);\n if (url.protocol === \"https:\") return url.origin;\n if (\n url.protocol === \"http:\" &&\n [\"localhost\", \"127.0.0.1\", \"::1\"].includes(url.hostname)\n ) {\n return url.origin;\n }\n } catch {\n return null;\n }\n return null;\n}\n\nfunction injectCsp(html: string, csp: string): string {\n const meta = `<meta http-equiv=\"Content-Security-Policy\" content=\"${escapeAttribute(csp)}\">`;\n if (/<head\\b[^>]*>/i.test(html)) {\n return html.replace(/<head\\b[^>]*>/i, (head) => `${head}${meta}`);\n }\n if (/<html\\b[^>]*>/i.test(html)) {\n return html.replace(\n /<html\\b[^>]*>/i,\n (htmlTag) => `${htmlTag}<head>${meta}</head>`,\n );\n }\n return `<!doctype html><html><head>${meta}</head><body>${html}</body></html>`;\n}\n\nfunction escapeAttribute(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/\"/g, \""\")\n .replace(/</g, \"<\");\n}\n\nfunction buildHostContext(app: AgentMcpAppPayload, maxHeight: number) {\n const root =\n typeof window !== \"undefined\"\n ? getComputedStyle(document.documentElement)\n : null;\n const cssVar = (name: string) => root?.getPropertyValue(name).trim() || \"\";\n const theme =\n typeof document !== \"undefined\" &&\n (document.documentElement.classList.contains(\"dark\") ||\n window.matchMedia?.(\"(prefers-color-scheme: dark)\").matches)\n ? \"dark\"\n : \"light\";\n return {\n toolInfo: app.tool\n ? {\n tool: {\n name: app.originalToolName,\n description: app.tool.description,\n inputSchema: app.tool.inputSchema ?? {\n type: \"object\",\n properties: {},\n },\n ...(app.tool._meta ? { _meta: app.tool._meta } : {}),\n },\n }\n : undefined,\n theme,\n displayMode: \"inline\",\n availableDisplayModes: [\"inline\"],\n platform: \"web\",\n userAgent: \"agent-native\",\n locale: typeof navigator !== \"undefined\" ? navigator.language : undefined,\n timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n containerDimensions: {\n maxHeight,\n maxWidth: typeof window !== \"undefined\" ? window.innerWidth : undefined,\n },\n styles: {\n variables: {\n \"--color-background-primary\": hslVar(cssVar(\"--background\")),\n \"--color-background-secondary\": hslVar(cssVar(\"--muted\")),\n \"--color-text-primary\": hslVar(cssVar(\"--foreground\")),\n \"--color-text-secondary\": hslVar(cssVar(\"--muted-foreground\")),\n \"--color-border-primary\": hslVar(cssVar(\"--border\")),\n \"--font-sans\": cssVar(\"--font-sans\") || \"ui-sans-serif, system-ui\",\n \"--font-mono\":\n cssVar(\"--font-mono\") ||\n \"ui-monospace, SFMono-Regular, Menlo, monospace\",\n \"--border-radius-md\": cssVar(\"--radius\") || \"8px\",\n },\n },\n };\n}\n\nfunction hslVar(value: string): string | undefined {\n return value ? `hsl(${value})` : undefined;\n}\n\nfunction normalizeSameServerToolName(\n serverId: string,\n rawName: string,\n): string | null {\n if (!rawName.trim()) return null;\n const prefix = `mcp__${serverId}__`;\n if (rawName.startsWith(\"mcp__\")) {\n return rawName.startsWith(prefix) ? rawName.slice(prefix.length) : null;\n }\n return rawName;\n}\n\nasync function postMcpAppEndpoint<T>(\n endpoint: \"call-tool\" | \"list-tools\" | \"read-resource\",\n body: Record<string, unknown>,\n): Promise<T> {\n const response = await fetch(\n agentNativePath(`/_agent-native/mcp/apps/${endpoint}`),\n {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n },\n );\n if (!response.ok) {\n let message = `MCP App request failed (${response.status})`;\n try {\n const json = await response.json();\n if (typeof json?.error === \"string\") message = json.error;\n } catch {\n // ignore\n }\n throw new Error(message);\n }\n return (await response.json()) as T;\n}\n\nfunction errorToolResult(message: string): CallToolResult {\n return {\n content: [{ type: \"text\", text: `Error: ${message}` }],\n isError: true,\n };\n}\n\nfunction finitePositiveNumber(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0\n ? value\n : null;\n}\n\nexport function availableMcpAppHeight(\n element: HTMLElement | null | undefined,\n): number {\n if (typeof window === \"undefined\") return DEFAULT_MCP_APP_IFRAME_HEIGHT;\n\n const viewportHeight =\n finitePositiveNumber(window.visualViewport?.height) ??\n finitePositiveNumber(window.innerHeight) ??\n DEFAULT_MCP_APP_IFRAME_HEIGHT;\n\n if (!element) {\n return Math.max(1, Math.floor(viewportHeight - VIEWPORT_MARGIN * 2));\n }\n\n const rect = element.getBoundingClientRect();\n const top = Number.isFinite(rect.top)\n ? Math.max(VIEWPORT_MARGIN, rect.top)\n : VIEWPORT_MARGIN;\n return Math.max(1, Math.floor(viewportHeight - top - VIEWPORT_MARGIN));\n}\n\nexport function clampMcpAppHeight(\n desiredHeight: number,\n maxVisibleHeight: number,\n): number {\n const maxHeight =\n finitePositiveNumber(maxVisibleHeight) ?? DEFAULT_MCP_APP_IFRAME_HEIGHT;\n const desired =\n finitePositiveNumber(desiredHeight) ?? DEFAULT_MCP_APP_IFRAME_HEIGHT;\n const minimum = Math.min(MIN_IFRAME_HEIGHT, maxHeight);\n return Math.max(minimum, Math.min(maxHeight, Math.ceil(desired)));\n}\n\nfunction isSafeExternalUrl(value: string): boolean {\n try {\n const url = new URL(value);\n return url.protocol === \"http:\" || url.protocol === \"https:\";\n } catch {\n return false;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"McpAppRenderer.js","sourceRoot":"","sources":["../../../src/client/mcp-apps/McpAppRenderer.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n AppBridge,\n PostMessageTransport,\n buildAllowAttribute,\n type McpUiResourceCsp,\n type McpUiResourcePermissions,\n} from \"@modelcontextprotocol/ext-apps/app-bridge\";\nimport type { CallToolResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport { IconAlertTriangle, IconLoader2 } from \"@tabler/icons-react\";\nimport type { AgentMcpAppPayload } from \"../../mcp-client/app-result.js\";\nimport { agentNativePath } from \"../api-path.js\";\nimport { cn } from \"../utils.js\";\n\nexport const DEFAULT_MCP_APP_IFRAME_HEIGHT = 650;\nconst MIN_IFRAME_HEIGHT = 220;\nconst VIEWPORT_MARGIN = 16;\nconst SANDBOX_FLAGS = \"allow-scripts allow-forms allow-popups\";\n\nexport interface McpAppRendererProps {\n app: AgentMcpAppPayload;\n className?: string;\n}\n\ntype ResourceUiMeta = {\n csp?: McpUiResourceCsp;\n permissions?: McpUiResourcePermissions;\n prefersBorder?: boolean;\n};\n\nexport function McpAppRenderer({ app, className }: McpAppRendererProps) {\n const iframeRef = useRef<HTMLIFrameElement | null>(null);\n const desiredHeightRef = useRef(DEFAULT_MCP_APP_IFRAME_HEIGHT);\n const [loadedSrcDoc, setLoadedSrcDoc] = useState<string | null>(null);\n const [height, setHeight] = useState(DEFAULT_MCP_APP_IFRAME_HEIGHT);\n const [error, setError] = useState<string | null>(null);\n const [ready, setReady] = useState(false);\n const resourceHtml = app.resource ? htmlFromResource(app.resource) : \"\";\n const uiMeta = useMemo(() => resourceUiMeta(app), [app]);\n const supportedPermissions = useMemo(\n () => supportedMcpAppPermissions(uiMeta.permissions),\n [uiMeta.permissions],\n );\n const csp = buildMcpAppCsp(uiMeta.csp);\n const srcDoc = useMemo(\n () => (resourceHtml ? injectCsp(resourceHtml, csp) : \"\"),\n [resourceHtml, csp],\n );\n\n useEffect(() => {\n desiredHeightRef.current = DEFAULT_MCP_APP_IFRAME_HEIGHT;\n setHeight(\n clampMcpAppHeight(\n DEFAULT_MCP_APP_IFRAME_HEIGHT,\n availableMcpAppHeight(iframeRef.current),\n ),\n );\n setLoadedSrcDoc(null);\n setReady(false);\n setError(null);\n }, [srcDoc]);\n\n const applyHeight = useCallback((desiredHeight?: number) => {\n if (\n typeof desiredHeight === \"number\" &&\n Number.isFinite(desiredHeight) &&\n desiredHeight > 0\n ) {\n desiredHeightRef.current = desiredHeight;\n }\n setHeight(\n clampMcpAppHeight(\n desiredHeightRef.current,\n availableMcpAppHeight(iframeRef.current),\n ),\n );\n }, []);\n\n useEffect(() => {\n let frame = 0;\n const update = () => {\n if (frame) cancelAnimationFrame(frame);\n frame = requestAnimationFrame(() => {\n frame = 0;\n applyHeight();\n });\n };\n\n update();\n window.addEventListener(\"resize\", update, { passive: true });\n window.visualViewport?.addEventListener(\"resize\", update, {\n passive: true,\n });\n document.addEventListener(\"scroll\", update, true);\n\n const observer =\n typeof ResizeObserver !== \"undefined\" ? new ResizeObserver(update) : null;\n if (observer) {\n observer.observe(document.documentElement);\n const parent = iframeRef.current?.parentElement;\n if (parent) observer.observe(parent);\n }\n\n return () => {\n if (frame) cancelAnimationFrame(frame);\n window.removeEventListener(\"resize\", update);\n window.visualViewport?.removeEventListener(\"resize\", update);\n document.removeEventListener(\"scroll\", update, true);\n observer?.disconnect();\n };\n }, [applyHeight, srcDoc]);\n\n useEffect(() => {\n const iframe = iframeRef.current;\n if (!iframe?.contentWindow || !srcDoc || loadedSrcDoc !== srcDoc) return;\n\n let closed = false;\n const bridge = new AppBridge(\n null,\n { name: \"Agent Native\", version: \"1.0.0\" },\n {\n openLinks: {},\n serverTools: {},\n serverResources: {},\n logging: {},\n sandbox: {\n permissions: supportedPermissions,\n csp: uiMeta.csp ?? {},\n },\n },\n {\n hostContext: buildHostContext(\n app,\n availableMcpAppHeight(iframe),\n ) as any,\n },\n );\n\n bridge.addEventListener(\"sizechange\", ({ height: nextHeight }) => {\n if (typeof nextHeight !== \"number\" || !Number.isFinite(nextHeight)) {\n return;\n }\n applyHeight(nextHeight);\n });\n bridge.addEventListener(\"initialized\", () => {\n if (closed) return;\n setReady(true);\n void bridge.sendToolInput({ arguments: app.toolInput });\n void bridge.sendToolResult(app.toolResult as CallToolResult);\n });\n bridge.addEventListener(\"loggingmessage\", ({ level, data }) => {\n if (level === \"error\" || level === \"critical\" || level === \"alert\") {\n console.warn(\"[mcp-app]\", data);\n }\n });\n bridge.onopenlink = async ({ url }) => {\n if (!isSafeExternalUrl(url)) return { isError: true };\n window.open(url, \"_blank\", \"noopener,noreferrer\");\n return {};\n };\n bridge.oncalltool = async ({ name, arguments: toolArguments }) => {\n const toolName = normalizeSameServerToolName(app.serverId, name);\n if (!toolName) {\n return errorToolResult(\"Cross-server MCP App tool calls are blocked.\");\n }\n try {\n return await postMcpAppEndpoint<CallToolResult>(\"call-tool\", {\n serverId: app.serverId,\n toolName,\n arguments:\n toolArguments && typeof toolArguments === \"object\"\n ? toolArguments\n : {},\n });\n } catch (err: any) {\n return errorToolResult(err?.message ?? \"MCP App tool call failed.\");\n }\n };\n (bridge as any).onlisttools = async () =>\n postMcpAppEndpoint(\"list-tools\", { serverId: app.serverId });\n bridge.onreadresource = async ({ uri }) =>\n postMcpAppEndpoint(\"read-resource\", { serverId: app.serverId, uri });\n bridge.onlistresources = async () => ({ resources: [] });\n bridge.onlistresourcetemplates = async () => ({ resourceTemplates: [] });\n bridge.ondownloadfile = async () => ({ isError: true });\n bridge.onmessage = async () => ({ isError: true });\n bridge.onupdatemodelcontext = async () => ({});\n\n const transport = new PostMessageTransport(\n iframe.contentWindow,\n iframe.contentWindow,\n );\n setReady(false);\n setError(null);\n bridge.connect(transport).catch((err: any) => {\n if (!closed) {\n setError(err?.message ?? \"Failed to initialize MCP App.\");\n }\n });\n\n return () => {\n closed = true;\n setReady(false);\n void bridge\n .teardownResource({}, { timeout: 500 })\n .catch(() => undefined)\n .finally(() => {\n void (bridge as any).close?.().catch?.(() => undefined);\n });\n };\n }, [\n app,\n applyHeight,\n loadedSrcDoc,\n srcDoc,\n supportedPermissions,\n uiMeta.csp,\n ]);\n\n if (!resourceHtml) {\n return (\n <div className={cn(\"agent-mcp-app agent-mcp-app--error\", className)}>\n <IconAlertTriangle size={15} />\n <span>MCP App resource was not available.</span>\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n \"agent-mcp-app\",\n uiMeta.prefersBorder === false && \"agent-mcp-app--flush\",\n className,\n )}\n >\n {!ready && !error && (\n <div className=\"agent-mcp-app__loading\">\n <IconLoader2 size={14} className=\"agent-conversation-spin\" />\n <span>Loading MCP App</span>\n </div>\n )}\n {error && (\n <div className=\"agent-mcp-app__error\">\n <IconAlertTriangle size={15} />\n <span>{error}</span>\n </div>\n )}\n <iframe\n ref={iframeRef}\n title={app.tool?.title ?? app.originalToolName}\n srcDoc={srcDoc}\n sandbox={SANDBOX_FLAGS}\n allow={buildAllowAttribute(supportedPermissions)}\n style={{ height }}\n onLoad={() => setLoadedSrcDoc(srcDoc)}\n />\n </div>\n );\n}\n\nfunction resourceUiMeta(app: AgentMcpAppPayload): ResourceUiMeta {\n const meta = app.resource?._meta;\n const ui =\n meta?.ui && typeof meta.ui === \"object\" && !Array.isArray(meta.ui)\n ? (meta.ui as ResourceUiMeta)\n : {};\n return ui;\n}\n\nfunction htmlFromResource(\n resource: NonNullable<AgentMcpAppPayload[\"resource\"]>,\n): string {\n if (typeof resource.text === \"string\") return resource.text;\n if (typeof resource.blob !== \"string\") return \"\";\n try {\n if (typeof atob !== \"function\") return \"\";\n return atob(resource.blob);\n } catch {\n return \"\";\n }\n}\n\nexport function supportedMcpAppPermissions(\n permissions: McpUiResourcePermissions | undefined,\n): McpUiResourcePermissions {\n return permissions?.clipboardWrite ? { clipboardWrite: {} } : {};\n}\n\nexport function buildMcpAppCsp(csp: McpUiResourceCsp | undefined): string {\n const connect = sanitizeCspSources(csp?.connectDomains);\n const resources = sanitizeCspSources(csp?.resourceDomains);\n const frames = sanitizeCspSources(csp?.frameDomains);\n const base = sanitizeCspSources(csp?.baseUriDomains);\n return [\n \"default-src 'none'\",\n `base-uri ${base.length ? base.join(\" \") : \"'none'\"}`,\n \"form-action 'none'\",\n `connect-src ${connect.length ? connect.join(\" \") : \"'none'\"}`,\n `img-src data: blob:${resources.length ? ` ${resources.join(\" \")}` : \"\"}`,\n `media-src data: blob:${resources.length ? ` ${resources.join(\" \")}` : \"\"}`,\n `font-src data:${resources.length ? ` ${resources.join(\" \")}` : \"\"}`,\n `style-src 'unsafe-inline'${resources.length ? ` ${resources.join(\" \")}` : \"\"}`,\n `script-src 'unsafe-inline'${resources.length ? ` ${resources.join(\" \")}` : \"\"}`,\n `frame-src ${frames.length ? frames.join(\" \") : \"'none'\"}`,\n ].join(\"; \");\n}\n\nfunction sanitizeCspSources(values: string[] | undefined): string[] {\n const out: string[] = [];\n for (const value of values ?? []) {\n const source = sanitizeCspSource(value);\n if (source) out.push(source);\n }\n return [...new Set(out)];\n}\n\nfunction sanitizeCspSource(value: string): string | null {\n const source = value.trim();\n if (!source || source.includes(\"'\") || /[\\s;]/.test(source)) return null;\n if (source === \"https:\") return source;\n if (/^http:\\/\\/(?:localhost|127\\.0\\.0\\.1|\\[::1\\]):\\*$/i.test(source)) {\n return source;\n }\n if (/^https:\\/\\/\\*\\.[a-z0-9.-]+(?::\\d+)?$/i.test(source)) return source;\n try {\n const url = new URL(source);\n if (url.protocol === \"https:\") return url.origin;\n if (\n url.protocol === \"http:\" &&\n [\"localhost\", \"127.0.0.1\", \"::1\"].includes(url.hostname)\n ) {\n return url.origin;\n }\n } catch {\n return null;\n }\n return null;\n}\n\nfunction injectCsp(html: string, csp: string): string {\n const meta = `<meta http-equiv=\"Content-Security-Policy\" content=\"${escapeAttribute(csp)}\">`;\n if (/<head\\b[^>]*>/i.test(html)) {\n return html.replace(/<head\\b[^>]*>/i, (head) => `${head}${meta}`);\n }\n if (/<html\\b[^>]*>/i.test(html)) {\n return html.replace(\n /<html\\b[^>]*>/i,\n (htmlTag) => `${htmlTag}<head>${meta}</head>`,\n );\n }\n return `<!doctype html><html><head>${meta}</head><body>${html}</body></html>`;\n}\n\nfunction escapeAttribute(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/\"/g, \""\")\n .replace(/</g, \"<\");\n}\n\nfunction buildHostContext(app: AgentMcpAppPayload, maxHeight: number) {\n const root =\n typeof window !== \"undefined\"\n ? getComputedStyle(document.documentElement)\n : null;\n const cssVar = (name: string) => root?.getPropertyValue(name).trim() || \"\";\n const theme =\n typeof document !== \"undefined\" &&\n (document.documentElement.classList.contains(\"dark\") ||\n window.matchMedia?.(\"(prefers-color-scheme: dark)\").matches)\n ? \"dark\"\n : \"light\";\n return {\n toolInfo: app.tool\n ? {\n tool: {\n name: app.originalToolName,\n description: app.tool.description,\n inputSchema: app.tool.inputSchema ?? {\n type: \"object\",\n properties: {},\n },\n ...(app.tool._meta ? { _meta: app.tool._meta } : {}),\n },\n }\n : undefined,\n theme,\n displayMode: \"inline\",\n availableDisplayModes: [\"inline\"],\n platform: \"web\",\n userAgent: \"agent-native\",\n locale: typeof navigator !== \"undefined\" ? navigator.language : undefined,\n timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n containerDimensions: {\n maxHeight,\n maxWidth: typeof window !== \"undefined\" ? window.innerWidth : undefined,\n },\n styles: {\n variables: {\n \"--color-background-primary\": hslVar(cssVar(\"--background\")),\n \"--color-background-secondary\": hslVar(cssVar(\"--muted\")),\n \"--color-text-primary\": hslVar(cssVar(\"--foreground\")),\n \"--color-text-secondary\": hslVar(cssVar(\"--muted-foreground\")),\n \"--color-border-primary\": hslVar(cssVar(\"--border\")),\n \"--font-sans\": cssVar(\"--font-sans\") || \"ui-sans-serif, system-ui\",\n \"--font-mono\":\n cssVar(\"--font-mono\") ||\n \"ui-monospace, SFMono-Regular, Menlo, monospace\",\n \"--border-radius-md\": cssVar(\"--radius\") || \"8px\",\n },\n },\n };\n}\n\nfunction hslVar(value: string): string | undefined {\n return value ? `hsl(${value})` : undefined;\n}\n\nfunction normalizeSameServerToolName(\n serverId: string,\n rawName: string,\n): string | null {\n if (!rawName.trim()) return null;\n const prefix = `mcp__${serverId}__`;\n if (rawName.startsWith(\"mcp__\")) {\n return rawName.startsWith(prefix) ? rawName.slice(prefix.length) : null;\n }\n return rawName;\n}\n\nasync function postMcpAppEndpoint<T>(\n endpoint: \"call-tool\" | \"list-tools\" | \"read-resource\",\n body: Record<string, unknown>,\n): Promise<T> {\n const response = await fetch(\n agentNativePath(`/_agent-native/mcp/apps/${endpoint}`),\n {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n },\n );\n if (!response.ok) {\n let message = `MCP App request failed (${response.status})`;\n try {\n const json = await response.json();\n if (typeof json?.error === \"string\") message = json.error;\n } catch {\n // ignore\n }\n throw new Error(message);\n }\n return (await response.json()) as T;\n}\n\nfunction errorToolResult(message: string): CallToolResult {\n return {\n content: [{ type: \"text\", text: `Error: ${message}` }],\n isError: true,\n };\n}\n\nfunction finitePositiveNumber(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0\n ? value\n : null;\n}\n\nexport function availableMcpAppHeight(\n element: HTMLElement | null | undefined,\n): number {\n if (typeof window === \"undefined\") return DEFAULT_MCP_APP_IFRAME_HEIGHT;\n\n const viewportHeight =\n finitePositiveNumber(window.visualViewport?.height) ??\n finitePositiveNumber(window.innerHeight) ??\n DEFAULT_MCP_APP_IFRAME_HEIGHT;\n\n if (!element) {\n return Math.max(1, Math.floor(viewportHeight - VIEWPORT_MARGIN * 2));\n }\n\n const rect = element.getBoundingClientRect();\n const top = Number.isFinite(rect.top)\n ? Math.max(VIEWPORT_MARGIN, rect.top)\n : VIEWPORT_MARGIN;\n return Math.max(1, Math.floor(viewportHeight - top - VIEWPORT_MARGIN));\n}\n\nexport function clampMcpAppHeight(\n desiredHeight: number,\n maxVisibleHeight: number,\n): number {\n const maxHeight =\n finitePositiveNumber(maxVisibleHeight) ?? DEFAULT_MCP_APP_IFRAME_HEIGHT;\n const desired =\n finitePositiveNumber(desiredHeight) ?? DEFAULT_MCP_APP_IFRAME_HEIGHT;\n const minimum = Math.min(MIN_IFRAME_HEIGHT, maxHeight);\n return Math.max(minimum, Math.min(maxHeight, Math.ceil(desired)));\n}\n\nfunction isSafeExternalUrl(value: string): boolean {\n try {\n const url = new URL(value);\n return url.protocol === \"http:\" || url.protocol === \"https:\";\n } catch {\n return false;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NotificationsBell.js","sourceRoot":"","sources":["../../../src/client/notifications/NotificationsBell.tsx"],"names":[],"mappings":"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","sourcesContent":["import { agentNativePath, appPath } from \"../api-path.js\";\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n IconBell,\n IconBellRinging,\n IconLoader2,\n IconX,\n} from \"@tabler/icons-react\";\nimport { usePausingInterval } from \"../use-pausing-interval.js\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../components/ui/popover.js\";\nimport type {\n Notification as NotificationDto,\n NotificationSeverity,\n} from \"../../notifications/types.js\";\n\ninterface NotificationsBellProps {\n /** Poll interval in ms. Set to 0 to disable polling. Default: 10000. */\n pollMs?: number;\n /** Optional className for the outer container. */\n className?: string;\n /**\n * When true, fires a system-level `new Notification(...)` popup for each\n * new unread notification — handy when the tab is in the background.\n * Renders an \"Enable browser notifications\" prompt in the dropdown until\n * the user grants permission. Silently no-ops on denied or unsupported.\n */\n browserNotifications?: boolean;\n /** Empty-state title shown when there are no notifications. */\n emptyTitle?: string;\n /** Optional empty-state detail text. */\n emptyDescription?: string;\n}\n\nconst POLL_MS_DEFAULT = 10_000;\nconst SUPPORTS_NOTIFICATION =\n typeof window !== \"undefined\" && \"Notification\" in window;\n\n/**\n * Header-bar bell that shows the unread-notification count and a dropdown of\n * recent entries. Polling keeps it in sync (the framework poll loop already\n * bumps a version counter so notifications ride on that signal, but we poll\n * the count endpoint directly so the bell updates even outside an app-state\n * change).\n */\nexport function NotificationsBell({\n pollMs = POLL_MS_DEFAULT,\n className,\n browserNotifications = false,\n emptyTitle = \"No app notifications yet.\",\n emptyDescription,\n}: NotificationsBellProps) {\n const [unreadCount, setUnreadCount] = useState(0);\n const [open, setOpen] = useState(false);\n const [items, setItems] = useState<NotificationDto[] | null>(null);\n // Init to \"default\" unconditionally so server and client render the same\n // HTML — reading Notification.permission at init would diverge between SSR\n // (\"denied\", no API) and hydration (\"default\"/\"granted\"), causing a mismatch\n // in templates that mount the bell outside a ClientOnly boundary. We sync\n // to the real value in a useEffect below.\n const [permission, setPermission] =\n useState<NotificationPermission>(\"default\");\n\n useEffect(() => {\n if (SUPPORTS_NOTIFICATION) setPermission(Notification.permission);\n }, []);\n // Ids already popped as browser notifications. Seeded on first run so\n // existing unread don't pop retroactively on page load.\n const seenIdsRef = useRef<Set<string> | null>(null);\n\n const loadItems = useCallback(async () => {\n try {\n const res = await fetch(\n agentNativePath(\"/_agent-native/notifications?limit=20\"),\n );\n if (!res.ok) return;\n const rows = (await res.json()) as NotificationDto[];\n setItems(rows);\n } catch {\n // best-effort\n }\n }, []);\n\n // One polling callback used by both paths. When browserNotifications is on\n // we fetch the unread list (source of truth for both the badge count AND\n // the popup loop — no second /count request), and pop Notification() for\n // any new ids. When off, we fetch just /count. The unread-list branch also\n // opts out of visibility pause so popups still fire for backgrounded tabs.\n const refresh = useCallback(async () => {\n if (browserNotifications) {\n try {\n const res = await fetch(\n agentNativePath(\"/_agent-native/notifications?unread=true&limit=20\"),\n );\n if (!res.ok) return;\n const rows = (await res.json()) as NotificationDto[];\n setUnreadCount(rows.length);\n // First run: treat everything as already seen so we don't pop\n // retroactively on page load. After that, rebuild from the current\n // unread list so ids for read/archived rows drop out — keeps the\n // set bounded to the unread fetch limit (~20).\n const prev = seenIdsRef.current;\n const seen = new Set<string>();\n for (const n of rows) {\n const alreadySeen = prev?.has(n.id) ?? true;\n seen.add(n.id);\n if (alreadySeen) continue;\n if (!SUPPORTS_NOTIFICATION) continue;\n if (Notification.permission !== \"granted\") continue;\n try {\n new Notification(n.title, { body: n.body, tag: n.id });\n } catch {\n // Safari / restricted contexts may throw even when permission\n // claims to be granted — silent no-op.\n }\n }\n seenIdsRef.current = seen;\n } catch {\n // best-effort\n }\n return;\n }\n try {\n const res = await fetch(\n agentNativePath(\"/_agent-native/notifications/count\"),\n );\n if (!res.ok) return;\n const data = (await res.json()) as { count: number };\n setUnreadCount(data.count);\n } catch {\n // best-effort\n }\n }, [browserNotifications]);\n\n usePausingInterval(\n refresh,\n pollMs,\n /* pauseWhenHidden */ !browserNotifications,\n );\n\n useEffect(() => {\n if (!open) return;\n loadItems();\n }, [open, loadItems]);\n\n const markRead = async (id: string) => {\n try {\n // `keepalive: true` lets the request survive page navigation —\n // without it, clicking a notification with a link aborts this\n // request mid-flight and the row stays unread.\n await fetch(agentNativePath(`/_agent-native/notifications/${id}/read`), {\n method: \"POST\",\n keepalive: true,\n });\n setItems((prev) =>\n prev\n ? prev.map((n) =>\n n.id === id ? { ...n, readAt: new Date().toISOString() } : n,\n )\n : prev,\n );\n refresh();\n } catch {\n // best-effort\n }\n };\n\n // Reject any URL that isn't http(s) or a same-origin relative path. Blocks\n // `javascript:` execution, `data:` URIs, and absolute redirects to phishing\n // sites. Relative paths starting with `/` are routed through `appPath()` so\n // the link works in mounted deployments (e.g. /mail subdirectory).\n const safeNotificationLink = (link: string): string | null => {\n if (link.startsWith(\"/\") && !link.startsWith(\"//\")) {\n return appPath(link);\n }\n try {\n const url = new URL(link, window.location.origin);\n if (url.protocol === \"http:\" || url.protocol === \"https:\") {\n return url.toString();\n }\n } catch {\n // fallthrough\n }\n return null;\n };\n\n const markAllRead = async () => {\n try {\n await fetch(agentNativePath(`/_agent-native/notifications/read-all`), {\n method: \"POST\",\n });\n setItems((prev) =>\n prev\n ? prev.map((n) =>\n n.readAt ? n : { ...n, readAt: new Date().toISOString() },\n )\n : prev,\n );\n setUnreadCount(0);\n } catch {\n // best-effort\n }\n };\n\n const dismiss = async (id: string) => {\n try {\n await fetch(agentNativePath(`/_agent-native/notifications/${id}`), {\n method: \"DELETE\",\n });\n setItems((prev) => (prev ? prev.filter((n) => n.id !== id) : prev));\n refresh();\n } catch {\n // best-effort\n }\n };\n\n const hasUnread = unreadCount > 0;\n const Icon = hasUnread ? IconBellRinging : IconBell;\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-label={\n hasUnread ? `${unreadCount} unread notifications` : \"Notifications\"\n }\n className={\n \"an-notifications-bell__trigger relative inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground hover:bg-accent/40 hover:text-foreground\" +\n (className ? ` ${className}` : \"\")\n }\n >\n <Icon size={18} aria-hidden />\n {hasUnread ? (\n <span\n aria-hidden\n className=\"an-notifications-bell__badge absolute -right-0.5 -top-0.5 rounded-full bg-destructive px-1 text-[10px] leading-[14px] font-medium text-destructive-foreground\"\n >\n {unreadCount > 99 ? \"99+\" : unreadCount}\n </span>\n ) : null}\n </button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n sideOffset={8}\n className=\"an-notifications-bell__menu w-80 p-0\"\n >\n <div className=\"flex items-center justify-between border-b border-border px-3 py-2 text-sm font-medium\">\n <span>Notifications</span>\n {hasUnread ? (\n <button\n type=\"button\"\n onClick={markAllRead}\n className=\"text-xs text-primary hover:underline\"\n >\n Mark all read\n </button>\n ) : null}\n </div>\n {browserNotifications &&\n SUPPORTS_NOTIFICATION &&\n permission === \"default\" ? (\n <div className=\"flex items-center justify-between gap-2 border-b border-border bg-accent/40 px-3 py-2 text-xs text-foreground\">\n <span>Get a system popup for new notifications.</span>\n <button\n type=\"button\"\n onClick={async () => {\n const result = await Notification.requestPermission();\n setPermission(result);\n }}\n className=\"shrink-0 rounded bg-primary px-2 py-0.5 font-medium text-primary-foreground hover:bg-primary/90\"\n >\n Enable\n </button>\n </div>\n ) : null}\n <div className=\"max-h-96 overflow-y-auto\">\n {items === null ? (\n <div className=\"flex items-center gap-2 p-4 text-sm text-muted-foreground\">\n <IconLoader2 size={14} className=\"animate-spin\" /> Loading…\n </div>\n ) : items.length > 0 ? (\n items.map((n) => {\n const rawLink =\n typeof n.metadata?.link === \"string\" ? n.metadata.link : null;\n const link = rawLink ? safeNotificationLink(rawLink) : null;\n const onItemClick = () => {\n if (!n.readAt) void markRead(n.id);\n if (link) {\n setOpen(false);\n window.location.assign(link);\n }\n };\n return (\n <div\n key={n.id}\n className={\n \"group relative border-b border-border last:border-b-0 hover:bg-accent/40 \" +\n (n.readAt ? \"opacity-60\" : \"\")\n }\n >\n <button\n type=\"button\"\n onClick={onItemClick}\n className={\n \"flex w-full flex-col items-start gap-0.5 px-3 py-2 pr-8 text-left\" +\n (link ? \" cursor-pointer\" : \"\")\n }\n >\n <div className=\"flex w-full items-center justify-between gap-2\">\n <span className=\"truncate text-sm font-medium text-foreground\">\n {n.title}\n </span>\n <SeverityBadge severity={n.severity} />\n </div>\n {n.body ? (\n <span className=\"line-clamp-2 text-xs text-muted-foreground\">\n {n.body}\n </span>\n ) : null}\n <span className=\"text-[10px] text-muted-foreground/70\">\n {new Date(n.createdAt).toLocaleString()}\n </span>\n </button>\n <button\n type=\"button\"\n aria-label=\"Dismiss notification\"\n onClick={(e) => {\n e.stopPropagation();\n void dismiss(n.id);\n }}\n className=\"absolute right-2 top-2 hidden rounded p-0.5 text-muted-foreground hover:bg-accent hover:text-foreground group-hover:flex\"\n >\n <IconX size={12} />\n </button>\n </div>\n );\n })\n ) : (\n <div className=\"space-y-1 p-4 text-sm\">\n <p className=\"font-medium text-foreground\">{emptyTitle}</p>\n {emptyDescription ? (\n <p className=\"text-xs leading-relaxed text-muted-foreground\">\n {emptyDescription}\n </p>\n ) : null}\n </div>\n )}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\n// Severity color pairs — use /20 opacity backdrops that work against both\n// light and dark theme backgrounds; text uses 700/300 so it stays readable\n// in each mode (the `dark:` prefix is one of the few places where explicit\n// variants are necessary since these are brand-color tokens, not semantic).\nfunction SeverityBadge({ severity }: { severity: NotificationSeverity }) {\n const color =\n severity === \"critical\"\n ? \"bg-red-500/20 text-red-700 dark:text-red-300\"\n : severity === \"warning\"\n ? \"bg-amber-500/20 text-amber-700 dark:text-amber-300\"\n : \"bg-muted text-muted-foreground\";\n return (\n <span className={`rounded px-1.5 py-0.5 text-[10px] font-medium ${color}`}>\n {severity}\n </span>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"NotificationsBell.js","sourceRoot":"","sources":["../../../src/client/notifications/NotificationsBell.tsx"],"names":[],"mappings":"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","sourcesContent":["import { agentNativePath, appPath } from \"../api-path.js\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n IconBell,\n IconBellRinging,\n IconLoader2,\n IconX,\n} from \"@tabler/icons-react\";\nimport { usePausingInterval } from \"../use-pausing-interval.js\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../components/ui/popover.js\";\nimport type {\n Notification as NotificationDto,\n NotificationSeverity,\n} from \"../../notifications/types.js\";\n\ninterface NotificationsBellProps {\n /** Poll interval in ms. Set to 0 to disable polling. Default: 10000. */\n pollMs?: number;\n /** Optional className for the outer container. */\n className?: string;\n /**\n * When true, fires a system-level `new Notification(...)` popup for each\n * new unread notification — handy when the tab is in the background.\n * Renders an \"Enable browser notifications\" prompt in the dropdown until\n * the user grants permission. Silently no-ops on denied or unsupported.\n */\n browserNotifications?: boolean;\n /** Empty-state title shown when there are no notifications. */\n emptyTitle?: string;\n /** Optional empty-state detail text. */\n emptyDescription?: string;\n}\n\nconst POLL_MS_DEFAULT = 10_000;\nconst SUPPORTS_NOTIFICATION =\n typeof window !== \"undefined\" && \"Notification\" in window;\n\n/**\n * Header-bar bell that shows the unread-notification count and a dropdown of\n * recent entries. Polling keeps it in sync (the framework poll loop already\n * bumps a version counter so notifications ride on that signal, but we poll\n * the count endpoint directly so the bell updates even outside an app-state\n * change).\n */\nexport function NotificationsBell({\n pollMs = POLL_MS_DEFAULT,\n className,\n browserNotifications = false,\n emptyTitle = \"No app notifications yet.\",\n emptyDescription,\n}: NotificationsBellProps) {\n const [unreadCount, setUnreadCount] = useState(0);\n const [open, setOpen] = useState(false);\n const [items, setItems] = useState<NotificationDto[] | null>(null);\n // Init to \"default\" unconditionally so server and client render the same\n // HTML — reading Notification.permission at init would diverge between SSR\n // (\"denied\", no API) and hydration (\"default\"/\"granted\"), causing a mismatch\n // in templates that mount the bell outside a ClientOnly boundary. We sync\n // to the real value in a useEffect below.\n const [permission, setPermission] =\n useState<NotificationPermission>(\"default\");\n\n useEffect(() => {\n if (SUPPORTS_NOTIFICATION) setPermission(Notification.permission);\n }, []);\n // Ids already popped as browser notifications. Seeded on first run so\n // existing unread don't pop retroactively on page load.\n const seenIdsRef = useRef<Set<string> | null>(null);\n\n const loadItems = useCallback(async () => {\n try {\n const res = await fetch(\n agentNativePath(\"/_agent-native/notifications?limit=20\"),\n );\n if (!res.ok) return;\n const rows = (await res.json()) as NotificationDto[];\n setItems(rows);\n } catch {\n // best-effort\n }\n }, []);\n\n // One polling callback used by both paths. When browserNotifications is on\n // we fetch the unread list (source of truth for both the badge count AND\n // the popup loop — no second /count request), and pop Notification() for\n // any new ids. When off, we fetch just /count. The unread-list branch also\n // opts out of visibility pause so popups still fire for backgrounded tabs.\n const refresh = useCallback(async () => {\n if (browserNotifications) {\n try {\n const res = await fetch(\n agentNativePath(\"/_agent-native/notifications?unread=true&limit=20\"),\n );\n if (!res.ok) return;\n const rows = (await res.json()) as NotificationDto[];\n setUnreadCount(rows.length);\n // First run: treat everything as already seen so we don't pop\n // retroactively on page load. After that, rebuild from the current\n // unread list so ids for read/archived rows drop out — keeps the\n // set bounded to the unread fetch limit (~20).\n const prev = seenIdsRef.current;\n const seen = new Set<string>();\n for (const n of rows) {\n const alreadySeen = prev?.has(n.id) ?? true;\n seen.add(n.id);\n if (alreadySeen) continue;\n if (!SUPPORTS_NOTIFICATION) continue;\n if (Notification.permission !== \"granted\") continue;\n try {\n new Notification(n.title, { body: n.body, tag: n.id });\n } catch {\n // Safari / restricted contexts may throw even when permission\n // claims to be granted — silent no-op.\n }\n }\n seenIdsRef.current = seen;\n } catch {\n // best-effort\n }\n return;\n }\n try {\n const res = await fetch(\n agentNativePath(\"/_agent-native/notifications/count\"),\n );\n if (!res.ok) return;\n const data = (await res.json()) as { count: number };\n setUnreadCount(data.count);\n } catch {\n // best-effort\n }\n }, [browserNotifications]);\n\n usePausingInterval(\n refresh,\n pollMs,\n /* pauseWhenHidden */ !browserNotifications,\n );\n\n useEffect(() => {\n if (!open) return;\n loadItems();\n }, [open, loadItems]);\n\n const markRead = async (id: string) => {\n try {\n // `keepalive: true` lets the request survive page navigation —\n // without it, clicking a notification with a link aborts this\n // request mid-flight and the row stays unread.\n await fetch(agentNativePath(`/_agent-native/notifications/${id}/read`), {\n method: \"POST\",\n keepalive: true,\n });\n setItems((prev) =>\n prev\n ? prev.map((n) =>\n n.id === id ? { ...n, readAt: new Date().toISOString() } : n,\n )\n : prev,\n );\n refresh();\n } catch {\n // best-effort\n }\n };\n\n // Reject any URL that isn't http(s) or a same-origin relative path. Blocks\n // `javascript:` execution, `data:` URIs, and absolute redirects to phishing\n // sites. Relative paths starting with `/` are routed through `appPath()` so\n // the link works in mounted deployments (e.g. /mail subdirectory).\n const safeNotificationLink = (link: string): string | null => {\n if (link.startsWith(\"/\") && !link.startsWith(\"//\")) {\n return appPath(link);\n }\n try {\n const url = new URL(link, window.location.origin);\n if (url.protocol === \"http:\" || url.protocol === \"https:\") {\n return url.toString();\n }\n } catch {\n // fallthrough\n }\n return null;\n };\n\n const markAllRead = async () => {\n try {\n await fetch(agentNativePath(`/_agent-native/notifications/read-all`), {\n method: \"POST\",\n });\n setItems((prev) =>\n prev\n ? prev.map((n) =>\n n.readAt ? n : { ...n, readAt: new Date().toISOString() },\n )\n : prev,\n );\n setUnreadCount(0);\n } catch {\n // best-effort\n }\n };\n\n const dismiss = async (id: string) => {\n try {\n await fetch(agentNativePath(`/_agent-native/notifications/${id}`), {\n method: \"DELETE\",\n });\n setItems((prev) => (prev ? prev.filter((n) => n.id !== id) : prev));\n refresh();\n } catch {\n // best-effort\n }\n };\n\n const hasUnread = unreadCount > 0;\n const Icon = hasUnread ? IconBellRinging : IconBell;\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-label={\n hasUnread ? `${unreadCount} unread notifications` : \"Notifications\"\n }\n className={\n \"an-notifications-bell__trigger relative inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground hover:bg-accent/40 hover:text-foreground\" +\n (className ? ` ${className}` : \"\")\n }\n >\n <Icon size={18} aria-hidden />\n {hasUnread ? (\n <span\n aria-hidden\n className=\"an-notifications-bell__badge absolute -right-0.5 -top-0.5 rounded-full bg-destructive px-1 text-[10px] leading-[14px] font-medium text-destructive-foreground\"\n >\n {unreadCount > 99 ? \"99+\" : unreadCount}\n </span>\n ) : null}\n </button>\n </PopoverTrigger>\n <PopoverContent\n align=\"end\"\n sideOffset={8}\n className=\"an-notifications-bell__menu w-80 p-0\"\n >\n <div className=\"flex items-center justify-between border-b border-border px-3 py-2 text-sm font-medium\">\n <span>Notifications</span>\n {hasUnread ? (\n <button\n type=\"button\"\n onClick={markAllRead}\n className=\"text-xs text-primary hover:underline\"\n >\n Mark all read\n </button>\n ) : null}\n </div>\n {browserNotifications &&\n SUPPORTS_NOTIFICATION &&\n permission === \"default\" ? (\n <div className=\"flex items-center justify-between gap-2 border-b border-border bg-accent/40 px-3 py-2 text-xs text-foreground\">\n <span>Get a system popup for new notifications.</span>\n <button\n type=\"button\"\n onClick={async () => {\n const result = await Notification.requestPermission();\n setPermission(result);\n }}\n className=\"shrink-0 rounded bg-primary px-2 py-0.5 font-medium text-primary-foreground hover:bg-primary/90\"\n >\n Enable\n </button>\n </div>\n ) : null}\n <div className=\"max-h-96 overflow-y-auto\">\n {items === null ? (\n <div className=\"flex items-center gap-2 p-4 text-sm text-muted-foreground\">\n <IconLoader2 size={14} className=\"animate-spin\" /> Loading…\n </div>\n ) : items.length > 0 ? (\n items.map((n) => {\n const rawLink =\n typeof n.metadata?.link === \"string\" ? n.metadata.link : null;\n const link = rawLink ? safeNotificationLink(rawLink) : null;\n const onItemClick = () => {\n if (!n.readAt) void markRead(n.id);\n if (link) {\n setOpen(false);\n window.location.assign(link);\n }\n };\n return (\n <div\n key={n.id}\n className={\n \"group relative border-b border-border last:border-b-0 hover:bg-accent/40 \" +\n (n.readAt ? \"opacity-60\" : \"\")\n }\n >\n <button\n type=\"button\"\n onClick={onItemClick}\n className={\n \"flex w-full flex-col items-start gap-0.5 px-3 py-2 pr-8 text-left\" +\n (link ? \" cursor-pointer\" : \"\")\n }\n >\n <div className=\"flex w-full items-center justify-between gap-2\">\n <span className=\"truncate text-sm font-medium text-foreground\">\n {n.title}\n </span>\n <SeverityBadge severity={n.severity} />\n </div>\n {n.body ? (\n <span className=\"line-clamp-2 text-xs text-muted-foreground\">\n {n.body}\n </span>\n ) : null}\n <span className=\"text-[10px] text-muted-foreground/70\">\n {new Date(n.createdAt).toLocaleString()}\n </span>\n </button>\n <button\n type=\"button\"\n aria-label=\"Dismiss notification\"\n onClick={(e) => {\n e.stopPropagation();\n void dismiss(n.id);\n }}\n className=\"absolute right-2 top-2 hidden rounded p-0.5 text-muted-foreground hover:bg-accent hover:text-foreground group-hover:flex\"\n >\n <IconX size={12} />\n </button>\n </div>\n );\n })\n ) : (\n <div className=\"space-y-1 p-4 text-sm\">\n <p className=\"font-medium text-foreground\">{emptyTitle}</p>\n {emptyDescription ? (\n <p className=\"text-xs leading-relaxed text-muted-foreground\">\n {emptyDescription}\n </p>\n ) : null}\n </div>\n )}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n\n// Severity color pairs — use /20 opacity backdrops that work against both\n// light and dark theme backgrounds; text uses 700/300 so it stays readable\n// in each mode (the `dark:` prefix is one of the few places where explicit\n// variants are necessary since these are brand-color tokens, not semantic).\nfunction SeverityBadge({ severity }: { severity: NotificationSeverity }) {\n const color =\n severity === \"critical\"\n ? \"bg-red-500/20 text-red-700 dark:text-red-300\"\n : severity === \"warning\"\n ? \"bg-amber-500/20 text-amber-700 dark:text-amber-300\"\n : \"bg-muted text-muted-foreground\";\n return (\n <span className={`rounded px-1.5 py-0.5 text-[10px] font-medium ${color}`}>\n {severity}\n </span>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SetupButton.d.ts","sourceRoot":"","sources":["../../../src/client/onboarding/SetupButton.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"SetupButton.d.ts","sourceRoot":"","sources":["../../../src/client/onboarding/SetupButton.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAaH,wBAAgB,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,2CA4ChE"}
|
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* <SetupButton /> — re-opens the onboarding panel after it's been dismissed.
|
|
4
|
+
*
|
|
5
|
+
* Only renders when the user has dismissed the panel but still has incomplete
|
|
6
|
+
* required steps. Clicking clears the dismissal flag so the panel reappears.
|
|
7
|
+
*/
|
|
2
8
|
import { IconChecklist } from "@tabler/icons-react";
|
|
3
9
|
import { useOnboarding } from "./use-onboarding.js";
|
|
4
10
|
import { useDevMode } from "../use-dev-mode.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SetupButton.js","sourceRoot":"","sources":["../../../src/client/onboarding/SetupButton.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"SetupButton.js","sourceRoot":"","sources":["../../../src/client/onboarding/SetupButton.tsx"],"names":[],"mappings":";AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EACL,OAAO,EACP,cAAc,EACd,cAAc,GACf,MAAM,6BAA6B,CAAC;AAErC,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;AAExD,MAAM,UAAU,WAAW,CAAC,EAAE,SAAS,EAA0B;IAC/D,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,aAAa,EAAE,CAAC;IAC9D,MAAM,EAAE,SAAS,EAAE,GAAG,UAAU,EAAE,CAAC;IACnC,MAAM,YAAY,GAAG,SAAS;QAC5B,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtD,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC;IACvC,MAAM,WAAW,GAAG,YAAY;SAC7B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;SACzB,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAE5B,IAAI,OAAO,IAAI,UAAU,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7C,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5B,IAAI,WAAW;QAAE,OAAO,IAAI,CAAC;IAE7B,OAAO,CACL,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,MAAM,gBACJ,eAAe,EAC1B,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE;wBACL,OAAO,EAAE,aAAa;wBACtB,UAAU,EAAE,QAAQ;wBACpB,GAAG,EAAE,CAAC;wBACN,OAAO,EAAE,SAAS;wBAClB,YAAY,EAAE,CAAC;wBACf,MAAM,EAAE,gCAAgC;wBACxC,UAAU,EAAE,uBAAuB;wBACnC,KAAK,EAAE,SAAS;wBAChB,QAAQ,EAAE,EAAE;wBACZ,UAAU,EAAE,GAAG;wBACf,MAAM,EAAE,SAAS;qBAClB,aAED,KAAC,aAAa,IAAC,IAAI,EAAE,EAAE,GAAI,aAEpB,GACM,EACjB,KAAC,cAAc,gCAA+B,IACtC,CACX,CAAC;AACJ,CAAC","sourcesContent":["/**\n * <SetupButton /> — re-opens the onboarding panel after it's been dismissed.\n *\n * Only renders when the user has dismissed the panel but still has incomplete\n * required steps. Clicking clears the dismissal flag so the panel reappears.\n */\n\nimport { IconChecklist } from \"@tabler/icons-react\";\nimport { useOnboarding } from \"./use-onboarding.js\";\nimport { useDevMode } from \"../use-dev-mode.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"../components/ui/tooltip.js\";\n\nconst DEV_ONLY_STEP_IDS = new Set([\"database\", \"auth\"]);\n\nexport function SetupButton({ className }: { className?: string }) {\n const { dismissed, loading, steps, reopen } = useOnboarding();\n const { isDevMode } = useDevMode();\n const visibleSteps = isDevMode\n ? steps\n : steps.filter((s) => !DEV_ONLY_STEP_IDS.has(s.id));\n const totalCount = visibleSteps.length;\n const allComplete = visibleSteps\n .filter((s) => s.required)\n .every((s) => s.complete);\n\n if (loading || totalCount === 0) return null;\n if (!dismissed) return null;\n if (allComplete) return null;\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={reopen}\n aria-label=\"Re-open setup\"\n className={className}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 4,\n padding: \"2px 8px\",\n borderRadius: 5,\n border: \"1px solid rgba(96,165,250,0.3)\",\n background: \"rgba(59,130,246,0.08)\",\n color: \"#60a5fa\",\n fontSize: 11,\n fontWeight: 500,\n cursor: \"pointer\",\n }}\n >\n <IconChecklist size={12} />\n Setup\n </button>\n </TooltipTrigger>\n <TooltipContent>Re-open setup</TooltipContent>\n </Tooltip>\n );\n}\n"]}
|