@agent-native/core 0.80.8 → 0.80.9
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/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +12 -0
- package/corpus/core/docs/content/locales/ar-SA/template-design.mdx +6 -0
- package/corpus/core/docs/content/locales/de-DE/template-design.mdx +8 -0
- package/corpus/core/docs/content/locales/es-ES/template-design.mdx +10 -2
- package/corpus/core/docs/content/locales/fr-FR/template-design.mdx +10 -2
- package/corpus/core/docs/content/locales/hi-IN/template-design.mdx +7 -0
- package/corpus/core/docs/content/locales/ja-JP/template-design.mdx +7 -0
- package/corpus/core/docs/content/locales/ko-KR/template-design.mdx +7 -0
- package/corpus/core/docs/content/locales/pt-BR/template-design.mdx +9 -2
- package/corpus/core/docs/content/locales/zh-CN/template-design.mdx +6 -0
- package/corpus/core/docs/content/locales/zh-TW/template-design.mdx +6 -0
- package/corpus/core/docs/content/template-design.mdx +9 -2
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/cli/mcp.ts +10 -0
- package/corpus/core/src/cli/skills.ts +58 -12
- package/corpus/core/src/client/error-format.ts +25 -0
- package/corpus/core/src/client/extensions/ExtensionViewer.tsx +13 -11
- package/corpus/core/src/client/guided-questions.tsx +32 -4
- package/corpus/core/src/client/onboarding/OnboardingPanel.tsx +33 -1
- package/corpus/core/src/client/resources/BuiltinCapabilityDetail.tsx +8 -0
- package/corpus/core/src/client/resources/use-builtin-capabilities.ts +4 -2
- package/corpus/core/src/client/session-replay.ts +34 -0
- package/corpus/core/src/client/sharing/ShareButton.tsx +106 -21
- package/corpus/core/src/coding-tools/index.ts +1 -1
- package/corpus/core/src/mcp/index.ts +2 -0
- package/corpus/core/src/mcp/screen-memory-stdio.ts +290 -0
- package/corpus/core/src/mcp-client/builtin-capabilities.ts +13 -1
- package/corpus/core/src/mcp-client/index.ts +9 -0
- package/corpus/core/src/mcp-client/screen-memory-local.ts +461 -0
- package/corpus/core/src/onboarding/types.ts +7 -0
- package/corpus/core/src/server/agent-chat-plugin.ts +25 -0
- package/corpus/core/src/server/agents-bundle.ts +35 -7
- package/corpus/core/src/styles/agent-native.css +5 -0
- package/corpus/core/src/templates/default/app/global.css +35 -35
- package/corpus/templates/analytics/AGENTS.md +6 -0
- package/corpus/templates/analytics/actions/github-repo-files.ts +9 -0
- package/corpus/templates/analytics/app/components/layout/Layout.tsx +4 -4
- package/corpus/templates/analytics/app/global.css +144 -40
- package/corpus/templates/analytics/app/pages/adhoc/explorer/index.tsx +1 -1
- package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/ChartCard.tsx +1 -1
- package/corpus/templates/analytics/app/pages/adhoc/explorer-dashboard/index.tsx +1 -1
- package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +4 -4
- package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +9 -9
- package/corpus/templates/analytics/changelog/2026-06-29-agents-can-search-and-read-connected-github-repositories-whe.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-29-sessions-and-explorer-layouts-adapt-when-the-agent-sidebar-is.md +6 -0
- package/corpus/templates/assets/app/components/layout/Layout.tsx +3 -1
- package/corpus/templates/assets/app/components/library/LibraryPresetGrid.tsx +1 -1
- package/corpus/templates/assets/app/global.css +99 -35
- package/corpus/templates/assets/app/routes/asset.$id.tsx +2 -2
- package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +4 -4
- package/corpus/templates/assets/app/routes/library.tsx +4 -4
- package/corpus/templates/assets/changelog/2026-06-29-asset-library-and-detail-layouts-adapt-when-the-agent-sidebar.md +6 -0
- package/corpus/templates/brain/app/components/layout/Layout.tsx +1 -1
- package/corpus/templates/brain/app/global.css +63 -35
- package/corpus/templates/brain/app/routes/search.tsx +1 -1
- package/corpus/templates/brain/app/routes/settings.tsx +1 -1
- package/corpus/templates/brain/app/routes/sources.tsx +2 -2
- package/corpus/templates/brain/changelog/2026-06-29-search-settings-and-source-layouts-adapt-when-the-agent-sidebar.md +6 -0
- package/corpus/templates/calendar/app/components/calendar/EventDetailPanel.tsx +4 -4
- package/corpus/templates/calendar/app/components/calendar/FindTimePanel.tsx +3 -2
- package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +4 -2
- package/corpus/templates/calendar/app/global.css +69 -35
- package/corpus/templates/calendar/changelog/2026-06-29-event-and-find-time-layouts-adapt-when-the-agent-sidebar-is.md +6 -0
- package/corpus/templates/chat/app/components/layout/Layout.tsx +1 -1
- package/corpus/templates/chat/app/global.css +35 -35
- package/corpus/templates/chat/changelog/2026-06-29-chat-layouts-adapt-when-the-agent-sidebar-is-open.md +6 -0
- package/corpus/templates/clips/AGENTS.md +13 -0
- package/corpus/templates/clips/actions/get-screen-memory-status.ts +12 -0
- package/corpus/templates/clips/actions/query-screen-memory-context.ts +29 -0
- package/corpus/templates/clips/actions/view-screen.ts +2 -2
- package/corpus/templates/clips/app/components/library/library-layout.tsx +1 -1
- package/corpus/templates/clips/app/global.css +47 -35
- package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +3 -3
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +45 -18
- package/corpus/templates/clips/changelog/2026-06-29-meeting-detail-layouts-adapt-when-the-agent-sidebar-is-open.md +6 -0
- package/corpus/templates/clips/changelog/2026-06-29-screen-memory-keeps-a-local-rolling-screen-buffer-for-agent-context.md +5 -0
- package/corpus/templates/clips/changelog/2026-06-29-video-chat-is-easier-to-find-on-recording-pages-and-s3-setup.md +6 -0
- package/corpus/templates/clips/chrome-extension/src/styles.css +39 -39
- package/corpus/templates/clips/desktop/src/app.tsx +290 -1
- package/corpus/templates/clips/desktop/src/shared/config.ts +83 -0
- package/corpus/templates/clips/desktop/src/styles.css +67 -52
- package/corpus/templates/clips/desktop/src-tauri/src/config.rs +50 -0
- package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +17 -0
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +13 -13
- package/corpus/templates/clips/desktop/src-tauri/src/screen_memory.rs +990 -0
- package/corpus/templates/clips/server/plugins/onboarding.ts +2 -0
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +3 -3
- package/corpus/templates/content/app/components/layout/Layout.tsx +1 -1
- package/corpus/templates/content/app/global.css +29 -15
- package/corpus/templates/content/changelog/2026-06-29-database-gallery-layouts-adapt-when-the-agent-sidebar-is-open.md +6 -0
- package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +25 -20
- package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +8 -0
- package/corpus/templates/design/.agents/skills/export-handoff/SKILL.md +8 -0
- package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +13 -0
- package/corpus/templates/design/AGENTS.md +20 -12
- package/corpus/templates/design/CODE_NATIVE_DESIGN_STUDIO_IMPLEMENTATION_PLAN.md +1054 -0
- package/corpus/templates/design/actions/apply-visual-edit.ts +24 -4
- package/corpus/templates/design/actions/export-coding-handoff.ts +12 -4
- package/corpus/templates/design/actions/generate-design.ts +6 -21
- package/corpus/templates/design/actions/generate-screens.ts +43 -2
- package/corpus/templates/design/actions/get-design.ts +1 -0
- package/corpus/templates/design/actions/present-design-variants.ts +355 -30
- package/corpus/templates/design/actions/view-screen.ts +75 -31
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +329 -69
- package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +1 -1
- package/corpus/templates/design/app/components/design/EditPanel.tsx +479 -77
- package/corpus/templates/design/app/components/design/LayersPanel.tsx +380 -216
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +1050 -196
- package/corpus/templates/design/app/components/design/QuestionFlow.tsx +83 -206
- package/corpus/templates/design/app/components/design/TweaksPanel.tsx +1 -1
- package/corpus/templates/design/app/components/design/index.ts +0 -1
- package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +225 -133
- package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +122 -11
- package/corpus/templates/design/app/components/design/inspector/ExportSettingsPanel.tsx +24 -5
- package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +57 -1
- package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +37 -12
- package/corpus/templates/design/app/components/design/inspector/index.ts +1 -0
- package/corpus/templates/design/app/components/design/inspector/scrub-input-utils.ts +12 -5
- package/corpus/templates/design/app/components/design/types.ts +9 -0
- package/corpus/templates/design/app/components/layout/Layout.tsx +23 -5
- package/corpus/templates/design/app/global.css +77 -49
- package/corpus/templates/design/app/hooks/use-question-flow.ts +2 -2
- package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +8 -1
- package/corpus/templates/design/app/i18n/zh-TW.ts +3 -0
- package/corpus/templates/design/app/i18n-data.ts +45 -3
- package/corpus/templates/design/app/pages/DesignEditor.tsx +2602 -657
- package/corpus/templates/design/app/root.tsx +1 -1
- package/corpus/templates/design/changelog/2026-06-29-containers-no-longer-block-selecting-nested-elements-and-nor.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-design-agents-now-generate-and-refine-variants-from-stronger.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-design-inspector-controls-now-match-figmas-softer-dark-chrome.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-design-questions-now-appear-as-a-cleaner-canvas-intake-with-.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-design-variant-directions-now-appear-as-board-screens-with-chat-buttons.md +5 -0
- package/corpus/templates/design/changelog/2026-06-29-element-selection-no-longer-snaps-back-to-the-previous-layer.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-frame-resize-measurements-now-stay-beside-the-cursor-while-d.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-inspector-number-fields-have-cleaner-tooltips-and-draggable-.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-layer-locking-layer-nesting-generated-question-intake-and-im.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-layer-names-in-the-sidebar-can-scroll-horizontally-instead-o.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-layer-nesting-in-the-sidebar-now-uses-tighter-spacing-so-nam.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-layers-no-longer-repeat-document-wrapper-rows-when-a-screen-.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-overview-previews-now-keep-element-hover-and-selection-tied-.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-pressing-escape-now-cancels-a-stuck-screen-drag-in-the-overv.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-screen-overview-is-easier-to-find-and-named-screens-open-dir.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-screen-overview-only-highlights-screens-when-the-frame-or-ti.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-screen-overview-previews-now-resize-to-match-the-selected-de.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-screen-overview-selection-now-uses-a-pointer-cursor-instead-.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-screen-overview-selection-outlines-now-stay-locked-to-the-se.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-screen-overview-zoom-now-reports-real-screen-scale-separatel.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-screen-overview-zooming-feels-smoother-and-selection-outline.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-screen-overview-zooming-now-stays-on-the-overview-canvas-ins.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-selecting-a-nested-layer-from-all-screens-now-keeps-you-in-a.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-share-now-groups-link-sharing-exports-and-agent-handoff.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-the-design-editor-loading-skeleton-now-uses-a-softer-charcoa.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-the-device-preview-menu-now-sits-next-to-the-preview-button-.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-the-inspector-stays-read-only-while-an-empty-design-is-still.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-the-missing-design-view-now-matches-the-rest-of-the-editor-c.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-the-pen-tool-icon-and-tool-option-menus-better-match-the-edi.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-typography-controls-now-keep-the-font-name-visible-and-move-.md +6 -0
- package/corpus/templates/design/e2e/README.md +3 -3
- package/corpus/templates/design/e2e/global-setup.ts +11 -22
- package/corpus/templates/design/e2e/helpers.ts +122 -11
- package/corpus/templates/design/playwright.config.ts +9 -3
- package/corpus/templates/design/server/lib/coding-handoff.ts +126 -2
- package/corpus/templates/design/server/plugins/core-routes.ts +1 -2
- package/corpus/templates/design/server/routes/api/design-handoff/[id].zip.get.ts +86 -0
- package/corpus/templates/design/shared/code-layer.ts +125 -22
- package/corpus/templates/design/shared/generation-session.ts +41 -0
- package/corpus/templates/dispatch/app/global.css +79 -35
- package/corpus/templates/dispatch/app/routes/integrations.tsx +8 -7
- package/corpus/templates/dispatch/changelog/2026-06-29-integration-layouts-adapt-when-the-agent-sidebar-is-open.md +6 -0
- package/corpus/templates/forms/app/components/layout/Layout.tsx +6 -2
- package/corpus/templates/forms/app/global.css +64 -35
- package/corpus/templates/forms/app/pages/FormsListPage.tsx +2 -2
- package/corpus/templates/forms/app/pages/ResponseInsightsPage.tsx +3 -3
- package/corpus/templates/forms/changelog/2026-06-29-form-list-and-insight-layouts-adapt-when-the-agent-sidebar.md +6 -0
- package/corpus/templates/macros/app/components/layout/AppLayout.tsx +3 -1
- package/corpus/templates/macros/app/global.css +25 -9
- package/corpus/templates/macros/changelog/2026-06-29-macro-layouts-adapt-when-the-agent-sidebar-is-open.md +6 -0
- package/corpus/templates/mail/app/components/layout/AppLayout.tsx +6 -2
- package/corpus/templates/mail/app/global.css +42 -36
- package/corpus/templates/mail/app/pages/InboxPage.tsx +1 -1
- package/corpus/templates/mail/changelog/2026-06-29-the-contact-panel-now-adapts-to-the-available-mail-pane-width.md +6 -0
- package/corpus/templates/plan/app/components/layout/Layout.tsx +3 -1
- package/corpus/templates/plan/app/components/plan/DocumentArea.tsx +6 -7
- package/corpus/templates/plan/app/global.css +74 -42
- package/corpus/templates/plan/changelog/2026-06-29-plan-document-blocks-adapt-to-the-available-document-width.md +6 -0
- package/corpus/templates/plan/changelog/2026-06-29-plan-titles-and-summaries-can-be-edited-inline-without-focus.md +6 -0
- package/corpus/templates/slides/app/components/layout/Layout.tsx +3 -1
- package/corpus/templates/slides/app/global.css +49 -33
- package/corpus/templates/slides/changelog/2026-06-29-slide-layouts-adapt-when-the-agent-sidebar-is-open.md +6 -0
- package/corpus/templates/videos/app/components/layout/Layout.tsx +3 -1
- package/corpus/templates/videos/app/global.css +35 -35
- package/corpus/templates/videos/changelog/2026-06-29-video-layouts-adapt-when-the-agent-sidebar-is-open.md +6 -0
- package/dist/cli/mcp.d.ts.map +1 -1
- package/dist/cli/mcp.js +10 -0
- package/dist/cli/mcp.js.map +1 -1
- package/dist/cli/skills.d.ts.map +1 -1
- package/dist/cli/skills.js +58 -12
- package/dist/cli/skills.js.map +1 -1
- package/dist/client/error-format.d.ts.map +1 -1
- package/dist/client/error-format.js +17 -0
- package/dist/client/error-format.js.map +1 -1
- package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionViewer.js +3 -4
- package/dist/client/extensions/ExtensionViewer.js.map +1 -1
- package/dist/client/guided-questions.d.ts +4 -0
- package/dist/client/guided-questions.d.ts.map +1 -1
- package/dist/client/guided-questions.js +16 -7
- package/dist/client/guided-questions.js.map +1 -1
- package/dist/client/onboarding/OnboardingPanel.js +26 -1
- package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
- package/dist/client/resources/BuiltinCapabilityDetail.d.ts.map +1 -1
- package/dist/client/resources/BuiltinCapabilityDetail.js +1 -1
- package/dist/client/resources/BuiltinCapabilityDetail.js.map +1 -1
- package/dist/client/resources/use-builtin-capabilities.d.ts +1 -1
- package/dist/client/resources/use-builtin-capabilities.d.ts.map +1 -1
- package/dist/client/resources/use-builtin-capabilities.js +2 -1
- package/dist/client/resources/use-builtin-capabilities.js.map +1 -1
- package/dist/client/session-replay.d.ts.map +1 -1
- package/dist/client/session-replay.js +31 -0
- package/dist/client/session-replay.js.map +1 -1
- package/dist/client/sharing/ShareButton.d.ts +14 -0
- package/dist/client/sharing/ShareButton.d.ts.map +1 -1
- package/dist/client/sharing/ShareButton.js +36 -7
- package/dist/client/sharing/ShareButton.js.map +1 -1
- package/dist/coding-tools/index.js +1 -1
- package/dist/coding-tools/index.js.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/file-upload/actions/upload-image.d.ts +2 -2
- package/dist/mcp/index.d.ts +2 -0
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +1 -0
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/screen-memory-stdio.d.ts +6 -0
- package/dist/mcp/screen-memory-stdio.d.ts.map +1 -0
- package/dist/mcp/screen-memory-stdio.js +213 -0
- package/dist/mcp/screen-memory-stdio.js.map +1 -0
- package/dist/mcp-client/builtin-capabilities.d.ts +1 -1
- package/dist/mcp-client/builtin-capabilities.d.ts.map +1 -1
- package/dist/mcp-client/builtin-capabilities.js +10 -0
- package/dist/mcp-client/builtin-capabilities.js.map +1 -1
- package/dist/mcp-client/index.d.ts +1 -0
- package/dist/mcp-client/index.d.ts.map +1 -1
- package/dist/mcp-client/index.js +1 -0
- package/dist/mcp-client/index.js.map +1 -1
- package/dist/mcp-client/screen-memory-local.d.ts +61 -0
- package/dist/mcp-client/screen-memory-local.d.ts.map +1 -0
- package/dist/mcp-client/screen-memory-local.js +336 -0
- package/dist/mcp-client/screen-memory-local.js.map +1 -0
- package/dist/notifications/routes.d.ts +2 -2
- package/dist/observability/routes.d.ts +8 -8
- package/dist/onboarding/types.d.ts +7 -0
- package/dist/onboarding/types.d.ts.map +1 -1
- package/dist/onboarding/types.js.map +1 -1
- package/dist/resources/handlers.d.ts +2 -2
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +26 -0
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/agents-bundle.d.ts.map +1 -1
- package/dist/server/agents-bundle.js +22 -7
- package/dist/server/agents-bundle.js.map +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/styles/agent-native.css +5 -0
- package/dist/templates/default/app/global.css +35 -35
- package/docs/content/locales/ar-SA/template-design.mdx +6 -0
- package/docs/content/locales/de-DE/template-design.mdx +8 -0
- package/docs/content/locales/es-ES/template-design.mdx +10 -2
- package/docs/content/locales/fr-FR/template-design.mdx +10 -2
- package/docs/content/locales/hi-IN/template-design.mdx +7 -0
- package/docs/content/locales/ja-JP/template-design.mdx +7 -0
- package/docs/content/locales/ko-KR/template-design.mdx +7 -0
- package/docs/content/locales/pt-BR/template-design.mdx +9 -2
- package/docs/content/locales/zh-CN/template-design.mdx +6 -0
- package/docs/content/locales/zh-TW/template-design.mdx +6 -0
- package/docs/content/template-design.mdx +9 -2
- package/package.json +1 -1
- package/src/templates/default/app/global.css +35 -35
- package/corpus/templates/design/app/components/design/VariantGrid.tsx +0 -189
- package/corpus/templates/design/app/components/design/VariantHandoffCard.tsx +0 -115
- package/corpus/templates/design/app/hooks/use-variant-flow.ts +0 -342
|
@@ -92,7 +92,7 @@ function DbSyncSetup() {
|
|
|
92
92
|
const qc = useQueryClient();
|
|
93
93
|
useDbSync({
|
|
94
94
|
queryClient: qc,
|
|
95
|
-
queryKeys: ["designs", "design-systems", "design-files"
|
|
95
|
+
queryKeys: ["designs", "design-systems", "design-files"],
|
|
96
96
|
ignoreSource: getBrowserTabId(),
|
|
97
97
|
});
|
|
98
98
|
return null;
|
|
@@ -33,12 +33,12 @@ action endpoints. Both `.auth/` files are gitignored.
|
|
|
33
33
|
|
|
34
34
|
## Why the editor needs special handling (the hard-won bits)
|
|
35
35
|
|
|
36
|
-
The design renders inside a
|
|
37
|
-
|
|
36
|
+
The design renders inside a sandboxed iframe, and a pointer-capturing shield
|
|
37
|
+
overlay sits on top. So:
|
|
38
38
|
|
|
39
39
|
| Symptom | Wrong approach | Right approach |
|
|
40
40
|
| ----------------------------------------------------------------------- | -------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
41
|
-
|
|
|
41
|
+
| Reaching into iframe DOM | parent-document locators | `page.frameLocator('iframe').locator(...)` — Playwright targets the frame directly and stays stable across sandbox/overlay changes |
|
|
42
42
|
| Clicks "intercepted by `<div data-agent-native-edit-overlay="shield">`" | normal click (actionability fails) | `.click({ force: true })` — the shield is _meant_ to get the event and drive selection |
|
|
43
43
|
| Asserting an edit happened | reading iframe state | listen for the bridge's parent `postMessage`s: `element-select`, `element-hover`, `visual-style-change`, `visual-structure-change` (see `installBridge`/`waitForBridge`) |
|
|
44
44
|
| `page.screenshot()` hangs forever | `page.screenshot()` | `cdpScreenshot()` — CDP `Page.captureScreenshot`, no stability wait (the page never idles; the agent-chat panel polls) |
|
|
@@ -34,7 +34,7 @@ export const FIXTURE_HTML = `<!doctype html>
|
|
|
34
34
|
</head>
|
|
35
35
|
<body style="margin:0;font-family:system-ui,sans-serif;background:#0f1115;color:#f4f4f5">
|
|
36
36
|
<main style="max-width:720px;margin:0 auto;padding:48px 32px;display:flex;flex-direction:column;gap:24px">
|
|
37
|
-
<h1 style="font-size:40px;font-weight:800;margin:0">E2E Hero Heading</h1>
|
|
37
|
+
<h1 style="font-size:40px;font-weight:800;margin:0;color:#f4f4f5">E2E Hero Heading</h1>
|
|
38
38
|
<p style="font-size:18px;line-height:1.6;margin:0;color:#a1a1aa">First fixture paragraph for selection tests.</p>
|
|
39
39
|
<p style="font-size:18px;line-height:1.6;margin:0;color:#a1a1aa">Second fixture paragraph for selection tests.</p>
|
|
40
40
|
<div style="display:flex;flex-direction:row;gap:16px">
|
|
@@ -89,23 +89,18 @@ export default async function globalSetup(config: FullConfig) {
|
|
|
89
89
|
const page = await context.newPage();
|
|
90
90
|
|
|
91
91
|
try {
|
|
92
|
-
await page.goto(`${baseURL}
|
|
92
|
+
await page.goto(`${baseURL}/_agent-native/sign-in`, {
|
|
93
|
+
waitUntil: "domcontentloaded",
|
|
94
|
+
});
|
|
93
95
|
|
|
94
96
|
const isSignIn = async () => /sign in/i.test(await page.title());
|
|
95
97
|
|
|
96
98
|
if (await isSignIn()) {
|
|
97
99
|
// Try to create the account; if it already exists, fall back to sign in.
|
|
98
|
-
await page.
|
|
99
|
-
await page
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
const confirm = page.getByRole("textbox", { name: "Confirm password" });
|
|
103
|
-
if (await confirm.count()) await confirm.fill(E2E_PASSWORD);
|
|
104
|
-
await page
|
|
105
|
-
.locator("#signup-form")
|
|
106
|
-
.getByRole("button", { name: "Create account" })
|
|
107
|
-
.click()
|
|
108
|
-
.catch(() => {});
|
|
100
|
+
await page.locator("#s-email").fill(E2E_EMAIL);
|
|
101
|
+
await page.locator("#s-pass").fill(E2E_PASSWORD);
|
|
102
|
+
await page.locator("#s-pass2").fill(E2E_PASSWORD);
|
|
103
|
+
await page.locator("#signup-form button[type='submit']").click();
|
|
109
104
|
await page.waitForTimeout(2500);
|
|
110
105
|
|
|
111
106
|
if (await isSignIn()) {
|
|
@@ -115,15 +110,9 @@ export default async function globalSetup(config: FullConfig) {
|
|
|
115
110
|
.first()
|
|
116
111
|
.click()
|
|
117
112
|
.catch(() => {});
|
|
118
|
-
await page.
|
|
119
|
-
await page
|
|
120
|
-
|
|
121
|
-
.fill(E2E_PASSWORD);
|
|
122
|
-
await page
|
|
123
|
-
.getByRole("button", { name: /sign in/i })
|
|
124
|
-
.last()
|
|
125
|
-
.click()
|
|
126
|
-
.catch(() => {});
|
|
113
|
+
await page.locator("#l-email").fill(E2E_EMAIL);
|
|
114
|
+
await page.locator("#l-pass").fill(E2E_PASSWORD);
|
|
115
|
+
await page.locator("#login-form button[type='submit']").click();
|
|
127
116
|
await page.waitForTimeout(2500);
|
|
128
117
|
}
|
|
129
118
|
}
|
|
@@ -26,7 +26,7 @@ export async function readSeedDesignId(): Promise<string> {
|
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
export function designFrame(page: Page): FrameLocator {
|
|
29
|
-
return page.frameLocator("iframe");
|
|
29
|
+
return page.frameLocator("iframe[data-design-preview-iframe]");
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
/** Open the editor for a design and wait for the toolbar + iframe to be ready. */
|
|
@@ -35,7 +35,16 @@ export async function gotoEditor(page: Page, designId: string): Promise<void> {
|
|
|
35
35
|
await expect(
|
|
36
36
|
page.getByRole("button", { name: "Move", exact: true }),
|
|
37
37
|
).toBeVisible({ timeout: 30_000 });
|
|
38
|
-
await
|
|
38
|
+
await waitForDesignBridgeReady(page);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
async function waitForDesignBridgeReady(page: Page): Promise<void> {
|
|
42
|
+
await expect(
|
|
43
|
+
page.locator("iframe[data-design-preview-iframe]"),
|
|
44
|
+
).toBeVisible();
|
|
45
|
+
await expect(
|
|
46
|
+
designFrame(page).locator('[data-agent-native-edit-overlay="shield"]'),
|
|
47
|
+
).toBeVisible({ timeout: 10_000 });
|
|
39
48
|
// Wait for the iframe bridge to stamp at least one selectable node.
|
|
40
49
|
await expect
|
|
41
50
|
.poll(
|
|
@@ -48,14 +57,43 @@ export async function gotoEditor(page: Page, designId: string): Promise<void> {
|
|
|
48
57
|
.toBeGreaterThan(0);
|
|
49
58
|
}
|
|
50
59
|
|
|
60
|
+
export async function enterDirectMode(page: Page): Promise<void> {
|
|
61
|
+
const fullView = page.getByRole("button", { name: "Full view", exact: true });
|
|
62
|
+
const fullViewVisible = await fullView
|
|
63
|
+
.first()
|
|
64
|
+
.waitFor({ state: "visible", timeout: 5_000 })
|
|
65
|
+
.then(() => true)
|
|
66
|
+
.catch(() => false);
|
|
67
|
+
if (fullViewVisible) {
|
|
68
|
+
await fullView.first().click();
|
|
69
|
+
await expect(fullView).toHaveCount(0);
|
|
70
|
+
}
|
|
71
|
+
await expect
|
|
72
|
+
.poll(
|
|
73
|
+
async () =>
|
|
74
|
+
(await page.locator("iframe[data-design-preview-iframe]").boundingBox())
|
|
75
|
+
?.width ?? 0,
|
|
76
|
+
{ timeout: 10_000 },
|
|
77
|
+
)
|
|
78
|
+
.toBeGreaterThan(600);
|
|
79
|
+
await waitForDesignBridgeReady(page);
|
|
80
|
+
}
|
|
81
|
+
|
|
51
82
|
/** Start capturing bridge postMessages on the parent window. */
|
|
52
83
|
export async function installBridge(page: Page): Promise<void> {
|
|
53
84
|
await page.evaluate(() => {
|
|
54
|
-
|
|
85
|
+
const win = window as any;
|
|
86
|
+
if (!Array.isArray(win.__bridge)) win.__bridge = [];
|
|
87
|
+
if (win.__bridgeInstalled) return;
|
|
88
|
+
win.__bridgeInstalled = true;
|
|
55
89
|
window.addEventListener("message", (e: MessageEvent) => {
|
|
56
90
|
const t = (e.data as any)?.type;
|
|
57
|
-
if (
|
|
58
|
-
|
|
91
|
+
if (
|
|
92
|
+
typeof t === "string" &&
|
|
93
|
+
(/^(element-|visual-)/.test(t) || t === "text-content-change")
|
|
94
|
+
) {
|
|
95
|
+
if (!Array.isArray(win.__bridge)) win.__bridge = [];
|
|
96
|
+
win.__bridge.push(e.data);
|
|
59
97
|
}
|
|
60
98
|
});
|
|
61
99
|
});
|
|
@@ -73,7 +111,9 @@ export async function waitForBridge(
|
|
|
73
111
|
): Promise<any> {
|
|
74
112
|
const handle = await page.waitForFunction(
|
|
75
113
|
(t) =>
|
|
76
|
-
((window as any).__bridge ?? [])
|
|
114
|
+
[...((window as any).__bridge ?? [])]
|
|
115
|
+
.reverse()
|
|
116
|
+
.find((m: any) => m.type === t) ?? null,
|
|
77
117
|
type,
|
|
78
118
|
{ timeout },
|
|
79
119
|
);
|
|
@@ -86,14 +126,85 @@ export async function waitForBridge(
|
|
|
86
126
|
* shield overlay (which is what actually drives selection).
|
|
87
127
|
*/
|
|
88
128
|
export async function selectByText(page: Page, text: string): Promise<any> {
|
|
129
|
+
await enterDirectMode(page);
|
|
89
130
|
await installBridge(page);
|
|
90
131
|
await page.evaluate(() => ((window as any).__bridge = []));
|
|
132
|
+
const target = designFrame(page).getByText(text, { exact: false }).first();
|
|
133
|
+
await target.waitFor({ state: "visible", timeout: 8_000 });
|
|
134
|
+
const box = await target.boundingBox();
|
|
135
|
+
if (!box) throw new Error(`no bounding box for "${text}"`);
|
|
136
|
+
await page.mouse.click(box.x + box.width / 2, box.y + box.height / 2);
|
|
137
|
+
let sel: any;
|
|
138
|
+
try {
|
|
139
|
+
sel = await waitForBridge(page, "element-select", 2_000);
|
|
140
|
+
} catch {
|
|
141
|
+
await page.evaluate(() => ((window as any).__bridge = []));
|
|
142
|
+
await dispatchShieldClickByText(page, text);
|
|
143
|
+
sel = await waitForBridge(page, "element-select");
|
|
144
|
+
}
|
|
145
|
+
const payload = sel?.payload ?? sel;
|
|
146
|
+
expect(String(payload?.textContent ?? "")).toContain(text);
|
|
147
|
+
return payload;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
async function dispatchShieldClickByText(
|
|
151
|
+
page: Page,
|
|
152
|
+
text: string,
|
|
153
|
+
): Promise<void> {
|
|
91
154
|
await designFrame(page)
|
|
92
|
-
.
|
|
93
|
-
.
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
155
|
+
.locator("body")
|
|
156
|
+
.evaluate((_, targetText) => {
|
|
157
|
+
const normalizeText = (element: HTMLElement) =>
|
|
158
|
+
(element.textContent ?? "").replace(/\s+/g, " ").trim();
|
|
159
|
+
const isVisible = (element: HTMLElement) => {
|
|
160
|
+
const rect = element.getBoundingClientRect();
|
|
161
|
+
const styles = window.getComputedStyle(element);
|
|
162
|
+
return (
|
|
163
|
+
rect.width > 0 &&
|
|
164
|
+
rect.height > 0 &&
|
|
165
|
+
styles.display !== "none" &&
|
|
166
|
+
styles.visibility !== "hidden"
|
|
167
|
+
);
|
|
168
|
+
};
|
|
169
|
+
const shield = document.querySelector<HTMLElement>(
|
|
170
|
+
'[data-agent-native-edit-overlay="shield"]',
|
|
171
|
+
);
|
|
172
|
+
const leafCandidates = Array.from(
|
|
173
|
+
document.querySelectorAll<HTMLElement>(
|
|
174
|
+
"h1, h2, h3, h4, h5, h6, p, button, a, label, span, input, textarea",
|
|
175
|
+
),
|
|
176
|
+
).filter(isVisible);
|
|
177
|
+
const nodeCandidates = Array.from(
|
|
178
|
+
document.querySelectorAll<HTMLElement>("[data-agent-native-node-id]"),
|
|
179
|
+
).filter(isVisible);
|
|
180
|
+
const target =
|
|
181
|
+
nodeCandidates.find(
|
|
182
|
+
(element) => normalizeText(element) === targetText,
|
|
183
|
+
) ??
|
|
184
|
+
leafCandidates.find(
|
|
185
|
+
(element) => normalizeText(element) === targetText,
|
|
186
|
+
) ??
|
|
187
|
+
nodeCandidates.find((element) =>
|
|
188
|
+
normalizeText(element).includes(targetText),
|
|
189
|
+
) ??
|
|
190
|
+
leafCandidates.find((element) =>
|
|
191
|
+
normalizeText(element).includes(targetText),
|
|
192
|
+
);
|
|
193
|
+
if (!shield || !target) {
|
|
194
|
+
throw new Error(`unable to dispatch selection for "${targetText}"`);
|
|
195
|
+
}
|
|
196
|
+
const rect = target.getBoundingClientRect();
|
|
197
|
+
shield.dispatchEvent(
|
|
198
|
+
new MouseEvent("click", {
|
|
199
|
+
bubbles: true,
|
|
200
|
+
cancelable: true,
|
|
201
|
+
view: window,
|
|
202
|
+
clientX: rect.left + rect.width / 2,
|
|
203
|
+
clientY: rect.top + rect.height / 2,
|
|
204
|
+
detail: 1,
|
|
205
|
+
}),
|
|
206
|
+
);
|
|
207
|
+
}, text);
|
|
97
208
|
}
|
|
98
209
|
|
|
99
210
|
/** Number of inputs in the right-hand inspector (proxy for "inspector populated"). */
|
|
@@ -15,6 +15,11 @@ import { defineConfig, devices } from "@playwright/test";
|
|
|
15
15
|
*/
|
|
16
16
|
const PORT = Number(process.env.E2E_PORT ?? 9333);
|
|
17
17
|
const BASE_URL = process.env.E2E_BASE_URL ?? `http://127.0.0.1:${PORT}`;
|
|
18
|
+
const E2E_DATABASE_URL = `file:${path.join(
|
|
19
|
+
import.meta.dirname,
|
|
20
|
+
"data",
|
|
21
|
+
"e2e.db",
|
|
22
|
+
)}`;
|
|
18
23
|
const BROWSER_CHANNEL = process.env.E2E_BROWSER_CHANNEL;
|
|
19
24
|
|
|
20
25
|
export default defineConfig({
|
|
@@ -47,9 +52,10 @@ export default defineConfig({
|
|
|
47
52
|
? undefined
|
|
48
53
|
: {
|
|
49
54
|
// APP_NAME + the app-prefixed DESIGN_DATABASE_URL is checked BEFORE the
|
|
50
|
-
// generic DATABASE_URL,
|
|
51
|
-
//
|
|
52
|
-
|
|
55
|
+
// generic DATABASE_URL, but set both to an absolute SQLite URL so a
|
|
56
|
+
// `.env` Postgres URL or a changed command cwd can never override this
|
|
57
|
+
// throwaway local db.
|
|
58
|
+
command: `APP_NAME=design DESIGN_DATABASE_URL=${JSON.stringify(E2E_DATABASE_URL)} DATABASE_URL=${JSON.stringify(E2E_DATABASE_URL)} PORT=${PORT} corepack pnpm dev`,
|
|
53
59
|
url: BASE_URL,
|
|
54
60
|
reuseExistingServer: !process.env.CI,
|
|
55
61
|
// Cold Vite dep-optimization on first boot can exceed two minutes.
|