@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":"embed-app.d.ts","sourceRoot":"","sources":["../../src/mcp/embed-app.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAM/D,eAAO,MAAM,iCAAiC,mBAAmB,CAAC;AAElE,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAChD,eAAO,MAAM,+BAA+B,QACkB,CAAC;AAE/D,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAUD,wBAAgB,QAAQ,CACtB,OAAO,GAAE,eAAoB,GAC5B,0BAA0B,
|
|
1
|
+
{"version":3,"file":"embed-app.d.ts","sourceRoot":"","sources":["../../src/mcp/embed-app.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAM/D,eAAO,MAAM,iCAAiC,mBAAmB,CAAC;AAElE,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAChD,eAAO,MAAM,+BAA+B,QACkB,CAAC;AAE/D,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAUD,wBAAgB,QAAQ,CACtB,OAAO,GAAE,eAAoB,GAC5B,0BAA0B,CAs1D5B"}
|
package/dist/mcp/embed-app.js
CHANGED
|
@@ -40,6 +40,8 @@ export function embedApp(options = {}) {
|
|
|
40
40
|
.title { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 12px; font-weight: 700; color: color-mix(in srgb, CanvasText 72%, Canvas); }
|
|
41
41
|
.actions { display: flex; align-items: center; gap: 6px; }
|
|
42
42
|
button { min-height: 28px; border: 1px solid color-mix(in srgb, CanvasText 14%, Canvas); border-radius: 7px; background: Canvas; color: CanvasText; cursor: pointer; font: inherit; font-size: 12px; font-weight: 700; padding: 0 9px; }
|
|
43
|
+
button.primary { min-height: 32px; padding: 0 14px; background: CanvasText; color: Canvas; border-color: CanvasText; }
|
|
44
|
+
button.primary:hover:not(:disabled) { background: color-mix(in srgb, CanvasText 86%, Canvas); }
|
|
43
45
|
button:disabled { opacity: .55; cursor: default; }
|
|
44
46
|
.stage { position: relative; min-height: var(--agent-native-viewport-height); }
|
|
45
47
|
iframe { display: block; width: 100%; height: var(--agent-native-viewport-height); border: 0; background: Canvas; }
|
|
@@ -428,6 +430,49 @@ export function embedApp(options = {}) {
|
|
|
428
430
|
};
|
|
429
431
|
}
|
|
430
432
|
|
|
433
|
+
function externalOpenUrlForAppUrl(appUrl) {
|
|
434
|
+
if (openUrl) return openUrl;
|
|
435
|
+
try {
|
|
436
|
+
const url = new URL(appUrl.href);
|
|
437
|
+
url.searchParams.delete("embedded");
|
|
438
|
+
url.searchParams.delete("__an_embed_token");
|
|
439
|
+
url.searchParams.delete(chatBridgeParam);
|
|
440
|
+
return url.toString();
|
|
441
|
+
} catch (_err) {
|
|
442
|
+
return "";
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
function installExternalOpenControl(appUrl) {
|
|
447
|
+
const href = externalOpenUrlForAppUrl(appUrl);
|
|
448
|
+
if (!href || !document.body || document.getElementById("agent-native-external-open-control")) {
|
|
449
|
+
return;
|
|
450
|
+
}
|
|
451
|
+
const host = document.createElement("div");
|
|
452
|
+
host.id = "agent-native-external-open-control";
|
|
453
|
+
host.style.position = "fixed";
|
|
454
|
+
host.style.top = "10px";
|
|
455
|
+
host.style.right = "10px";
|
|
456
|
+
host.style.zIndex = "2147483647";
|
|
457
|
+
host.style.pointerEvents = "auto";
|
|
458
|
+
const root = host.attachShadow ? host.attachShadow({ mode: "open" }) : host;
|
|
459
|
+
root.innerHTML =
|
|
460
|
+
'<style>' +
|
|
461
|
+
':host{all:initial;}' +
|
|
462
|
+
'button{box-sizing:border-box;min-height:30px;border:1px solid color-mix(in srgb, CanvasText 18%, Canvas);border-radius:7px;background:Canvas;color:CanvasText;box-shadow:0 6px 22px color-mix(in srgb, CanvasText 14%, transparent);cursor:pointer;font:700 12px ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;padding:0 10px;white-space:nowrap;}' +
|
|
463
|
+
'button:hover{background:color-mix(in srgb, CanvasText 6%, Canvas);}' +
|
|
464
|
+
'</style>' +
|
|
465
|
+
'<button type="button">Open in new tab</button>';
|
|
466
|
+
const button = root.querySelector("button");
|
|
467
|
+
if (button) {
|
|
468
|
+
button.addEventListener("click", (event) => {
|
|
469
|
+
event.preventDefault();
|
|
470
|
+
void openHostLink({ url: href });
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
document.body.appendChild(host);
|
|
474
|
+
}
|
|
475
|
+
|
|
431
476
|
function installReactRefreshPreambleFallback() {
|
|
432
477
|
window.__vite_plugin_react_preamble_installed__ = true;
|
|
433
478
|
if (typeof window.$RefreshReg$ !== "function") {
|
|
@@ -768,6 +813,7 @@ export function embedApp(options = {}) {
|
|
|
768
813
|
base.href = config.baseHref;
|
|
769
814
|
document.head.prepend(base);
|
|
770
815
|
importChildren(parsed.body, document.body);
|
|
816
|
+
installExternalOpenControl(appUrl);
|
|
771
817
|
for (const script of scripts) {
|
|
772
818
|
if (isRunnableClassicScript(script)) runClassicScript(script);
|
|
773
819
|
}
|
|
@@ -824,9 +870,21 @@ export function embedApp(options = {}) {
|
|
|
824
870
|
});
|
|
825
871
|
if (!response.ok) {
|
|
826
872
|
if (response.status === 401 && isEmbedStartUrl(src)) {
|
|
873
|
+
reportEmbedError(
|
|
874
|
+
"transplant-auth",
|
|
875
|
+
"Embedded app session expired (HTTP 401).",
|
|
876
|
+
"Opaque-origin sandbox could not authenticate the embed.",
|
|
877
|
+
401
|
|
878
|
+
);
|
|
827
879
|
refreshExpiredEmbedSession();
|
|
828
880
|
return;
|
|
829
881
|
}
|
|
882
|
+
reportEmbedError(
|
|
883
|
+
"transplant-http",
|
|
884
|
+
"Embedded app returned HTTP " + response.status + ".",
|
|
885
|
+
undefined,
|
|
886
|
+
response.status
|
|
887
|
+
);
|
|
830
888
|
throw new Error("Embedded app returned HTTP " + response.status + ".");
|
|
831
889
|
}
|
|
832
890
|
const html = await response.text();
|
|
@@ -927,6 +985,52 @@ export function embedApp(options = {}) {
|
|
|
927
985
|
}, frameReadyTimeoutMs);
|
|
928
986
|
}
|
|
929
987
|
|
|
988
|
+
// Best-effort telemetry sink so inline-embed failures are visible in
|
|
989
|
+
// Sentry (handshake timeout, transplant fetch status/CORS, auth, CSP).
|
|
990
|
+
// The shell is a sandboxed opaque-origin iframe, so it POSTs to the app
|
|
991
|
+
// origin's CORS-open /_agent-native/mcp/embed-error route, derived from the
|
|
992
|
+
// known app URLs. Deduped per stage+message so a retry loop can't spam.
|
|
993
|
+
const reportedEmbedErrorKeys = new Set();
|
|
994
|
+
let embedErrorReportCount = 0;
|
|
995
|
+
function embedReportOrigin() {
|
|
996
|
+
for (const value of [openStartUrl, openUrl, lastFrameSrc]) {
|
|
997
|
+
if (typeof value === "string" && value) {
|
|
998
|
+
try { return new URL(value, window.location.href).origin; } catch {}
|
|
999
|
+
}
|
|
1000
|
+
}
|
|
1001
|
+
return "";
|
|
1002
|
+
}
|
|
1003
|
+
function reportEmbedError(stage, message, detail, status) {
|
|
1004
|
+
try {
|
|
1005
|
+
const key = String(stage) + "|" + String(message || "");
|
|
1006
|
+
if (reportedEmbedErrorKeys.has(key) || embedErrorReportCount >= 8) return;
|
|
1007
|
+
reportedEmbedErrorKeys.add(key);
|
|
1008
|
+
embedErrorReportCount += 1;
|
|
1009
|
+
const origin = embedReportOrigin();
|
|
1010
|
+
if (!origin) return;
|
|
1011
|
+
let renderMode = "";
|
|
1012
|
+
try { renderMode = renderModeSource().mode || ""; } catch {}
|
|
1013
|
+
const body = JSON.stringify({
|
|
1014
|
+
stage: String(stage || ""),
|
|
1015
|
+
message: String(message || "").slice(0, 500),
|
|
1016
|
+
detail: detail ? String(detail).slice(0, 1200) : undefined,
|
|
1017
|
+
url: openStartUrl || openUrl || lastFrameSrc || "",
|
|
1018
|
+
status: typeof status === "number" ? status : undefined,
|
|
1019
|
+
host: window.location.hostname || "",
|
|
1020
|
+
renderMode: renderMode,
|
|
1021
|
+
bridge: openAiBridge ? "openai" : app ? "native" : "none",
|
|
1022
|
+
userAgent: navigator.userAgent || ""
|
|
1023
|
+
});
|
|
1024
|
+
fetch(origin + "/_agent-native/mcp/embed-error", {
|
|
1025
|
+
method: "POST",
|
|
1026
|
+
credentials: "omit",
|
|
1027
|
+
keepalive: true,
|
|
1028
|
+
headers: { "Content-Type": "application/json" },
|
|
1029
|
+
body: body
|
|
1030
|
+
}).catch(() => {});
|
|
1031
|
+
} catch {}
|
|
1032
|
+
}
|
|
1033
|
+
|
|
930
1034
|
function renderFrameFallback() {
|
|
931
1035
|
clearFrameReadyTimer();
|
|
932
1036
|
clearFrameLoadTimer();
|
|
@@ -934,12 +1038,13 @@ export function embedApp(options = {}) {
|
|
|
934
1038
|
const fallbackCopy = openUrl
|
|
935
1039
|
? "This chat host did not allow the embedded app frame to load inline. You can still open the same app route through the host or use the URL below."
|
|
936
1040
|
: "This chat host did not allow the embedded app frame to load inline.";
|
|
1041
|
+
reportEmbedError("frame-fallback", fallbackCopy);
|
|
937
1042
|
stage.innerHTML =
|
|
938
1043
|
'<div class="fallback">' +
|
|
939
1044
|
'<div class="fallback-title">Open this app in its own tab</div>' +
|
|
940
1045
|
'<div class="fallback-copy">' + esc(fallbackCopy) + '</div>' +
|
|
941
1046
|
'<div class="fallback-actions">' +
|
|
942
|
-
'<button type="button" data-fallback-open>Open
|
|
1047
|
+
'<button type="button" class="primary" data-fallback-open>Open in new tab</button>' +
|
|
943
1048
|
'<button type="button" data-fallback-retry>Try inline again</button>' +
|
|
944
1049
|
'</div>' +
|
|
945
1050
|
(openUrl ? '<a class="fallback-url" href="' + esc(openUrl) + '" target="_blank" rel="noreferrer">' + esc(openUrl) + '</a>' : '') +
|
|
@@ -960,6 +1065,43 @@ export function embedApp(options = {}) {
|
|
|
960
1065
|
}
|
|
961
1066
|
}
|
|
962
1067
|
|
|
1068
|
+
function renderAppLaunchError(message) {
|
|
1069
|
+
clearFrameReadyTimer();
|
|
1070
|
+
clearFrameLoadTimer();
|
|
1071
|
+
appFrame = null;
|
|
1072
|
+
const fallbackCopy = openUrl
|
|
1073
|
+
? "The inline MCP app could not load in this chat host. You can open the same app route in a new tab or retry the inline load."
|
|
1074
|
+
: "The inline MCP app could not load in this chat host.";
|
|
1075
|
+
reportEmbedError("app-launch-error", message || fallbackCopy, message);
|
|
1076
|
+
const copyHtml = message
|
|
1077
|
+
? '<div>' + esc(message) + '</div><div>' + esc(fallbackCopy) + '</div>'
|
|
1078
|
+
: esc(fallbackCopy);
|
|
1079
|
+
stage.innerHTML =
|
|
1080
|
+
'<div class="fallback">' +
|
|
1081
|
+
'<div class="fallback-title">App did not load</div>' +
|
|
1082
|
+
'<div class="fallback-copy">' + copyHtml + '</div>' +
|
|
1083
|
+
'<div class="fallback-actions">' +
|
|
1084
|
+
'<button type="button" class="primary" data-fallback-open>Open in new tab</button>' +
|
|
1085
|
+
'<button type="button" data-fallback-retry>Retry</button>' +
|
|
1086
|
+
'</div>' +
|
|
1087
|
+
(openUrl ? '<a class="fallback-url" href="' + esc(openUrl) + '" target="_blank" rel="noreferrer">' + esc(openUrl) + '</a>' : '') +
|
|
1088
|
+
'</div>';
|
|
1089
|
+
const fallbackOpen = stage.querySelector("[data-fallback-open]");
|
|
1090
|
+
const fallbackRetry = stage.querySelector("[data-fallback-retry]");
|
|
1091
|
+
if (fallbackOpen) {
|
|
1092
|
+
fallbackOpen.disabled = !openUrl;
|
|
1093
|
+
fallbackOpen.onclick = () => {
|
|
1094
|
+
if (openUrl) void openHostLink({ url: openUrl });
|
|
1095
|
+
};
|
|
1096
|
+
}
|
|
1097
|
+
if (fallbackRetry) {
|
|
1098
|
+
fallbackRetry.onclick = () => {
|
|
1099
|
+
startedFor = "";
|
|
1100
|
+
void launchEmbed();
|
|
1101
|
+
};
|
|
1102
|
+
}
|
|
1103
|
+
}
|
|
1104
|
+
|
|
963
1105
|
async function openFallbackExternal() {
|
|
964
1106
|
if (!openUrl) return;
|
|
965
1107
|
let url = withChatBridgeParam(openUrl);
|
|
@@ -1024,12 +1166,29 @@ export function embedApp(options = {}) {
|
|
|
1024
1166
|
return true;
|
|
1025
1167
|
}
|
|
1026
1168
|
|
|
1169
|
+
// We have connected to a standards-track MCP Apps host (Codex, Cursor,
|
|
1170
|
+
// Claude over the SDK, our own renderer, …) through the postMessage
|
|
1171
|
+
// \`ui/*\` bridge rather than ChatGPT's \`window.openai\` global. These hosts
|
|
1172
|
+
// render the resource in a strict sandboxed iframe (typically
|
|
1173
|
+
// \`sandbox="allow-scripts"\`, opaque origin). Self-navigating that iframe to
|
|
1174
|
+
// the real app origin tears down the host bridge and loses the opaque-origin
|
|
1175
|
+
// auth context, which shows up as a permanent / flashing loading state.
|
|
1176
|
+
// Transplanting the app document into the shell keeps the bridge alive and
|
|
1177
|
+
// works under the opaque origin via embed-token auth, exactly like Claude.
|
|
1178
|
+
function isNativeMcpAppsBridgeHost() {
|
|
1179
|
+
return !!app && !openAiBridge;
|
|
1180
|
+
}
|
|
1181
|
+
|
|
1027
1182
|
function shouldTransplantAppDocument() {
|
|
1028
1183
|
const render = renderModeSource();
|
|
1029
1184
|
const mode = render.mode;
|
|
1185
|
+
if (mode === "iframe" || mode === "nested" || render.frame === "iframe" || render.nested) {
|
|
1186
|
+
return false;
|
|
1187
|
+
}
|
|
1030
1188
|
return (
|
|
1031
1189
|
isClaudeMcpContentHost() ||
|
|
1032
1190
|
isChatGptSandboxHost() ||
|
|
1191
|
+
isNativeMcpAppsBridgeHost() ||
|
|
1033
1192
|
mode === "transplant" ||
|
|
1034
1193
|
render.frame === "transplant"
|
|
1035
1194
|
);
|
|
@@ -1047,7 +1206,7 @@ export function embedApp(options = {}) {
|
|
|
1047
1206
|
try {
|
|
1048
1207
|
const host = window.location.hostname || "";
|
|
1049
1208
|
const appParam = new URL(window.location.href).searchParams.get("app");
|
|
1050
|
-
return /^[^.]+\\.web-sandbox\\.oaiusercontent\\.com$/i.test(host) || appParam === "chatgpt";
|
|
1209
|
+
return /^(?:[^.]+\\.)?web-sandbox\\.oaiusercontent\\.com$/i.test(host) || appParam === "chatgpt";
|
|
1051
1210
|
} catch {
|
|
1052
1211
|
return false;
|
|
1053
1212
|
}
|
|
@@ -1270,7 +1429,7 @@ export function embedApp(options = {}) {
|
|
|
1270
1429
|
async function launchEmbed() {
|
|
1271
1430
|
const launchUrl = openStartUrl || openUrl;
|
|
1272
1431
|
if (!launchUrl) {
|
|
1273
|
-
|
|
1432
|
+
renderAppLaunchError("Open link was not available.");
|
|
1274
1433
|
return;
|
|
1275
1434
|
}
|
|
1276
1435
|
if (!wantsEmbed()) {
|
|
@@ -1301,7 +1460,7 @@ export function embedApp(options = {}) {
|
|
|
1301
1460
|
const data = parseToolResult(result);
|
|
1302
1461
|
if (typeof data.startUrl !== "string" || !data.startUrl) {
|
|
1303
1462
|
startedFor = "";
|
|
1304
|
-
|
|
1463
|
+
renderAppLaunchError(data.error || "This app can be opened, but not embedded from this MCP server.");
|
|
1305
1464
|
return;
|
|
1306
1465
|
}
|
|
1307
1466
|
const startUrl = withChatBridgeParam(data.startUrl);
|
|
@@ -1318,7 +1477,7 @@ export function embedApp(options = {}) {
|
|
|
1318
1477
|
}
|
|
1319
1478
|
} catch (err) {
|
|
1320
1479
|
startedFor = "";
|
|
1321
|
-
|
|
1480
|
+
renderAppLaunchError(err && err.message ? err.message : "Could not launch embedded app.");
|
|
1322
1481
|
}
|
|
1323
1482
|
}
|
|
1324
1483
|
|
|
@@ -1368,6 +1527,9 @@ export function embedApp(options = {}) {
|
|
|
1368
1527
|
try {
|
|
1369
1528
|
if (new URLSearchParams(window.location.search).get("app") === "chatgpt") return true;
|
|
1370
1529
|
} catch (_err) {}
|
|
1530
|
+
try {
|
|
1531
|
+
if (/^(?:[^.]+\\.)?web-sandbox\\.oaiusercontent\\.com$/i.test(window.location.hostname || "")) return true;
|
|
1532
|
+
} catch (_err) {}
|
|
1371
1533
|
try {
|
|
1372
1534
|
return /chatgpt/i.test(String(navigator.userAgent || ""));
|
|
1373
1535
|
} catch (_err) {
|
|
@@ -1551,8 +1713,13 @@ export function embedApp(options = {}) {
|
|
|
1551
1713
|
async openLink(params) {
|
|
1552
1714
|
const url = typeof (params && params.url) === "string" ? params.url : "";
|
|
1553
1715
|
if (!url) return { isError: true };
|
|
1554
|
-
|
|
1555
|
-
|
|
1716
|
+
try {
|
|
1717
|
+
return await rpcRequest("ui/open-link", { url }, wrapperRequestTimeoutMs);
|
|
1718
|
+
} catch (err) {
|
|
1719
|
+
console.warn("[agent-native] MCP host open-link request failed", err);
|
|
1720
|
+
}
|
|
1721
|
+
const opened = window.open(url, "_blank", "noopener,noreferrer");
|
|
1722
|
+
return opened ? { ok: true } : { isError: true };
|
|
1556
1723
|
},
|
|
1557
1724
|
async requestDisplayMode(params) {
|
|
1558
1725
|
return await rpcRequest("ui/request-display-mode", objectValue(params));
|
|
@@ -1588,6 +1755,7 @@ export function embedApp(options = {}) {
|
|
|
1588
1755
|
return;
|
|
1589
1756
|
}
|
|
1590
1757
|
if (
|
|
1758
|
+
message.method === "ui/notifications/host-context-changed" ||
|
|
1591
1759
|
message.method === "ui/notifications/host-context" ||
|
|
1592
1760
|
message.method === "ui/notifications/context"
|
|
1593
1761
|
) {
|
|
@@ -1668,8 +1836,30 @@ export function embedApp(options = {}) {
|
|
|
1668
1836
|
}
|
|
1669
1837
|
} catch (err) {
|
|
1670
1838
|
console.error("[agent-native] MCP app shell failed", err);
|
|
1839
|
+
reportEmbedError(
|
|
1840
|
+
"bridge-init",
|
|
1841
|
+
err && err.message ? err.message : "Could not initialize app.",
|
|
1842
|
+
err && err.stack ? String(err.stack) : undefined
|
|
1843
|
+
);
|
|
1671
1844
|
setMessage(err && err.message ? err.message : "Could not initialize app.");
|
|
1672
1845
|
}
|
|
1846
|
+
|
|
1847
|
+
window.addEventListener("error", (event) => {
|
|
1848
|
+
const err = event && event.error;
|
|
1849
|
+
reportEmbedError(
|
|
1850
|
+
"window-error",
|
|
1851
|
+
(err && err.message) || (event && event.message) || "Uncaught error in MCP app embed.",
|
|
1852
|
+
err && err.stack ? String(err.stack) : undefined
|
|
1853
|
+
);
|
|
1854
|
+
});
|
|
1855
|
+
window.addEventListener("unhandledrejection", (event) => {
|
|
1856
|
+
const reason = event && event.reason;
|
|
1857
|
+
reportEmbedError(
|
|
1858
|
+
"unhandled-rejection",
|
|
1859
|
+
(reason && reason.message) || String(reason || "Unhandled promise rejection in MCP app embed."),
|
|
1860
|
+
reason && reason.stack ? String(reason.stack) : undefined
|
|
1861
|
+
);
|
|
1862
|
+
});
|
|
1673
1863
|
})();
|
|
1674
1864
|
</script>
|
|
1675
1865
|
</body>
|