@agent-native/core 0.83.0 → 0.84.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/corpus/README.md +1 -1
- package/corpus/core/CHANGELOG.md +34 -0
- package/corpus/core/README.md +2 -2
- package/corpus/core/docs/content/cloneable-saas.mdx +2 -2
- package/corpus/core/docs/content/evals.mdx +34 -12
- package/corpus/core/docs/content/faq.mdx +1 -1
- package/corpus/core/docs/content/locales/ar-SA/cloneable-saas.mdx +2 -2
- package/corpus/core/docs/content/locales/ar-SA/evals.mdx +7 -0
- package/corpus/core/docs/content/locales/ar-SA/faq.mdx +1 -1
- package/corpus/core/docs/content/locales/ar-SA/template-chat.mdx +1 -1
- package/corpus/core/docs/content/locales/de-DE/cloneable-saas.mdx +2 -2
- package/corpus/core/docs/content/locales/de-DE/evals.mdx +8 -0
- package/corpus/core/docs/content/locales/de-DE/faq.mdx +1 -1
- package/corpus/core/docs/content/locales/de-DE/template-chat.mdx +1 -1
- package/corpus/core/docs/content/locales/es-ES/cloneable-saas.mdx +2 -2
- package/corpus/core/docs/content/locales/es-ES/evals.mdx +8 -0
- package/corpus/core/docs/content/locales/es-ES/faq.mdx +1 -1
- package/corpus/core/docs/content/locales/es-ES/template-chat.mdx +1 -1
- package/corpus/core/docs/content/locales/fr-FR/cloneable-saas.mdx +2 -2
- package/corpus/core/docs/content/locales/fr-FR/evals.mdx +8 -0
- package/corpus/core/docs/content/locales/fr-FR/faq.mdx +1 -1
- package/corpus/core/docs/content/locales/fr-FR/template-chat.mdx +1 -1
- package/corpus/core/docs/content/locales/hi-IN/cloneable-saas.mdx +2 -2
- package/corpus/core/docs/content/locales/hi-IN/evals.mdx +8 -0
- package/corpus/core/docs/content/locales/hi-IN/faq.mdx +1 -1
- package/corpus/core/docs/content/locales/hi-IN/template-chat.mdx +1 -1
- package/corpus/core/docs/content/locales/ja-JP/cloneable-saas.mdx +2 -2
- package/corpus/core/docs/content/locales/ja-JP/evals.mdx +7 -0
- package/corpus/core/docs/content/locales/ja-JP/faq.mdx +1 -1
- package/corpus/core/docs/content/locales/ja-JP/template-chat.mdx +1 -1
- package/corpus/core/docs/content/locales/ko-KR/cloneable-saas.mdx +2 -2
- package/corpus/core/docs/content/locales/ko-KR/evals.mdx +7 -0
- package/corpus/core/docs/content/locales/ko-KR/faq.mdx +1 -1
- package/corpus/core/docs/content/locales/ko-KR/template-chat.mdx +1 -1
- package/corpus/core/docs/content/locales/pt-BR/cloneable-saas.mdx +2 -2
- package/corpus/core/docs/content/locales/pt-BR/evals.mdx +8 -0
- package/corpus/core/docs/content/locales/pt-BR/faq.mdx +1 -1
- package/corpus/core/docs/content/locales/pt-BR/template-chat.mdx +1 -1
- package/corpus/core/docs/content/locales/zh-CN/cloneable-saas.mdx +2 -2
- package/corpus/core/docs/content/locales/zh-CN/evals.mdx +7 -0
- package/corpus/core/docs/content/locales/zh-CN/faq.mdx +1 -1
- package/corpus/core/docs/content/locales/zh-CN/template-chat.mdx +1 -1
- package/corpus/core/docs/content/locales/zh-TW/cloneable-saas.mdx +2 -2
- package/corpus/core/docs/content/locales/zh-TW/evals.mdx +7 -0
- package/corpus/core/docs/content/locales/zh-TW/faq.mdx +1 -1
- package/corpus/core/docs/content/locales/zh-TW/template-chat.mdx +1 -1
- package/corpus/core/docs/content/template-chat.mdx +1 -1
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/agent/engine/builtin.ts +1 -1
- package/corpus/core/src/agent/engine/output-tokens.ts +1 -1
- package/corpus/core/src/agent/harness/acp-adapter.ts +28 -4
- package/corpus/core/src/agent/harness/ai-sdk-adapter.ts +3 -0
- package/corpus/core/src/agent/harness/translate.ts +3 -0
- package/corpus/core/src/agent/harness/types.ts +1 -0
- package/corpus/core/src/agent/model-config.ts +34 -13
- package/corpus/core/src/agent/production-agent.ts +87 -10
- package/corpus/core/src/agent/thread-data-builder.ts +29 -4
- package/corpus/core/src/agent/tool-call-journal.ts +109 -48
- package/corpus/core/src/agent/types.ts +6 -1
- package/corpus/core/src/cli/design-connect.ts +106 -0
- package/corpus/core/src/cli/gateway-helpers.ts +17 -0
- package/corpus/core/src/cli/recap.ts +0 -2
- package/corpus/core/src/cli/skills.ts +54 -16
- package/corpus/core/src/cli/workspace-dev.ts +29 -5
- package/corpus/core/src/client/AssistantChat.tsx +89 -42
- package/corpus/core/src/client/DefaultSpinner.tsx +8 -1
- package/corpus/core/src/client/chat/message-components.tsx +49 -1
- package/corpus/core/src/client/chat/repo-helpers.ts +71 -0
- package/corpus/core/src/client/chat/run-recovery.tsx +15 -5
- package/corpus/core/src/client/components/ApiKeySettings.tsx +8 -8
- package/corpus/core/src/client/components/CodeRequiredDialog.tsx +26 -15
- package/corpus/core/src/client/components/MissingKeyCard.tsx +13 -6
- package/corpus/core/src/client/composer/TiptapComposer.tsx +4 -3
- package/corpus/core/src/client/extensions/ExtensionsSidebarSection.tsx +0 -1
- package/corpus/core/src/client/guided-questions.tsx +21 -27
- package/corpus/core/src/client/integrations/IntegrationCard.tsx +1 -1
- package/corpus/core/src/client/integrations/IntegrationsPanel.tsx +1 -1
- package/corpus/core/src/client/onboarding/OnboardingBanner.tsx +2 -2
- package/corpus/core/src/client/onboarding/OnboardingPanel.tsx +23 -19
- package/corpus/core/src/client/resources/ResourceEditor.tsx +18 -10
- package/corpus/core/src/client/resources/ResourcesPanel.tsx +5 -1
- package/corpus/core/src/client/settings/SettingsPanel.tsx +8 -3
- package/corpus/core/src/client/settings/useBuilderStatus.ts +8 -41
- package/corpus/core/src/client/useProductionAgent.ts +6 -2
- package/corpus/core/src/deploy/build.ts +1 -1
- package/corpus/core/src/eval/define-eval.ts +4 -1
- package/corpus/core/src/eval/report.ts +23 -8
- package/corpus/core/src/eval/runner.ts +41 -6
- package/corpus/core/src/eval/types.ts +11 -0
- package/corpus/core/src/observability/traces.ts +3 -3
- package/corpus/core/src/onboarding/default-steps.ts +1 -1
- package/corpus/core/src/scripts/agent-engines/manage-agent-engine.ts +1 -1
- package/corpus/core/src/scripts/agent-engines/set-agent-engine.ts +1 -1
- package/corpus/core/src/server/agent-chat-plugin.ts +177 -81
- package/corpus/core/src/server/core-routes-plugin.ts +7 -1
- package/corpus/core/src/server/open-route.ts +59 -40
- package/corpus/core/src/shared/reasoning-effort.ts +2 -0
- package/corpus/core/src/sharing/access.ts +22 -2
- package/corpus/core/src/sharing/registry.ts +18 -0
- package/corpus/core/src/styles/agent-native.css +104 -20
- package/corpus/core/src/styles/rich-markdown-editor.css +11 -10
- package/corpus/templates/analytics/app/components/dashboard/CumulativeNetChart.tsx +10 -10
- package/corpus/templates/analytics/app/components/dashboard/RevenueChart.tsx +10 -10
- package/corpus/templates/analytics/app/components/dashboard/RevenueComparisonChart.tsx +6 -5
- package/corpus/templates/analytics/app/components/dashboard/TimeSeriesChart.tsx +9 -9
- package/corpus/templates/analytics/app/global.css +4 -0
- package/corpus/templates/analytics/app/lib/chart-theme.ts +13 -0
- package/corpus/templates/analytics/app/pages/adhoc/_shared/KpiChart.tsx +22 -24
- package/corpus/templates/analytics/changelog/2026-06-30-dashboard-charts-now-use-theme-aware-tooltip-and-grid-colors.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-30-fixed-ask-composer-spacing-so-the-chat-field-has-a-comfortab.md +6 -0
- package/corpus/templates/calendar/AGENTS.md +4 -0
- package/corpus/templates/calendar/actions/connect-google-calendar.ts +80 -0
- package/corpus/templates/calendar/changelog/2026-06-30-calendar-now-gives-the-agent-a-safe-google-connection-link-i.md +6 -0
- package/corpus/templates/calendar/server/plugins/agent-chat.ts +4 -0
- package/corpus/templates/content/AGENTS.md +9 -2
- package/corpus/templates/content/actions/_database-row-batch.ts +230 -0
- package/corpus/templates/content/actions/_database-utils.ts +17 -9
- package/corpus/templates/content/actions/_notion-action-utils.ts +26 -0
- package/corpus/templates/content/actions/connect-notion-status.ts +13 -4
- package/corpus/templates/content/actions/create-and-link-notion-page.ts +23 -0
- package/corpus/templates/content/actions/delete-database-items.ts +55 -0
- package/corpus/templates/content/actions/delete-document.ts +4 -4
- package/corpus/templates/content/actions/disconnect-notion.ts +16 -0
- package/corpus/templates/content/actions/duplicate-database-item.ts +1 -1
- package/corpus/templates/content/actions/duplicate-database-items.ts +191 -0
- package/corpus/templates/content/actions/link-notion-page.ts +10 -7
- package/corpus/templates/content/actions/list-notion-links.ts +3 -4
- package/corpus/templates/content/actions/pull-notion-page.ts +7 -9
- package/corpus/templates/content/actions/push-notion-page.ts +7 -9
- package/corpus/templates/content/actions/refresh-notion-sync-status.ts +24 -0
- package/corpus/templates/content/actions/resolve-notion-sync-conflict.ts +23 -0
- package/corpus/templates/content/actions/search-notion-pages.ts +67 -0
- package/corpus/templates/content/actions/unlink-notion-page.ts +23 -0
- package/corpus/templates/content/app/components/editor/BubbleToolbar.tsx +5 -5
- package/corpus/templates/content/app/components/editor/DocumentDatabase.tsx +27 -34
- package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +16 -13
- package/corpus/templates/content/app/components/editor/DocumentToolbar.tsx +10 -10
- package/corpus/templates/content/app/components/editor/NotionConflictBanner.tsx +1 -1
- package/corpus/templates/content/app/components/editor/NotionSyncBar.tsx +18 -9
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +27 -34
- package/corpus/templates/content/app/components/editor/database/navigation-state.ts +10 -4
- package/corpus/templates/content/app/components/sidebar/NotionButton.tsx +32 -17
- package/corpus/templates/content/app/global.css +6 -5
- package/corpus/templates/content/app/hooks/use-content-database.ts +35 -0
- package/corpus/templates/content/app/hooks/use-notion.ts +108 -99
- package/corpus/templates/content/changelog/2026-06-30-editor-floating-toolbars-now-use-theme-aware-colors-in-light.md +6 -0
- package/corpus/templates/content/package.json +3 -0
- package/corpus/templates/content/parity/README.md +69 -0
- package/corpus/templates/content/parity/eval-scenarios.ts +118 -0
- package/corpus/templates/content/parity/exceptions.allowlist.ts +17 -0
- package/corpus/templates/content/parity/matrix.md +28 -0
- package/corpus/templates/content/parity/matrix.ts +606 -0
- package/corpus/templates/content/parity/matrix.types.ts +42 -0
- package/corpus/templates/content/parity/parity-evals.eval.ts +4 -0
- package/corpus/templates/content/parity/render-matrix.ts +90 -0
- package/corpus/templates/content/parity/scenario-to-eval.ts +57 -0
- package/corpus/templates/content/shared/api.ts +11 -0
- package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +6 -1
- package/corpus/templates/design/actions/add-localhost-screens.ts +63 -8
- package/corpus/templates/design/actions/apply-motion-edit.ts +12 -46
- package/corpus/templates/design/actions/list-design-native-assets.ts +2 -1
- package/corpus/templates/design/actions/migrate-board-objects-to-file.ts +49 -1
- package/corpus/templates/design/actions/navigate.ts +3 -12
- package/corpus/templates/design/actions/open-visual-edit.ts +341 -0
- package/corpus/templates/design/actions/view-screen.ts +1 -1
- package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +1 -1
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +345 -14
- package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +71 -91
- package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +25 -27
- package/corpus/templates/design/app/components/design/DeviceFrame.tsx +1 -1
- package/corpus/templates/design/app/components/design/DrawOverlay.tsx +2 -2
- package/corpus/templates/design/app/components/design/EditPanel.tsx +1111 -570
- package/corpus/templates/design/app/components/design/LayersPanel.tsx +162 -32
- package/corpus/templates/design/app/components/design/MotionDock.tsx +268 -240
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +1038 -150
- package/corpus/templates/design/app/components/design/QuestionFlow.tsx +1 -1
- package/corpus/templates/design/app/components/design/ReviewPanel.tsx +81 -102
- package/corpus/templates/design/app/components/design/StatesPanel.tsx +6 -6
- package/corpus/templates/design/app/components/design/TokensPanel.tsx +11 -11
- package/corpus/templates/design/app/components/design/TweaksPanel.tsx +9 -7
- package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +1129 -155
- package/corpus/templates/design/app/components/design/bridge/hit-test.bridge.ts +130 -37
- package/corpus/templates/design/app/components/design/canvas-primitive-style.ts +24 -11
- package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +184 -162
- package/corpus/templates/design/app/components/design/inspector/ConstraintsWidget.tsx +137 -79
- package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +13 -13
- package/corpus/templates/design/app/components/design/inspector/ExportSettingsPanel.tsx +8 -8
- package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +2 -2
- package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +4 -4
- package/corpus/templates/design/app/components/design/inspector/InspectorAiActions.tsx +3 -3
- package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +13 -7
- package/corpus/templates/design/app/components/design/inspector/ShaderControls.tsx +14 -11
- package/corpus/templates/design/app/components/design/inspector/ShaderFillsPanel.tsx +4 -4
- package/corpus/templates/design/app/components/design/inspector/index.ts +2 -0
- package/corpus/templates/design/app/components/design/types.ts +19 -0
- package/corpus/templates/design/app/components/editor/PromptDialog.tsx +61 -78
- package/corpus/templates/design/app/components/layout/Header.tsx +0 -1
- package/corpus/templates/design/app/components/layout/Layout.tsx +3 -2
- package/corpus/templates/design/app/components/layout/Sidebar.tsx +0 -2
- package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +5 -4
- package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +1 -1
- package/corpus/templates/design/app/components/visual-editor/SaveStatusIndicator.tsx +2 -2
- package/corpus/templates/design/app/global.css +56 -0
- package/corpus/templates/design/app/hooks/use-agent-generating.ts +4 -5
- package/corpus/templates/design/app/hooks/use-navigation-state.ts +6 -7
- package/corpus/templates/design/app/hooks/use-question-flow.ts +3 -2
- package/corpus/templates/design/app/hooks/useAgentEditRequest.ts +6 -4
- package/corpus/templates/design/app/i18n/zh-TW.ts +5 -14
- package/corpus/templates/design/app/i18n-data.ts +63 -188
- package/corpus/templates/design/app/lib/agent-chat.ts +13 -0
- package/corpus/templates/design/app/pages/DesignEditor.tsx +1428 -384
- package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +9 -5
- package/corpus/templates/design/app/pages/DesignSystems.tsx +2 -2
- package/corpus/templates/design/app/pages/Index.tsx +49 -26
- package/corpus/templates/design/app/pages/NotFound.tsx +25 -8
- package/corpus/templates/design/app/pages/VisualEdit.tsx +17 -5
- package/corpus/templates/design/app/routes/examples.tsx +1 -7
- package/corpus/templates/design/app/routes/templates.tsx +7 -4
- package/corpus/templates/design/changelog/2026-06-30-board-shapes-and-auto-layout-controls-are-clearer.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-component-selections-now-use-purple-component-chrome-and-sho.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-constraints-now-stay-tucked-into-a-compact-inspector-preview.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-creating-a-component-now-opens-in-a-compact-inspector-popove.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-design-cards-no-longer-show-legacy-project-type-badges.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-design-chat-now-keeps-new-turns-in-the-visible-design-agent-.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-design-editor-panels-now-keep-their-compact-text-sizing-cons.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-design-no-longer-shows-the-connected-local-code-warning-bann.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-design-now-opens-to-the-files-panel-unless-a-generation-is-a.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-design-opens-with-a-cleaner-empty-canvas-and-loading-preview.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-design-tools-use-simpler-less-decorative-icons.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-dragging-absolute-elements-no-longer-shows-coordinate-labels.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-fixed-all-screens-opening-too-zoomed-in-by-default.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-fixed-the-public-design-assets-sidebar-so-native-components-.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-fixed-the-screen-overview-board-so-empty-board-space-no-long.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-full-view-screens-can-now-scroll-while-remaining-editable.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-inspector-element-headers-show-the-selected-html-tag-and-the.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-inspector-inputs-stay-compact-across-desktop-breakpoints.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-layers-can-be-multi-selected-from-the-canvas-and-edited-toge.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-local-visual-edit-links-can-edit-localhost-frames-without-si.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-localhost-visual-edit-frames-can-now-be-selected-and-edited.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-marquee-selection-now-works-inside-screens-multi-selected-la.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-motion-is-now-available-from-the-persistent-left-rail-and-th.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-motion-timeline-collapse-and-reopen-animations-feel-smoother.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-multi-select-outlines-now-stay-consistent-across-all-screens.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-new-board-shapes-now-start-with-neutral-gray-styling.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-new-designs-open-into-a-steadier-loading-state-before-the-ed.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-new-designs-show-a-loading-state-during-handoff-and-keep-edi.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-public-visual-edit-design-links-now-open-directly-instead-of.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-removed-the-confusing-states-section-from-the-design-editor-.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-removed-the-templates-gallery-from-design-navigation.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-share-stays-visible-as-soon-as-editable-designs-load.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-signed-out-save-and-share-controls-use-simpler-labels-and-op.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-text-added-on-the-canvas-now-focuses-cleanly-with-the-right-.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-the-design-editor-loading-skeleton-is-simpler-and-its-bottom.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-the-design-editor-loading-skeleton-now-follows-the-current-t.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-the-design-inspector-no-longer-shows-child-layout-controls-o.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-the-design-inspector-no-longer-shows-the-ask-ai-section-abov.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-the-design-review-panel-no-longer-shows-a-separate-inline-au.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-the-empty-designs-page-now-focuses-on-a-single-primary-new-d.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-the-layers-panel-header-stays-as-layers-while-multiple-items.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-the-missing-design-screen-now-uses-a-neutral-back-button.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-the-motion-timeline-now-closes-without-squeezing-the-canvas-.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-the-new-design-connect-ai-setup-now-lines-up-with-the-compos.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-the-screen-overview-board-now-blends-into-the-canvas-and-new.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-top-level-canvas-drops-now-show-screen-guides.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-top-level-canvas-layers-now-keep-a-transparent-backdrop-and-.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-top-level-canvas-layers-now-select-reliably-from-all-screens.md +6 -0
- package/corpus/templates/design/changelog/2026-06-30-visual-edit-can-open-and-refresh-localhost-screens-in-one-au.md +6 -0
- package/corpus/templates/design/e2e/helpers.ts +15 -4
- package/corpus/templates/design/server/db/index.ts +52 -0
- package/corpus/templates/design/server/plugins/agent-chat.ts +5 -0
- package/corpus/templates/design/server/plugins/auth.ts +1 -0
- package/corpus/templates/design/server/plugins/core-routes.ts +4 -0
- package/corpus/templates/design/shared/board-file.ts +380 -5
- package/corpus/templates/design/shared/board-objects.ts +2 -2
- package/corpus/templates/design/shared/code-layer.ts +50 -6
- package/corpus/templates/design/shared/motion-compiler.ts +27 -0
- package/corpus/templates/macros/app/components/DailyProgress.tsx +41 -37
- package/corpus/templates/macros/app/components/ExerciseCard.tsx +2 -2
- package/corpus/templates/macros/app/components/MealCard.tsx +2 -2
- package/corpus/templates/macros/app/components/VoiceDictation.tsx +1 -1
- package/corpus/templates/macros/app/components/WeeklyCaloriesChart.tsx +1 -1
- package/corpus/templates/macros/app/components/WeightCard.tsx +2 -2
- package/corpus/templates/macros/app/components/WeightTracker.tsx +1 -1
- package/corpus/templates/macros/app/components/layout/AppLayout.tsx +1 -1
- package/corpus/templates/macros/app/routes/_index.tsx +5 -5
- package/corpus/templates/macros/app/routes/analytics.tsx +1 -1
- package/corpus/templates/macros/changelog/2026-06-30-dashboard-loading-and-chart-surfaces-now-use-theme-aware-col.md +6 -0
- package/corpus/templates/mail/app/components/email/ComposeBubbleToolbar.tsx +14 -11
- package/corpus/templates/mail/app/global.css +3 -2
- package/corpus/templates/mail/changelog/2026-06-30-compose-floating-toolbars-now-use-theme-aware-colors-in-ligh.md +6 -0
- package/corpus/templates/plan/app/pages/PlansPage.tsx +2 -2
- package/corpus/templates/slides/app/components/deck/DeckCard.tsx +3 -3
- package/corpus/templates/slides/app/global.css +10 -0
- package/corpus/templates/slides/app/pages/Index.tsx +55 -51
- package/corpus/templates/slides/changelog/2026-06-30-deck-thumbnails-collapse-cleanly-to-one-column-when-the-chat.md +6 -0
- package/dist/agent/engine/anthropic-engine.d.ts +2 -2
- package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
- package/dist/agent/engine/builder-engine.d.ts +2 -2
- package/dist/agent/engine/builder-engine.d.ts.map +1 -1
- package/dist/agent/engine/builtin.js +1 -1
- package/dist/agent/engine/builtin.js.map +1 -1
- package/dist/agent/engine/output-tokens.js +1 -1
- package/dist/agent/engine/output-tokens.js.map +1 -1
- package/dist/agent/harness/acp-adapter.d.ts +4 -1
- package/dist/agent/harness/acp-adapter.d.ts.map +1 -1
- package/dist/agent/harness/acp-adapter.js +19 -2
- package/dist/agent/harness/acp-adapter.js.map +1 -1
- package/dist/agent/harness/ai-sdk-adapter.d.ts.map +1 -1
- package/dist/agent/harness/ai-sdk-adapter.js +3 -0
- package/dist/agent/harness/ai-sdk-adapter.js.map +1 -1
- package/dist/agent/harness/translate.d.ts.map +1 -1
- package/dist/agent/harness/translate.js +3 -0
- package/dist/agent/harness/translate.js.map +1 -1
- package/dist/agent/harness/types.d.ts +1 -0
- package/dist/agent/harness/types.d.ts.map +1 -1
- package/dist/agent/harness/types.js.map +1 -1
- package/dist/agent/model-config.d.ts +21 -20
- package/dist/agent/model-config.d.ts.map +1 -1
- package/dist/agent/model-config.js +31 -13
- package/dist/agent/model-config.js.map +1 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +85 -10
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/thread-data-builder.d.ts.map +1 -1
- package/dist/agent/thread-data-builder.js +27 -6
- package/dist/agent/thread-data-builder.js.map +1 -1
- package/dist/agent/tool-call-journal.d.ts +11 -9
- package/dist/agent/tool-call-journal.d.ts.map +1 -1
- package/dist/agent/tool-call-journal.js +92 -40
- package/dist/agent/tool-call-journal.js.map +1 -1
- package/dist/agent/types.d.ts +5 -1
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/cli/design-connect.d.ts.map +1 -1
- package/dist/cli/design-connect.js +84 -0
- package/dist/cli/design-connect.js.map +1 -1
- package/dist/cli/gateway-helpers.d.ts +4 -0
- package/dist/cli/gateway-helpers.d.ts.map +1 -1
- package/dist/cli/gateway-helpers.js +9 -0
- package/dist/cli/gateway-helpers.js.map +1 -1
- package/dist/cli/recap.d.ts.map +1 -1
- package/dist/cli/recap.js +0 -2
- package/dist/cli/recap.js.map +1 -1
- package/dist/cli/skills.d.ts.map +1 -1
- package/dist/cli/skills.js +54 -16
- package/dist/cli/skills.js.map +1 -1
- package/dist/cli/workspace-dev.d.ts.map +1 -1
- package/dist/cli/workspace-dev.js +33 -6
- package/dist/cli/workspace-dev.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +72 -26
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/DefaultSpinner.d.ts.map +1 -1
- package/dist/client/DefaultSpinner.js +8 -1
- package/dist/client/DefaultSpinner.js.map +1 -1
- package/dist/client/chat/message-components.d.ts +7 -1
- package/dist/client/chat/message-components.d.ts.map +1 -1
- package/dist/client/chat/message-components.js +37 -1
- package/dist/client/chat/message-components.js.map +1 -1
- package/dist/client/chat/repo-helpers.d.ts +1 -0
- package/dist/client/chat/repo-helpers.d.ts.map +1 -1
- package/dist/client/chat/repo-helpers.js +59 -0
- package/dist/client/chat/repo-helpers.js.map +1 -1
- package/dist/client/chat/run-recovery.d.ts.map +1 -1
- package/dist/client/chat/run-recovery.js +4 -4
- package/dist/client/chat/run-recovery.js.map +1 -1
- package/dist/client/components/ApiKeySettings.js +8 -8
- package/dist/client/components/ApiKeySettings.js.map +1 -1
- package/dist/client/components/CodeRequiredDialog.d.ts.map +1 -1
- package/dist/client/components/CodeRequiredDialog.js +24 -15
- package/dist/client/components/CodeRequiredDialog.js.map +1 -1
- package/dist/client/components/MissingKeyCard.d.ts.map +1 -1
- package/dist/client/components/MissingKeyCard.js +11 -6
- package/dist/client/components/MissingKeyCard.js.map +1 -1
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +4 -3
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/extensions/ExtensionsSidebarSection.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionsSidebarSection.js +1 -1
- package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
- package/dist/client/guided-questions.d.ts.map +1 -1
- package/dist/client/guided-questions.js +6 -6
- package/dist/client/guided-questions.js.map +1 -1
- package/dist/client/integrations/IntegrationCard.js +1 -1
- package/dist/client/integrations/IntegrationCard.js.map +1 -1
- package/dist/client/integrations/IntegrationsPanel.js +1 -1
- package/dist/client/integrations/IntegrationsPanel.js.map +1 -1
- package/dist/client/onboarding/OnboardingBanner.js +2 -2
- package/dist/client/onboarding/OnboardingBanner.js.map +1 -1
- package/dist/client/onboarding/OnboardingPanel.js +23 -19
- package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
- package/dist/client/resources/ResourceEditor.d.ts.map +1 -1
- package/dist/client/resources/ResourceEditor.js +13 -10
- package/dist/client/resources/ResourceEditor.js.map +1 -1
- package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
- package/dist/client/resources/ResourcesPanel.js +2 -1
- package/dist/client/resources/ResourcesPanel.js.map +1 -1
- package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
- package/dist/client/settings/SettingsPanel.js +8 -3
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
- package/dist/client/settings/useBuilderStatus.js +6 -38
- package/dist/client/settings/useBuilderStatus.js.map +1 -1
- package/dist/client/useProductionAgent.d.ts +2 -1
- package/dist/client/useProductionAgent.d.ts.map +1 -1
- package/dist/client/useProductionAgent.js.map +1 -1
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/deploy/build.js +1 -1
- package/dist/deploy/build.js.map +1 -1
- package/dist/eval/define-eval.d.ts.map +1 -1
- package/dist/eval/define-eval.js +2 -1
- package/dist/eval/define-eval.js.map +1 -1
- package/dist/eval/report.d.ts.map +1 -1
- package/dist/eval/report.js +19 -4
- package/dist/eval/report.js.map +1 -1
- package/dist/eval/runner.d.ts.map +1 -1
- package/dist/eval/runner.js +38 -6
- package/dist/eval/runner.js.map +1 -1
- package/dist/eval/types.d.ts +11 -0
- package/dist/eval/types.d.ts.map +1 -1
- package/dist/eval/types.js.map +1 -1
- package/dist/file-upload/actions/upload-image.d.ts +2 -2
- package/dist/notifications/routes.d.ts +3 -3
- package/dist/observability/routes.d.ts +5 -5
- package/dist/observability/traces.d.ts.map +1 -1
- package/dist/observability/traces.js.map +1 -1
- package/dist/onboarding/default-steps.js +1 -1
- package/dist/onboarding/default-steps.js.map +1 -1
- package/dist/progress/routes.d.ts +1 -1
- package/dist/resources/handlers.d.ts +1 -1
- package/dist/scripts/agent-engines/manage-agent-engine.js +1 -1
- package/dist/scripts/agent-engines/manage-agent-engine.js.map +1 -1
- package/dist/scripts/agent-engines/set-agent-engine.js +1 -1
- package/dist/scripts/agent-engines/set-agent-engine.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts +3 -0
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +134 -72
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts +3 -0
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +4 -1
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/open-route.d.ts +9 -0
- package/dist/server/open-route.d.ts.map +1 -1
- package/dist/server/open-route.js +48 -38
- package/dist/server/open-route.js.map +1 -1
- package/dist/shared/reasoning-effort.js +3 -0
- package/dist/shared/reasoning-effort.js.map +1 -1
- package/dist/sharing/access.d.ts.map +1 -1
- package/dist/sharing/access.js +18 -2
- package/dist/sharing/access.js.map +1 -1
- package/dist/sharing/registry.d.ts +10 -0
- package/dist/sharing/registry.d.ts.map +1 -1
- package/dist/sharing/registry.js.map +1 -1
- package/dist/styles/agent-native.css +104 -20
- package/dist/styles/rich-markdown-editor.css +11 -10
- package/docs/content/cloneable-saas.mdx +2 -2
- package/docs/content/evals.mdx +34 -12
- package/docs/content/faq.mdx +1 -1
- package/docs/content/locales/ar-SA/cloneable-saas.mdx +2 -2
- package/docs/content/locales/ar-SA/evals.mdx +7 -0
- package/docs/content/locales/ar-SA/faq.mdx +1 -1
- package/docs/content/locales/ar-SA/template-chat.mdx +1 -1
- package/docs/content/locales/de-DE/cloneable-saas.mdx +2 -2
- package/docs/content/locales/de-DE/evals.mdx +8 -0
- package/docs/content/locales/de-DE/faq.mdx +1 -1
- package/docs/content/locales/de-DE/template-chat.mdx +1 -1
- package/docs/content/locales/es-ES/cloneable-saas.mdx +2 -2
- package/docs/content/locales/es-ES/evals.mdx +8 -0
- package/docs/content/locales/es-ES/faq.mdx +1 -1
- package/docs/content/locales/es-ES/template-chat.mdx +1 -1
- package/docs/content/locales/fr-FR/cloneable-saas.mdx +2 -2
- package/docs/content/locales/fr-FR/evals.mdx +8 -0
- package/docs/content/locales/fr-FR/faq.mdx +1 -1
- package/docs/content/locales/fr-FR/template-chat.mdx +1 -1
- package/docs/content/locales/hi-IN/cloneable-saas.mdx +2 -2
- package/docs/content/locales/hi-IN/evals.mdx +8 -0
- package/docs/content/locales/hi-IN/faq.mdx +1 -1
- package/docs/content/locales/hi-IN/template-chat.mdx +1 -1
- package/docs/content/locales/ja-JP/cloneable-saas.mdx +2 -2
- package/docs/content/locales/ja-JP/evals.mdx +7 -0
- package/docs/content/locales/ja-JP/faq.mdx +1 -1
- package/docs/content/locales/ja-JP/template-chat.mdx +1 -1
- package/docs/content/locales/ko-KR/cloneable-saas.mdx +2 -2
- package/docs/content/locales/ko-KR/evals.mdx +7 -0
- package/docs/content/locales/ko-KR/faq.mdx +1 -1
- package/docs/content/locales/ko-KR/template-chat.mdx +1 -1
- package/docs/content/locales/pt-BR/cloneable-saas.mdx +2 -2
- package/docs/content/locales/pt-BR/evals.mdx +8 -0
- package/docs/content/locales/pt-BR/faq.mdx +1 -1
- package/docs/content/locales/pt-BR/template-chat.mdx +1 -1
- package/docs/content/locales/zh-CN/cloneable-saas.mdx +2 -2
- package/docs/content/locales/zh-CN/evals.mdx +7 -0
- package/docs/content/locales/zh-CN/faq.mdx +1 -1
- package/docs/content/locales/zh-CN/template-chat.mdx +1 -1
- package/docs/content/locales/zh-TW/cloneable-saas.mdx +2 -2
- package/docs/content/locales/zh-TW/evals.mdx +7 -0
- package/docs/content/locales/zh-TW/faq.mdx +1 -1
- package/docs/content/locales/zh-TW/template-chat.mdx +1 -1
- package/docs/content/template-chat.mdx +1 -1
- package/package.json +1 -1
- package/corpus/templates/content/server/routes/api/notion/disconnect.post.ts +0 -12
- package/corpus/templates/design/app/components/design/LocalSourceEditBanner.tsx +0 -157
- package/corpus/templates/design/app/lib/design-templates.ts +0 -1305
- package/corpus/templates/design/app/pages/Templates.tsx +0 -279
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { writeFileSync } from "node:fs";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
|
|
4
|
+
import { parityMatrix } from "./matrix";
|
|
5
|
+
import type { ParityRow } from "./matrix.types";
|
|
6
|
+
|
|
7
|
+
function escapeCell(value: string) {
|
|
8
|
+
return value.replace(/\|/g, "\\|").replace(/\n/g, "<br>");
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function cell(value: string | string[] | null | undefined) {
|
|
12
|
+
if (Array.isArray(value))
|
|
13
|
+
return escapeCell(value.length ? value.join(", ") : "-");
|
|
14
|
+
if (value === null || value === undefined || value === "") return "-";
|
|
15
|
+
return escapeCell(value);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const headers = [
|
|
19
|
+
"ID",
|
|
20
|
+
"Surface",
|
|
21
|
+
"User-visible action",
|
|
22
|
+
"Status",
|
|
23
|
+
"Actions",
|
|
24
|
+
"UI entrypoints",
|
|
25
|
+
"Durable effect",
|
|
26
|
+
"Exception / gap",
|
|
27
|
+
"Reliability risk",
|
|
28
|
+
"Spine priority",
|
|
29
|
+
"Test coverage",
|
|
30
|
+
"Coverage refs",
|
|
31
|
+
"Eval scenarios",
|
|
32
|
+
"Follow-up",
|
|
33
|
+
];
|
|
34
|
+
|
|
35
|
+
function renderRow(row: ParityRow) {
|
|
36
|
+
return [
|
|
37
|
+
row.id,
|
|
38
|
+
row.surface,
|
|
39
|
+
row.label,
|
|
40
|
+
row.status,
|
|
41
|
+
row.actions.length
|
|
42
|
+
? row.actions.map((action) => `\`${action}\``).join(", ")
|
|
43
|
+
: "-",
|
|
44
|
+
row.uiEntrypoints.map((entry) => `\`${entry}\``).join(", "),
|
|
45
|
+
row.durableEffect,
|
|
46
|
+
row.exception,
|
|
47
|
+
row.reliabilityRisk === "none" ? "-" : row.reliabilityRisk,
|
|
48
|
+
row.spinePriority,
|
|
49
|
+
row.testCoverage,
|
|
50
|
+
row.coverageRefs?.map((ref) => `\`${ref}\``).join(", "),
|
|
51
|
+
row.evalScenarioIds?.map((id) => `\`${id}\``).join(", "),
|
|
52
|
+
row.followUpPR,
|
|
53
|
+
].map(cell);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function renderTable(rows: string[][]) {
|
|
57
|
+
const widths = headers.map((header, index) =>
|
|
58
|
+
Math.max(header.length, ...rows.map((row) => row[index]?.length ?? 0)),
|
|
59
|
+
);
|
|
60
|
+
const renderCells = (cells: string[]) =>
|
|
61
|
+
`| ${cells.map((value, index) => value.padEnd(widths[index])).join(" | ")} |`;
|
|
62
|
+
return [
|
|
63
|
+
renderCells(headers),
|
|
64
|
+
renderCells(widths.map((width) => "-".repeat(width))),
|
|
65
|
+
...rows.map(renderCells),
|
|
66
|
+
];
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export function renderParityMatrixMarkdown(rows: ParityRow[] = parityMatrix) {
|
|
70
|
+
const sortedRows = [...rows].sort((a, b) => a.id.localeCompare(b.id));
|
|
71
|
+
return [
|
|
72
|
+
"# Content Agent/UI Action Parity Matrix",
|
|
73
|
+
"",
|
|
74
|
+
"This generated matrix tracks whether high-value Content UI operations use the same action surface agents can call, or have an explicit exception. Edit `matrix.ts`, then regenerate this file.",
|
|
75
|
+
"",
|
|
76
|
+
...renderTable(sortedRows.map(renderRow)),
|
|
77
|
+
"",
|
|
78
|
+
].join("\n");
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const isCli = process.argv[1] === fileURLToPath(import.meta.url);
|
|
82
|
+
|
|
83
|
+
if (isCli) {
|
|
84
|
+
const markdown = renderParityMatrixMarkdown();
|
|
85
|
+
if (process.argv.includes("--write")) {
|
|
86
|
+
writeFileSync(new URL("./matrix.md", import.meta.url), markdown);
|
|
87
|
+
} else {
|
|
88
|
+
process.stdout.write(markdown);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import {
|
|
2
|
+
contains,
|
|
3
|
+
createScorer,
|
|
4
|
+
defineEval,
|
|
5
|
+
type AgentRunOutput,
|
|
6
|
+
type Eval,
|
|
7
|
+
} from "@agent-native/core/eval";
|
|
8
|
+
|
|
9
|
+
import type { ParityEvalScenario } from "./eval-scenarios.ts";
|
|
10
|
+
|
|
11
|
+
function expectedToolScorer(expectedTools: string[]) {
|
|
12
|
+
return createScorer<AgentRunOutput, { used: string[]; missing: string[] }>({
|
|
13
|
+
name: "expected_tools",
|
|
14
|
+
analyze(run) {
|
|
15
|
+
const usedTools = new Set(run.toolCalls);
|
|
16
|
+
return {
|
|
17
|
+
used: expectedTools.filter((tool) => usedTools.has(tool)),
|
|
18
|
+
missing: expectedTools.filter((tool) => !usedTools.has(tool)),
|
|
19
|
+
};
|
|
20
|
+
},
|
|
21
|
+
generateScore({ missing }) {
|
|
22
|
+
return expectedTools.length === 0 || missing.length === 0 ? 1 : 0;
|
|
23
|
+
},
|
|
24
|
+
generateReason({ analysis: { used, missing } }) {
|
|
25
|
+
if (missing.length === 0) {
|
|
26
|
+
return `Agent called all expected tool(s): ${used.join(", ")}`;
|
|
27
|
+
}
|
|
28
|
+
return `Called expected tool(s): ${used.join(", ") || "none"}; missing: ${missing.join(", ")}`;
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function scenarioToEval(scenario: ParityEvalScenario): Eval {
|
|
34
|
+
const name = `content-parity:${scenario.id}`;
|
|
35
|
+
|
|
36
|
+
if (!process.env[scenario.gateEnv]) {
|
|
37
|
+
return defineEval({
|
|
38
|
+
name,
|
|
39
|
+
input: { prompt: scenario.prompt },
|
|
40
|
+
threshold: 1,
|
|
41
|
+
skipReason: `Skipped because ${scenario.gateEnv} is unset`,
|
|
42
|
+
scorers: [],
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return defineEval({
|
|
47
|
+
name,
|
|
48
|
+
input: { prompt: scenario.prompt },
|
|
49
|
+
threshold: 0.6,
|
|
50
|
+
scorers: [
|
|
51
|
+
contains(scenario.successSignals),
|
|
52
|
+
...(scenario.expectedTools?.length
|
|
53
|
+
? [expectedToolScorer(scenario.expectedTools)]
|
|
54
|
+
: []),
|
|
55
|
+
],
|
|
56
|
+
});
|
|
57
|
+
}
|
|
@@ -646,6 +646,10 @@ export interface ContentDatabaseResponse {
|
|
|
646
646
|
createdDocumentId?: string;
|
|
647
647
|
duplicatedItemId?: string;
|
|
648
648
|
duplicatedDocumentId?: string;
|
|
649
|
+
duplicatedItemIds?: string[];
|
|
650
|
+
duplicatedDocumentIds?: string[];
|
|
651
|
+
deletedItemIds?: string[];
|
|
652
|
+
deletedDocumentIds?: string[];
|
|
649
653
|
}
|
|
650
654
|
|
|
651
655
|
export interface ContentDatabaseUnavailableResponse {
|
|
@@ -701,6 +705,13 @@ export interface DuplicateDatabaseItemRequest {
|
|
|
701
705
|
title?: string;
|
|
702
706
|
}
|
|
703
707
|
|
|
708
|
+
export interface DatabaseItemsBatchRequest {
|
|
709
|
+
databaseId?: string;
|
|
710
|
+
documentId?: string;
|
|
711
|
+
itemIds?: string[];
|
|
712
|
+
documentIds?: string[];
|
|
713
|
+
}
|
|
714
|
+
|
|
704
715
|
export interface MoveDatabaseItemRequest {
|
|
705
716
|
itemId?: string;
|
|
706
717
|
documentId?: string;
|
|
@@ -65,9 +65,14 @@ For one-shot agent setup, ask for JSON and keep the long-running bridge open in
|
|
|
65
65
|
a second terminal if the user needs live updates:
|
|
66
66
|
|
|
67
67
|
```bash
|
|
68
|
-
npx @agent-native/core@latest design connect --url http://localhost:5173 --root .
|
|
68
|
+
npx @agent-native/core@latest design connect --url http://localhost:5173 --root .
|
|
69
|
+
curl http://127.0.0.1:7331/manifest.json
|
|
69
70
|
```
|
|
70
71
|
|
|
72
|
+
Do not use `--json` for an editable session. `--json`, `--once`, and
|
|
73
|
+
`--dry-run` print the manifest and exit, so Design will fall back to a
|
|
74
|
+
non-editable live iframe as soon as it tries to refresh the snapshot.
|
|
75
|
+
|
|
71
76
|
## Action Flow
|
|
72
77
|
|
|
73
78
|
1. Register or refresh the bridge in Design:
|
|
@@ -17,6 +17,7 @@ import { z } from "zod";
|
|
|
17
17
|
import { getDb, schema } from "../server/db/index.js";
|
|
18
18
|
import {
|
|
19
19
|
mergeCanvasFramePlacements,
|
|
20
|
+
parseCanvasFrameGeometryById,
|
|
20
21
|
type CanvasFramePlacement,
|
|
21
22
|
} from "../shared/canvas-frames.js";
|
|
22
23
|
import {
|
|
@@ -148,6 +149,25 @@ function uniqueFilename(
|
|
|
148
149
|
return filename;
|
|
149
150
|
}
|
|
150
151
|
|
|
152
|
+
export function viewportFilename(
|
|
153
|
+
pathOrUrl: string,
|
|
154
|
+
width: number,
|
|
155
|
+
height: number,
|
|
156
|
+
) {
|
|
157
|
+
const viewport = `${Math.round(width)}x${Math.round(height)}`;
|
|
158
|
+
return `localhost-${slugForPath(pathOrUrl)}-${viewport}.html`;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function metadataNumber(
|
|
162
|
+
metadata: Record<string, unknown> | undefined,
|
|
163
|
+
key: "width" | "height",
|
|
164
|
+
) {
|
|
165
|
+
const value = metadata?.[key];
|
|
166
|
+
return typeof value === "number" && Number.isFinite(value)
|
|
167
|
+
? value
|
|
168
|
+
: undefined;
|
|
169
|
+
}
|
|
170
|
+
|
|
151
171
|
export default defineAction({
|
|
152
172
|
description:
|
|
153
173
|
"Create or refresh URL-backed localhost screens in a design project. " +
|
|
@@ -179,14 +199,12 @@ export default defineAction({
|
|
|
179
199
|
.number()
|
|
180
200
|
.positive()
|
|
181
201
|
.optional()
|
|
182
|
-
.
|
|
183
|
-
.describe("Default iframe viewport width."),
|
|
202
|
+
.describe("Default iframe viewport width. Defaults to 1280."),
|
|
184
203
|
defaultHeight: z
|
|
185
204
|
.number()
|
|
186
205
|
.positive()
|
|
187
206
|
.optional()
|
|
188
|
-
.
|
|
189
|
-
.describe("Default iframe viewport height."),
|
|
207
|
+
.describe("Default iframe viewport height. Defaults to 900."),
|
|
190
208
|
startX: z.number().optional().default(0),
|
|
191
209
|
startY: z.number().optional().default(0),
|
|
192
210
|
gap: z.number().optional().default(160),
|
|
@@ -292,6 +310,13 @@ export default defineAction({
|
|
|
292
310
|
.from(schema.designs)
|
|
293
311
|
.where(eq(schema.designs.id, designId))
|
|
294
312
|
.limit(1);
|
|
313
|
+
const prevData = parseJson<Record<string, unknown>>(design?.data, {});
|
|
314
|
+
const existingCanvasFrames = parseCanvasFrameGeometryById(
|
|
315
|
+
prevData.canvasFrames,
|
|
316
|
+
);
|
|
317
|
+
const existingMetadata = isRecord(prevData.screenMetadata)
|
|
318
|
+
? (prevData.screenMetadata as Record<string, unknown>)
|
|
319
|
+
: {};
|
|
295
320
|
const existingFiles = await db
|
|
296
321
|
.select()
|
|
297
322
|
.from(schema.designFiles)
|
|
@@ -301,6 +326,8 @@ export default defineAction({
|
|
|
301
326
|
);
|
|
302
327
|
const usedFilenames = new Set(existingFiles.map((file) => file.filename));
|
|
303
328
|
const now = new Date().toISOString();
|
|
329
|
+
const effectiveDefaultWidth = defaultWidth ?? 1280;
|
|
330
|
+
const effectiveDefaultHeight = defaultHeight ?? 900;
|
|
304
331
|
const savedScreens: Array<{
|
|
305
332
|
id: string;
|
|
306
333
|
filename: string;
|
|
@@ -333,9 +360,38 @@ export default defineAction({
|
|
|
333
360
|
const title =
|
|
334
361
|
input.title ?? manifestRoute?.title ?? titleFromRoutePath(path);
|
|
335
362
|
const sourceFile = input.sourceFile ?? manifestRoute?.sourceFile;
|
|
336
|
-
const width = input.width ??
|
|
337
|
-
const height = input.height ??
|
|
338
|
-
const
|
|
363
|
+
const width = input.width ?? effectiveDefaultWidth;
|
|
364
|
+
const height = input.height ?? effectiveDefaultHeight;
|
|
365
|
+
const basePreferredFilename = `localhost-${slugForPath(path)}.html`;
|
|
366
|
+
const existingBase = existingByFilename.get(basePreferredFilename);
|
|
367
|
+
const requestedViewportExplicitly =
|
|
368
|
+
input.width !== undefined ||
|
|
369
|
+
input.height !== undefined ||
|
|
370
|
+
defaultWidth !== undefined ||
|
|
371
|
+
defaultHeight !== undefined;
|
|
372
|
+
const existingBaseMetadata = isRecord(
|
|
373
|
+
existingBase ? existingMetadata[existingBase.id] : undefined,
|
|
374
|
+
)
|
|
375
|
+
? (existingMetadata[existingBase!.id] as Record<string, unknown>)
|
|
376
|
+
: undefined;
|
|
377
|
+
const existingBaseFrame = existingBase
|
|
378
|
+
? existingCanvasFrames[existingBase.id]
|
|
379
|
+
: undefined;
|
|
380
|
+
const existingBaseWidth =
|
|
381
|
+
existingBaseFrame?.width ??
|
|
382
|
+
metadataNumber(existingBaseMetadata, "width");
|
|
383
|
+
const existingBaseHeight =
|
|
384
|
+
existingBaseFrame?.height ??
|
|
385
|
+
metadataNumber(existingBaseMetadata, "height");
|
|
386
|
+
const viewportDiffersFromBase =
|
|
387
|
+
(typeof existingBaseWidth === "number" &&
|
|
388
|
+
existingBaseWidth !== width) ||
|
|
389
|
+
(typeof existingBaseHeight === "number" &&
|
|
390
|
+
existingBaseHeight !== height);
|
|
391
|
+
const preferredFilename =
|
|
392
|
+
existingBase && requestedViewportExplicitly && viewportDiffersFromBase
|
|
393
|
+
? viewportFilename(path, width, height)
|
|
394
|
+
: basePreferredFilename;
|
|
339
395
|
const existing = existingByFilename.get(preferredFilename);
|
|
340
396
|
const filename =
|
|
341
397
|
existing?.filename ??
|
|
@@ -387,7 +443,6 @@ export default defineAction({
|
|
|
387
443
|
});
|
|
388
444
|
}
|
|
389
445
|
|
|
390
|
-
const prevData = parseJson<Record<string, unknown>>(design?.data, {});
|
|
391
446
|
const mergedFrames = mergeCanvasFramePlacements({
|
|
392
447
|
existing: prevData.canvasFrames,
|
|
393
448
|
placements,
|
|
@@ -31,6 +31,7 @@ import {
|
|
|
31
31
|
assertSafeMotionCssProperty,
|
|
32
32
|
assertSafeMotionCssToken,
|
|
33
33
|
compile,
|
|
34
|
+
injectManagedMotionCss,
|
|
34
35
|
} from "../shared/motion-compiler.js";
|
|
35
36
|
import type { MotionTrack } from "../shared/motion-timeline.js";
|
|
36
37
|
|
|
@@ -69,55 +70,12 @@ const trackSchema = z.object({
|
|
|
69
70
|
|
|
70
71
|
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
71
72
|
|
|
72
|
-
const MOTION_STYLE_OPEN = "<style data-agent-native-motion>";
|
|
73
|
-
const MOTION_STYLE_CLOSE = "</style>";
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* Bounded, case-insensitive matcher for any HTML `</style>` end tag
|
|
77
|
-
* (`</style >`, `</STYLE>`, …). Used to locate the close of the managed block
|
|
78
|
-
* without a naive `indexOf("</style>")` that would miss case/whitespace
|
|
79
|
-
* variants — and to detect any `</style` sequence smuggled into compiled CSS.
|
|
80
|
-
*/
|
|
81
|
-
const STYLE_CLOSE_RE = /<\s*\/\s*style\b[^>]*>/i;
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Inject or replace the managed `<style data-agent-native-motion>` block in
|
|
85
|
-
* the HTML content. Inserts before `</head>` when not already present.
|
|
86
|
-
*/
|
|
87
|
-
function injectMotionStyle(html: string, css: string): string {
|
|
88
|
-
const open = MOTION_STYLE_OPEN;
|
|
89
|
-
const close = MOTION_STYLE_CLOSE;
|
|
90
|
-
const openIdx = html.indexOf(open);
|
|
91
|
-
|
|
92
|
-
if (openIdx !== -1) {
|
|
93
|
-
// Find the matching closing tag after the open tag using a bounded regex
|
|
94
|
-
// (tolerates `</style >`, `</STYLE>`, etc.) instead of a literal indexOf.
|
|
95
|
-
const after = html.slice(openIdx + open.length);
|
|
96
|
-
const closeMatch = STYLE_CLOSE_RE.exec(after);
|
|
97
|
-
if (closeMatch) {
|
|
98
|
-
const closeIdx = openIdx + open.length + closeMatch.index;
|
|
99
|
-
// Replace the existing block.
|
|
100
|
-
return (
|
|
101
|
-
html.slice(0, openIdx) + open + "\n" + css + "\n" + html.slice(closeIdx)
|
|
102
|
-
);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
// Not found — insert before </head> or, if there is no <head>, at the top.
|
|
107
|
-
const headClose = html.lastIndexOf("</head>");
|
|
108
|
-
const block = `${open}\n${css}\n${close}`;
|
|
109
|
-
if (headClose !== -1) {
|
|
110
|
-
return html.slice(0, headClose) + block + "\n" + html.slice(headClose);
|
|
111
|
-
}
|
|
112
|
-
return block + "\n" + html;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
73
|
async function persistFileContent(
|
|
116
74
|
fileId: string,
|
|
117
75
|
designId: string,
|
|
118
76
|
content: string,
|
|
119
77
|
now: string,
|
|
120
|
-
): Promise<
|
|
78
|
+
): Promise<string> {
|
|
121
79
|
const db = getDb();
|
|
122
80
|
await db
|
|
123
81
|
.update(schema.designFiles)
|
|
@@ -134,6 +92,8 @@ async function persistFileContent(
|
|
|
134
92
|
.update(schema.designs)
|
|
135
93
|
.set({ updatedAt: now })
|
|
136
94
|
.where(eq(schema.designs.id, designId));
|
|
95
|
+
|
|
96
|
+
return now;
|
|
137
97
|
}
|
|
138
98
|
|
|
139
99
|
// ─── Action ───────────────────────────────────────────────────────────────────
|
|
@@ -296,7 +256,7 @@ export default defineAction({
|
|
|
296
256
|
});
|
|
297
257
|
|
|
298
258
|
// ── 3. Inject the managed CSS block into the HTML ───────────────────────
|
|
299
|
-
const patchedContent =
|
|
259
|
+
const patchedContent = injectManagedMotionCss(currentContent, css);
|
|
300
260
|
const bytesBefore = currentContent.length;
|
|
301
261
|
const bytesAfter = patchedContent.length;
|
|
302
262
|
|
|
@@ -392,7 +352,12 @@ export default defineAction({
|
|
|
392
352
|
// Written after the row so a SQL failure here leaves the timeline row
|
|
393
353
|
// accurate (correct tracks + hash) and the stale HTML can be recompiled on
|
|
394
354
|
// the next apply-motion-edit call via compiledHash drift detection.
|
|
395
|
-
await persistFileContent(
|
|
355
|
+
const updatedAt = await persistFileContent(
|
|
356
|
+
fileId,
|
|
357
|
+
designId,
|
|
358
|
+
patchedContent,
|
|
359
|
+
now,
|
|
360
|
+
);
|
|
396
361
|
|
|
397
362
|
return {
|
|
398
363
|
timelineId: resolvedTimelineId,
|
|
@@ -401,6 +366,7 @@ export default defineAction({
|
|
|
401
366
|
sourceRef: resolvedSourceRef,
|
|
402
367
|
trackCount: typedTracks.length,
|
|
403
368
|
compiledHash: hash,
|
|
369
|
+
updatedAt,
|
|
404
370
|
bytesBefore,
|
|
405
371
|
bytesAfter,
|
|
406
372
|
bytesDelta: bytesAfter - bytesBefore,
|
|
@@ -90,7 +90,8 @@ export default defineAction({
|
|
|
90
90
|
}),
|
|
91
91
|
http: { method: "GET" },
|
|
92
92
|
readOnly: true,
|
|
93
|
-
|
|
93
|
+
requiresAuth: false,
|
|
94
|
+
publicAgent: { expose: true, readOnly: true, requiresAuth: false },
|
|
94
95
|
run: ({ category }) => {
|
|
95
96
|
const assets = category
|
|
96
97
|
? DESIGN_NATIVE_ASSETS.filter((asset) => asset.category === category)
|
|
@@ -39,6 +39,7 @@ import { z } from "zod";
|
|
|
39
39
|
import { getDb, schema } from "../server/db/index.js";
|
|
40
40
|
import {
|
|
41
41
|
BOARD_FILENAME,
|
|
42
|
+
backfillBoardPrimitiveMarkers,
|
|
42
43
|
boardObjectEntryToHtmlFragment,
|
|
43
44
|
emptyBoardHtml,
|
|
44
45
|
} from "../shared/board-file.js";
|
|
@@ -91,10 +92,57 @@ export default defineAction({
|
|
|
91
92
|
typeof parsed["boardFileId"] === "string" &&
|
|
92
93
|
parsed["boardFileId"].length > 0
|
|
93
94
|
) {
|
|
95
|
+
// ── Marker backfill path ───────────────────────────────────────────────
|
|
96
|
+
// The board file exists (boardFileId set), but it may have been created
|
|
97
|
+
// before the data-an-primitive marker was introduced. Run the additive
|
|
98
|
+
// backfill so the layers-panel renders the correct icon (ellipse / text /
|
|
99
|
+
// frame / rectangle) instead of the generic code glyph.
|
|
100
|
+
const existingBoardFileId = parsed["boardFileId"] as string;
|
|
101
|
+
|
|
102
|
+
const [boardFileRow] = await db
|
|
103
|
+
.select({ content: schema.designFiles.content })
|
|
104
|
+
.from(schema.designFiles)
|
|
105
|
+
.where(eq(schema.designFiles.id, existingBoardFileId))
|
|
106
|
+
.limit(1);
|
|
107
|
+
|
|
108
|
+
if (boardFileRow) {
|
|
109
|
+
const originalContent = boardFileRow.content ?? "";
|
|
110
|
+
// Only run backfill when the board file has node-id elements but is
|
|
111
|
+
// missing at least one data-an-primitive marker.
|
|
112
|
+
const needsBackfill =
|
|
113
|
+
originalContent.includes("data-agent-native-node-id=") &&
|
|
114
|
+
!originalContent.includes("data-an-primitive=");
|
|
115
|
+
|
|
116
|
+
if (needsBackfill) {
|
|
117
|
+
const backfilledContent =
|
|
118
|
+
backfillBoardPrimitiveMarkers(originalContent);
|
|
119
|
+
const now = new Date().toISOString();
|
|
120
|
+
await db
|
|
121
|
+
.update(schema.designFiles)
|
|
122
|
+
.set({ content: backfilledContent, updatedAt: now })
|
|
123
|
+
.where(eq(schema.designFiles.id, existingBoardFileId));
|
|
124
|
+
|
|
125
|
+
// Best-effort collab re-seed.
|
|
126
|
+
try {
|
|
127
|
+
await seedFromText(existingBoardFileId, backfilledContent);
|
|
128
|
+
} catch {
|
|
129
|
+
// Non-fatal.
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
return {
|
|
133
|
+
designId,
|
|
134
|
+
migrated: false,
|
|
135
|
+
boardFileId: existingBoardFileId,
|
|
136
|
+
reason:
|
|
137
|
+
"boardFileId already set — backfilled missing data-an-primitive markers.",
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
94
142
|
return {
|
|
95
143
|
designId,
|
|
96
144
|
migrated: false,
|
|
97
|
-
boardFileId:
|
|
145
|
+
boardFileId: existingBoardFileId,
|
|
98
146
|
reason: "boardFileId already set — migration already complete.",
|
|
99
147
|
};
|
|
100
148
|
}
|
|
@@ -10,12 +10,11 @@
|
|
|
10
10
|
* pnpm action navigate --view=editor --designId=abc123 --filename=checkout.html
|
|
11
11
|
* pnpm action navigate --view=design-systems
|
|
12
12
|
* pnpm action navigate --view=design-systems --designSystemId=abc123
|
|
13
|
-
* pnpm action navigate --view=templates
|
|
14
13
|
* pnpm action navigate --view=settings
|
|
15
14
|
* pnpm action navigate --path=/some/route
|
|
16
15
|
*
|
|
17
16
|
* Options:
|
|
18
|
-
* --view View name (list, editor, design-systems, present,
|
|
17
|
+
* --view View name (list, editor, design-systems, present, settings)
|
|
19
18
|
* --designId Design ID (for editor/present views)
|
|
20
19
|
* --editorView Editor mode for designs: single or overview
|
|
21
20
|
* --inspectorTab Inspector tab for designs: design or tweaks (extensions opens Tools for compatibility)
|
|
@@ -58,19 +57,11 @@ const designLeftPanelSchema = z.enum([
|
|
|
58
57
|
|
|
59
58
|
export default defineAction({
|
|
60
59
|
description:
|
|
61
|
-
"Navigate the UI to a specific view or path. Views: list, editor, design-systems, present,
|
|
60
|
+
"Navigate the UI to a specific view or path. Views: list, editor, design-systems, present, 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 leftPanel=file|agent|assets|tools|tokens to focus the Figma-style left rail. Legacy inspectorTab=extensions opens Tools. Use tool to activate a design editor tool.",
|
|
62
61
|
schema: z
|
|
63
62
|
.object({
|
|
64
63
|
view: z
|
|
65
|
-
.enum([
|
|
66
|
-
"list",
|
|
67
|
-
"editor",
|
|
68
|
-
"design-systems",
|
|
69
|
-
"present",
|
|
70
|
-
"templates",
|
|
71
|
-
"examples",
|
|
72
|
-
"settings",
|
|
73
|
-
])
|
|
64
|
+
.enum(["list", "editor", "design-systems", "present", "settings"])
|
|
74
65
|
.optional()
|
|
75
66
|
.describe("View name to navigate to"),
|
|
76
67
|
designId: z.string().optional().describe("Design ID for editor/present"),
|