@agent-native/core 0.79.27 → 0.80.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/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +34 -0
- package/corpus/core/docs/content/locales/ar-SA/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/ar-SA/template-design.mdx +55 -1
- package/corpus/core/docs/content/locales/de-DE/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/de-DE/template-design.mdx +66 -1
- package/corpus/core/docs/content/locales/es-ES/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/es-ES/template-design.mdx +65 -1
- package/corpus/core/docs/content/locales/fr-FR/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/fr-FR/template-design.mdx +64 -1
- package/corpus/core/docs/content/locales/hi-IN/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/hi-IN/template-design.mdx +59 -1
- package/corpus/core/docs/content/locales/ja-JP/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/ja-JP/template-design.mdx +62 -1
- package/corpus/core/docs/content/locales/ko-KR/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/ko-KR/template-design.mdx +58 -1
- package/corpus/core/docs/content/locales/pt-BR/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/pt-BR/template-design.mdx +62 -1
- package/corpus/core/docs/content/locales/zh-CN/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/zh-CN/template-design.mdx +50 -1
- package/corpus/core/docs/content/locales/zh-TW/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/locales/zh-TW/template-design.mdx +52 -1
- package/corpus/core/docs/content/skills-guide.mdx +5 -0
- package/corpus/core/docs/content/template-design.mdx +59 -1
- package/corpus/core/package.json +2 -1
- package/corpus/core/src/agent/engine/index.ts +1 -0
- package/corpus/core/src/agent/engine/registry.ts +40 -0
- package/corpus/core/src/agent/production-agent.ts +6 -2
- package/corpus/core/src/application-state/handlers.ts +1 -1
- package/corpus/core/src/brand-kit/index.ts +1 -1
- package/corpus/core/src/cli/design-connect.ts +490 -0
- package/corpus/core/src/cli/index.ts +16 -0
- package/corpus/core/src/cli/skills.ts +144 -3
- package/corpus/core/src/client/AgentPanel.tsx +1 -1
- package/corpus/core/src/client/AssistantChat.tsx +43 -7
- package/corpus/core/src/client/MultiTabAssistantChat.tsx +1 -1
- package/corpus/core/src/client/agent-chat.ts +27 -3
- package/corpus/core/src/client/blocks/library/MermaidBlock.tsx +1 -1
- package/corpus/core/src/client/blocks/library/diagram.tsx +2 -2
- package/corpus/core/src/client/blocks/library/wireframe.tsx +1 -1
- package/corpus/core/src/client/chat/message-components.tsx +1 -1
- package/corpus/core/src/client/chat-model-groups.ts +1 -2
- package/corpus/core/src/client/components/LiveCursorOverlay.tsx +33 -66
- package/corpus/core/src/client/composer/TiptapComposer.tsx +99 -24
- package/corpus/core/src/client/composer/useVoiceDictation.ts +429 -260
- package/corpus/core/src/client/extensions/portable-extension.ts +1 -1
- package/corpus/core/src/client/frame-protocol.ts +17 -2
- package/corpus/core/src/client/rich-markdown-editor/RegistryBlockNode.tsx +2 -2
- package/corpus/core/src/client/sharing/ShareButton.tsx +20 -15
- package/corpus/core/src/client/use-agent-engine-configured.ts +80 -28
- package/corpus/core/src/code-agents/transcript-normalizer.ts +1 -1
- package/corpus/core/src/extensions/path.ts +1 -4
- package/corpus/core/src/integrations/a2a-continuation-processor.ts +1 -1
- package/corpus/core/src/mcp/build-server.ts +1 -1
- package/corpus/core/src/org/handlers.ts +5 -5
- package/corpus/core/src/org/plugin.ts +2 -2
- package/corpus/core/src/scripts/call-agent.ts +1 -1
- package/corpus/core/src/scripts/db/safety.ts +1 -1
- package/corpus/core/src/server/auth.ts +3 -0
- package/corpus/core/src/server/builder-design-systems.ts +308 -0
- package/corpus/core/src/server/core-routes-plugin.ts +29 -3
- package/corpus/core/src/server/index.ts +8 -0
- package/corpus/core/src/server/transcribe-voice.ts +57 -22
- package/corpus/core/src/shared/mcp-embed-headers.ts +23 -1
- package/corpus/core/src/styles/agent-native.css +60 -4
- package/corpus/core/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +10 -0
- package/corpus/core/src/usage/store.ts +2 -2
- package/corpus/core/src/vite/client.ts +2 -0
- package/corpus/core/src/voice/index.ts +18 -0
- package/corpus/core/src/voice/voice-cleanup-prompt.ts +38 -0
- package/corpus/core/src/voice/voice-context.ts +217 -0
- package/corpus/core/src/voice/voice-replacements.ts +75 -0
- package/corpus/templates/analytics/AGENTS.md +4 -3
- package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +298 -15
- package/corpus/templates/analytics/actions/get-sql-dashboard.ts +9 -4
- package/corpus/templates/analytics/actions/list-session-recordings.ts +6 -1
- package/corpus/templates/analytics/actions/mutate-dashboard.ts +18 -2
- package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +12 -2
- package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +557 -400
- package/corpus/templates/analytics/app/global.css +0 -4
- package/corpus/templates/analytics/app/hooks/use-replay-storage-status.ts +66 -0
- package/corpus/templates/analytics/app/i18n/zh-TW.ts +39 -0
- package/corpus/templates/analytics/app/i18n-data.ts +424 -0
- package/corpus/templates/analytics/app/pages/Settings.tsx +333 -0
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/PanelEditorDialog.tsx +2 -1
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/dashboard-layout.ts +121 -3
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +82 -34
- package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +7 -0
- package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +144 -36
- package/corpus/templates/analytics/changelog/2026-06-28-ask-tab-now-matches-the-darker-app-background.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-28-dashboard-email-reports-now-use-cleaner-light-mode-snapshots.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-28-sessions-now-show-only-signed-in-recordings-with-playable-re.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-29-analytics-agents-can-now-place-new-charts-into-requested-das.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-29-analytics-queries-now-report-failed-source-query-errors-inst.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-29-charts-can-now-be-dropped-between-full-dashboard-rows-to-cre.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-29-dashboard-email-reports-include-the-full-dashboard-image-wit.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-29-main-surface-border-reaches-the-top.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-29-session-replay-now-records-playable-sessions-in-production-a.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-29-set-up-session-replay-storage-from-settings-connect-builder-.md +6 -0
- package/corpus/templates/analytics/scripts/cleanup-empty-session-recordings.ts +102 -0
- package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +3 -3
- package/corpus/templates/analytics/server/lib/dashboard-report.ts +75 -30
- package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +5 -2
- package/corpus/templates/analytics/server/lib/real-data-actions.ts +81 -20
- package/corpus/templates/analytics/server/lib/replay-storage.ts +79 -0
- package/corpus/templates/analytics/server/lib/s3-upload-provider.ts +255 -0
- package/corpus/templates/analytics/server/lib/session-replay.ts +53 -12
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +11 -2
- package/corpus/templates/analytics/server/plugins/onboarding.ts +97 -0
- package/corpus/templates/assets/app/components/layout/Sidebar.tsx +4 -4
- package/corpus/templates/assets/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
- package/corpus/templates/brain/app/components/layout/Layout.tsx +29 -2
- package/corpus/templates/brain/app/components/layout/Sidebar.tsx +131 -42
- package/corpus/templates/brain/app/i18n/zh-TW.ts +2 -0
- package/corpus/templates/brain/app/i18n-data.ts +20 -0
- package/corpus/templates/brain/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
- package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +29 -1
- package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +417 -299
- package/corpus/templates/calendar/app/i18n/zh-TW.ts +2 -0
- package/corpus/templates/calendar/app/i18n-data.ts +20 -0
- package/corpus/templates/calendar/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
- package/corpus/templates/chat/app/components/layout/Sidebar.tsx +6 -19
- package/corpus/templates/chat/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
- package/corpus/templates/clips/AGENTS.md +4 -0
- package/corpus/templates/clips/actions/cleanup-transcript.ts +39 -9
- package/corpus/templates/clips/actions/finalize-meeting.ts +81 -12
- package/corpus/templates/clips/actions/lib/agents-md-context.ts +4 -1
- package/corpus/templates/clips/app/components/library/library-layout.tsx +3 -3
- package/corpus/templates/clips/app/components/meetings/share-meeting-dialog.tsx +1 -1
- package/corpus/templates/clips/app/components/player/share-dialog.tsx +2 -2
- package/corpus/templates/clips/changelog/2026-06-28-left-sidebar-footer-controls-use-less-divider-chrome.md +6 -0
- package/corpus/templates/clips/desktop/src/lib/personal-vocabulary.ts +13 -8
- package/corpus/templates/clips/desktop/src/lib/recorder.ts +24 -0
- package/corpus/templates/clips/desktop/src/lib/transcription-capture.ts +105 -5
- package/corpus/templates/clips/desktop/src/lib/voice-dictation.ts +60 -1
- package/corpus/templates/content/actions/set-image-alt-text.ts +1 -1
- package/corpus/templates/content/app/components/editor/DocumentDatabase.tsx +1 -1
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +1 -1
- package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +5 -5
- package/corpus/templates/content/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
- package/corpus/templates/content/shared/document-export.ts +1 -1
- package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +8 -18
- package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +154 -0
- package/corpus/templates/design/AGENTS.md +95 -5
- package/corpus/templates/design/DESIGN.md +82 -0
- package/corpus/templates/design/DEVELOPING.md +43 -0
- package/corpus/templates/design/actions/add-localhost-screens.ts +453 -0
- package/corpus/templates/design/actions/apply-shader.ts +277 -0
- package/corpus/templates/design/actions/apply-visual-edit.ts +303 -0
- package/corpus/templates/design/actions/connect-localhost.ts +183 -0
- package/corpus/templates/design/actions/edit-design.ts +195 -42
- package/corpus/templates/design/actions/generate-design.ts +71 -1
- package/corpus/templates/design/actions/generate-screens.ts +193 -0
- package/corpus/templates/design/actions/get-code-layer-projection.ts +191 -0
- package/corpus/templates/design/actions/get-shader.ts +119 -0
- package/corpus/templates/design/actions/index-design-system-with-builder.ts +259 -0
- package/corpus/templates/design/actions/list-localhost-connections.ts +95 -0
- package/corpus/templates/design/actions/navigate.ts +55 -2
- package/corpus/templates/design/actions/update-file.ts +9 -2
- package/corpus/templates/design/actions/view-screen.ts +68 -1
- package/corpus/templates/design/agent-native.app-skill.json +10 -0
- package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +719 -0
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +2120 -103
- package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +74 -38
- package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +401 -0
- package/corpus/templates/design/app/components/design/EditPanel.tsx +3966 -440
- package/corpus/templates/design/app/components/design/LayersPanel.tsx +1473 -0
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +3940 -147
- package/corpus/templates/design/app/components/design/QuestionFlow.tsx +700 -13
- package/corpus/templates/design/app/components/design/TweaksPanel.tsx +105 -63
- package/corpus/templates/design/app/components/design/index.ts +0 -5
- package/corpus/templates/design/app/components/design/inspector/AlignmentMatrix.tsx +353 -0
- package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +1589 -0
- package/corpus/templates/design/app/components/design/inspector/ConstraintsWidget.tsx +511 -0
- package/corpus/templates/design/app/components/design/inspector/ExportSettingsPanel.tsx +395 -0
- package/corpus/templates/design/app/components/design/inspector/FigmaColorPicker.tsx +2010 -0
- package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +601 -0
- package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +242 -0
- package/corpus/templates/design/app/components/design/inspector/SHADER_INTEGRATION.md +420 -0
- package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +238 -0
- package/corpus/templates/design/app/components/design/inspector/ShaderControls.stories.tsx +71 -0
- package/corpus/templates/design/app/components/design/inspector/ShaderControls.tsx +575 -0
- package/corpus/templates/design/app/components/design/inspector/ShaderEffectRow.tsx +106 -0
- package/corpus/templates/design/app/components/design/inspector/ShaderFillsPanel.tsx +423 -0
- package/corpus/templates/design/app/components/design/inspector/figma-icons.tsx +741 -0
- package/corpus/templates/design/app/components/design/inspector/index.ts +87 -0
- package/corpus/templates/design/app/components/design/inspector/scrub-input-utils.ts +201 -0
- package/corpus/templates/design/app/components/design/types.ts +23 -0
- package/corpus/templates/design/app/components/layout/Layout.tsx +24 -13
- package/corpus/templates/design/app/components/layout/Sidebar.tsx +4 -4
- package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +474 -36
- package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +22 -5
- package/corpus/templates/design/app/components/visual-editor/SaveStatusIndicator.tsx +24 -11
- package/corpus/templates/design/app/global.css +149 -5
- package/corpus/templates/design/app/hooks/use-agent-generating.ts +4 -0
- package/corpus/templates/design/app/hooks/use-navigation-state.ts +130 -8
- package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +329 -0
- package/corpus/templates/design/app/i18n/zh-TW.ts +277 -0
- package/corpus/templates/design/app/i18n-data.ts +3028 -1
- package/corpus/templates/design/app/pages/DesignEditor.tsx +5831 -904
- package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +57 -221
- package/corpus/templates/design/changelog/2026-06-28-annotate-mode-now-combines-drawing-and-comment-pins-in-one-c.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-design-editor-panel-borders-are-cleaner-so-the-canvas-edge-s.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-drawing-prompts-now-reliably-open-and-submit-to-the-design-a.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-editor-app-menus-now-use-an-outline-agent-native-mark-with-b.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-figma-style-code-design-mode.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-layer-selection-now-updates-chat-context-without-opening-the.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-layer-selections-now-preserve-hidden-and-locked-canvas-state.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-live-cursors-now-keep-names-beside-a-cleaner-pointer-marker.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-mode-switching-now-lives-in-a-compact-bottom-right-icon-dock.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-screen-overview-now-handles-zooming-drawing-opening-and-dele.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-screen-overview-now-selects-screens-on-click-and-opens-them-.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-screen-overview-zooms-into-the-active-screen-with-smoother-e.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-selected-element-chips-in-chat-are-shorter-and-easier-to-sca.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-the-design-editor-toolbar-is-more-compact-and-the-app-menu-m.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-tweaks-now-live-at-the-top-of-the-design-sidebar-instead-of-.md +6 -0
- package/corpus/templates/design/changelog/2026-06-28-tweaks-now-live-in-the-right-inspector-beside-the-design-tab.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-active-sidebar-rows-use-soft-highlights.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-agents-can-now-open-screen-overview-focus-screens-and-add.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-canvas-selection-no-longer-flashes-broken-prototype-html-whe.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-command-menu-selections-are-clearer-in-dark-mode.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-design-agents-now-edit-broad-copy-changes-more-reliably.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-design-editor-extensions-now-run-inline-beside-the-artboard.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-design-mode-top-chrome-now-groups-collaborators-preview-shar.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-element-selection-now-stays-on-the-intended-layer-after-sele.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-screen-overview-full-view-controls-now-sit-above-frames-inst.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-screen-overview-tools-can-draw-shapes-create-screens-and-kee.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-sidebars-use-darker-chrome-and-chat-warns-immediately.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-the-pen-tool-now-creates-anchor-based-bezier-vectors-with-ha.md +6 -0
- package/corpus/templates/design/changelog/2026-06-29-visual-edit-can-open-localhost-routes-as-url-backed-screens.md +6 -0
- package/corpus/templates/design/package.json +1 -0
- package/corpus/templates/design/server/db/schema.ts +26 -0
- package/corpus/templates/design/server/handlers/import-figma-system.ts +38 -85
- package/corpus/templates/design/server/lib/design-snapshot.ts +9 -1
- package/corpus/templates/design/server/plugins/agent-chat.ts +3 -0
- package/corpus/templates/design/shared/api.ts +27 -0
- package/corpus/templates/design/shared/canvas-frames.ts +103 -0
- package/corpus/templates/design/shared/canvas-math.ts +1058 -0
- package/corpus/templates/design/shared/code-layer.ts +2412 -0
- package/corpus/templates/design/shared/color-utils.ts +180 -0
- package/corpus/templates/design/shared/generation-session.ts +61 -0
- package/corpus/templates/design/shared/html-content.ts +21 -0
- package/corpus/templates/design/shared/pen-path.ts +207 -0
- package/corpus/templates/design/shared/shader-presets.ts +782 -0
- package/corpus/templates/design/shared/shader-safety.ts +137 -0
- package/corpus/templates/design/shared/source-mode.ts +237 -0
- package/corpus/templates/forms/app/components/layout/Sidebar.tsx +149 -6
- package/corpus/templates/forms/app/i18n/ar-SA.ts +2 -0
- package/corpus/templates/forms/app/i18n/de-DE.ts +2 -0
- package/corpus/templates/forms/app/i18n/en-US.ts +2 -0
- package/corpus/templates/forms/app/i18n/es-ES.ts +2 -0
- package/corpus/templates/forms/app/i18n/fr-FR.ts +2 -0
- package/corpus/templates/forms/app/i18n/hi-IN.ts +2 -0
- package/corpus/templates/forms/app/i18n/ja-JP.ts +2 -0
- package/corpus/templates/forms/app/i18n/ko-KR.ts +2 -0
- package/corpus/templates/forms/app/i18n/pt-BR.ts +2 -0
- package/corpus/templates/forms/app/i18n/zh-CN.ts +2 -0
- package/corpus/templates/forms/app/i18n/zh-TW.ts +2 -0
- package/corpus/templates/forms/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
- package/corpus/templates/macros/app/components/layout/AppLayout.tsx +2 -2
- package/corpus/templates/macros/changelog/2026-06-28-left-sidebar-footer-controls-use-less-divider-chrome.md +6 -0
- package/corpus/templates/mail/app/components/layout/AppLayout.tsx +408 -247
- package/corpus/templates/mail/app/i18n/ar-SA.ts +4 -0
- package/corpus/templates/mail/app/i18n/de-DE.ts +4 -0
- package/corpus/templates/mail/app/i18n/en-US.ts +4 -0
- package/corpus/templates/mail/app/i18n/es-ES.ts +4 -0
- package/corpus/templates/mail/app/i18n/fr-FR.ts +4 -0
- package/corpus/templates/mail/app/i18n/hi-IN.ts +4 -0
- package/corpus/templates/mail/app/i18n/ja-JP.ts +4 -0
- package/corpus/templates/mail/app/i18n/ko-KR.ts +4 -0
- package/corpus/templates/mail/app/i18n/pt-BR.ts +4 -0
- package/corpus/templates/mail/app/i18n/zh-CN.ts +4 -0
- package/corpus/templates/mail/app/i18n/zh-TW.ts +4 -0
- package/corpus/templates/mail/app/lib/utils.ts +2 -2
- package/corpus/templates/mail/changelog/2026-06-28-pinned-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
- package/corpus/templates/plan/app/components/layout/Sidebar.tsx +6 -8
- package/corpus/templates/plan/app/components/plan/wireframe/Wireframe.tsx +1 -1
- package/corpus/templates/plan/app/global.css +61 -78
- package/corpus/templates/plan/app/pages/PlansPage.tsx +8 -0
- package/corpus/templates/plan/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
- package/corpus/templates/plan/changelog/2026-06-28-plans-use-the-shared-neutral-light-and-dark-theme.md +6 -0
- package/corpus/templates/plan/changelog/2026-06-28-sending-open-feedback-from-a-plan-now-opens-the-inline-plan-.md +6 -0
- package/corpus/templates/slides/.agents/skills/design-systems/SKILL.md +9 -10
- package/corpus/templates/slides/AGENTS.md +3 -2
- package/corpus/templates/slides/actions/import-file.ts +26 -17
- package/corpus/templates/slides/actions/index-design-system-with-builder.ts +259 -0
- package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +35 -167
- package/corpus/templates/slides/app/components/design-system/fig-import-response.ts +9 -13
- package/corpus/templates/slides/app/components/layout/Sidebar.tsx +5 -5
- package/corpus/templates/slides/app/context/DeckContext.tsx +1 -1
- package/corpus/templates/slides/app/i18n/ar-SA.ts +9 -37
- package/corpus/templates/slides/app/i18n/de-DE.ts +10 -25
- package/corpus/templates/slides/app/i18n/en-US.ts +9 -26
- package/corpus/templates/slides/app/i18n/es-ES.ts +10 -28
- package/corpus/templates/slides/app/i18n/fr-FR.ts +10 -28
- package/corpus/templates/slides/app/i18n/hi-IN.ts +9 -26
- package/corpus/templates/slides/app/i18n/ja-JP.ts +10 -22
- package/corpus/templates/slides/app/i18n/ko-KR.ts +9 -23
- package/corpus/templates/slides/app/i18n/pt-BR.ts +10 -28
- package/corpus/templates/slides/app/i18n/zh-CN.ts +9 -22
- package/corpus/templates/slides/app/i18n/zh-TW.ts +9 -22
- package/corpus/templates/slides/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
- package/corpus/templates/slides/server/handlers/import-figma-system.ts +44 -12
- package/corpus/templates/slides/server/lib/chat-attachments.ts +1 -1
- package/corpus/templates/videos/app/components/NewCompositionPopover.tsx +1 -1
- package/corpus/templates/videos/app/components/Sidebar.tsx +2 -2
- package/corpus/templates/videos/app/components/layout/Layout.tsx +29 -2
- package/corpus/templates/videos/app/components/layout/NavSidebar.tsx +113 -30
- package/corpus/templates/videos/app/i18n/ar-SA.ts +2 -0
- package/corpus/templates/videos/app/i18n/de-DE.ts +2 -0
- package/corpus/templates/videos/app/i18n/en-US.ts +2 -0
- package/corpus/templates/videos/app/i18n/es-ES.ts +2 -0
- package/corpus/templates/videos/app/i18n/fr-FR.ts +2 -0
- package/corpus/templates/videos/app/i18n/hi-IN.ts +2 -0
- package/corpus/templates/videos/app/i18n/ja-JP.ts +2 -0
- package/corpus/templates/videos/app/i18n/ko-KR.ts +2 -0
- package/corpus/templates/videos/app/i18n/pt-BR.ts +2 -0
- package/corpus/templates/videos/app/i18n/zh-CN.ts +2 -0
- package/corpus/templates/videos/app/i18n/zh-TW.ts +2 -0
- package/corpus/templates/videos/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +6 -0
- package/dist/agent/engine/index.d.ts +1 -1
- package/dist/agent/engine/index.d.ts.map +1 -1
- package/dist/agent/engine/index.js +1 -1
- package/dist/agent/engine/index.js.map +1 -1
- package/dist/agent/engine/registry.d.ts +9 -0
- package/dist/agent/engine/registry.d.ts.map +1 -1
- package/dist/agent/engine/registry.js +37 -0
- package/dist/agent/engine/registry.js.map +1 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +4 -3
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/application-state/handlers.js +1 -1
- package/dist/application-state/handlers.js.map +1 -1
- package/dist/brand-kit/index.d.ts +1 -1
- package/dist/brand-kit/index.js +1 -1
- package/dist/brand-kit/index.js.map +1 -1
- package/dist/cli/design-connect.d.ts +52 -0
- package/dist/cli/design-connect.d.ts.map +1 -0
- package/dist/cli/design-connect.js +409 -0
- package/dist/cli/design-connect.js.map +1 -0
- package/dist/cli/index.js +15 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/skills.d.ts +3 -0
- package/dist/cli/skills.d.ts.map +1 -1
- package/dist/cli/skills.js +139 -3
- package/dist/cli/skills.js.map +1 -1
- package/dist/client/AgentPanel.js +1 -1
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +38 -8
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +1 -1
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/agent-chat.d.ts +6 -0
- package/dist/client/agent-chat.d.ts.map +1 -1
- package/dist/client/agent-chat.js +17 -3
- package/dist/client/agent-chat.js.map +1 -1
- package/dist/client/blocks/library/MermaidBlock.js +1 -1
- package/dist/client/blocks/library/MermaidBlock.js.map +1 -1
- package/dist/client/blocks/library/diagram.js +1 -1
- package/dist/client/blocks/library/diagram.js.map +1 -1
- package/dist/client/blocks/library/wireframe.js +1 -1
- package/dist/client/blocks/library/wireframe.js.map +1 -1
- package/dist/client/chat/message-components.js +1 -1
- package/dist/client/chat/message-components.js.map +1 -1
- package/dist/client/chat-model-groups.d.ts.map +1 -1
- package/dist/client/chat-model-groups.js +1 -2
- package/dist/client/chat-model-groups.js.map +1 -1
- package/dist/client/components/LiveCursorOverlay.d.ts +1 -2
- package/dist/client/components/LiveCursorOverlay.d.ts.map +1 -1
- package/dist/client/components/LiveCursorOverlay.js +19 -40
- package/dist/client/components/LiveCursorOverlay.js.map +1 -1
- package/dist/client/composer/TiptapComposer.d.ts +3 -1
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +86 -24
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/composer/useVoiceDictation.d.ts +9 -0
- package/dist/client/composer/useVoiceDictation.d.ts.map +1 -1
- package/dist/client/composer/useVoiceDictation.js +154 -32
- package/dist/client/composer/useVoiceDictation.js.map +1 -1
- package/dist/client/extensions/portable-extension.d.ts +1 -1
- package/dist/client/extensions/portable-extension.d.ts.map +1 -1
- package/dist/client/extensions/portable-extension.js.map +1 -1
- package/dist/client/frame-protocol.d.ts +17 -2
- package/dist/client/frame-protocol.d.ts.map +1 -1
- package/dist/client/frame-protocol.js.map +1 -1
- package/dist/client/rich-markdown-editor/RegistryBlockNode.js +2 -2
- package/dist/client/rich-markdown-editor/RegistryBlockNode.js.map +1 -1
- package/dist/client/sharing/ShareButton.d.ts +2 -0
- package/dist/client/sharing/ShareButton.d.ts.map +1 -1
- package/dist/client/sharing/ShareButton.js +7 -6
- package/dist/client/sharing/ShareButton.js.map +1 -1
- package/dist/client/use-agent-engine-configured.d.ts +5 -0
- package/dist/client/use-agent-engine-configured.d.ts.map +1 -1
- package/dist/client/use-agent-engine-configured.js +51 -25
- package/dist/client/use-agent-engine-configured.js.map +1 -1
- package/dist/code-agents/transcript-normalizer.js +1 -1
- package/dist/code-agents/transcript-normalizer.js.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/extensions/path.d.ts +1 -1
- package/dist/extensions/path.d.ts.map +1 -1
- package/dist/extensions/path.js.map +1 -1
- package/dist/file-upload/actions/upload-image.d.ts +2 -2
- package/dist/integrations/a2a-continuation-processor.js +1 -1
- package/dist/integrations/a2a-continuation-processor.js.map +1 -1
- package/dist/mcp/build-server.d.ts +1 -1
- package/dist/mcp/build-server.d.ts.map +1 -1
- package/dist/mcp/build-server.js.map +1 -1
- package/dist/notifications/routes.d.ts +3 -3
- package/dist/observability/routes.d.ts +5 -5
- package/dist/org/handlers.js +5 -5
- package/dist/org/handlers.js.map +1 -1
- package/dist/org/plugin.js +2 -2
- package/dist/org/plugin.js.map +1 -1
- package/dist/scripts/call-agent.js +1 -1
- package/dist/scripts/call-agent.js.map +1 -1
- package/dist/scripts/db/safety.js +1 -1
- package/dist/scripts/db/safety.js.map +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +3 -0
- package/dist/server/auth.js.map +1 -1
- package/dist/server/builder-design-systems.d.ts +28 -0
- package/dist/server/builder-design-systems.d.ts.map +1 -0
- package/dist/server/builder-design-systems.js +217 -0
- package/dist/server/builder-design-systems.js.map +1 -0
- package/dist/server/core-routes-plugin.d.ts +1 -0
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +20 -3
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/server/transcribe-voice.d.ts.map +1 -1
- package/dist/server/transcribe-voice.js +40 -24
- package/dist/server/transcribe-voice.js.map +1 -1
- package/dist/shared/mcp-embed-headers.d.ts +1 -0
- package/dist/shared/mcp-embed-headers.d.ts.map +1 -1
- package/dist/shared/mcp-embed-headers.js +20 -1
- package/dist/shared/mcp-embed-headers.js.map +1 -1
- package/dist/styles/agent-native.css +60 -4
- package/dist/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +10 -0
- package/dist/usage/store.js +2 -2
- package/dist/usage/store.js.map +1 -1
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +2 -0
- package/dist/vite/client.js.map +1 -1
- package/dist/voice/index.d.ts +5 -0
- package/dist/voice/index.d.ts.map +1 -0
- package/dist/voice/index.js +4 -0
- package/dist/voice/index.js.map +1 -0
- package/dist/voice/voice-cleanup-prompt.d.ts +6 -0
- package/dist/voice/voice-cleanup-prompt.d.ts.map +1 -0
- package/dist/voice/voice-cleanup-prompt.js +26 -0
- package/dist/voice/voice-cleanup-prompt.js.map +1 -0
- package/dist/voice/voice-context.d.ts +25 -0
- package/dist/voice/voice-context.d.ts.map +1 -0
- package/dist/voice/voice-context.js +156 -0
- package/dist/voice/voice-context.js.map +1 -0
- package/dist/voice/voice-replacements.d.ts +4 -0
- package/dist/voice/voice-replacements.d.ts.map +1 -0
- package/dist/voice/voice-replacements.js +52 -0
- package/dist/voice/voice-replacements.js.map +1 -0
- package/docs/content/locales/ar-SA/skills-guide.mdx +5 -0
- package/docs/content/locales/ar-SA/template-design.mdx +55 -1
- package/docs/content/locales/de-DE/skills-guide.mdx +5 -0
- package/docs/content/locales/de-DE/template-design.mdx +66 -1
- package/docs/content/locales/es-ES/skills-guide.mdx +5 -0
- package/docs/content/locales/es-ES/template-design.mdx +65 -1
- package/docs/content/locales/fr-FR/skills-guide.mdx +5 -0
- package/docs/content/locales/fr-FR/template-design.mdx +64 -1
- package/docs/content/locales/hi-IN/skills-guide.mdx +5 -0
- package/docs/content/locales/hi-IN/template-design.mdx +59 -1
- package/docs/content/locales/ja-JP/skills-guide.mdx +5 -0
- package/docs/content/locales/ja-JP/template-design.mdx +62 -1
- package/docs/content/locales/ko-KR/skills-guide.mdx +5 -0
- package/docs/content/locales/ko-KR/template-design.mdx +58 -1
- package/docs/content/locales/pt-BR/skills-guide.mdx +5 -0
- package/docs/content/locales/pt-BR/template-design.mdx +62 -1
- package/docs/content/locales/zh-CN/skills-guide.mdx +5 -0
- package/docs/content/locales/zh-CN/template-design.mdx +50 -1
- package/docs/content/locales/zh-TW/skills-guide.mdx +5 -0
- package/docs/content/locales/zh-TW/template-design.mdx +52 -1
- package/docs/content/skills-guide.mdx +5 -0
- package/docs/content/template-design.mdx +59 -1
- package/package.json +2 -1
- package/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +10 -0
- package/corpus/templates/design/actions/import-figma-file.ts +0 -166
- package/corpus/templates/design/app/components/design/DesignToolbar.tsx +0 -339
- package/corpus/templates/design/app/components/design/PresentMode.tsx +0 -68
- package/corpus/templates/design/app/components/design/ViewportTabs.tsx +0 -149
- package/corpus/templates/design/app/components/design/ZoomControls.tsx +0 -157
- package/corpus/templates/slides/server/lib/fig-design-system.ts +0 -110
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import { defineAction } from "@agent-native/core";
|
|
2
|
+
import {
|
|
3
|
+
startBuilderDesignSystemIndex,
|
|
4
|
+
type BuilderDesignSystemIndexFile,
|
|
5
|
+
} from "@agent-native/core/server";
|
|
6
|
+
import {
|
|
7
|
+
getRequestOrgId,
|
|
8
|
+
getRequestUserEmail,
|
|
9
|
+
} from "@agent-native/core/server/request-context";
|
|
10
|
+
import { eq } from "drizzle-orm";
|
|
11
|
+
import { nanoid } from "nanoid";
|
|
12
|
+
import { z } from "zod";
|
|
13
|
+
|
|
14
|
+
import { getDb, schema } from "../server/db/index.js";
|
|
15
|
+
|
|
16
|
+
const MAX_CODE_FILES = 50;
|
|
17
|
+
const MAX_TOTAL_CODE_BYTES = 2 * 1024 * 1024;
|
|
18
|
+
|
|
19
|
+
const codeFileSchema = z.object({
|
|
20
|
+
filename: z.string().trim().min(1).describe("File name or relative path"),
|
|
21
|
+
content: z.string().describe("Raw text content of the code/design file"),
|
|
22
|
+
mimeType: z.string().trim().optional().describe("Optional MIME type"),
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
function mimeTypeForFilename(filename: string, explicit?: string): string {
|
|
26
|
+
if (explicit?.trim()) return explicit.trim();
|
|
27
|
+
const lower = filename.toLowerCase();
|
|
28
|
+
if (lower.endsWith(".css")) return "text/css";
|
|
29
|
+
if (lower.endsWith(".json")) return "application/json";
|
|
30
|
+
if (lower.endsWith(".md") || lower.endsWith(".mdx")) return "text/markdown";
|
|
31
|
+
if (lower.endsWith(".html")) return "text/html";
|
|
32
|
+
if (lower.endsWith(".svg")) return "image/svg+xml";
|
|
33
|
+
return "text/plain";
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function makeFiles(
|
|
37
|
+
codeFiles: Array<z.infer<typeof codeFileSchema>> | undefined,
|
|
38
|
+
): BuilderDesignSystemIndexFile[] {
|
|
39
|
+
const encoder = new TextEncoder();
|
|
40
|
+
const files: BuilderDesignSystemIndexFile[] = [];
|
|
41
|
+
let totalBytes = 0;
|
|
42
|
+
for (const file of (codeFiles ?? []).slice(0, MAX_CODE_FILES)) {
|
|
43
|
+
const data = encoder.encode(file.content);
|
|
44
|
+
if (totalBytes + data.byteLength > MAX_TOTAL_CODE_BYTES) break;
|
|
45
|
+
totalBytes += data.byteLength;
|
|
46
|
+
files.push({
|
|
47
|
+
name: file.filename.replace(/^\/+/, "") || "code.txt",
|
|
48
|
+
data,
|
|
49
|
+
mimeType: mimeTypeForFilename(file.filename, file.mimeType),
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
return files;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function localBuilderDesignSystemId(builderDesignSystemId: string): string {
|
|
56
|
+
const slug = builderDesignSystemId
|
|
57
|
+
.replace(/[^a-zA-Z0-9_-]+/g, "-")
|
|
58
|
+
.replace(/^-+|-+$/g, "")
|
|
59
|
+
.slice(0, 96);
|
|
60
|
+
return `builder-${slug || "design-system"}`;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function builderProxyData({
|
|
64
|
+
builderDesignSystemId,
|
|
65
|
+
jobId,
|
|
66
|
+
builderUrl,
|
|
67
|
+
projectName,
|
|
68
|
+
description,
|
|
69
|
+
}: {
|
|
70
|
+
builderDesignSystemId: string;
|
|
71
|
+
jobId: string;
|
|
72
|
+
builderUrl: string;
|
|
73
|
+
projectName?: string;
|
|
74
|
+
description?: string;
|
|
75
|
+
}) {
|
|
76
|
+
return JSON.stringify({
|
|
77
|
+
source: "builder",
|
|
78
|
+
builderDesignSystemId,
|
|
79
|
+
builderJobId: jobId,
|
|
80
|
+
builderUrl,
|
|
81
|
+
colors: {
|
|
82
|
+
primary: "var(--primary)",
|
|
83
|
+
secondary: "var(--secondary)",
|
|
84
|
+
accent: "var(--accent)",
|
|
85
|
+
background: "var(--background)",
|
|
86
|
+
surface: "var(--card)",
|
|
87
|
+
text: "var(--foreground)",
|
|
88
|
+
textMuted: "var(--muted-foreground)",
|
|
89
|
+
},
|
|
90
|
+
typography: {
|
|
91
|
+
headingFont: "inherit",
|
|
92
|
+
bodyFont: "inherit",
|
|
93
|
+
headingWeight: "700",
|
|
94
|
+
bodyWeight: "400",
|
|
95
|
+
headingSizes: { h1: "48px", h2: "32px", h3: "24px" },
|
|
96
|
+
},
|
|
97
|
+
spacing: { elementGap: "24px", pagePadding: "48px" },
|
|
98
|
+
borders: { radius: "12px", accentWidth: "1px" },
|
|
99
|
+
logos: [],
|
|
100
|
+
notes: [
|
|
101
|
+
"This is a local proxy for a Builder-indexed design system.",
|
|
102
|
+
`Builder design system id: ${builderDesignSystemId}`,
|
|
103
|
+
`Builder indexing job id: ${jobId}`,
|
|
104
|
+
`Builder URL: ${builderUrl}`,
|
|
105
|
+
projectName ? `Requested name: ${projectName}` : "",
|
|
106
|
+
description ? `Context: ${description}` : "",
|
|
107
|
+
"Use Builder as the source of truth for extracted tokens and guidance.",
|
|
108
|
+
]
|
|
109
|
+
.filter(Boolean)
|
|
110
|
+
.join("\n"),
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function builderProxyInstructions({
|
|
115
|
+
builderDesignSystemId,
|
|
116
|
+
jobId,
|
|
117
|
+
builderUrl,
|
|
118
|
+
}: {
|
|
119
|
+
builderDesignSystemId: string;
|
|
120
|
+
jobId: string;
|
|
121
|
+
builderUrl: string;
|
|
122
|
+
}) {
|
|
123
|
+
return [
|
|
124
|
+
"This design system is indexed and owned by Builder.",
|
|
125
|
+
`Builder design system id: ${builderDesignSystemId}`,
|
|
126
|
+
`Builder job id: ${jobId}`,
|
|
127
|
+
`Builder URL: ${builderUrl}`,
|
|
128
|
+
"When generating designs, treat Builder as the source of truth for the final extracted tokens, assets, and guidance.",
|
|
129
|
+
].join("\n");
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export default defineAction({
|
|
133
|
+
description:
|
|
134
|
+
"Start Builder design-system indexing from a GitHub repository and/or code files. " +
|
|
135
|
+
"Use this instead of local import-code/import-github when the user wants a reusable brand kit or design system. " +
|
|
136
|
+
"Requires Builder.io to be connected; Builder owns the indexed design-system docs, generated guidance, and job state.",
|
|
137
|
+
schema: z.object({
|
|
138
|
+
projectName: z
|
|
139
|
+
.string()
|
|
140
|
+
.optional()
|
|
141
|
+
.describe("Optional Builder project/design-system name"),
|
|
142
|
+
description: z
|
|
143
|
+
.string()
|
|
144
|
+
.optional()
|
|
145
|
+
.describe("Additional brand context or instructions for Builder"),
|
|
146
|
+
githubRepoUrl: z
|
|
147
|
+
.string()
|
|
148
|
+
.optional()
|
|
149
|
+
.describe("GitHub repository URL to index with Builder"),
|
|
150
|
+
connectedProjectId: z
|
|
151
|
+
.string()
|
|
152
|
+
.optional()
|
|
153
|
+
.describe("Optional existing Builder project id to attach indexing to"),
|
|
154
|
+
codeFiles: z
|
|
155
|
+
.array(codeFileSchema)
|
|
156
|
+
.optional()
|
|
157
|
+
.describe("Optional inlined code/design files to upload to Builder"),
|
|
158
|
+
}),
|
|
159
|
+
run: async ({
|
|
160
|
+
projectName,
|
|
161
|
+
description,
|
|
162
|
+
githubRepoUrl,
|
|
163
|
+
connectedProjectId,
|
|
164
|
+
codeFiles,
|
|
165
|
+
}) => {
|
|
166
|
+
const files = makeFiles(codeFiles);
|
|
167
|
+
const result = await startBuilderDesignSystemIndex({
|
|
168
|
+
projectName,
|
|
169
|
+
description,
|
|
170
|
+
githubRepoUrl,
|
|
171
|
+
connectedProjectId,
|
|
172
|
+
files,
|
|
173
|
+
});
|
|
174
|
+
const ownerEmail = getRequestUserEmail();
|
|
175
|
+
if (!ownerEmail) throw new Error("no authenticated user");
|
|
176
|
+
|
|
177
|
+
const db = getDb();
|
|
178
|
+
const now = new Date().toISOString();
|
|
179
|
+
const orgId = getRequestOrgId();
|
|
180
|
+
const baseLocalDesignSystemId = localBuilderDesignSystemId(
|
|
181
|
+
result.designSystemId,
|
|
182
|
+
);
|
|
183
|
+
const title = projectName?.trim() || "Builder indexed design system";
|
|
184
|
+
const localData = builderProxyData({
|
|
185
|
+
builderDesignSystemId: result.designSystemId,
|
|
186
|
+
jobId: result.jobId,
|
|
187
|
+
builderUrl: result.builderUrl,
|
|
188
|
+
projectName,
|
|
189
|
+
description,
|
|
190
|
+
});
|
|
191
|
+
const customInstructions = builderProxyInstructions({
|
|
192
|
+
builderDesignSystemId: result.designSystemId,
|
|
193
|
+
jobId: result.jobId,
|
|
194
|
+
builderUrl: result.builderUrl,
|
|
195
|
+
});
|
|
196
|
+
const [existing] = await db
|
|
197
|
+
.select({
|
|
198
|
+
id: schema.designSystems.id,
|
|
199
|
+
ownerEmail: schema.designSystems.ownerEmail,
|
|
200
|
+
})
|
|
201
|
+
.from(schema.designSystems)
|
|
202
|
+
.where(eq(schema.designSystems.id, baseLocalDesignSystemId))
|
|
203
|
+
.limit(1);
|
|
204
|
+
const localDesignSystemId =
|
|
205
|
+
existing && existing.ownerEmail !== ownerEmail
|
|
206
|
+
? `${baseLocalDesignSystemId}-${nanoid(8)}`
|
|
207
|
+
: baseLocalDesignSystemId;
|
|
208
|
+
if (existing && existing.ownerEmail === ownerEmail) {
|
|
209
|
+
await db
|
|
210
|
+
.update(schema.designSystems)
|
|
211
|
+
.set({
|
|
212
|
+
title,
|
|
213
|
+
description:
|
|
214
|
+
description ??
|
|
215
|
+
`Builder indexed design system ${result.designSystemId}`,
|
|
216
|
+
data: localData,
|
|
217
|
+
assets: "[]",
|
|
218
|
+
customInstructions,
|
|
219
|
+
updatedAt: now,
|
|
220
|
+
})
|
|
221
|
+
.where(eq(schema.designSystems.id, existing.id));
|
|
222
|
+
} else {
|
|
223
|
+
const [ownedSystem] = await db
|
|
224
|
+
.select({ id: schema.designSystems.id })
|
|
225
|
+
.from(schema.designSystems)
|
|
226
|
+
.where(eq(schema.designSystems.ownerEmail, ownerEmail))
|
|
227
|
+
.limit(1);
|
|
228
|
+
await db.insert(schema.designSystems).values({
|
|
229
|
+
id: localDesignSystemId,
|
|
230
|
+
title,
|
|
231
|
+
description:
|
|
232
|
+
description ??
|
|
233
|
+
`Builder indexed design system ${result.designSystemId}`,
|
|
234
|
+
data: localData,
|
|
235
|
+
assets: "[]",
|
|
236
|
+
customInstructions,
|
|
237
|
+
isDefault: !ownedSystem,
|
|
238
|
+
ownerEmail,
|
|
239
|
+
orgId,
|
|
240
|
+
createdAt: now,
|
|
241
|
+
updatedAt: now,
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
return {
|
|
246
|
+
...result,
|
|
247
|
+
localDesignSystemId,
|
|
248
|
+
uploadedFileCount: files.length,
|
|
249
|
+
instructions: [
|
|
250
|
+
"Builder design-system indexing has started.",
|
|
251
|
+
`Builder design system: ${result.designSystemId}`,
|
|
252
|
+
`Local selectable design system: ${localDesignSystemId}`,
|
|
253
|
+
`Builder job: ${result.jobId}`,
|
|
254
|
+
`Open: ${result.builderUrl}`,
|
|
255
|
+
"Use the local design system id in Design flows; Builder remains the source of truth for the indexed brand kit.",
|
|
256
|
+
].join("\n"),
|
|
257
|
+
};
|
|
258
|
+
},
|
|
259
|
+
});
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { defineAction } from "@agent-native/core";
|
|
2
|
+
import {
|
|
3
|
+
getRequestOrgId,
|
|
4
|
+
getRequestUserEmail,
|
|
5
|
+
} from "@agent-native/core/server/request-context";
|
|
6
|
+
import { and, desc, eq, isNull } from "drizzle-orm";
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
|
|
9
|
+
import { getDb, schema } from "../server/db/index.js";
|
|
10
|
+
import type {
|
|
11
|
+
DesignBridgeCapability,
|
|
12
|
+
LocalhostDesignRouteManifest,
|
|
13
|
+
} from "../shared/source-mode.js";
|
|
14
|
+
|
|
15
|
+
function parseJson<T>(value: string, fallback: T): T {
|
|
16
|
+
try {
|
|
17
|
+
return JSON.parse(value) as T;
|
|
18
|
+
} catch {
|
|
19
|
+
return fallback;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export default defineAction({
|
|
24
|
+
description:
|
|
25
|
+
"List localhost Design source connections for the current user. Use this before creating localhost artboards or resolving local routes.",
|
|
26
|
+
schema: z.object({
|
|
27
|
+
id: z.string().optional().describe("Optional connection ID filter."),
|
|
28
|
+
status: z
|
|
29
|
+
.enum(["connected", "detected", "manual", "error"])
|
|
30
|
+
.optional()
|
|
31
|
+
.describe("Optional status filter."),
|
|
32
|
+
}),
|
|
33
|
+
readOnly: true,
|
|
34
|
+
http: { method: "GET" },
|
|
35
|
+
run: async ({ id, status }) => {
|
|
36
|
+
const ownerEmail = getRequestUserEmail();
|
|
37
|
+
if (!ownerEmail) throw new Error("no authenticated user");
|
|
38
|
+
const orgId = getRequestOrgId() ?? null;
|
|
39
|
+
const clauses = [
|
|
40
|
+
eq(schema.designLocalhostConnections.ownerEmail, ownerEmail),
|
|
41
|
+
orgId
|
|
42
|
+
? eq(schema.designLocalhostConnections.orgId, orgId)
|
|
43
|
+
: isNull(schema.designLocalhostConnections.orgId),
|
|
44
|
+
];
|
|
45
|
+
if (id) clauses.push(eq(schema.designLocalhostConnections.id, id));
|
|
46
|
+
if (status) {
|
|
47
|
+
clauses.push(eq(schema.designLocalhostConnections.status, status));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const rows = await getDb()
|
|
51
|
+
.select()
|
|
52
|
+
.from(schema.designLocalhostConnections)
|
|
53
|
+
.where(and(...clauses))
|
|
54
|
+
.orderBy(desc(schema.designLocalhostConnections.updatedAt));
|
|
55
|
+
|
|
56
|
+
const connections = rows.map((row) => {
|
|
57
|
+
const routeManifest = parseJson<LocalhostDesignRouteManifest>(
|
|
58
|
+
row.routeManifest,
|
|
59
|
+
{
|
|
60
|
+
version: 1,
|
|
61
|
+
sourceType: "localhost",
|
|
62
|
+
devServerUrl: row.devServerUrl,
|
|
63
|
+
rootPath: row.rootPath ?? undefined,
|
|
64
|
+
routes: [],
|
|
65
|
+
generatedAt: row.updatedAt ?? new Date(0).toISOString(),
|
|
66
|
+
},
|
|
67
|
+
);
|
|
68
|
+
const capabilities = parseJson<DesignBridgeCapability[]>(
|
|
69
|
+
row.capabilities,
|
|
70
|
+
[],
|
|
71
|
+
);
|
|
72
|
+
return {
|
|
73
|
+
id: row.id,
|
|
74
|
+
sourceType: row.sourceType,
|
|
75
|
+
name: row.name,
|
|
76
|
+
devServerUrl: row.devServerUrl,
|
|
77
|
+
bridgeUrl: row.bridgeUrl ?? null,
|
|
78
|
+
rootPath: row.rootPath ?? null,
|
|
79
|
+
routeManifest,
|
|
80
|
+
routes: routeManifest.routes,
|
|
81
|
+
routeCount: routeManifest.routes.length,
|
|
82
|
+
capabilities,
|
|
83
|
+
status: row.status,
|
|
84
|
+
lastSeenAt: row.lastSeenAt ?? null,
|
|
85
|
+
createdAt: row.createdAt,
|
|
86
|
+
updatedAt: row.updatedAt,
|
|
87
|
+
};
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
return {
|
|
91
|
+
count: connections.length,
|
|
92
|
+
connections,
|
|
93
|
+
};
|
|
94
|
+
},
|
|
95
|
+
});
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
* Usage:
|
|
7
7
|
* pnpm action navigate --view=list
|
|
8
8
|
* pnpm action navigate --view=editor --designId=abc123
|
|
9
|
+
* pnpm action navigate --view=editor --designId=abc123 --editorView=overview
|
|
10
|
+
* pnpm action navigate --view=editor --designId=abc123 --filename=checkout.html
|
|
9
11
|
* pnpm action navigate --view=design-systems
|
|
10
12
|
* pnpm action navigate --view=design-systems --designSystemId=abc123
|
|
11
13
|
* pnpm action navigate --view=templates
|
|
@@ -15,6 +17,10 @@
|
|
|
15
17
|
* Options:
|
|
16
18
|
* --view View name (list, editor, design-systems, present, templates, settings)
|
|
17
19
|
* --designId Design ID (for editor/present views)
|
|
20
|
+
* --editorView Editor mode for designs: single or overview
|
|
21
|
+
* --inspectorTab Inspector tab for designs: design, tweaks, or extensions
|
|
22
|
+
* --fileId Screen/file id to focus in the design editor
|
|
23
|
+
* --filename Screen filename to focus in the design editor
|
|
18
24
|
* --designSystemId Design system ID (for design-systems view)
|
|
19
25
|
* --path URL path to navigate to
|
|
20
26
|
*/
|
|
@@ -25,7 +31,7 @@ import { z } from "zod";
|
|
|
25
31
|
|
|
26
32
|
export default defineAction({
|
|
27
33
|
description:
|
|
28
|
-
"Navigate the UI to a specific view or path. Views: list, editor, design-systems, present, templates, settings. Use --designId with editor/present views and --designSystemId with design-systems.",
|
|
34
|
+
"Navigate the UI to a specific view or path. Views: list, editor, design-systems, present, templates, settings. Use --designId with editor/present views and --designSystemId with design-systems. For designs, use editorView=overview to show the infinite screens canvas, or editorView=single with fileId/filename/screen to focus a screen. Use inspectorTab=extensions to focus the in-editor extension panel.",
|
|
29
35
|
schema: z.object({
|
|
30
36
|
view: z
|
|
31
37
|
.enum([
|
|
@@ -40,6 +46,38 @@ export default defineAction({
|
|
|
40
46
|
.optional()
|
|
41
47
|
.describe("View name to navigate to"),
|
|
42
48
|
designId: z.string().optional().describe("Design ID for editor/present"),
|
|
49
|
+
editorView: z
|
|
50
|
+
.enum(["single", "overview"])
|
|
51
|
+
.optional()
|
|
52
|
+
.describe(
|
|
53
|
+
"Design editor view: overview for the infinite screens canvas, single for a focused screen",
|
|
54
|
+
),
|
|
55
|
+
viewMode: z
|
|
56
|
+
.enum(["single", "overview"])
|
|
57
|
+
.optional()
|
|
58
|
+
.describe("Alias for editorView"),
|
|
59
|
+
inspectorTab: z
|
|
60
|
+
.enum(["design", "tweaks", "extensions"])
|
|
61
|
+
.optional()
|
|
62
|
+
.describe("Design editor inspector tab to focus"),
|
|
63
|
+
inspector: z
|
|
64
|
+
.enum(["design", "tweaks", "extensions"])
|
|
65
|
+
.optional()
|
|
66
|
+
.describe("Alias for inspectorTab"),
|
|
67
|
+
fileId: z.string().optional().describe("Design file/screen ID to focus"),
|
|
68
|
+
screenId: z.string().optional().describe("Alias for fileId"),
|
|
69
|
+
filename: z
|
|
70
|
+
.string()
|
|
71
|
+
.optional()
|
|
72
|
+
.describe("Design screen filename to focus, such as checkout.html"),
|
|
73
|
+
screen: z
|
|
74
|
+
.string()
|
|
75
|
+
.optional()
|
|
76
|
+
.describe("Screen id, filename, or name to focus"),
|
|
77
|
+
zoom: z
|
|
78
|
+
.number()
|
|
79
|
+
.optional()
|
|
80
|
+
.describe("Optional design canvas zoom percentage"),
|
|
43
81
|
designSystemId: z
|
|
44
82
|
.string()
|
|
45
83
|
.optional()
|
|
@@ -51,14 +89,29 @@ export default defineAction({
|
|
|
51
89
|
if (!args.view && !args.path) {
|
|
52
90
|
throw new Error("At least --view or --path is required.");
|
|
53
91
|
}
|
|
54
|
-
const nav: Record<string,
|
|
92
|
+
const nav: Record<string, unknown> = {};
|
|
55
93
|
if (args.view) nav.view = args.view;
|
|
56
94
|
if (args.designId) nav.designId = args.designId;
|
|
95
|
+
const editorView = args.editorView ?? args.viewMode;
|
|
96
|
+
if (editorView) nav.editorView = editorView;
|
|
97
|
+
const inspectorTab = args.inspectorTab ?? args.inspector;
|
|
98
|
+
if (inspectorTab) nav.inspectorTab = inspectorTab;
|
|
99
|
+
if (args.fileId) nav.fileId = args.fileId;
|
|
100
|
+
if (args.screenId) nav.screenId = args.screenId;
|
|
101
|
+
if (args.filename) nav.filename = args.filename;
|
|
102
|
+
if (args.screen) nav.screen = args.screen;
|
|
103
|
+
if (args.zoom !== undefined) nav.zoom = args.zoom;
|
|
57
104
|
if (args.designSystemId) nav.designSystemId = args.designSystemId;
|
|
58
105
|
if (args.path) nav.path = args.path;
|
|
59
106
|
await writeAppState("navigate", nav);
|
|
60
107
|
return `Navigating to ${args.view || args.path}${
|
|
61
108
|
args.designId ? ` (design: ${args.designId})` : ""
|
|
109
|
+
}${editorView ? ` (${editorView} view)` : ""}${
|
|
110
|
+
inspectorTab ? ` (${inspectorTab} inspector)` : ""
|
|
111
|
+
}${
|
|
112
|
+
args.fileId || args.screenId || args.filename || args.screen
|
|
113
|
+
? ` (screen: ${args.fileId ?? args.screenId ?? args.filename ?? args.screen})`
|
|
114
|
+
: ""
|
|
62
115
|
}${args.designSystemId ? ` (design system: ${args.designSystemId})` : ""}`;
|
|
63
116
|
},
|
|
64
117
|
});
|
|
@@ -23,8 +23,15 @@ export default defineAction({
|
|
|
23
23
|
.enum(["html", "css", "jsx", "asset"])
|
|
24
24
|
.optional()
|
|
25
25
|
.describe("Updated file type"),
|
|
26
|
+
syncCollab: z
|
|
27
|
+
.boolean()
|
|
28
|
+
.optional()
|
|
29
|
+
.default(true)
|
|
30
|
+
.describe(
|
|
31
|
+
"Whether to mirror content updates into the live collaboration document.",
|
|
32
|
+
),
|
|
26
33
|
}),
|
|
27
|
-
run: async ({ id, content, filename, fileType }) => {
|
|
34
|
+
run: async ({ id, content, filename, fileType, syncCollab }) => {
|
|
28
35
|
// Path traversal guard on filename
|
|
29
36
|
if (
|
|
30
37
|
filename &&
|
|
@@ -74,7 +81,7 @@ export default defineAction({
|
|
|
74
81
|
.where(eq(schema.designFiles.id, id));
|
|
75
82
|
|
|
76
83
|
// Push content through the collab layer so live editors see the change
|
|
77
|
-
if (content !== undefined) {
|
|
84
|
+
if (content !== undefined && syncCollab) {
|
|
78
85
|
const collabExists = await hasCollabState(id);
|
|
79
86
|
if (collabExists) {
|
|
80
87
|
await applyText(id, content, "content", "agent");
|
|
@@ -12,11 +12,17 @@ import {
|
|
|
12
12
|
readAppState,
|
|
13
13
|
readAppStateForCurrentTab,
|
|
14
14
|
} from "@agent-native/core/application-state";
|
|
15
|
+
import { resolveAccess } from "@agent-native/core/sharing";
|
|
16
|
+
import { eq } from "drizzle-orm";
|
|
15
17
|
import { z } from "zod";
|
|
16
18
|
|
|
19
|
+
import { getDb, schema } from "../server/db/index.js";
|
|
20
|
+
import { parseCanvasFrameGeometryById } from "../shared/canvas-frames.js";
|
|
21
|
+
import { designGenerationSessionKey } from "../shared/generation-session.js";
|
|
22
|
+
|
|
17
23
|
export default defineAction({
|
|
18
24
|
description:
|
|
19
|
-
"See what the user is currently looking at on screen. Returns the current navigation state including which design is open, which view they are on (list, editor, design-systems, present, templates, settings), plus any pending question overlay or variant grid. Always call this first before taking any action.",
|
|
25
|
+
"See what the user is currently looking at on screen. Returns the current navigation state including which design is open, which view they are on (list, editor, design-systems, present, templates, settings), active/focused design screen, selected element, active inspector tab (design, tweaks, or extensions), overview canvas state, plus any pending question overlay or variant grid. Always call this first before taking any action.",
|
|
20
26
|
schema: z.object({}),
|
|
21
27
|
http: false,
|
|
22
28
|
run: async () => {
|
|
@@ -35,10 +41,68 @@ export default defineAction({
|
|
|
35
41
|
(designId
|
|
36
42
|
? await readAppState(`show-questions:${designId}`)
|
|
37
43
|
: undefined) ?? (await readAppState("show-questions"));
|
|
44
|
+
const generationSession = designId
|
|
45
|
+
? await readAppState(designGenerationSessionKey(designId))
|
|
46
|
+
: undefined;
|
|
38
47
|
|
|
39
48
|
const screen: Record<string, unknown> = {};
|
|
40
49
|
if (navigation) screen.navigation = navigation;
|
|
41
50
|
if (designSelection) screen.designSelection = designSelection;
|
|
51
|
+
if (designId) {
|
|
52
|
+
const access = await resolveAccess("design", designId).catch(() => null);
|
|
53
|
+
if (access) {
|
|
54
|
+
const db = getDb();
|
|
55
|
+
const files = await db
|
|
56
|
+
.select({
|
|
57
|
+
id: schema.designFiles.id,
|
|
58
|
+
filename: schema.designFiles.filename,
|
|
59
|
+
fileType: schema.designFiles.fileType,
|
|
60
|
+
updatedAt: schema.designFiles.updatedAt,
|
|
61
|
+
})
|
|
62
|
+
.from(schema.designFiles)
|
|
63
|
+
.where(eq(schema.designFiles.designId, designId));
|
|
64
|
+
let data: Record<string, unknown> = {};
|
|
65
|
+
const rawData = (access.resource as { data?: unknown }).data;
|
|
66
|
+
if (typeof rawData === "string") {
|
|
67
|
+
try {
|
|
68
|
+
const parsed = JSON.parse(rawData);
|
|
69
|
+
if (
|
|
70
|
+
parsed &&
|
|
71
|
+
typeof parsed === "object" &&
|
|
72
|
+
!Array.isArray(parsed)
|
|
73
|
+
) {
|
|
74
|
+
data = parsed as Record<string, unknown>;
|
|
75
|
+
}
|
|
76
|
+
} catch {
|
|
77
|
+
data = {};
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
const activeFileId =
|
|
81
|
+
designSelection &&
|
|
82
|
+
typeof designSelection === "object" &&
|
|
83
|
+
typeof (designSelection as { activeFileId?: unknown })
|
|
84
|
+
.activeFileId === "string"
|
|
85
|
+
? (designSelection as { activeFileId: string }).activeFileId
|
|
86
|
+
: undefined;
|
|
87
|
+
const activeFilename =
|
|
88
|
+
designSelection &&
|
|
89
|
+
typeof designSelection === "object" &&
|
|
90
|
+
typeof (designSelection as { activeFilename?: unknown })
|
|
91
|
+
.activeFilename === "string"
|
|
92
|
+
? (designSelection as { activeFilename: string }).activeFilename
|
|
93
|
+
: undefined;
|
|
94
|
+
screen.design = {
|
|
95
|
+
id: designId,
|
|
96
|
+
title: (access.resource as { title?: unknown }).title ?? null,
|
|
97
|
+
screens: files,
|
|
98
|
+
activeScreen:
|
|
99
|
+
files.find((file) => file.id === activeFileId) ??
|
|
100
|
+
files.find((file) => file.filename === activeFilename) ??
|
|
101
|
+
null,
|
|
102
|
+
canvasFrames: parseCanvasFrameGeometryById(data.canvasFrames),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
}
|
|
42
106
|
if (showQuestions) {
|
|
43
107
|
screen.pendingQuestions = showQuestions;
|
|
44
108
|
screen.note =
|
|
@@ -49,6 +113,9 @@ export default defineAction({
|
|
|
49
113
|
screen.variantsNote =
|
|
50
114
|
'A variant picker is open. Wait for the user to choose a direction before generating further. In an inline MCP app their pick returns to you automatically; if it opened as a browser tab (a CLI or code editor), they paste an auto-copied summary or just tell you which one (e.g. "use variant A"). Once you know the choice, read the saved index.html with get-design-snapshot. Do not call generate-design while this picker is open.';
|
|
51
115
|
}
|
|
116
|
+
if (generationSession) {
|
|
117
|
+
screen.generationSession = generationSession;
|
|
118
|
+
}
|
|
52
119
|
|
|
53
120
|
if (Object.keys(screen).length === 0) {
|
|
54
121
|
return "No application state found. Is the app running?";
|
|
@@ -29,6 +29,11 @@
|
|
|
29
29
|
"id": "design-exploration",
|
|
30
30
|
"action": "present-design-variants",
|
|
31
31
|
"path": "/design"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"id": "visual-edit",
|
|
35
|
+
"action": "add-localhost-screens",
|
|
36
|
+
"path": "/design"
|
|
32
37
|
}
|
|
33
38
|
],
|
|
34
39
|
"skills": [
|
|
@@ -36,6 +41,11 @@
|
|
|
36
41
|
"path": ".agents/skills/design-generation",
|
|
37
42
|
"visibility": "both",
|
|
38
43
|
"exportAs": "design-exploration"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"path": ".agents/skills/visual-edit",
|
|
47
|
+
"visibility": "both",
|
|
48
|
+
"exportAs": "visual-edit"
|
|
39
49
|
}
|
|
40
50
|
],
|
|
41
51
|
"hostAdapters": [
|