@agent-native/core 0.69.0 → 0.70.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/README.md +15 -15
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +109 -0
- package/corpus/core/docs/design/durable-agent-runs.md +217 -0
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/action.ts +89 -0
- package/corpus/core/src/agent/model-config.ts +0 -2
- package/corpus/core/src/agent/run-loop-with-resume.ts +48 -0
- package/corpus/core/src/changelog/parse.ts +245 -0
- package/corpus/core/src/cli/changelog.ts +199 -0
- package/corpus/core/src/cli/index.ts +19 -0
- package/corpus/core/src/cli/recap.ts +24 -1
- package/corpus/core/src/cli/skills.ts +74 -47
- package/corpus/core/src/client/AgentPanel.tsx +5 -3
- package/corpus/core/src/client/AssistantChat.tsx +8 -0
- package/corpus/core/src/client/CommandMenu.tsx +183 -75
- package/corpus/core/src/client/agent-chat-adapter.ts +44 -7
- package/corpus/core/src/client/analytics.ts +181 -0
- package/corpus/core/src/client/changelog/Changelog.tsx +321 -0
- package/corpus/core/src/client/client-surface.ts +41 -0
- package/corpus/core/src/client/composer/TiptapComposer.tsx +123 -12
- package/corpus/core/src/client/feedback-context.ts +4 -0
- package/corpus/core/src/client/index.ts +12 -0
- package/corpus/core/src/client/mcp-apps/McpAppRenderer.tsx +54 -0
- package/corpus/core/src/client/settings/useBuilderStatus.ts +82 -20
- package/corpus/core/src/client/sse-event-processor.ts +7 -1
- package/corpus/core/src/mcp/build-server.ts +57 -1
- package/corpus/core/src/mcp/embed-app.ts +197 -7
- package/corpus/core/src/mcp/oauth-route.ts +109 -13
- package/corpus/core/src/server/attribution.ts +211 -0
- package/corpus/core/src/server/auth.ts +6 -0
- package/corpus/core/src/server/better-auth-instance.ts +49 -5
- package/corpus/core/src/server/builder-browser.ts +27 -1
- package/corpus/core/src/server/core-routes-plugin.ts +136 -0
- package/corpus/core/src/server/google-oauth.ts +19 -6
- package/corpus/core/src/server/onboarding-html.ts +35 -0
- package/corpus/core/src/shared/mcp-embed-headers.ts +1 -1
- package/corpus/core/src/styles/agent-conversation.css +21 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/changelog/SKILL.md +111 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/reliable-mutations/SKILL.md +72 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +46 -14
- package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +22 -0
- package/corpus/templates/analytics/AGENTS.md +8 -1
- package/corpus/templates/analytics/CHANGELOG.md +10 -0
- package/corpus/templates/analytics/actions/install-dashboard-template.ts +99 -4
- package/corpus/templates/analytics/actions/open-traffic-dashboard.ts +1 -1
- package/corpus/templates/analytics/actions/update-dashboard.ts +39 -8
- package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +30 -3
- package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +180 -144
- package/corpus/templates/analytics/app/components/layout/Header.tsx +2 -3
- package/corpus/templates/analytics/app/components/layout/Layout.tsx +7 -5
- package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +221 -215
- package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +6 -6
- package/corpus/templates/analytics/app/lib/demo-dashboard-path.ts +1 -1
- package/corpus/templates/analytics/app/lib/last-opened.ts +2 -1
- package/corpus/templates/analytics/app/pages/Settings.tsx +4 -0
- package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +3 -3
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/DashboardFilterBar.tsx +2 -2
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +32 -2
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +101 -99
- package/corpus/templates/analytics/app/pages/overview/OverviewPage.tsx +1 -1
- package/corpus/templates/analytics/app/routes/adhoc.$id.tsx +18 -5
- package/corpus/templates/analytics/app/routes/catalog.tsx +1 -1
- package/corpus/templates/analytics/app/routes/dashboards.$id.tsx +9 -0
- package/corpus/templates/analytics/app/routes/traffic.tsx +1 -1
- package/corpus/templates/analytics/changelog/2026-06-23-long-dashboard-and-analysis-names-in-the-sidebar-now-truncat.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-23-open-any-dashboard-chart-full-screen-in-a-modal-from-the-pan.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-23-the-dashboards-and-analyses-sidebar-settings-buttons-now-sta.md +6 -0
- package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +145 -0
- package/corpus/templates/analytics/server/db/index.ts +1 -1
- package/corpus/templates/analytics/server/lib/dashboard-catalog.ts +9 -2
- package/corpus/templates/analytics/server/lib/demo-dashboards.ts +1 -1
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +2 -2
- package/corpus/templates/analytics/server/plugins/core-routes.ts +6 -6
- package/corpus/templates/assets/CHANGELOG.md +10 -0
- package/corpus/templates/assets/actions/generate-image.ts +24 -0
- package/corpus/templates/assets/app/components/layout/Sidebar.tsx +2 -2
- package/corpus/templates/assets/app/global.css +17 -1
- package/corpus/templates/assets/app/root.tsx +7 -1
- package/corpus/templates/assets/app/routes/_index.tsx +94 -14
- package/corpus/templates/assets/app/routes/settings.tsx +6 -0
- package/corpus/templates/assets/changelog/2026-06-23-chat-dates-in-the-sidebar-no-longer-wrap-onto-two-lines.md +6 -0
- package/corpus/templates/assets/changelog/2026-06-23-clicking-image-video-or-refine-on-the-start-screen-now-drops.md +6 -0
- package/corpus/templates/assets/changelog/2026-06-23-pick-your-image-generation-model-right-from-the-chat-model-m.md +6 -0
- package/corpus/templates/brain/CHANGELOG.md +10 -0
- package/corpus/templates/brain/app/root.tsx +7 -1
- package/corpus/templates/brain/app/routes/settings.tsx +8 -1
- package/corpus/templates/calendar/CHANGELOG.md +10 -0
- package/corpus/templates/calendar/app/pages/Settings.tsx +4 -0
- package/corpus/templates/calendar/app/root.tsx +7 -1
- package/corpus/templates/chat/CHANGELOG.md +10 -0
- package/corpus/templates/chat/app/root.tsx +7 -1
- package/corpus/templates/clips/CHANGELOG.md +10 -0
- package/corpus/templates/clips/app/components/library/library-grid.tsx +1 -20
- package/corpus/templates/clips/app/components/player/share-dialog.tsx +33 -7
- package/corpus/templates/clips/app/components/player/sign-in-prompt-dialog.tsx +8 -0
- package/corpus/templates/clips/app/components/player/video-player.tsx +150 -20
- package/corpus/templates/clips/app/components/recorder/countdown-overlay.tsx +72 -48
- package/corpus/templates/clips/app/components/recorder/pre-record-panel.tsx +7 -11
- package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +31 -0
- package/corpus/templates/clips/app/components/sharing/slack-share-hint.tsx +71 -0
- package/corpus/templates/clips/app/lib/countdown-audio-cue.ts +35 -17
- package/corpus/templates/clips/app/root.tsx +7 -1
- package/corpus/templates/clips/app/routes/_app.settings._index.tsx +15 -1
- package/corpus/templates/clips/app/routes/record.tsx +78 -5
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +86 -5
- package/corpus/templates/clips/changelog/2026-06-23-clips-shared-in-slack-no-longer-show-a-could-not-start-playb.md +6 -0
- package/corpus/templates/clips/changelog/2026-06-23-made-the-play-button-on-shared-and-embedded-clips-scale-with.md +6 -0
- package/corpus/templates/clips/changelog/2026-06-23-public-clip-share-links-now-show-whether-they-ll-play-inline.md +6 -0
- package/corpus/templates/clips/changelog/2026-06-23-removed-select-button-from-library-hover-a-clip-to-select-it.md +6 -0
- package/corpus/templates/clips/changelog/2026-06-23-screen-camera-recordings-now-keep-the-presenter-s-face-in-th.md +6 -0
- package/corpus/templates/clips/changelog/2026-06-23-shared-video-links-now-play-for-anyone-without-signing-in.md +6 -0
- package/corpus/templates/clips/changelog/2026-06-23-skip-or-cancel-the-recording-countdown-with-buttons-beside-t.md +6 -0
- package/corpus/templates/clips/changelog/2026-06-23-the-desktop-camera-bubble-now-looks-sharp-the-instant-it-ope.md +6 -0
- package/corpus/templates/clips/changelog/2026-06-23-the-desktop-recording-widget-now-grows-downward-only-when-yo.md +6 -0
- package/corpus/templates/clips/changelog/2026-06-23-the-recording-start-sound-is-now-a-softer-more-modern-chime.md +6 -0
- package/corpus/templates/clips/chrome-extension/public/manifest.json +17 -8
- package/corpus/templates/clips/chrome-extension/src/background.ts +769 -180
- package/corpus/templates/clips/chrome-extension/src/content-script.ts +177 -0
- package/corpus/templates/clips/chrome-extension/src/offscreen.ts +466 -329
- package/corpus/templates/clips/chrome-extension/src/overlay.css +377 -0
- package/corpus/templates/clips/chrome-extension/src/overlay.html +12 -0
- package/corpus/templates/clips/chrome-extension/src/overlay.ts +330 -0
- package/corpus/templates/clips/chrome-extension/src/permission.html +227 -0
- package/corpus/templates/clips/chrome-extension/src/permission.ts +105 -0
- package/corpus/templates/clips/chrome-extension/src/popup.html +3 -0
- package/corpus/templates/clips/chrome-extension/src/popup.ts +50 -2
- package/corpus/templates/clips/chrome-extension/src/styles.css +50 -0
- package/corpus/templates/clips/chrome-extension/vite.config.ts +3 -0
- package/corpus/templates/clips/desktop/src/lib/audio-cue.ts +41 -24
- package/corpus/templates/clips/desktop/src/lib/bubble-webrtc.ts +119 -2
- package/corpus/templates/clips/desktop/src/lib/recorder.ts +20 -0
- package/corpus/templates/clips/desktop/src/main.tsx +3 -0
- package/corpus/templates/clips/desktop/src/overlays/countdown.tsx +21 -2
- package/corpus/templates/clips/desktop/src/overlays/region-record-border.tsx +76 -0
- package/corpus/templates/clips/desktop/src/styles.css +119 -2
- package/corpus/templates/clips/desktop/src-tauri/capabilities/default.json +2 -1
- package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +140 -1
- package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +2 -0
- package/corpus/templates/clips/desktop/src-tauri/src/util.rs +4 -1
- package/corpus/templates/clips/server/routes/api/video/[recordingId].get.ts +85 -6
- package/corpus/templates/clips/shared/share-attribution.ts +79 -0
- package/corpus/templates/content/AGENTS.md +20 -3
- package/corpus/templates/content/CHANGELOG.md +10 -0
- package/corpus/templates/content/actions/_database-utils.ts +15 -0
- package/corpus/templates/content/actions/_property-utils.ts +371 -4
- package/corpus/templates/content/actions/configure-document-property.ts +35 -1
- package/corpus/templates/content/actions/create-content-database.ts +5 -1
- package/corpus/templates/content/actions/delete-document-property.ts +52 -2
- package/corpus/templates/content/actions/duplicate-document-property.ts +34 -17
- package/corpus/templates/content/actions/reorder-document-property.ts +79 -0
- package/corpus/templates/content/actions/set-document-property.ts +39 -0
- package/corpus/templates/content/app/components/editor/DocumentBlockFields.tsx +806 -0
- package/corpus/templates/content/app/components/editor/DocumentDatabase.tsx +226 -68
- package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +59 -30
- package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +25 -1
- package/corpus/templates/content/app/components/editor/blockFieldSaveController.ts +180 -0
- package/corpus/templates/content/app/components/editor/blockFieldSaveRegistry.ts +179 -0
- package/corpus/templates/content/app/components/editor/previewDocumentSaveController.ts +244 -0
- package/corpus/templates/content/app/components/editor/previewDocumentSaveRegistry.ts +132 -0
- package/corpus/templates/content/app/global.css +9 -0
- package/corpus/templates/content/app/hooks/use-document-properties.ts +21 -0
- package/corpus/templates/content/app/root.tsx +7 -1
- package/corpus/templates/content/server/db/schema.ts +30 -0
- package/corpus/templates/content/server/plugins/db.ts +87 -0
- package/corpus/templates/content/shared/api.ts +7 -0
- package/corpus/templates/content/shared/properties.ts +109 -0
- package/corpus/templates/design/CHANGELOG.md +10 -0
- package/corpus/templates/design/actions/generate-design.ts +4 -0
- package/corpus/templates/design/app/root.tsx +7 -1
- package/corpus/templates/design/app/routes/settings.tsx +10 -2
- package/corpus/templates/dispatch/CHANGELOG.md +10 -0
- package/corpus/templates/dispatch/app/root.tsx +7 -1
- package/corpus/templates/forms/.agents/skills/form-responses/SKILL.md +10 -0
- package/corpus/templates/forms/CHANGELOG.md +10 -0
- package/corpus/templates/forms/actions/export-responses.ts +6 -0
- package/corpus/templates/forms/actions/list-responses.ts +2 -0
- package/corpus/templates/forms/actions/response-insights.ts +2 -0
- package/corpus/templates/forms/app/pages/ResponsesPage.tsx +138 -1
- package/corpus/templates/forms/app/root.tsx +7 -1
- package/corpus/templates/forms/changelog/2026-06-23-response-tables-now-show-the-page-each-submission-came-from-.md +6 -0
- package/corpus/templates/forms/changelog/2026-06-23-response-tables-now-show-whether-feedback-came-from-the-web-.md +6 -0
- package/corpus/templates/forms/server/db/schema.ts +7 -0
- package/corpus/templates/forms/server/handlers/submissions.ts +19 -2
- package/corpus/templates/forms/server/lib/integrations.ts +76 -2
- package/corpus/templates/forms/server/plugins/db.ts +20 -0
- package/corpus/templates/forms/shared/types.ts +12 -0
- package/corpus/templates/macros/CHANGELOG.md +10 -0
- package/corpus/templates/macros/app/root.tsx +7 -1
- package/corpus/templates/mail/CHANGELOG.md +10 -0
- package/corpus/templates/mail/app/components/layout/CommandPalette.tsx +3 -0
- package/corpus/templates/mail/app/pages/SettingsPage.tsx +27 -0
- package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +31 -17
- package/corpus/templates/plan/.agents/skills/visual-plan/references/wireframe.md +7 -4
- package/corpus/templates/plan/.agents/skills/visual-recap/SKILL.md +34 -24
- package/corpus/templates/plan/.agents/skills/visual-recap/references/wireframe.md +7 -4
- package/corpus/templates/plan/AGENTS.md +4 -0
- package/corpus/templates/plan/CHANGELOG.md +10 -0
- package/corpus/templates/plan/actions/view-screen.ts +5 -0
- package/corpus/templates/plan/app/components/layout/Sidebar.tsx +98 -1
- package/corpus/templates/plan/app/components/plan/wireframe/html-artboard.css +3 -1
- package/corpus/templates/plan/app/pages/PlansPage.tsx +107 -7
- package/corpus/templates/plan/app/root.tsx +7 -1
- package/corpus/templates/plan/changelog/2026-06-23-large-diagrams-in-a-plan-now-scroll-within-their-block-inste.md +6 -0
- package/corpus/templates/plan/shared/share-attribution.ts +72 -0
- package/corpus/templates/slides/CHANGELOG.md +10 -0
- package/corpus/templates/slides/app/root.tsx +7 -1
- package/corpus/templates/videos/CHANGELOG.md +4 -151
- package/corpus/templates/videos/app/root.tsx +7 -1
- package/dist/action.js +87 -0
- package/dist/action.js.map +1 -1
- package/dist/agent/engine/builder-engine.d.ts +1 -1
- package/dist/agent/engine/builder-engine.d.ts.map +1 -1
- package/dist/agent/model-config.d.ts +2 -2
- package/dist/agent/model-config.d.ts.map +1 -1
- package/dist/agent/model-config.js +0 -2
- package/dist/agent/model-config.js.map +1 -1
- package/dist/agent/run-loop-with-resume.d.ts +13 -0
- package/dist/agent/run-loop-with-resume.d.ts.map +1 -1
- package/dist/agent/run-loop-with-resume.js +44 -0
- package/dist/agent/run-loop-with-resume.js.map +1 -1
- package/dist/changelog/parse.d.ts +70 -0
- package/dist/changelog/parse.d.ts.map +1 -0
- package/dist/changelog/parse.js +200 -0
- package/dist/changelog/parse.js.map +1 -0
- package/dist/cli/changelog.d.ts +4 -0
- package/dist/cli/changelog.d.ts.map +1 -0
- package/dist/cli/changelog.js +166 -0
- package/dist/cli/changelog.js.map +1 -0
- package/dist/cli/index.js +18 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/recap.d.ts.map +1 -1
- package/dist/cli/recap.js +22 -1
- package/dist/cli/recap.js.map +1 -1
- package/dist/cli/skills.d.ts +3 -3
- package/dist/cli/skills.d.ts.map +1 -1
- package/dist/cli/skills.js +74 -47
- package/dist/cli/skills.js.map +1 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +5 -3
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts +6 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +2 -2
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/CommandMenu.d.ts +17 -1
- package/dist/client/CommandMenu.d.ts.map +1 -1
- package/dist/client/CommandMenu.js +49 -13
- package/dist/client/CommandMenu.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +43 -6
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/analytics.d.ts +18 -0
- package/dist/client/analytics.d.ts.map +1 -1
- package/dist/client/analytics.js +177 -0
- package/dist/client/analytics.js.map +1 -1
- package/dist/client/changelog/Changelog.d.ts +47 -0
- package/dist/client/changelog/Changelog.d.ts.map +1 -0
- package/dist/client/changelog/Changelog.js +138 -0
- package/dist/client/changelog/Changelog.js.map +1 -0
- package/dist/client/client-surface.d.ts +17 -0
- package/dist/client/client-surface.d.ts.map +1 -0
- package/dist/client/client-surface.js +24 -0
- package/dist/client/client-surface.js.map +1 -0
- package/dist/client/composer/TiptapComposer.d.ts +26 -1
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +27 -5
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/feedback-context.d.ts +3 -0
- package/dist/client/feedback-context.d.ts.map +1 -1
- package/dist/client/feedback-context.js +2 -0
- package/dist/client/feedback-context.js.map +1 -1
- package/dist/client/index.d.ts +3 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +3 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/mcp-apps/McpAppRenderer.d.ts +1 -0
- package/dist/client/mcp-apps/McpAppRenderer.d.ts.map +1 -1
- package/dist/client/mcp-apps/McpAppRenderer.js +42 -1
- package/dist/client/mcp-apps/McpAppRenderer.js.map +1 -1
- package/dist/client/settings/useBuilderStatus.d.ts +2 -0
- package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
- package/dist/client/settings/useBuilderStatus.js +58 -10
- package/dist/client/settings/useBuilderStatus.js.map +1 -1
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +7 -1
- package/dist/client/sse-event-processor.js.map +1 -1
- package/dist/mcp/build-server.d.ts +21 -0
- package/dist/mcp/build-server.d.ts.map +1 -1
- package/dist/mcp/build-server.js +43 -1
- package/dist/mcp/build-server.js.map +1 -1
- package/dist/mcp/embed-app.d.ts.map +1 -1
- package/dist/mcp/embed-app.js +197 -7
- package/dist/mcp/embed-app.js.map +1 -1
- package/dist/mcp/oauth-route.d.ts.map +1 -1
- package/dist/mcp/oauth-route.js +95 -12
- package/dist/mcp/oauth-route.js.map +1 -1
- package/dist/server/attribution.d.ts +83 -0
- package/dist/server/attribution.d.ts.map +1 -0
- package/dist/server/attribution.js +178 -0
- package/dist/server/attribution.js.map +1 -0
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +7 -0
- package/dist/server/auth.js.map +1 -1
- package/dist/server/better-auth-instance.d.ts +9 -1
- package/dist/server/better-auth-instance.d.ts.map +1 -1
- package/dist/server/better-auth-instance.js +32 -2
- package/dist/server/better-auth-instance.js.map +1 -1
- package/dist/server/builder-browser.d.ts +4 -0
- package/dist/server/builder-browser.d.ts.map +1 -1
- package/dist/server/builder-browser.js +20 -1
- package/dist/server/builder-browser.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts +25 -0
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +101 -0
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/google-oauth.d.ts.map +1 -1
- package/dist/server/google-oauth.js +16 -2
- package/dist/server/google-oauth.js.map +1 -1
- package/dist/server/onboarding-html.d.ts.map +1 -1
- package/dist/server/onboarding-html.js +35 -0
- package/dist/server/onboarding-html.js.map +1 -1
- package/dist/shared/mcp-embed-headers.js +1 -1
- package/dist/shared/mcp-embed-headers.js.map +1 -1
- package/dist/styles/agent-conversation.css +21 -0
- package/dist/templates/workspace-core/.agents/skills/changelog/SKILL.md +111 -0
- package/dist/templates/workspace-core/.agents/skills/reliable-mutations/SKILL.md +72 -0
- package/dist/templates/workspace-core/.agents/skills/tracking/SKILL.md +46 -14
- package/docs/design/durable-agent-runs.md +217 -0
- package/package.json +1 -1
- package/src/templates/workspace-core/.agents/skills/changelog/SKILL.md +111 -0
- package/src/templates/workspace-core/.agents/skills/reliable-mutations/SKILL.md +72 -0
- package/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +46 -14
- package/corpus/templates/analytics/app/pages/About.tsx +0 -108
- package/corpus/templates/analytics/app/routes/about.tsx +0 -9
- /package/corpus/templates/analytics/app/routes/{dashboards.tsx → dashboards._index.tsx} +0 -0
|
@@ -1 +1 @@
|
|
|
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
|
+
{"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;\nexport const MCP_APP_INITIALIZE_TIMEOUT_MS = 8000;\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 const externalOpenUrl = useMemo(() => openUrlFromMcpApp(app), [app]);\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 initializeTimer = window.setTimeout(() => {\n if (closed) return;\n setReady(false);\n setError(\"MCP App did not finish initializing.\");\n }, MCP_APP_INITIALIZE_TIMEOUT_MS);\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 clearTimeout(initializeTimer);\n setReady(true);\n // Clear any error the initialize timeout may have set before a slow app\n // finished — otherwise the error overlay stays stuck over a working app.\n setError(null);\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 clearTimeout(initializeTimer);\n setError(err?.message ?? \"Failed to initialize MCP App.\");\n }\n });\n\n return () => {\n closed = true;\n clearTimeout(initializeTimer);\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 {externalOpenUrl && (\n <button\n type=\"button\"\n className=\"agent-mcp-app__open\"\n onClick={() =>\n window.open(externalOpenUrl, \"_blank\", \"noopener,noreferrer\")\n }\n >\n Open in new tab\n </button>\n )}\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\nfunction recordValue(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction openUrlRecordValue(value: unknown): string | null {\n const record = recordValue(value);\n const webUrl = record?.webUrl;\n return typeof webUrl === \"string\" && isSafeExternalUrl(webUrl)\n ? webUrl\n : null;\n}\n\nfunction openUrlFromMcpApp(app: AgentMcpAppPayload): string | null {\n const result = recordValue(app.toolResult);\n const meta = recordValue(result?._meta);\n const fromMeta = openUrlRecordValue(meta?.[\"agent-native/openLink\"]);\n if (fromMeta) return fromMeta;\n\n const structuredContent = recordValue(result?.structuredContent);\n const fromStructured = openUrlRecordValue(structuredContent?.openLink);\n if (fromStructured) return fromStructured;\n\n const directUrl = structuredContent?.url ?? result?.url;\n return typeof directUrl === \"string\" && isSafeExternalUrl(directUrl)\n ? directUrl\n : null;\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"]}
|
|
@@ -116,6 +116,8 @@ export interface BuilderConnectFlow {
|
|
|
116
116
|
export declare function withBuilderConnectTrackingParams(url: string, options?: {
|
|
117
117
|
source?: string;
|
|
118
118
|
flow?: string;
|
|
119
|
+
app?: string;
|
|
120
|
+
template?: string;
|
|
119
121
|
}): string;
|
|
120
122
|
export interface OpenBuilderConnectPopupOptions {
|
|
121
123
|
url?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBuilderStatus.d.ts","sourceRoot":"","sources":["../../../src/client/settings/useBuilderStatus.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,WAAW,GAAG,KAAK,CAAC;IACxD,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;OAIG;IACH,YAAY,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C;;;;OAIG;IACH,SAAS,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7C;AAED;;;GAGG;AACH,wBAAgB,gBAAgB;;;;;;EA8D/B;AAkBD,MAAM,WAAW,yBAAyB;IACxC,sEAAsE;IACtE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kEAAkE;IAClE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mEAAmE;IACnE,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3E;AAED,MAAM,WAAW,0BAA0B;IACzC,qDAAqD;IACrD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mDAAmD;IACnD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,UAAU,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,cAAc,EAAE,OAAO,CAAC;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB;;;;;;;OAOG;IACH,gBAAgB,EAAE,OAAO,CAAC;IAC1B,oFAAoF;IACpF,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,0BAA0B,KAAK,IAAI,CAAC;CACvD;
|
|
1
|
+
{"version":3,"file":"useBuilderStatus.d.ts","sourceRoot":"","sources":["../../../src/client/settings/useBuilderStatus.ts"],"names":[],"mappings":"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"}
|
|
@@ -74,6 +74,8 @@ const BUILDER_STATE_PARAM = "_an_state";
|
|
|
74
74
|
const BUILDER_SIGNUP_SOURCE_PARAM = "signupSource";
|
|
75
75
|
const BUILDER_AGENT_NATIVE_FLOW_PARAM = "agentNativeFlow";
|
|
76
76
|
const BUILDER_AGENT_NATIVE_CONNECT_SOURCE_PARAM = "agentNativeConnectSource";
|
|
77
|
+
const BUILDER_AGENT_NATIVE_APP_PARAM = "agentNativeApp";
|
|
78
|
+
const BUILDER_AGENT_NATIVE_TEMPLATE_PARAM = "agentNativeTemplate";
|
|
77
79
|
const BUILDER_SIGNUP_SOURCE = "agent-native";
|
|
78
80
|
const STATUS_CONNECT_URL_TTL_MS = 9 * 60 * 1000;
|
|
79
81
|
function cleanTrackingParam(value) {
|
|
@@ -104,26 +106,72 @@ function inferBuilderConnectTrackingFlow(source) {
|
|
|
104
106
|
return "auth";
|
|
105
107
|
return "connect_llm";
|
|
106
108
|
}
|
|
109
|
+
function normalizeTrackingSlug(value) {
|
|
110
|
+
const trimmed = value?.trim();
|
|
111
|
+
if (!trimmed)
|
|
112
|
+
return null;
|
|
113
|
+
const unscoped = trimmed.startsWith("@")
|
|
114
|
+
? (trimmed.split("/").pop() ?? trimmed)
|
|
115
|
+
: trimmed;
|
|
116
|
+
const slug = unscoped
|
|
117
|
+
.toLowerCase()
|
|
118
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
119
|
+
.replace(/^-+|-+$/g, "");
|
|
120
|
+
return slug || null;
|
|
121
|
+
}
|
|
122
|
+
function inferBuilderConnectTrackingIdentity(options) {
|
|
123
|
+
const env = import.meta.env ?? {};
|
|
124
|
+
const app = normalizeTrackingSlug(options.app) ??
|
|
125
|
+
normalizeTrackingSlug(env.VITE_AGENT_NATIVE_APP) ??
|
|
126
|
+
(typeof window !== "undefined"
|
|
127
|
+
? normalizeTrackingSlug(window.location.hostname.split(".")[0])
|
|
128
|
+
: null);
|
|
129
|
+
const template = normalizeTrackingSlug(options.template) ??
|
|
130
|
+
normalizeTrackingSlug(env.VITE_AGENT_NATIVE_TEMPLATE) ??
|
|
131
|
+
normalizeTrackingSlug(env.VITE_APP_TEMPLATE) ??
|
|
132
|
+
(app?.startsWith("agent-native-")
|
|
133
|
+
? normalizeTrackingSlug(app.slice("agent-native-".length))
|
|
134
|
+
: app && app !== "localhost"
|
|
135
|
+
? app
|
|
136
|
+
: null);
|
|
137
|
+
return { app, template };
|
|
138
|
+
}
|
|
139
|
+
function applyBuilderConnectTrackingParams(params, tracking) {
|
|
140
|
+
params.set(BUILDER_SIGNUP_SOURCE_PARAM, BUILDER_SIGNUP_SOURCE);
|
|
141
|
+
params.set(BUILDER_AGENT_NATIVE_FLOW_PARAM, tracking.flow);
|
|
142
|
+
if (tracking.source) {
|
|
143
|
+
params.set(BUILDER_AGENT_NATIVE_CONNECT_SOURCE_PARAM, tracking.source);
|
|
144
|
+
}
|
|
145
|
+
if (tracking.app) {
|
|
146
|
+
params.set(BUILDER_AGENT_NATIVE_APP_PARAM, tracking.app);
|
|
147
|
+
}
|
|
148
|
+
if (tracking.template) {
|
|
149
|
+
params.set(BUILDER_AGENT_NATIVE_TEMPLATE_PARAM, tracking.template);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
107
152
|
export function withBuilderConnectTrackingParams(url, options = {}) {
|
|
108
153
|
const source = cleanTrackingParam(options.source);
|
|
109
154
|
const flow = cleanTrackingParam(options.flow) ??
|
|
110
155
|
inferBuilderConnectTrackingFlow(source ?? undefined);
|
|
156
|
+
const { app, template } = inferBuilderConnectTrackingIdentity(options);
|
|
111
157
|
const origin = typeof window !== "undefined" ? window.location.origin : "http://localhost";
|
|
112
158
|
try {
|
|
113
159
|
const parsed = new URL(url, origin);
|
|
114
|
-
parsed.searchParams
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
160
|
+
applyBuilderConnectTrackingParams(parsed.searchParams, {
|
|
161
|
+
source,
|
|
162
|
+
flow,
|
|
163
|
+
app,
|
|
164
|
+
template,
|
|
165
|
+
});
|
|
119
166
|
const redirectUrl = parsed.searchParams.get("redirect_url");
|
|
120
167
|
if (redirectUrl) {
|
|
121
168
|
const parsedRedirect = new URL(redirectUrl);
|
|
122
|
-
parsedRedirect.searchParams
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
169
|
+
applyBuilderConnectTrackingParams(parsedRedirect.searchParams, {
|
|
170
|
+
source,
|
|
171
|
+
flow,
|
|
172
|
+
app,
|
|
173
|
+
template,
|
|
174
|
+
});
|
|
127
175
|
parsed.searchParams.set("redirect_url", parsedRedirect.toString());
|
|
128
176
|
}
|
|
129
177
|
return parsed.toString();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBuilderStatus.js","sourceRoot":"","sources":["../../../src/client/settings/useBuilderStatus.ts"],"names":[],"mappings":"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","sourcesContent":["import { agentNativePath } from \"../api-path.js\";\nimport { useState, useEffect, useCallback, useRef } from \"react\";\nimport { getCallbackOrigin } from \"../frame.js\";\nimport { trackEvent } from \"../analytics.js\";\nimport { openMcpAppHostLink } from \"../mcp-app-host.js\";\n\nexport interface BuilderStatus {\n configured: boolean;\n builderEnabled: boolean;\n /**\n * True when `BUILDER_PRIVATE_KEY` is set at the deploy level. This is a\n * fallback credential; per-user/org Builder connections are still allowed\n * and take precedence for that request.\n */\n envManaged?: boolean;\n credentialSource?: \"user\" | \"org\" | \"workspace\" | \"env\";\n connectUrl: string;\n cliAuthUrl?: string;\n appHost: string;\n apiHost: string;\n branchProjectIdConfigured?: boolean;\n branchProjectId?: string;\n publicKeyConfigured: boolean;\n privateKeyConfigured: boolean;\n userId?: string;\n orgName?: string;\n /**\n * Builder space(s) the effective credential can reach, with real display\n * names derived from the Admin API. One entry today (a `bpk-` key is\n * space-scoped); the list shape lets the Sources drill-down show multiple\n * spaces later. Absent/empty when undeducible — fall back to `orgName`.\n */\n spaces?: Array<{ id: string; name: string }>;\n orgKind?: string;\n subscription?: string;\n subscriptionLevel?: string;\n subscriptionName?: string;\n isEnterprise?: boolean;\n isFreeAccount?: boolean;\n /**\n * Set when the OAuth callback ran but failed to persist credentials.\n * Surfaced as a one-shot row by the server so the connect-flow polling\n * can stop with a clear message instead of timing out at 5min.\n */\n connectError?: { message: string; at: number };\n /**\n * Set when the currently effective Builder credential was rejected by\n * Builder's API. Unlike connectError, this describes the old credential pair\n * and should not abort a new reconnect attempt while the popup is open.\n */\n authError?: { message: string; at: number };\n}\n\n/**\n * Fetches Builder connection status from /_agent-native/builder/status.\n * Re-fetches on window focus to detect post-redirect state changes.\n */\nexport function useBuilderStatus() {\n const [status, setStatus] = useState<BuilderStatus | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [stale, setStale] = useState(false);\n const lastGoodStatusRef = useRef<BuilderStatus | null>(null);\n\n const fetchStatus = useCallback(async () => {\n const keepLastGoodStatus = (message: string) => {\n const lastGoodStatus = lastGoodStatusRef.current;\n setStatus(lastGoodStatus);\n setStale(!!lastGoodStatus);\n setError(message);\n };\n\n try {\n const res = await fetch(agentNativePath(\"/_agent-native/builder/status\"));\n if (!res.ok) {\n keepLastGoodStatus(`Builder status unavailable (${res.status})`);\n return;\n }\n const nextStatus = (await res.json()) as BuilderStatus;\n lastGoodStatusRef.current = nextStatus;\n setStatus(nextStatus);\n setStale(false);\n setError(null);\n } catch (err) {\n const message =\n err instanceof Error\n ? `Builder status unavailable: ${err.message}`\n : \"Builder status unavailable\";\n keepLastGoodStatus(message);\n } finally {\n setLoading(false);\n }\n }, []);\n\n useEffect(() => {\n fetchStatus();\n\n function onFocus() {\n fetchStatus();\n }\n function onVisibility() {\n if (document.visibilityState === \"visible\") fetchStatus();\n }\n window.addEventListener(\"focus\", onFocus);\n document.addEventListener(\"visibilitychange\", onVisibility);\n // Engine connect/disconnect actions (e.g. the Builder disconnect button)\n // dispatch this event so dependent cards refresh without a full reload.\n window.addEventListener(\"agent-engine:configured-changed\", fetchStatus);\n return () => {\n window.removeEventListener(\"focus\", onFocus);\n document.removeEventListener(\"visibilitychange\", onVisibility);\n window.removeEventListener(\n \"agent-engine:configured-changed\",\n fetchStatus,\n );\n };\n }, [fetchStatus]);\n\n return { status, loading, error, stale, refetch: fetchStatus };\n}\n\n// ─── useBuilderConnectFlow ──────────────────────────────────────────────────\n//\n// Shared state machine for the \"open Builder CLI-auth popup + poll\n// /builder/status until credentials land\" interaction. Replaces three\n// near-duplicate inline implementations: `BuilderCliAuthMethod` in\n// OnboardingPanel, `ConnectBuilderCard`, and `BuilderConnectCta` in\n// AssistantChat. Each consumer supplies its own popup URL / completion\n// behavior; the hook owns the polling + timeout + focus refresh.\n//\n// `popupUrl` is what we pass to `window.open`. The default\n// `/_agent-native/builder/connect` is a server-side 302 to the real\n// cli-auth URL — using it keeps the click handler synchronous so popup\n// blockers don't downgrade the open to same-tab navigation. Pass an\n// explicit `popupUrl` (e.g. the already-computed cli-auth URL) if your\n// caller already has it in hand.\n\nexport interface BuilderConnectFlowOptions {\n /** Skip server status polling for hosts that own provider routing. */\n enabled?: boolean;\n /** URL to synchronously open on start(). Defaults to the 302 shortcut. */\n popupUrl?: string;\n /** Low-cardinality label for the UI surface that opened Builder connect. */\n trackingSource?: string;\n /** Product flow that needed Builder connect, e.g. connect_llm. */\n trackingFlow?: string;\n /** Invoked after the status poll first sees `configured: true`. */\n onConnected?: (state: { orgName: string | null }) => void | Promise<void>;\n}\n\nexport interface BuilderConnectStartOptions {\n /** Override the hook-level source for this click. */\n trackingSource?: string;\n /** Override the hook-level flow for this click. */\n trackingFlow?: string;\n}\n\nexport interface BuilderConnectFlow {\n configured: boolean;\n /**\n * True when the deploy has BUILDER_PRIVATE_KEY set as a fallback. Connect\n * is still available so users can override the fallback with their own\n * Builder account.\n */\n envManaged: boolean;\n /**\n * True when the server has a Builder branch project configured for this\n * request. When false, the card surfaces a waitlist CTA instead of a Send\n * button.\n */\n builderEnabled: boolean;\n orgName: string | null;\n connecting: boolean;\n error: string | null;\n /**\n * True once the first `/builder/status` fetch has completed (successfully\n * or not). Consumers that accept an `initialConfigured` prop (e.g. agent\n * tool-call results rendered with server-side state) should treat\n * `configured`/`orgName` as authoritative only once this flips true —\n * otherwise the hook's starting `false` defaults would cause a flash\n * back to \"Connect Builder\" on first paint.\n */\n hasFetchedStatus: boolean;\n /** Open the popup and begin polling. Must be called from a user-gesture handler. */\n start: (options?: BuilderConnectStartOptions) => void;\n}\n\nconst POLL_INTERVAL_MS = 2000;\nconst POLL_TIMEOUT_MS = 5 * 60 * 1000;\nconst POPUP_CLOSED_CONFIRMATION_GRACE_MS = 5000;\nconst CALLBACK_SUCCESS_STATUS_RETRY_MS = 500;\nconst CALLBACK_SUCCESS_STATUS_RETRIES = 10;\nconst BUILDER_CONNECT_PARAM = \"_an_connect\";\nconst BUILDER_STATE_PARAM = \"_an_state\";\nconst BUILDER_SIGNUP_SOURCE_PARAM = \"signupSource\";\nconst BUILDER_AGENT_NATIVE_FLOW_PARAM = \"agentNativeFlow\";\nconst BUILDER_AGENT_NATIVE_CONNECT_SOURCE_PARAM = \"agentNativeConnectSource\";\nconst BUILDER_SIGNUP_SOURCE = \"agent-native\";\nconst STATUS_CONNECT_URL_TTL_MS = 9 * 60 * 1000;\n\nfunction cleanTrackingParam(value: string | null | undefined): string | null {\n const trimmed = value?.trim();\n return trimmed ? trimmed.slice(0, 120) : null;\n}\n\nfunction inferBuilderConnectTrackingFlow(source: string | undefined): string {\n const normalized = source?.toLowerCase() ?? \"\";\n if (normalized.includes(\"background_agent\")) return \"background_agent\";\n if (\n normalized.includes(\"code_required\") ||\n normalized.includes(\"code_access\") ||\n normalized.includes(\"connect_builder_card\")\n ) {\n return \"background_agent\";\n }\n if (normalized.includes(\"browser\")) return \"browser_automation\";\n if (normalized.includes(\"voice\") || normalized.includes(\"transcription\")) {\n return \"voice_transcription\";\n }\n if (normalized.includes(\"upload\")) return \"file_upload\";\n if (normalized.includes(\"hosting\")) return \"hosting\";\n if (normalized.includes(\"database\")) return \"database\";\n if (normalized.includes(\"auth_settings\")) return \"auth\";\n return \"connect_llm\";\n}\n\nexport function withBuilderConnectTrackingParams(\n url: string,\n options: { source?: string; flow?: string } = {},\n): string {\n const source = cleanTrackingParam(options.source);\n const flow =\n cleanTrackingParam(options.flow) ??\n inferBuilderConnectTrackingFlow(source ?? undefined);\n const origin =\n typeof window !== \"undefined\" ? window.location.origin : \"http://localhost\";\n\n try {\n const parsed = new URL(url, origin);\n parsed.searchParams.set(BUILDER_SIGNUP_SOURCE_PARAM, BUILDER_SIGNUP_SOURCE);\n parsed.searchParams.set(BUILDER_AGENT_NATIVE_FLOW_PARAM, flow);\n if (source) {\n parsed.searchParams.set(\n BUILDER_AGENT_NATIVE_CONNECT_SOURCE_PARAM,\n source,\n );\n }\n\n const redirectUrl = parsed.searchParams.get(\"redirect_url\");\n if (redirectUrl) {\n const parsedRedirect = new URL(redirectUrl);\n parsedRedirect.searchParams.set(\n BUILDER_SIGNUP_SOURCE_PARAM,\n BUILDER_SIGNUP_SOURCE,\n );\n parsedRedirect.searchParams.set(BUILDER_AGENT_NATIVE_FLOW_PARAM, flow);\n if (source) {\n parsedRedirect.searchParams.set(\n BUILDER_AGENT_NATIVE_CONNECT_SOURCE_PARAM,\n source,\n );\n }\n parsed.searchParams.set(\"redirect_url\", parsedRedirect.toString());\n }\n\n return parsed.toString();\n } catch {\n return url;\n }\n}\n\nfunction isAgentNativeDesktop() {\n if (typeof navigator === \"undefined\") return false;\n return /AgentNativeDesktop/i.test(navigator.userAgent || \"\");\n}\n\nfunction hasSignedConnectToken(url: string | null | undefined): boolean {\n if (!url || typeof window === \"undefined\") return false;\n try {\n return new URL(url, window.location.origin).searchParams.has(\n BUILDER_CONNECT_PARAM,\n );\n } catch {\n return false;\n }\n}\n\nfunction hasSignedCallbackState(url: string | null | undefined): boolean {\n if (!url || typeof window === \"undefined\") return false;\n try {\n const parsed = new URL(url, window.location.origin);\n const redirectUrl = parsed.searchParams.get(\"redirect_url\");\n if (!redirectUrl) return false;\n return new URL(redirectUrl).searchParams.has(BUILDER_STATE_PARAM);\n } catch {\n return false;\n }\n}\n\nfunction isFreshSignedConnectUrl(\n url: string | null,\n fetchedAt: number | null,\n): url is string {\n return (\n (hasSignedConnectToken(url) || hasSignedCallbackState(url)) &&\n typeof fetchedAt === \"number\" &&\n Date.now() - fetchedAt < STATUS_CONNECT_URL_TTL_MS\n );\n}\n\nfunction isCurrentConnectError(\n error: { message: string; at: number } | undefined,\n startedAt: number | null,\n): error is { message: string; at: number } {\n if (!error?.message) return false;\n if (!startedAt) return true;\n return typeof error.at !== \"number\" || error.at >= startedAt - 1000;\n}\n\nfunction showBuilderConnectPopupPlaceholder(opened: Window) {\n // Keep opener attached: the Builder callback uses postMessage to notify the\n // settings tab that the popup completed. We still hold the WindowProxy so the\n // parent can navigate the blank popup after refreshing the signed connect URL.\n try {\n opened.document.title = \"Opening Builder.io\";\n opened.document.body.style.margin = \"0\";\n opened.document.body.style.background = \"#111\";\n opened.document.body.style.color = \"#ddd\";\n opened.document.body.style.fontFamily =\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif';\n opened.document.body.style.display = \"flex\";\n opened.document.body.style.alignItems = \"center\";\n opened.document.body.style.justifyContent = \"center\";\n opened.document.body.style.height = \"100vh\";\n opened.document.body.textContent = \"Opening Builder.io...\";\n } catch {\n // Popup may already be cross-origin or browser may block document writes.\n }\n}\n\nfunction navigateBuilderConnectPopup(opened: Window, url: string): boolean {\n try {\n opened.location.href = url;\n return true;\n } catch {\n try {\n opened.close();\n } catch {\n // Ignore close failures.\n }\n return false;\n }\n}\n\nfunction isEmbeddedWindow(): boolean {\n if (typeof window === \"undefined\") return false;\n try {\n return window.self !== window.top;\n } catch {\n return true;\n }\n}\n\nasync function openBuilderConnectViaMcpHost(url: string): Promise<boolean> {\n const request = openMcpAppHostLink(url);\n if (!request) return false;\n try {\n return await request;\n } catch {\n return false;\n }\n}\n\nfunction notifyAgentEngineConfiguredChanged(source: string) {\n if (typeof window === \"undefined\") return;\n window.dispatchEvent(\n new CustomEvent(\"agent-engine:configured-changed\", {\n detail: { source },\n }),\n );\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction isPopupClosed(opened: Window | null): boolean {\n if (!opened) return false;\n try {\n return opened.closed === true;\n } catch {\n return false;\n }\n}\n\nfunction isTrustedBuilderConnectMessageOrigin(origin: string): boolean {\n if (typeof window !== \"undefined\" && origin === window.location.origin) {\n return true;\n }\n try {\n const hostname = new URL(origin).hostname.toLowerCase();\n return (\n hostname === \"localhost\" ||\n hostname === \"127.0.0.1\" ||\n hostname === \"::1\" ||\n hostname === \"builder.io\" ||\n hostname.endsWith(\".builder.io\") ||\n hostname === \"builder.my\" ||\n hostname.endsWith(\".builder.my\") ||\n hostname === \"builderio.xyz\" ||\n hostname.endsWith(\".builderio.xyz\") ||\n hostname === \"builderio.dev\" ||\n hostname.endsWith(\".builderio.dev\") ||\n hostname === \"builder.codes\" ||\n hostname.endsWith(\".builder.codes\") ||\n hostname === \"agent-native.com\" ||\n hostname.endsWith(\".agent-native.com\")\n );\n } catch {\n return false;\n }\n}\n\nexport interface OpenBuilderConnectPopupOptions {\n url?: string;\n source?: string;\n flow?: string;\n features?: string;\n}\n\nexport function openBuilderConnectPopup({\n url,\n source = \"builder_connect\",\n flow,\n features = \"noopener,noreferrer\",\n}: OpenBuilderConnectPopupOptions = {}): Window | null {\n if (typeof window === \"undefined\") return null;\n const origin = getCallbackOrigin() || window.location.origin;\n const href =\n url ??\n new URL(agentNativePath(\"/_agent-native/builder/connect\"), origin).href;\n const trackedHref =\n href === \"about:blank\"\n ? href\n : withBuilderConnectTrackingParams(href, { source, flow });\n const connectUrlKind = url ? \"provided\" : \"default\";\n const trackingFlow =\n cleanTrackingParam(flow) ?? inferBuilderConnectTrackingFlow(source);\n trackEvent(\"builder connect clicked\", {\n feature: \"builder\",\n stage: \"client\",\n source,\n flow: trackingFlow,\n connect_url_kind: connectUrlKind,\n });\n try {\n const opened = window.open(trackedHref, \"_blank\", features);\n if (!opened && !/AgentNativeDesktop/i.test(navigator.userAgent || \"\")) {\n trackEvent(\"builder connect popup blocked\", {\n feature: \"builder\",\n stage: \"client\",\n source,\n flow: trackingFlow,\n connect_url_kind: connectUrlKind,\n });\n }\n return opened;\n } catch {\n trackEvent(\"builder connect failed\", {\n feature: \"builder\",\n stage: \"client\",\n reason: \"popup_open_exception\",\n source,\n flow: trackingFlow,\n connect_url_kind: connectUrlKind,\n });\n return null;\n }\n}\n\nexport function useBuilderConnectFlow(\n opts: BuilderConnectFlowOptions = {},\n): BuilderConnectFlow {\n const {\n enabled = true,\n popupUrl,\n trackingSource = \"builder_connect_flow\",\n trackingFlow,\n onConnected,\n } = opts;\n const [configured, setConfigured] = useState(false);\n const [envManaged, setEnvManaged] = useState(false);\n const [builderEnabled, setBuilderEnabled] = useState(false);\n const [orgName, setOrgName] = useState<string | null>(null);\n const [connecting, setConnecting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [hasFetchedStatus, setHasFetchedStatus] = useState(false);\n const [statusConnectUrl, setStatusConnectUrl] = useState<string | null>(null);\n // When statusConnectUrl was last fetched. The server signs the embedded\n // _an_connect token with a 10-minute TTL; using an older URL fails the\n // cross-origin popup gate. Track freshness so start() can either use a\n // still-good direct URL (desktop) or refresh a new one inside the popup\n // gesture path (browser/editor embeds).\n const statusConnectUrlAtRef = useRef<number | null>(null);\n const pollRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const connectStartedAtRef = useRef<number | null>(null);\n const mountedRef = useRef(true);\n const notifiedConnectedRef = useRef(false);\n // Keep onConnected in a ref so start() doesn't need to re-create when the\n // caller passes an inline arrow function.\n const onConnectedRef = useRef(onConnected);\n onConnectedRef.current = onConnected;\n\n const stopPoll = useCallback(() => {\n if (pollRef.current) {\n clearInterval(pollRef.current);\n pollRef.current = null;\n }\n }, []);\n\n const fetchStatus = useCallback(async () => {\n if (!enabled) return null;\n const origin = getCallbackOrigin() || window.location.origin;\n try {\n const r = await fetch(\n new URL(agentNativePath(\"/_agent-native/builder/status\"), origin).href,\n );\n if (!r.ok) return null;\n return (await r.json()) as {\n configured: boolean;\n envManaged?: boolean;\n builderEnabled?: boolean;\n orgName?: string | null;\n connectUrl?: string;\n cliAuthUrl?: string;\n credentialSource?: \"user\" | \"org\" | \"workspace\" | \"env\";\n connectError?: { message: string; at: number };\n authError?: { message: string; at: number };\n };\n } catch {\n return null;\n }\n }, [enabled]);\n\n // Initial fetch + focus/visibility refresh so if the user completed the\n // flow in another tab (or a downgraded same-tab nav) we notice it. Also\n // listen for `agent-engine:configured-changed` so a Disconnect click in\n // Settings propagates to any connect-CTA cards rendered elsewhere in\n // the app without waiting for the next focus event.\n useEffect(() => {\n if (!enabled) {\n setConfigured(false);\n setEnvManaged(false);\n setBuilderEnabled(false);\n setOrgName(null);\n setConnecting(false);\n setError(null);\n setHasFetchedStatus(false);\n setStatusConnectUrl(null);\n statusConnectUrlAtRef.current = null;\n stopPoll();\n return;\n }\n mountedRef.current = true;\n let cancelled = false;\n const refresh = async () => {\n const s = await fetchStatus();\n if (cancelled || !mountedRef.current) return;\n // Flip `hasFetchedStatus` even when the fetch failed — the caller's\n // \"use initial props until the hook has an answer\" pattern wants to\n // stop waiting after we've tried, regardless of network outcome.\n setHasFetchedStatus(true);\n if (!s) return;\n setConfigured(!!s.configured);\n setEnvManaged(!!s.envManaged);\n setBuilderEnabled(!!s.builderEnabled);\n const nextConnectUrl = s.cliAuthUrl ?? s.connectUrl ?? null;\n setStatusConnectUrl(nextConnectUrl);\n statusConnectUrlAtRef.current = nextConnectUrl ? Date.now() : null;\n const org = s.orgName ?? null;\n setOrgName(org);\n if (s.configured) {\n connectStartedAtRef.current = null;\n }\n if (s.configured && !notifiedConnectedRef.current) {\n notifiedConnectedRef.current = true;\n notifyAgentEngineConfiguredChanged(\"builder-status\");\n try {\n await onConnectedRef.current?.({ orgName: org });\n } catch {\n // The caller's callback is a UI convenience; status is already set.\n }\n } else if (!s.configured) {\n notifiedConnectedRef.current = false;\n }\n // Surface persisted auth-failure messages on idle refreshes, but don't\n // let an old rejected credential abort a new reconnect popup while the\n // user is still choosing a Builder space.\n const activeConnectStartedAt = connectStartedAtRef.current;\n if (isCurrentConnectError(s.connectError, activeConnectStartedAt)) {\n setError(s.connectError.message);\n } else if (!activeConnectStartedAt && s.authError?.message) {\n setError(s.authError.message);\n } else if (s.configured) {\n setError(null);\n }\n };\n refresh();\n const onVisible = () => {\n if (document.visibilityState === \"visible\") refresh();\n };\n window.addEventListener(\"focus\", refresh);\n document.addEventListener(\"visibilitychange\", onVisible);\n window.addEventListener(\"agent-engine:configured-changed\", refresh);\n return () => {\n cancelled = true;\n mountedRef.current = false;\n window.removeEventListener(\"focus\", refresh);\n document.removeEventListener(\"visibilitychange\", onVisible);\n window.removeEventListener(\"agent-engine:configured-changed\", refresh);\n stopPoll();\n };\n }, [enabled, fetchStatus, stopPoll]);\n\n const start = useCallback(\n (startOptions?: BuilderConnectStartOptions) => {\n if (!enabled) return;\n stopPoll();\n const started = Date.now();\n const clickTrackingSource =\n startOptions?.trackingSource ?? trackingSource;\n const clickTrackingFlow = startOptions?.trackingFlow ?? trackingFlow;\n let openedPopup: Window | null = null;\n let popupClosedAt: number | null = null;\n connectStartedAtRef.current = started;\n setConnecting(true);\n setError(null);\n\n // Open SYNCHRONOUSLY inside the caller's click handler — any await\n // before window.open lets the user-gesture token expire, which causes\n // popup blockers to block entirely or fall back to same-tab navigation.\n const origin = getCallbackOrigin() || window.location.origin;\n const cachedFreshUrl = isFreshSignedConnectUrl(\n statusConnectUrl,\n statusConnectUrlAtRef.current,\n )\n ? statusConnectUrl\n : null;\n // popupUrl props and statusConnectUrl are signed URLs minted before the\n // click. In web browsers, always refresh inside an about:blank popup so a\n // server/package restart cannot leave the user with a stale signed state.\n // Desktop keeps the direct path because the Electron shell owns the popup.\n const signedPropUrl = hasSignedConnectToken(popupUrl) ? popupUrl : null;\n const signedCliPropUrl = hasSignedCallbackState(popupUrl)\n ? popupUrl\n : null;\n const fallbackUrl = new URL(\n agentNativePath(\"/_agent-native/builder/connect\"),\n origin,\n ).href;\n const directUrl =\n cachedFreshUrl ?? signedCliPropUrl ?? signedPropUrl ?? fallbackUrl;\n\n if (isAgentNativeDesktop()) {\n const opened = openBuilderConnectPopup({\n url: directUrl,\n source: clickTrackingSource,\n flow: clickTrackingFlow,\n });\n openedPopup = opened;\n if (!opened) {\n // Agent Native Desktop handles the popup in Electron and reports\n // null to the embedded webview, so null is not a blocker here.\n }\n } else {\n const opened = openBuilderConnectPopup({\n url: \"about:blank\",\n source: clickTrackingSource,\n flow: clickTrackingFlow,\n features: \"width=600,height=700\",\n });\n if (!opened) {\n if (!isEmbeddedWindow()) {\n connectStartedAtRef.current = null;\n setConnecting(false);\n setError(\"Couldn't open Builder. Allow popups and try again.\");\n return;\n }\n\n void (async () => {\n const s = await fetchStatus();\n if (!mountedRef.current) return;\n if (s) {\n setHasFetchedStatus(true);\n setConfigured(!!s.configured);\n setEnvManaged(!!s.envManaged);\n setBuilderEnabled(!!s.builderEnabled);\n const nextConnectUrl = s.cliAuthUrl ?? s.connectUrl ?? null;\n setStatusConnectUrl(nextConnectUrl);\n statusConnectUrlAtRef.current = nextConnectUrl\n ? Date.now()\n : null;\n setOrgName(s.orgName ?? null);\n }\n\n const hostUrl =\n s?.cliAuthUrl ?? s?.connectUrl ?? cachedFreshUrl ?? directUrl;\n const trackedHostUrl = withBuilderConnectTrackingParams(hostUrl, {\n source: clickTrackingSource,\n flow: clickTrackingFlow,\n });\n const openedByHost =\n await openBuilderConnectViaMcpHost(trackedHostUrl);\n if (!mountedRef.current || openedByHost) return;\n stopPoll();\n connectStartedAtRef.current = null;\n setConnecting(false);\n setError(\n \"Couldn't open Builder from this chat host. Open this app in a browser tab and try Connect Builder again.\",\n );\n })();\n } else {\n openedPopup = opened;\n showBuilderConnectPopupPlaceholder(opened);\n void (async () => {\n const s = await fetchStatus();\n if (!mountedRef.current) {\n try {\n opened.close();\n } catch {\n // Ignore close failures.\n }\n return;\n }\n if (s) {\n setHasFetchedStatus(true);\n setConfigured(!!s.configured);\n setEnvManaged(!!s.envManaged);\n setBuilderEnabled(!!s.builderEnabled);\n const nextConnectUrl = s.cliAuthUrl ?? s.connectUrl ?? null;\n setStatusConnectUrl(nextConnectUrl);\n statusConnectUrlAtRef.current = nextConnectUrl\n ? Date.now()\n : null;\n setOrgName(s.orgName ?? null);\n }\n\n // Prefer the click-time status response, but keep the signed URL\n // already rendered into the CTA as a fallback. This avoids closing\n // the popup when the refresh hits a transient 401/HTML/error\n // response before the status cache has warmed.\n const freshUrl =\n s?.cliAuthUrl ??\n s?.connectUrl ??\n cachedFreshUrl ??\n signedCliPropUrl ??\n signedPropUrl ??\n fallbackUrl;\n if (!freshUrl) {\n try {\n opened.close();\n } catch {\n // Ignore close failures.\n }\n stopPoll();\n connectStartedAtRef.current = null;\n setConnecting(false);\n setError(\n \"Couldn't start Builder connect. Refresh this page and try again.\",\n );\n return;\n }\n const trackedFreshUrl = withBuilderConnectTrackingParams(freshUrl, {\n source: clickTrackingSource,\n flow: clickTrackingFlow,\n });\n if (!navigateBuilderConnectPopup(opened, trackedFreshUrl)) {\n stopPoll();\n connectStartedAtRef.current = null;\n setConnecting(false);\n setError(\n \"Couldn't navigate the Builder popup. Allow popups and try again.\",\n );\n }\n })();\n }\n }\n\n pollRef.current = setInterval(async () => {\n const s = await fetchStatus();\n if (!mountedRef.current) {\n stopPoll();\n return;\n }\n if (s?.configured) {\n stopPoll();\n setConfigured(true);\n setEnvManaged(!!s.envManaged);\n setBuilderEnabled(!!s.builderEnabled);\n const nextConnectUrl = s.cliAuthUrl ?? s.connectUrl ?? null;\n setStatusConnectUrl(nextConnectUrl);\n statusConnectUrlAtRef.current = nextConnectUrl ? Date.now() : null;\n const org = s.orgName ?? null;\n setOrgName(org);\n setConnecting(false);\n connectStartedAtRef.current = null;\n notifiedConnectedRef.current = true;\n notifyAgentEngineConfiguredChanged(\"builder-connect\");\n try {\n await onConnectedRef.current?.({ orgName: org });\n } catch {\n // Consumer's callback failed; we've already flipped the UI state\n // to connected. Swallow so we don't re-arm the flow.\n }\n } else if (isCurrentConnectError(s?.connectError, started)) {\n // OAuth callback ran but writeBuilderCredentials threw — surface the\n // real error instead of letting the user wait 5 minutes for timeout.\n stopPoll();\n connectStartedAtRef.current = null;\n setConnecting(false);\n setError(\n `Couldn't save Builder credentials: ${s.connectError.message}. Try again or contact support.`,\n );\n } else if (isPopupClosed(openedPopup)) {\n popupClosedAt ??= Date.now();\n if (Date.now() - popupClosedAt > POPUP_CLOSED_CONFIRMATION_GRACE_MS) {\n stopPoll();\n connectStartedAtRef.current = null;\n setConnecting(false);\n trackEvent(\"builder connect failed\", {\n feature: \"builder\",\n stage: \"client\",\n reason: \"popup_closed_without_status\",\n source: clickTrackingSource,\n flow:\n cleanTrackingParam(clickTrackingFlow) ??\n inferBuilderConnectTrackingFlow(clickTrackingSource),\n });\n setError(\n \"Builder finished, but this workspace couldn't confirm the saved credentials. Refresh this page or try Connect Builder.io again.\",\n );\n }\n } else if (Date.now() - started > POLL_TIMEOUT_MS) {\n stopPoll();\n connectStartedAtRef.current = null;\n setConnecting(false);\n trackEvent(\"builder connect failed\", {\n feature: \"builder\",\n stage: \"client\",\n reason: \"timeout\",\n source: clickTrackingSource,\n flow:\n cleanTrackingParam(clickTrackingFlow) ??\n inferBuilderConnectTrackingFlow(clickTrackingSource),\n });\n setError(\n \"Didn't hear back from Builder in 5 minutes. Allow popups and try again.\",\n );\n }\n }, POLL_INTERVAL_MS);\n },\n [\n enabled,\n fetchStatus,\n popupUrl,\n statusConnectUrl,\n stopPoll,\n trackingFlow,\n trackingSource,\n ],\n );\n\n // Popup-side fast path: the callback page broadcasts a message so we stop\n // polling immediately rather than waiting for the next 2s tick.\n //\n // We listen on BroadcastChannel (same-origin, works with noopener popups)\n // AND on window.message (legacy path for environments without BC or for\n // popups that still have opener access). Both paths are safe to have open\n // simultaneously \\u2014 the first one to fire wins and the error is deduplicated\n // by the stopPoll() call which is idempotent.\n useEffect(() => {\n let channel: BroadcastChannel | null = null;\n const handleError = (message: string) => {\n stopPoll();\n connectStartedAtRef.current = null;\n setConnecting(false);\n setError(`Couldn't save Builder credentials: ${message}.`);\n };\n const handleSuccess = async () => {\n let s: Awaited<ReturnType<typeof fetchStatus>> = null;\n for (let i = 0; i < CALLBACK_SUCCESS_STATUS_RETRIES; i += 1) {\n s = await fetchStatus();\n if (!mountedRef.current) return;\n if (\n s?.configured ||\n isCurrentConnectError(s?.connectError, connectStartedAtRef.current)\n ) {\n break;\n }\n if (i < CALLBACK_SUCCESS_STATUS_RETRIES - 1) {\n await delay(CALLBACK_SUCCESS_STATUS_RETRY_MS);\n }\n }\n if (!mountedRef.current) return;\n if (!s?.configured) {\n const connectError = isCurrentConnectError(\n s?.connectError,\n connectStartedAtRef.current,\n )\n ? s?.connectError\n : null;\n stopPoll();\n setHasFetchedStatus(true);\n if (s) {\n setConfigured(false);\n setEnvManaged(!!s.envManaged);\n setBuilderEnabled(!!s.builderEnabled);\n const nextConnectUrl = s.cliAuthUrl ?? s.connectUrl ?? null;\n setStatusConnectUrl(nextConnectUrl);\n statusConnectUrlAtRef.current = nextConnectUrl ? Date.now() : null;\n setOrgName(s.orgName ?? null);\n }\n connectStartedAtRef.current = null;\n setConnecting(false);\n setError(\n connectError\n ? `Couldn't save Builder credentials: ${connectError.message}. Try again or contact support.`\n : \"Builder finished, but this workspace couldn't confirm the saved credentials. Refresh this page or try Connect Builder.io again.\",\n );\n return;\n }\n stopPoll();\n setHasFetchedStatus(true);\n setConfigured(true);\n setEnvManaged(!!s.envManaged);\n setBuilderEnabled(!!s.builderEnabled);\n const nextConnectUrl = s.cliAuthUrl ?? s.connectUrl ?? null;\n setStatusConnectUrl(nextConnectUrl);\n statusConnectUrlAtRef.current = nextConnectUrl ? Date.now() : null;\n const org = s.orgName ?? null;\n setOrgName(org);\n setConnecting(false);\n connectStartedAtRef.current = null;\n notifiedConnectedRef.current = true;\n notifyAgentEngineConfiguredChanged(\"builder-connect-message\");\n try {\n await onConnectedRef.current?.({ orgName: org });\n } catch {\n // The caller's callback is a UI convenience; status is already set.\n }\n };\n\n try {\n channel = new BroadcastChannel(`builder-connect:${window.location.host}`);\n channel.onmessage = (e: MessageEvent) => {\n const data = e.data as { type?: string; message?: string } | undefined;\n if (data?.type === \"builder-connect-success\") {\n void handleSuccess();\n return;\n }\n if (data?.type === \"builder-connect-error\") {\n if (typeof data.message !== \"string\" || !data.message) return;\n handleError(data.message);\n }\n };\n } catch {\n // BroadcastChannel not available (rare) \\u2014 fall through to postMessage.\n }\n\n const handler = (e: MessageEvent) => {\n if (!isTrustedBuilderConnectMessageOrigin(e.origin)) return;\n const data = e.data as { type?: string; message?: string } | undefined;\n if (data?.type === \"builder-connect-success\") {\n void handleSuccess();\n return;\n }\n if (data?.type === \"builder-connect-error\") {\n if (typeof data.message !== \"string\" || !data.message) return;\n handleError(data.message);\n }\n };\n window.addEventListener(\"message\", handler);\n\n return () => {\n channel?.close();\n window.removeEventListener(\"message\", handler);\n };\n }, [fetchStatus, stopPoll]);\n\n return {\n configured,\n envManaged,\n builderEnabled,\n orgName,\n connecting,\n error,\n hasFetchedStatus,\n start,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"useBuilderStatus.js","sourceRoot":"","sources":["../../../src/client/settings/useBuilderStatus.ts"],"names":[],"mappings":"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","sourcesContent":["import { agentNativePath } from \"../api-path.js\";\nimport { useState, useEffect, useCallback, useRef } from \"react\";\nimport { getCallbackOrigin } from \"../frame.js\";\nimport { trackEvent } from \"../analytics.js\";\nimport { openMcpAppHostLink } from \"../mcp-app-host.js\";\n\nexport interface BuilderStatus {\n configured: boolean;\n builderEnabled: boolean;\n /**\n * True when `BUILDER_PRIVATE_KEY` is set at the deploy level. This is a\n * fallback credential; per-user/org Builder connections are still allowed\n * and take precedence for that request.\n */\n envManaged?: boolean;\n credentialSource?: \"user\" | \"org\" | \"workspace\" | \"env\";\n connectUrl: string;\n cliAuthUrl?: string;\n appHost: string;\n apiHost: string;\n branchProjectIdConfigured?: boolean;\n branchProjectId?: string;\n publicKeyConfigured: boolean;\n privateKeyConfigured: boolean;\n userId?: string;\n orgName?: string;\n /**\n * Builder space(s) the effective credential can reach, with real display\n * names derived from the Admin API. One entry today (a `bpk-` key is\n * space-scoped); the list shape lets the Sources drill-down show multiple\n * spaces later. Absent/empty when undeducible — fall back to `orgName`.\n */\n spaces?: Array<{ id: string; name: string }>;\n orgKind?: string;\n subscription?: string;\n subscriptionLevel?: string;\n subscriptionName?: string;\n isEnterprise?: boolean;\n isFreeAccount?: boolean;\n /**\n * Set when the OAuth callback ran but failed to persist credentials.\n * Surfaced as a one-shot row by the server so the connect-flow polling\n * can stop with a clear message instead of timing out at 5min.\n */\n connectError?: { message: string; at: number };\n /**\n * Set when the currently effective Builder credential was rejected by\n * Builder's API. Unlike connectError, this describes the old credential pair\n * and should not abort a new reconnect attempt while the popup is open.\n */\n authError?: { message: string; at: number };\n}\n\n/**\n * Fetches Builder connection status from /_agent-native/builder/status.\n * Re-fetches on window focus to detect post-redirect state changes.\n */\nexport function useBuilderStatus() {\n const [status, setStatus] = useState<BuilderStatus | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [stale, setStale] = useState(false);\n const lastGoodStatusRef = useRef<BuilderStatus | null>(null);\n\n const fetchStatus = useCallback(async () => {\n const keepLastGoodStatus = (message: string) => {\n const lastGoodStatus = lastGoodStatusRef.current;\n setStatus(lastGoodStatus);\n setStale(!!lastGoodStatus);\n setError(message);\n };\n\n try {\n const res = await fetch(agentNativePath(\"/_agent-native/builder/status\"));\n if (!res.ok) {\n keepLastGoodStatus(`Builder status unavailable (${res.status})`);\n return;\n }\n const nextStatus = (await res.json()) as BuilderStatus;\n lastGoodStatusRef.current = nextStatus;\n setStatus(nextStatus);\n setStale(false);\n setError(null);\n } catch (err) {\n const message =\n err instanceof Error\n ? `Builder status unavailable: ${err.message}`\n : \"Builder status unavailable\";\n keepLastGoodStatus(message);\n } finally {\n setLoading(false);\n }\n }, []);\n\n useEffect(() => {\n fetchStatus();\n\n function onFocus() {\n fetchStatus();\n }\n function onVisibility() {\n if (document.visibilityState === \"visible\") fetchStatus();\n }\n window.addEventListener(\"focus\", onFocus);\n document.addEventListener(\"visibilitychange\", onVisibility);\n // Engine connect/disconnect actions (e.g. the Builder disconnect button)\n // dispatch this event so dependent cards refresh without a full reload.\n window.addEventListener(\"agent-engine:configured-changed\", fetchStatus);\n return () => {\n window.removeEventListener(\"focus\", onFocus);\n document.removeEventListener(\"visibilitychange\", onVisibility);\n window.removeEventListener(\n \"agent-engine:configured-changed\",\n fetchStatus,\n );\n };\n }, [fetchStatus]);\n\n return { status, loading, error, stale, refetch: fetchStatus };\n}\n\n// ─── useBuilderConnectFlow ──────────────────────────────────────────────────\n//\n// Shared state machine for the \"open Builder CLI-auth popup + poll\n// /builder/status until credentials land\" interaction. Replaces three\n// near-duplicate inline implementations: `BuilderCliAuthMethod` in\n// OnboardingPanel, `ConnectBuilderCard`, and `BuilderConnectCta` in\n// AssistantChat. Each consumer supplies its own popup URL / completion\n// behavior; the hook owns the polling + timeout + focus refresh.\n//\n// `popupUrl` is what we pass to `window.open`. The default\n// `/_agent-native/builder/connect` is a server-side 302 to the real\n// cli-auth URL — using it keeps the click handler synchronous so popup\n// blockers don't downgrade the open to same-tab navigation. Pass an\n// explicit `popupUrl` (e.g. the already-computed cli-auth URL) if your\n// caller already has it in hand.\n\nexport interface BuilderConnectFlowOptions {\n /** Skip server status polling for hosts that own provider routing. */\n enabled?: boolean;\n /** URL to synchronously open on start(). Defaults to the 302 shortcut. */\n popupUrl?: string;\n /** Low-cardinality label for the UI surface that opened Builder connect. */\n trackingSource?: string;\n /** Product flow that needed Builder connect, e.g. connect_llm. */\n trackingFlow?: string;\n /** Invoked after the status poll first sees `configured: true`. */\n onConnected?: (state: { orgName: string | null }) => void | Promise<void>;\n}\n\nexport interface BuilderConnectStartOptions {\n /** Override the hook-level source for this click. */\n trackingSource?: string;\n /** Override the hook-level flow for this click. */\n trackingFlow?: string;\n}\n\nexport interface BuilderConnectFlow {\n configured: boolean;\n /**\n * True when the deploy has BUILDER_PRIVATE_KEY set as a fallback. Connect\n * is still available so users can override the fallback with their own\n * Builder account.\n */\n envManaged: boolean;\n /**\n * True when the server has a Builder branch project configured for this\n * request. When false, the card surfaces a waitlist CTA instead of a Send\n * button.\n */\n builderEnabled: boolean;\n orgName: string | null;\n connecting: boolean;\n error: string | null;\n /**\n * True once the first `/builder/status` fetch has completed (successfully\n * or not). Consumers that accept an `initialConfigured` prop (e.g. agent\n * tool-call results rendered with server-side state) should treat\n * `configured`/`orgName` as authoritative only once this flips true —\n * otherwise the hook's starting `false` defaults would cause a flash\n * back to \"Connect Builder\" on first paint.\n */\n hasFetchedStatus: boolean;\n /** Open the popup and begin polling. Must be called from a user-gesture handler. */\n start: (options?: BuilderConnectStartOptions) => void;\n}\n\nconst POLL_INTERVAL_MS = 2000;\nconst POLL_TIMEOUT_MS = 5 * 60 * 1000;\nconst POPUP_CLOSED_CONFIRMATION_GRACE_MS = 5000;\nconst CALLBACK_SUCCESS_STATUS_RETRY_MS = 500;\nconst CALLBACK_SUCCESS_STATUS_RETRIES = 10;\nconst BUILDER_CONNECT_PARAM = \"_an_connect\";\nconst BUILDER_STATE_PARAM = \"_an_state\";\nconst BUILDER_SIGNUP_SOURCE_PARAM = \"signupSource\";\nconst BUILDER_AGENT_NATIVE_FLOW_PARAM = \"agentNativeFlow\";\nconst BUILDER_AGENT_NATIVE_CONNECT_SOURCE_PARAM = \"agentNativeConnectSource\";\nconst BUILDER_AGENT_NATIVE_APP_PARAM = \"agentNativeApp\";\nconst BUILDER_AGENT_NATIVE_TEMPLATE_PARAM = \"agentNativeTemplate\";\nconst BUILDER_SIGNUP_SOURCE = \"agent-native\";\nconst STATUS_CONNECT_URL_TTL_MS = 9 * 60 * 1000;\n\nfunction cleanTrackingParam(value: string | null | undefined): string | null {\n const trimmed = value?.trim();\n return trimmed ? trimmed.slice(0, 120) : null;\n}\n\nfunction inferBuilderConnectTrackingFlow(source: string | undefined): string {\n const normalized = source?.toLowerCase() ?? \"\";\n if (normalized.includes(\"background_agent\")) return \"background_agent\";\n if (\n normalized.includes(\"code_required\") ||\n normalized.includes(\"code_access\") ||\n normalized.includes(\"connect_builder_card\")\n ) {\n return \"background_agent\";\n }\n if (normalized.includes(\"browser\")) return \"browser_automation\";\n if (normalized.includes(\"voice\") || normalized.includes(\"transcription\")) {\n return \"voice_transcription\";\n }\n if (normalized.includes(\"upload\")) return \"file_upload\";\n if (normalized.includes(\"hosting\")) return \"hosting\";\n if (normalized.includes(\"database\")) return \"database\";\n if (normalized.includes(\"auth_settings\")) return \"auth\";\n return \"connect_llm\";\n}\n\nfunction normalizeTrackingSlug(\n value: string | null | undefined,\n): string | null {\n const trimmed = value?.trim();\n if (!trimmed) return null;\n const unscoped = trimmed.startsWith(\"@\")\n ? (trimmed.split(\"/\").pop() ?? trimmed)\n : trimmed;\n const slug = unscoped\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n return slug || null;\n}\n\nfunction inferBuilderConnectTrackingIdentity(options: {\n app?: string;\n template?: string;\n}): { app: string | null; template: string | null } {\n const env = (import.meta.env as Record<string, string | undefined>) ?? {};\n const app =\n normalizeTrackingSlug(options.app) ??\n normalizeTrackingSlug(env.VITE_AGENT_NATIVE_APP) ??\n (typeof window !== \"undefined\"\n ? normalizeTrackingSlug(window.location.hostname.split(\".\")[0])\n : null);\n const template =\n normalizeTrackingSlug(options.template) ??\n normalizeTrackingSlug(env.VITE_AGENT_NATIVE_TEMPLATE) ??\n normalizeTrackingSlug(env.VITE_APP_TEMPLATE) ??\n (app?.startsWith(\"agent-native-\")\n ? normalizeTrackingSlug(app.slice(\"agent-native-\".length))\n : app && app !== \"localhost\"\n ? app\n : null);\n\n return { app, template };\n}\n\nfunction applyBuilderConnectTrackingParams(\n params: URLSearchParams,\n tracking: {\n source?: string | null;\n flow: string;\n app?: string | null;\n template?: string | null;\n },\n) {\n params.set(BUILDER_SIGNUP_SOURCE_PARAM, BUILDER_SIGNUP_SOURCE);\n params.set(BUILDER_AGENT_NATIVE_FLOW_PARAM, tracking.flow);\n if (tracking.source) {\n params.set(BUILDER_AGENT_NATIVE_CONNECT_SOURCE_PARAM, tracking.source);\n }\n if (tracking.app) {\n params.set(BUILDER_AGENT_NATIVE_APP_PARAM, tracking.app);\n }\n if (tracking.template) {\n params.set(BUILDER_AGENT_NATIVE_TEMPLATE_PARAM, tracking.template);\n }\n}\n\nexport function withBuilderConnectTrackingParams(\n url: string,\n options: {\n source?: string;\n flow?: string;\n app?: string;\n template?: string;\n } = {},\n): string {\n const source = cleanTrackingParam(options.source);\n const flow =\n cleanTrackingParam(options.flow) ??\n inferBuilderConnectTrackingFlow(source ?? undefined);\n const { app, template } = inferBuilderConnectTrackingIdentity(options);\n const origin =\n typeof window !== \"undefined\" ? window.location.origin : \"http://localhost\";\n\n try {\n const parsed = new URL(url, origin);\n applyBuilderConnectTrackingParams(parsed.searchParams, {\n source,\n flow,\n app,\n template,\n });\n\n const redirectUrl = parsed.searchParams.get(\"redirect_url\");\n if (redirectUrl) {\n const parsedRedirect = new URL(redirectUrl);\n applyBuilderConnectTrackingParams(parsedRedirect.searchParams, {\n source,\n flow,\n app,\n template,\n });\n parsed.searchParams.set(\"redirect_url\", parsedRedirect.toString());\n }\n\n return parsed.toString();\n } catch {\n return url;\n }\n}\n\nfunction isAgentNativeDesktop() {\n if (typeof navigator === \"undefined\") return false;\n return /AgentNativeDesktop/i.test(navigator.userAgent || \"\");\n}\n\nfunction hasSignedConnectToken(url: string | null | undefined): boolean {\n if (!url || typeof window === \"undefined\") return false;\n try {\n return new URL(url, window.location.origin).searchParams.has(\n BUILDER_CONNECT_PARAM,\n );\n } catch {\n return false;\n }\n}\n\nfunction hasSignedCallbackState(url: string | null | undefined): boolean {\n if (!url || typeof window === \"undefined\") return false;\n try {\n const parsed = new URL(url, window.location.origin);\n const redirectUrl = parsed.searchParams.get(\"redirect_url\");\n if (!redirectUrl) return false;\n return new URL(redirectUrl).searchParams.has(BUILDER_STATE_PARAM);\n } catch {\n return false;\n }\n}\n\nfunction isFreshSignedConnectUrl(\n url: string | null,\n fetchedAt: number | null,\n): url is string {\n return (\n (hasSignedConnectToken(url) || hasSignedCallbackState(url)) &&\n typeof fetchedAt === \"number\" &&\n Date.now() - fetchedAt < STATUS_CONNECT_URL_TTL_MS\n );\n}\n\nfunction isCurrentConnectError(\n error: { message: string; at: number } | undefined,\n startedAt: number | null,\n): error is { message: string; at: number } {\n if (!error?.message) return false;\n if (!startedAt) return true;\n return typeof error.at !== \"number\" || error.at >= startedAt - 1000;\n}\n\nfunction showBuilderConnectPopupPlaceholder(opened: Window) {\n // Keep opener attached: the Builder callback uses postMessage to notify the\n // settings tab that the popup completed. We still hold the WindowProxy so the\n // parent can navigate the blank popup after refreshing the signed connect URL.\n try {\n opened.document.title = \"Opening Builder.io\";\n opened.document.body.style.margin = \"0\";\n opened.document.body.style.background = \"#111\";\n opened.document.body.style.color = \"#ddd\";\n opened.document.body.style.fontFamily =\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif';\n opened.document.body.style.display = \"flex\";\n opened.document.body.style.alignItems = \"center\";\n opened.document.body.style.justifyContent = \"center\";\n opened.document.body.style.height = \"100vh\";\n opened.document.body.textContent = \"Opening Builder.io...\";\n } catch {\n // Popup may already be cross-origin or browser may block document writes.\n }\n}\n\nfunction navigateBuilderConnectPopup(opened: Window, url: string): boolean {\n try {\n opened.location.href = url;\n return true;\n } catch {\n try {\n opened.close();\n } catch {\n // Ignore close failures.\n }\n return false;\n }\n}\n\nfunction isEmbeddedWindow(): boolean {\n if (typeof window === \"undefined\") return false;\n try {\n return window.self !== window.top;\n } catch {\n return true;\n }\n}\n\nasync function openBuilderConnectViaMcpHost(url: string): Promise<boolean> {\n const request = openMcpAppHostLink(url);\n if (!request) return false;\n try {\n return await request;\n } catch {\n return false;\n }\n}\n\nfunction notifyAgentEngineConfiguredChanged(source: string) {\n if (typeof window === \"undefined\") return;\n window.dispatchEvent(\n new CustomEvent(\"agent-engine:configured-changed\", {\n detail: { source },\n }),\n );\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction isPopupClosed(opened: Window | null): boolean {\n if (!opened) return false;\n try {\n return opened.closed === true;\n } catch {\n return false;\n }\n}\n\nfunction isTrustedBuilderConnectMessageOrigin(origin: string): boolean {\n if (typeof window !== \"undefined\" && origin === window.location.origin) {\n return true;\n }\n try {\n const hostname = new URL(origin).hostname.toLowerCase();\n return (\n hostname === \"localhost\" ||\n hostname === \"127.0.0.1\" ||\n hostname === \"::1\" ||\n hostname === \"builder.io\" ||\n hostname.endsWith(\".builder.io\") ||\n hostname === \"builder.my\" ||\n hostname.endsWith(\".builder.my\") ||\n hostname === \"builderio.xyz\" ||\n hostname.endsWith(\".builderio.xyz\") ||\n hostname === \"builderio.dev\" ||\n hostname.endsWith(\".builderio.dev\") ||\n hostname === \"builder.codes\" ||\n hostname.endsWith(\".builder.codes\") ||\n hostname === \"agent-native.com\" ||\n hostname.endsWith(\".agent-native.com\")\n );\n } catch {\n return false;\n }\n}\n\nexport interface OpenBuilderConnectPopupOptions {\n url?: string;\n source?: string;\n flow?: string;\n features?: string;\n}\n\nexport function openBuilderConnectPopup({\n url,\n source = \"builder_connect\",\n flow,\n features = \"noopener,noreferrer\",\n}: OpenBuilderConnectPopupOptions = {}): Window | null {\n if (typeof window === \"undefined\") return null;\n const origin = getCallbackOrigin() || window.location.origin;\n const href =\n url ??\n new URL(agentNativePath(\"/_agent-native/builder/connect\"), origin).href;\n const trackedHref =\n href === \"about:blank\"\n ? href\n : withBuilderConnectTrackingParams(href, { source, flow });\n const connectUrlKind = url ? \"provided\" : \"default\";\n const trackingFlow =\n cleanTrackingParam(flow) ?? inferBuilderConnectTrackingFlow(source);\n trackEvent(\"builder connect clicked\", {\n feature: \"builder\",\n stage: \"client\",\n source,\n flow: trackingFlow,\n connect_url_kind: connectUrlKind,\n });\n try {\n const opened = window.open(trackedHref, \"_blank\", features);\n if (!opened && !/AgentNativeDesktop/i.test(navigator.userAgent || \"\")) {\n trackEvent(\"builder connect popup blocked\", {\n feature: \"builder\",\n stage: \"client\",\n source,\n flow: trackingFlow,\n connect_url_kind: connectUrlKind,\n });\n }\n return opened;\n } catch {\n trackEvent(\"builder connect failed\", {\n feature: \"builder\",\n stage: \"client\",\n reason: \"popup_open_exception\",\n source,\n flow: trackingFlow,\n connect_url_kind: connectUrlKind,\n });\n return null;\n }\n}\n\nexport function useBuilderConnectFlow(\n opts: BuilderConnectFlowOptions = {},\n): BuilderConnectFlow {\n const {\n enabled = true,\n popupUrl,\n trackingSource = \"builder_connect_flow\",\n trackingFlow,\n onConnected,\n } = opts;\n const [configured, setConfigured] = useState(false);\n const [envManaged, setEnvManaged] = useState(false);\n const [builderEnabled, setBuilderEnabled] = useState(false);\n const [orgName, setOrgName] = useState<string | null>(null);\n const [connecting, setConnecting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [hasFetchedStatus, setHasFetchedStatus] = useState(false);\n const [statusConnectUrl, setStatusConnectUrl] = useState<string | null>(null);\n // When statusConnectUrl was last fetched. The server signs the embedded\n // _an_connect token with a 10-minute TTL; using an older URL fails the\n // cross-origin popup gate. Track freshness so start() can either use a\n // still-good direct URL (desktop) or refresh a new one inside the popup\n // gesture path (browser/editor embeds).\n const statusConnectUrlAtRef = useRef<number | null>(null);\n const pollRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const connectStartedAtRef = useRef<number | null>(null);\n const mountedRef = useRef(true);\n const notifiedConnectedRef = useRef(false);\n // Keep onConnected in a ref so start() doesn't need to re-create when the\n // caller passes an inline arrow function.\n const onConnectedRef = useRef(onConnected);\n onConnectedRef.current = onConnected;\n\n const stopPoll = useCallback(() => {\n if (pollRef.current) {\n clearInterval(pollRef.current);\n pollRef.current = null;\n }\n }, []);\n\n const fetchStatus = useCallback(async () => {\n if (!enabled) return null;\n const origin = getCallbackOrigin() || window.location.origin;\n try {\n const r = await fetch(\n new URL(agentNativePath(\"/_agent-native/builder/status\"), origin).href,\n );\n if (!r.ok) return null;\n return (await r.json()) as {\n configured: boolean;\n envManaged?: boolean;\n builderEnabled?: boolean;\n orgName?: string | null;\n connectUrl?: string;\n cliAuthUrl?: string;\n credentialSource?: \"user\" | \"org\" | \"workspace\" | \"env\";\n connectError?: { message: string; at: number };\n authError?: { message: string; at: number };\n };\n } catch {\n return null;\n }\n }, [enabled]);\n\n // Initial fetch + focus/visibility refresh so if the user completed the\n // flow in another tab (or a downgraded same-tab nav) we notice it. Also\n // listen for `agent-engine:configured-changed` so a Disconnect click in\n // Settings propagates to any connect-CTA cards rendered elsewhere in\n // the app without waiting for the next focus event.\n useEffect(() => {\n if (!enabled) {\n setConfigured(false);\n setEnvManaged(false);\n setBuilderEnabled(false);\n setOrgName(null);\n setConnecting(false);\n setError(null);\n setHasFetchedStatus(false);\n setStatusConnectUrl(null);\n statusConnectUrlAtRef.current = null;\n stopPoll();\n return;\n }\n mountedRef.current = true;\n let cancelled = false;\n const refresh = async () => {\n const s = await fetchStatus();\n if (cancelled || !mountedRef.current) return;\n // Flip `hasFetchedStatus` even when the fetch failed — the caller's\n // \"use initial props until the hook has an answer\" pattern wants to\n // stop waiting after we've tried, regardless of network outcome.\n setHasFetchedStatus(true);\n if (!s) return;\n setConfigured(!!s.configured);\n setEnvManaged(!!s.envManaged);\n setBuilderEnabled(!!s.builderEnabled);\n const nextConnectUrl = s.cliAuthUrl ?? s.connectUrl ?? null;\n setStatusConnectUrl(nextConnectUrl);\n statusConnectUrlAtRef.current = nextConnectUrl ? Date.now() : null;\n const org = s.orgName ?? null;\n setOrgName(org);\n if (s.configured) {\n connectStartedAtRef.current = null;\n }\n if (s.configured && !notifiedConnectedRef.current) {\n notifiedConnectedRef.current = true;\n notifyAgentEngineConfiguredChanged(\"builder-status\");\n try {\n await onConnectedRef.current?.({ orgName: org });\n } catch {\n // The caller's callback is a UI convenience; status is already set.\n }\n } else if (!s.configured) {\n notifiedConnectedRef.current = false;\n }\n // Surface persisted auth-failure messages on idle refreshes, but don't\n // let an old rejected credential abort a new reconnect popup while the\n // user is still choosing a Builder space.\n const activeConnectStartedAt = connectStartedAtRef.current;\n if (isCurrentConnectError(s.connectError, activeConnectStartedAt)) {\n setError(s.connectError.message);\n } else if (!activeConnectStartedAt && s.authError?.message) {\n setError(s.authError.message);\n } else if (s.configured) {\n setError(null);\n }\n };\n refresh();\n const onVisible = () => {\n if (document.visibilityState === \"visible\") refresh();\n };\n window.addEventListener(\"focus\", refresh);\n document.addEventListener(\"visibilitychange\", onVisible);\n window.addEventListener(\"agent-engine:configured-changed\", refresh);\n return () => {\n cancelled = true;\n mountedRef.current = false;\n window.removeEventListener(\"focus\", refresh);\n document.removeEventListener(\"visibilitychange\", onVisible);\n window.removeEventListener(\"agent-engine:configured-changed\", refresh);\n stopPoll();\n };\n }, [enabled, fetchStatus, stopPoll]);\n\n const start = useCallback(\n (startOptions?: BuilderConnectStartOptions) => {\n if (!enabled) return;\n stopPoll();\n const started = Date.now();\n const clickTrackingSource =\n startOptions?.trackingSource ?? trackingSource;\n const clickTrackingFlow = startOptions?.trackingFlow ?? trackingFlow;\n let openedPopup: Window | null = null;\n let popupClosedAt: number | null = null;\n connectStartedAtRef.current = started;\n setConnecting(true);\n setError(null);\n\n // Open SYNCHRONOUSLY inside the caller's click handler — any await\n // before window.open lets the user-gesture token expire, which causes\n // popup blockers to block entirely or fall back to same-tab navigation.\n const origin = getCallbackOrigin() || window.location.origin;\n const cachedFreshUrl = isFreshSignedConnectUrl(\n statusConnectUrl,\n statusConnectUrlAtRef.current,\n )\n ? statusConnectUrl\n : null;\n // popupUrl props and statusConnectUrl are signed URLs minted before the\n // click. In web browsers, always refresh inside an about:blank popup so a\n // server/package restart cannot leave the user with a stale signed state.\n // Desktop keeps the direct path because the Electron shell owns the popup.\n const signedPropUrl = hasSignedConnectToken(popupUrl) ? popupUrl : null;\n const signedCliPropUrl = hasSignedCallbackState(popupUrl)\n ? popupUrl\n : null;\n const fallbackUrl = new URL(\n agentNativePath(\"/_agent-native/builder/connect\"),\n origin,\n ).href;\n const directUrl =\n cachedFreshUrl ?? signedCliPropUrl ?? signedPropUrl ?? fallbackUrl;\n\n if (isAgentNativeDesktop()) {\n const opened = openBuilderConnectPopup({\n url: directUrl,\n source: clickTrackingSource,\n flow: clickTrackingFlow,\n });\n openedPopup = opened;\n if (!opened) {\n // Agent Native Desktop handles the popup in Electron and reports\n // null to the embedded webview, so null is not a blocker here.\n }\n } else {\n const opened = openBuilderConnectPopup({\n url: \"about:blank\",\n source: clickTrackingSource,\n flow: clickTrackingFlow,\n features: \"width=600,height=700\",\n });\n if (!opened) {\n if (!isEmbeddedWindow()) {\n connectStartedAtRef.current = null;\n setConnecting(false);\n setError(\"Couldn't open Builder. Allow popups and try again.\");\n return;\n }\n\n void (async () => {\n const s = await fetchStatus();\n if (!mountedRef.current) return;\n if (s) {\n setHasFetchedStatus(true);\n setConfigured(!!s.configured);\n setEnvManaged(!!s.envManaged);\n setBuilderEnabled(!!s.builderEnabled);\n const nextConnectUrl = s.cliAuthUrl ?? s.connectUrl ?? null;\n setStatusConnectUrl(nextConnectUrl);\n statusConnectUrlAtRef.current = nextConnectUrl\n ? Date.now()\n : null;\n setOrgName(s.orgName ?? null);\n }\n\n const hostUrl =\n s?.cliAuthUrl ?? s?.connectUrl ?? cachedFreshUrl ?? directUrl;\n const trackedHostUrl = withBuilderConnectTrackingParams(hostUrl, {\n source: clickTrackingSource,\n flow: clickTrackingFlow,\n });\n const openedByHost =\n await openBuilderConnectViaMcpHost(trackedHostUrl);\n if (!mountedRef.current || openedByHost) return;\n stopPoll();\n connectStartedAtRef.current = null;\n setConnecting(false);\n setError(\n \"Couldn't open Builder from this chat host. Open this app in a browser tab and try Connect Builder again.\",\n );\n })();\n } else {\n openedPopup = opened;\n showBuilderConnectPopupPlaceholder(opened);\n void (async () => {\n const s = await fetchStatus();\n if (!mountedRef.current) {\n try {\n opened.close();\n } catch {\n // Ignore close failures.\n }\n return;\n }\n if (s) {\n setHasFetchedStatus(true);\n setConfigured(!!s.configured);\n setEnvManaged(!!s.envManaged);\n setBuilderEnabled(!!s.builderEnabled);\n const nextConnectUrl = s.cliAuthUrl ?? s.connectUrl ?? null;\n setStatusConnectUrl(nextConnectUrl);\n statusConnectUrlAtRef.current = nextConnectUrl\n ? Date.now()\n : null;\n setOrgName(s.orgName ?? null);\n }\n\n // Prefer the click-time status response, but keep the signed URL\n // already rendered into the CTA as a fallback. This avoids closing\n // the popup when the refresh hits a transient 401/HTML/error\n // response before the status cache has warmed.\n const freshUrl =\n s?.cliAuthUrl ??\n s?.connectUrl ??\n cachedFreshUrl ??\n signedCliPropUrl ??\n signedPropUrl ??\n fallbackUrl;\n if (!freshUrl) {\n try {\n opened.close();\n } catch {\n // Ignore close failures.\n }\n stopPoll();\n connectStartedAtRef.current = null;\n setConnecting(false);\n setError(\n \"Couldn't start Builder connect. Refresh this page and try again.\",\n );\n return;\n }\n const trackedFreshUrl = withBuilderConnectTrackingParams(freshUrl, {\n source: clickTrackingSource,\n flow: clickTrackingFlow,\n });\n if (!navigateBuilderConnectPopup(opened, trackedFreshUrl)) {\n stopPoll();\n connectStartedAtRef.current = null;\n setConnecting(false);\n setError(\n \"Couldn't navigate the Builder popup. Allow popups and try again.\",\n );\n }\n })();\n }\n }\n\n pollRef.current = setInterval(async () => {\n const s = await fetchStatus();\n if (!mountedRef.current) {\n stopPoll();\n return;\n }\n if (s?.configured) {\n stopPoll();\n setConfigured(true);\n setEnvManaged(!!s.envManaged);\n setBuilderEnabled(!!s.builderEnabled);\n const nextConnectUrl = s.cliAuthUrl ?? s.connectUrl ?? null;\n setStatusConnectUrl(nextConnectUrl);\n statusConnectUrlAtRef.current = nextConnectUrl ? Date.now() : null;\n const org = s.orgName ?? null;\n setOrgName(org);\n setConnecting(false);\n connectStartedAtRef.current = null;\n notifiedConnectedRef.current = true;\n notifyAgentEngineConfiguredChanged(\"builder-connect\");\n try {\n await onConnectedRef.current?.({ orgName: org });\n } catch {\n // Consumer's callback failed; we've already flipped the UI state\n // to connected. Swallow so we don't re-arm the flow.\n }\n } else if (isCurrentConnectError(s?.connectError, started)) {\n // OAuth callback ran but writeBuilderCredentials threw — surface the\n // real error instead of letting the user wait 5 minutes for timeout.\n stopPoll();\n connectStartedAtRef.current = null;\n setConnecting(false);\n setError(\n `Couldn't save Builder credentials: ${s.connectError.message}. Try again or contact support.`,\n );\n } else if (isPopupClosed(openedPopup)) {\n popupClosedAt ??= Date.now();\n if (Date.now() - popupClosedAt > POPUP_CLOSED_CONFIRMATION_GRACE_MS) {\n stopPoll();\n connectStartedAtRef.current = null;\n setConnecting(false);\n trackEvent(\"builder connect failed\", {\n feature: \"builder\",\n stage: \"client\",\n reason: \"popup_closed_without_status\",\n source: clickTrackingSource,\n flow:\n cleanTrackingParam(clickTrackingFlow) ??\n inferBuilderConnectTrackingFlow(clickTrackingSource),\n });\n setError(\n \"Builder finished, but this workspace couldn't confirm the saved credentials. Refresh this page or try Connect Builder.io again.\",\n );\n }\n } else if (Date.now() - started > POLL_TIMEOUT_MS) {\n stopPoll();\n connectStartedAtRef.current = null;\n setConnecting(false);\n trackEvent(\"builder connect failed\", {\n feature: \"builder\",\n stage: \"client\",\n reason: \"timeout\",\n source: clickTrackingSource,\n flow:\n cleanTrackingParam(clickTrackingFlow) ??\n inferBuilderConnectTrackingFlow(clickTrackingSource),\n });\n setError(\n \"Didn't hear back from Builder in 5 minutes. Allow popups and try again.\",\n );\n }\n }, POLL_INTERVAL_MS);\n },\n [\n enabled,\n fetchStatus,\n popupUrl,\n statusConnectUrl,\n stopPoll,\n trackingFlow,\n trackingSource,\n ],\n );\n\n // Popup-side fast path: the callback page broadcasts a message so we stop\n // polling immediately rather than waiting for the next 2s tick.\n //\n // We listen on BroadcastChannel (same-origin, works with noopener popups)\n // AND on window.message (legacy path for environments without BC or for\n // popups that still have opener access). Both paths are safe to have open\n // simultaneously \\u2014 the first one to fire wins and the error is deduplicated\n // by the stopPoll() call which is idempotent.\n useEffect(() => {\n let channel: BroadcastChannel | null = null;\n const handleError = (message: string) => {\n stopPoll();\n connectStartedAtRef.current = null;\n setConnecting(false);\n setError(`Couldn't save Builder credentials: ${message}.`);\n };\n const handleSuccess = async () => {\n let s: Awaited<ReturnType<typeof fetchStatus>> = null;\n for (let i = 0; i < CALLBACK_SUCCESS_STATUS_RETRIES; i += 1) {\n s = await fetchStatus();\n if (!mountedRef.current) return;\n if (\n s?.configured ||\n isCurrentConnectError(s?.connectError, connectStartedAtRef.current)\n ) {\n break;\n }\n if (i < CALLBACK_SUCCESS_STATUS_RETRIES - 1) {\n await delay(CALLBACK_SUCCESS_STATUS_RETRY_MS);\n }\n }\n if (!mountedRef.current) return;\n if (!s?.configured) {\n const connectError = isCurrentConnectError(\n s?.connectError,\n connectStartedAtRef.current,\n )\n ? s?.connectError\n : null;\n stopPoll();\n setHasFetchedStatus(true);\n if (s) {\n setConfigured(false);\n setEnvManaged(!!s.envManaged);\n setBuilderEnabled(!!s.builderEnabled);\n const nextConnectUrl = s.cliAuthUrl ?? s.connectUrl ?? null;\n setStatusConnectUrl(nextConnectUrl);\n statusConnectUrlAtRef.current = nextConnectUrl ? Date.now() : null;\n setOrgName(s.orgName ?? null);\n }\n connectStartedAtRef.current = null;\n setConnecting(false);\n setError(\n connectError\n ? `Couldn't save Builder credentials: ${connectError.message}. Try again or contact support.`\n : \"Builder finished, but this workspace couldn't confirm the saved credentials. Refresh this page or try Connect Builder.io again.\",\n );\n return;\n }\n stopPoll();\n setHasFetchedStatus(true);\n setConfigured(true);\n setEnvManaged(!!s.envManaged);\n setBuilderEnabled(!!s.builderEnabled);\n const nextConnectUrl = s.cliAuthUrl ?? s.connectUrl ?? null;\n setStatusConnectUrl(nextConnectUrl);\n statusConnectUrlAtRef.current = nextConnectUrl ? Date.now() : null;\n const org = s.orgName ?? null;\n setOrgName(org);\n setConnecting(false);\n connectStartedAtRef.current = null;\n notifiedConnectedRef.current = true;\n notifyAgentEngineConfiguredChanged(\"builder-connect-message\");\n try {\n await onConnectedRef.current?.({ orgName: org });\n } catch {\n // The caller's callback is a UI convenience; status is already set.\n }\n };\n\n try {\n channel = new BroadcastChannel(`builder-connect:${window.location.host}`);\n channel.onmessage = (e: MessageEvent) => {\n const data = e.data as { type?: string; message?: string } | undefined;\n if (data?.type === \"builder-connect-success\") {\n void handleSuccess();\n return;\n }\n if (data?.type === \"builder-connect-error\") {\n if (typeof data.message !== \"string\" || !data.message) return;\n handleError(data.message);\n }\n };\n } catch {\n // BroadcastChannel not available (rare) \\u2014 fall through to postMessage.\n }\n\n const handler = (e: MessageEvent) => {\n if (!isTrustedBuilderConnectMessageOrigin(e.origin)) return;\n const data = e.data as { type?: string; message?: string } | undefined;\n if (data?.type === \"builder-connect-success\") {\n void handleSuccess();\n return;\n }\n if (data?.type === \"builder-connect-error\") {\n if (typeof data.message !== \"string\" || !data.message) return;\n handleError(data.message);\n }\n };\n window.addEventListener(\"message\", handler);\n\n return () => {\n channel?.close();\n window.removeEventListener(\"message\", handler);\n };\n }, [fetchStatus, stopPoll]);\n\n return {\n configured,\n envManaged,\n builderEnabled,\n orgName,\n connecting,\n error,\n hasFetchedStatus,\n start,\n };\n}\n"]}
|