@agent-native/core 0.132.2 → 0.133.0
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 +161 -0
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/a2a/correlation.ts +11 -1
- package/corpus/core/src/a2a/types.ts +11 -3
- package/corpus/core/src/agent/engine/ai-sdk-engine.ts +33 -46
- package/corpus/core/src/agent/engine/builder-engine.ts +22 -10
- package/corpus/core/src/agent/engine/error-detail.ts +184 -3
- package/corpus/core/src/agent/engine/failure-taxonomy.ts +123 -0
- package/corpus/core/src/agent/engine/index.ts +8 -0
- package/corpus/core/src/agent/engine/registry.ts +92 -8
- package/corpus/core/src/agent/engine/translate-ai-sdk.ts +17 -2
- package/corpus/core/src/agent/production-agent.ts +13 -33
- package/corpus/core/src/agent/run-loop-with-resume.ts +1 -1
- package/corpus/core/src/agent/run-manager.ts +43 -14
- package/corpus/core/src/agent/run-store.ts +30 -3
- package/corpus/core/src/agent/thread-data-builder.ts +36 -4
- package/corpus/core/src/cli/templates-meta.ts +13 -0
- package/corpus/core/src/cli/workspace-dev.ts +1 -0
- package/corpus/core/src/client/error-format.ts +12 -0
- package/corpus/core/src/credentials/index.ts +51 -12
- package/corpus/core/src/extensions/url-safety.ts +46 -12
- package/corpus/core/src/integrations/adapters/slack.ts +32 -10
- package/corpus/core/src/integrations/google-docs-poller.ts +12 -1
- package/corpus/core/src/integrations/installations-store.ts +30 -0
- package/corpus/core/src/integrations/plugin.ts +5 -5
- package/corpus/core/src/integrations/types.ts +7 -0
- package/corpus/core/src/integrations/webhook-handler.ts +24 -1
- package/corpus/core/src/jobs/background-automation-runner.ts +38 -1
- package/corpus/core/src/provider-api/index.ts +8 -2
- package/corpus/core/src/scripts/call-agent.ts +6 -0
- package/corpus/core/src/server/agent-chat-plugin.ts +30 -9
- package/corpus/core/src/server/agent-discovery.ts +2 -0
- package/corpus/core/src/server/builder-design-systems.ts +21 -0
- package/corpus/core/src/server/credential-provider.ts +51 -12
- package/corpus/core/src/server/index.ts +1 -0
- package/corpus/core/src/server/onboarding-html.ts +37 -2
- package/corpus/core/src/shared/reasoning-effort.ts +1 -1
- package/corpus/core/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +11 -0
- package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +6 -2
- package/corpus/templates/assets/app/components/layout/Sidebar.tsx +39 -19
- package/corpus/templates/assets/changelog/2026-07-31-the-agent-native-logo-stays-visible-when-the-sidebar-is-coll.md +6 -0
- package/corpus/templates/brain/app/components/layout/Sidebar.tsx +30 -3
- package/corpus/templates/brain/changelog/2026-07-31-clicking-the-agent-native-logo-now-toggles-the-app-sidebar.md +6 -0
- package/corpus/templates/calendar/app/components/layout/AppLayout.tsx +1 -1
- package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +54 -25
- package/corpus/templates/calendar/changelog/2026-07-31-the-agent-native-logo-stays-visible-when-the-sidebar-is-coll.md +6 -0
- package/corpus/templates/chat/app/components/layout/Sidebar.tsx +30 -3
- package/corpus/templates/chat/changelog/2026-07-31-clicking-the-agent-native-logo-now-toggles-the-app-sidebar.md +6 -0
- package/corpus/templates/clips/app/components/library/library-layout.tsx +37 -21
- package/corpus/templates/clips/changelog/2026-07-31-the-agent-native-logo-stays-visible-when-the-sidebar-is-coll.md +6 -0
- package/corpus/templates/clips/desktop/src/hooks/useMediaDevices.ts +1 -1
- package/corpus/templates/clips/desktop/src/lib/media-capture-constraints.ts +1 -1
- package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +34 -17
- package/corpus/templates/content/changelog/2026-07-31-the-agent-native-logo-stays-visible-when-the-sidebar-is-coll.md +6 -0
- package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +6 -2
- package/corpus/templates/design/actions/create-design-system.ts +1 -0
- package/corpus/templates/design/actions/set-default-design-system.ts +34 -26
- package/corpus/templates/design/app/components/layout/Sidebar.tsx +21 -4
- package/corpus/templates/design/app/i18n-data.ts +39 -0
- package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +229 -12
- package/corpus/templates/design/app/pages/DesignSystems.tsx +10 -4
- package/corpus/templates/design/changelog/2026-07-31-clicking-the-agent-native-logo-now-toggles-the-app-sidebar.md +6 -0
- package/corpus/templates/design/changelog/2026-07-31-design-system-indexing-keeps-your-chosen-name-when-you-uploa.md +6 -0
- package/corpus/templates/design/server/lib/builder-design-system-proxy.ts +19 -4
- package/corpus/templates/dispatch/AGENTS.md +4 -0
- package/corpus/templates/factory/.agents/skills/actions/SKILL.md +562 -0
- package/corpus/templates/factory/.agents/skills/adding-a-feature/SKILL.md +198 -0
- package/corpus/templates/factory/.agents/skills/agent-native-docs/SKILL.md +115 -0
- package/corpus/templates/factory/.agents/skills/agent-native-toolkit/SKILL.md +182 -0
- package/corpus/templates/factory/.agents/skills/capture-learnings/SKILL.md +89 -0
- package/corpus/templates/factory/.agents/skills/create-skill/SKILL.md +221 -0
- package/corpus/templates/factory/.agents/skills/customizing-agent-native/SKILL.md +220 -0
- package/corpus/templates/factory/.agents/skills/delegate-to-agent/SKILL.md +263 -0
- package/corpus/templates/factory/.agents/skills/factory-graphs/SKILL.md +52 -0
- package/corpus/templates/factory/.agents/skills/feature-flags/SKILL.md +169 -0
- package/corpus/templates/factory/.agents/skills/frontend-design/SKILL.md +174 -0
- package/corpus/templates/factory/.agents/skills/real-time-sync/SKILL.md +232 -0
- package/corpus/templates/factory/.agents/skills/security/SKILL.md +324 -0
- package/corpus/templates/factory/.agents/skills/self-modifying-code/SKILL.md +119 -0
- package/corpus/templates/factory/.agents/skills/shadcn-ui/SKILL.md +123 -0
- package/corpus/templates/factory/.agents/skills/sharing/SKILL.md +232 -0
- package/corpus/templates/factory/.agents/skills/storing-data/SKILL.md +178 -0
- package/corpus/templates/factory/.agents/skills/upgrade-agent-native/SKILL.md +122 -0
- package/corpus/templates/factory/.env.example +24 -0
- package/corpus/templates/factory/.ignore +0 -0
- package/corpus/templates/factory/.oxfmtrc.json +8 -0
- package/corpus/templates/factory/AGENTS.md +90 -0
- package/corpus/templates/factory/CHANGELOG.md +10 -0
- package/corpus/templates/factory/DEVELOPING.md +185 -0
- package/corpus/templates/factory/README.md +64 -0
- package/corpus/templates/factory/_gitignore +42 -0
- package/corpus/templates/factory/actions/add-factory-comment.ts +55 -0
- package/corpus/templates/factory/actions/approve-factory-item.ts +214 -0
- package/corpus/templates/factory/actions/babysit-pull-request.ts +126 -0
- package/corpus/templates/factory/actions/evaluate-triage-item.ts +172 -0
- package/corpus/templates/factory/actions/get-factory-graph.ts +62 -0
- package/corpus/templates/factory/actions/get-triage-config.ts +42 -0
- package/corpus/templates/factory/actions/get-triage-item.ts +74 -0
- package/corpus/templates/factory/actions/hello.ts +13 -0
- package/corpus/templates/factory/actions/ingest-github-observation.ts +100 -0
- package/corpus/templates/factory/actions/list-factories.ts +40 -0
- package/corpus/templates/factory/actions/list-factory-comments.ts +40 -0
- package/corpus/templates/factory/actions/list-triage-items.ts +85 -0
- package/corpus/templates/factory/actions/list-triage-rules.ts +44 -0
- package/corpus/templates/factory/actions/navigate.ts +41 -0
- package/corpus/templates/factory/actions/poll-slack-channel.ts +118 -0
- package/corpus/templates/factory/actions/reconcile-triage-run.ts +179 -0
- package/corpus/templates/factory/actions/record-triage-feedback.ts +58 -0
- package/corpus/templates/factory/actions/run.ts +2 -0
- package/corpus/templates/factory/actions/save-factory-graph.ts +129 -0
- package/corpus/templates/factory/actions/save-triage-config.ts +67 -0
- package/corpus/templates/factory/actions/save-triage-rule.ts +89 -0
- package/corpus/templates/factory/actions/suggest-factory-rules.ts +70 -0
- package/corpus/templates/factory/actions/view-screen.ts +73 -0
- package/corpus/templates/factory/app/components/factory/FactoryCanvas.tsx +441 -0
- package/corpus/templates/factory/app/components/factory/FactoryInspector.tsx +388 -0
- package/corpus/templates/factory/app/components/layout/Header.tsx +60 -0
- package/corpus/templates/factory/app/components/layout/Layout.tsx +190 -0
- package/corpus/templates/factory/app/components/layout/Sidebar.tsx +538 -0
- package/corpus/templates/factory/app/components/triage/triage-status-pill.tsx +28 -0
- package/corpus/templates/factory/app/components/ui/button.tsx +1 -0
- package/corpus/templates/factory/app/components/ui/card.tsx +1 -0
- package/corpus/templates/factory/app/components/ui/dropdown-menu.tsx +1 -0
- package/corpus/templates/factory/app/components/ui/input.tsx +1 -0
- package/corpus/templates/factory/app/components/ui/label.tsx +1 -0
- package/corpus/templates/factory/app/components/ui/sheet.tsx +1 -0
- package/corpus/templates/factory/app/components/ui/textarea.tsx +1 -0
- package/corpus/templates/factory/app/components/ui/toolkit-provider.tsx +17 -0
- package/corpus/templates/factory/app/components/ui/tooltip.tsx +1 -0
- package/corpus/templates/factory/app/design-system.ts +3 -0
- package/corpus/templates/factory/app/entry.client.tsx +22 -0
- package/corpus/templates/factory/app/entry.server.tsx +10 -0
- package/corpus/templates/factory/app/global.css +93 -0
- package/corpus/templates/factory/app/hooks/use-navigation-state.ts +113 -0
- package/corpus/templates/factory/app/i18n/en-US.ts +211 -0
- package/corpus/templates/factory/app/i18n/index.ts +34 -0
- package/corpus/templates/factory/app/i18n-data.ts +556 -0
- package/corpus/templates/factory/app/lib/agent-page.tsx +49 -0
- package/corpus/templates/factory/app/lib/app-config.ts +11 -0
- package/corpus/templates/factory/app/lib/tab-id.ts +1 -0
- package/corpus/templates/factory/app/lib/utils.ts +1 -0
- package/corpus/templates/factory/app/root.tsx +175 -0
- package/corpus/templates/factory/app/routes/_index.tsx +94 -0
- package/corpus/templates/factory/app/routes/agent.tsx +24 -0
- package/corpus/templates/factory/app/routes/chat.$threadId.tsx +1 -0
- package/corpus/templates/factory/app/routes/database.tsx +17 -0
- package/corpus/templates/factory/app/routes/extensions.$id.$slug.tsx +2 -0
- package/corpus/templates/factory/app/routes/extensions.$id.tsx +11 -0
- package/corpus/templates/factory/app/routes/extensions._index.tsx +11 -0
- package/corpus/templates/factory/app/routes/extensions.tsx +5 -0
- package/corpus/templates/factory/app/routes/factory.tsx +1003 -0
- package/corpus/templates/factory/app/routes/observability.tsx +19 -0
- package/corpus/templates/factory/app/routes/settings.tsx +89 -0
- package/corpus/templates/factory/app/routes/team.tsx +11 -0
- package/corpus/templates/factory/app/routes.ts +4 -0
- package/corpus/templates/factory/app/vite-env.d.ts +6 -0
- package/corpus/templates/factory/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +6 -0
- package/corpus/templates/factory/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +6 -0
- package/corpus/templates/factory/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +6 -0
- package/corpus/templates/factory/changelog/2026-06-28-left-sidebar-collapse-motion-and-footer-chrome-are-quieter.md +6 -0
- package/corpus/templates/factory/changelog/2026-06-29-chat-layouts-adapt-when-the-agent-sidebar-is-open.md +6 -0
- package/corpus/templates/factory/changelog/2026-07-08-settings-are-cleaner-and-searchable.md +5 -0
- package/corpus/templates/factory/changelog/2026-07-10-chat-now-makes-ai-connection-setup-clear-without-shifting-th.md +6 -0
- package/corpus/templates/factory/changelog/2026-07-13-a-full-agent-page-now-brings-context-files-connections-jobs-.md +6 -0
- package/corpus/templates/factory/changelog/2026-07-14-chat-opens-reliably-on-hosted-deployments-instead-of-failing.md +6 -0
- package/corpus/templates/factory/changelog/2026-07-14-fixed-chat-template-startup-with-older-core-versions.md +6 -0
- package/corpus/templates/factory/changelog/2026-07-15-chat-navigation-focuses-on-chat-and-agent.md +6 -0
- package/corpus/templates/factory/changelog/2026-07-17-the-agent-chat-sidebar-stays-closed-until-you-open-it-or-sta.md +6 -0
- package/corpus/templates/factory/changelog/2026-07-22-compact-sidebar-footer.md +6 -0
- package/corpus/templates/factory/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +6 -0
- package/corpus/templates/factory/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
- package/corpus/templates/factory/changelog/2026-07-22-recent-chats-are-easier-to-scan-and-expand.md +6 -0
- package/corpus/templates/factory/changelog/2026-07-23-full-page-chat-is-better-centered-with-quieter-chat-history-.md +6 -0
- package/corpus/templates/factory/changelog/2026-07-24-borderless-secondary-surfaces.md +6 -0
- package/corpus/templates/factory/changelog/2026-07-24-sidebar-footer-controls-follow-a-consistent-order.md +6 -0
- package/corpus/templates/factory/changelog/2026-07-25-settings-navigation-now-keeps-manage-agent-as-a-dedicated-li.md +6 -0
- package/corpus/templates/factory/changelog/2026-07-29-sidebar-footers-now-keep-feedback-search-and-collapse-togeth.md +6 -0
- package/corpus/templates/factory/changelog/2026-07-31-added-an-inspectable-observe-only-factory-queue-for-slack-.md +6 -0
- package/corpus/templates/factory/changelog/2026-07-31-clicking-the-agent-native-logo-now-toggles-the-app-sidebar.md +6 -0
- package/corpus/templates/factory/components.json +20 -0
- package/corpus/templates/factory/data/sync-config.json +1 -0
- package/corpus/templates/factory/learnings.defaults.md +5 -0
- package/corpus/templates/factory/netlify.toml +10 -0
- package/corpus/templates/factory/package.json +105 -0
- package/corpus/templates/factory/public/agent-native-icon-dark.svg +10 -0
- package/corpus/templates/factory/public/agent-native-icon-light.svg +10 -0
- package/corpus/templates/factory/public/agent-native-logo-dark.svg +21 -0
- package/corpus/templates/factory/public/agent-native-logo-light.svg +21 -0
- package/corpus/templates/factory/public/favicon.svg +1 -0
- package/corpus/templates/factory/public/icon-180.svg +1 -0
- package/corpus/templates/factory/public/icon-192.svg +1 -0
- package/corpus/templates/factory/public/icon-512.svg +1 -0
- package/corpus/templates/factory/public/manifest.json +21 -0
- package/corpus/templates/factory/react-router.config.ts +7 -0
- package/corpus/templates/factory/server/connectors/credentials.ts +129 -0
- package/corpus/templates/factory/server/connectors/slack.ts +129 -0
- package/corpus/templates/factory/server/db/index.ts +6 -0
- package/corpus/templates/factory/server/db/schema.ts +193 -0
- package/corpus/templates/factory/server/factory-graph/contracts.ts +212 -0
- package/corpus/templates/factory/server/factory-graph/store.ts +121 -0
- package/corpus/templates/factory/server/lib/require-workspace-member.ts +55 -0
- package/corpus/templates/factory/server/middleware/auth.ts +15 -0
- package/corpus/templates/factory/server/plugins/agent-chat.ts +58 -0
- package/corpus/templates/factory/server/plugins/auth.ts +14 -0
- package/corpus/templates/factory/server/plugins/factory-migrations.ts +247 -0
- package/corpus/templates/factory/server/plugins/factory-scheduler-job.ts +116 -0
- package/corpus/templates/factory/server/plugins/integrations.ts +46 -0
- package/corpus/templates/factory/server/routes/[...page].get.ts +5 -0
- package/corpus/templates/factory/server/routes/_agent-native/factory/builder-callback.post.ts +116 -0
- package/corpus/templates/factory/server/triage/ai-services-git.ts +197 -0
- package/corpus/templates/factory/server/triage/builder-executor.ts +118 -0
- package/corpus/templates/factory/server/triage/contracts.ts +164 -0
- package/corpus/templates/factory/server/triage/github-ingestion.ts +35 -0
- package/corpus/templates/factory/server/triage/guards.ts +121 -0
- package/corpus/templates/factory/server/triage/ids.ts +27 -0
- package/corpus/templates/factory/server/triage/pr-babysit.ts +100 -0
- package/corpus/templates/factory/server/triage/pr-monitor.ts +220 -0
- package/corpus/templates/factory/server/triage/slack-client.ts +55 -0
- package/corpus/templates/factory/server/triage/slack-poller.ts +152 -0
- package/corpus/templates/factory/ssr-entry.ts +15 -0
- package/corpus/templates/factory/tsconfig.json +21 -0
- package/corpus/templates/factory/vite.config.ts +19 -0
- package/corpus/templates/forms/app/components/layout/Sidebar.tsx +55 -5
- package/corpus/templates/forms/changelog/2026-07-31-the-agent-native-logo-stays-visible-when-the-sidebar-is-coll.md +6 -0
- package/corpus/templates/macros/app/components/layout/AppLayout.tsx +6 -2
- package/corpus/templates/plan/app/components/layout/Sidebar.tsx +21 -6
- package/corpus/templates/plan/changelog/2026-07-31-clicking-the-agent-native-logo-now-toggles-the-app-sidebar.md +6 -0
- package/corpus/templates/slides/.agents/skills/create-deck/SKILL.md +12 -0
- package/corpus/templates/slides/.agents/skills/design-systems/SKILL.md +9 -0
- package/corpus/templates/slides/.agents/skills/slide-editing/SKILL.md +11 -0
- package/corpus/templates/slides/AGENTS.md +5 -6
- package/corpus/templates/slides/actions/_await-fit-check.ts +20 -10
- package/corpus/templates/slides/actions/add-slide.ts +17 -4
- package/corpus/templates/slides/actions/create-design-system.ts +16 -4
- package/corpus/templates/slides/actions/delete-design-system.ts +18 -2
- package/corpus/templates/slides/actions/get-layout-overflows.ts +88 -0
- package/corpus/templates/slides/actions/import-file.ts +1 -0
- package/corpus/templates/slides/actions/index-design-system-with-builder.ts +8 -0
- package/corpus/templates/slides/actions/patch-deck.ts +48 -16
- package/corpus/templates/slides/actions/set-default-design-system.ts +49 -19
- package/corpus/templates/slides/actions/update-slide.ts +13 -3
- package/corpus/templates/slides/actions/view-screen.ts +87 -10
- package/corpus/templates/slides/app/components/deck/SlideRenderer.tsx +155 -28
- package/corpus/templates/slides/app/components/design-system/DesignSystemCard.tsx +21 -17
- package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +849 -341
- package/corpus/templates/slides/app/components/editor/EditorSidebar.tsx +102 -2
- package/corpus/templates/slides/app/components/editor/PromptDialog.tsx +13 -16
- package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +60 -12
- package/corpus/templates/slides/app/components/editor/SlideOverflowWarning.tsx +11 -1
- package/corpus/templates/slides/app/components/layout/Sidebar.tsx +66 -19
- package/corpus/templates/slides/app/i18n/en-US.ts +23 -0
- package/corpus/templates/slides/app/lib/normalize-slide-padding.ts +8 -15
- package/corpus/templates/slides/app/pages/DeckEditor.tsx +4 -3
- package/corpus/templates/slides/app/pages/DesignSystems.tsx +4 -3
- package/corpus/templates/slides/app/pages/Index.tsx +1 -1
- package/corpus/templates/slides/changelog/2026-07-31-design-system-details-now-show-their-source-and-indexing-sta.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-31-design-system-indexing-keeps-your-chosen-name-when-you-uploa.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-31-design-system-setup-keeps-focus-rings-visible-and-uses-a-sim.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-31-skip-prompt-is-now-available-in-the-new-deck-prompt-header.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-31-slides-now-detect-real-text-and-box-overflow-across-the-deck.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-31-the-agent-native-logo-stays-visible-when-the-sidebar-is-coll.md +6 -0
- package/corpus/templates/slides/server/handlers/design-systems.ts +1 -0
- package/corpus/templates/slides/server/handlers/index-design-system-sources.ts +1 -0
- package/corpus/templates/slides/server/lib/builder-design-system-proxy.ts +23 -4
- package/corpus/templates/slides/server/plugins/agent-chat.ts +5 -0
- package/corpus/templates/slides/server/plugins/creative-context.ts +16 -3
- package/corpus/templates/slides/server/workspace-defaults.ts +5 -1
- package/corpus/templates/slides/shared/slide-fit.ts +26 -0
- package/corpus/templates/tasks/app/components/layout/Sidebar.tsx +30 -3
- package/corpus/templates/tasks/changelog/2026-07-31-clicking-the-agent-native-logo-now-toggles-the-app-sidebar.md +6 -0
- package/dist/a2a/correlation.d.ts +4 -1
- package/dist/a2a/correlation.d.ts.map +1 -1
- package/dist/a2a/correlation.js +8 -1
- package/dist/a2a/correlation.js.map +1 -1
- package/dist/a2a/types.d.ts +11 -3
- package/dist/a2a/types.d.ts.map +1 -1
- package/dist/a2a/types.js.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.js +27 -41
- package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
- package/dist/agent/engine/builder-engine.d.ts.map +1 -1
- package/dist/agent/engine/builder-engine.js +18 -8
- package/dist/agent/engine/builder-engine.js.map +1 -1
- package/dist/agent/engine/error-detail.d.ts +61 -0
- package/dist/agent/engine/error-detail.d.ts.map +1 -1
- package/dist/agent/engine/error-detail.js +145 -3
- package/dist/agent/engine/error-detail.js.map +1 -1
- package/dist/agent/engine/failure-taxonomy.d.ts +24 -0
- package/dist/agent/engine/failure-taxonomy.d.ts.map +1 -0
- package/dist/agent/engine/failure-taxonomy.js +88 -0
- package/dist/agent/engine/failure-taxonomy.js.map +1 -0
- package/dist/agent/engine/index.d.ts +2 -1
- package/dist/agent/engine/index.d.ts.map +1 -1
- package/dist/agent/engine/index.js +2 -1
- package/dist/agent/engine/index.js.map +1 -1
- package/dist/agent/engine/registry.d.ts +16 -0
- package/dist/agent/engine/registry.d.ts.map +1 -1
- package/dist/agent/engine/registry.js +71 -6
- package/dist/agent/engine/registry.js.map +1 -1
- package/dist/agent/engine/translate-ai-sdk.d.ts.map +1 -1
- package/dist/agent/engine/translate-ai-sdk.js +14 -2
- package/dist/agent/engine/translate-ai-sdk.js.map +1 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +13 -24
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/run-loop-with-resume.js +1 -1
- package/dist/agent/run-loop-with-resume.js.map +1 -1
- package/dist/agent/run-manager.d.ts.map +1 -1
- package/dist/agent/run-manager.js +39 -10
- package/dist/agent/run-manager.js.map +1 -1
- package/dist/agent/run-store.d.ts +10 -0
- package/dist/agent/run-store.d.ts.map +1 -1
- package/dist/agent/run-store.js +20 -3
- package/dist/agent/run-store.js.map +1 -1
- package/dist/agent/thread-data-builder.d.ts.map +1 -1
- package/dist/agent/thread-data-builder.js +28 -4
- package/dist/agent/thread-data-builder.js.map +1 -1
- package/dist/cli/templates-meta.d.ts.map +1 -1
- package/dist/cli/templates-meta.js +13 -0
- package/dist/cli/templates-meta.js.map +1 -1
- package/dist/cli/workspace-dev.d.ts.map +1 -1
- package/dist/cli/workspace-dev.js +1 -0
- package/dist/cli/workspace-dev.js.map +1 -1
- package/dist/client/error-format.d.ts.map +1 -1
- package/dist/client/error-format.js +10 -0
- package/dist/client/error-format.js.map +1 -1
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/credentials/index.d.ts +9 -2
- package/dist/credentials/index.d.ts.map +1 -1
- package/dist/credentials/index.js +50 -8
- package/dist/credentials/index.js.map +1 -1
- package/dist/extensions/url-safety.d.ts.map +1 -1
- package/dist/extensions/url-safety.js +38 -12
- package/dist/extensions/url-safety.js.map +1 -1
- package/dist/integrations/adapters/slack.d.ts.map +1 -1
- package/dist/integrations/adapters/slack.js +25 -8
- package/dist/integrations/adapters/slack.js.map +1 -1
- package/dist/integrations/google-docs-poller.d.ts.map +1 -1
- package/dist/integrations/google-docs-poller.js +13 -1
- package/dist/integrations/google-docs-poller.js.map +1 -1
- package/dist/integrations/installations-store.d.ts +10 -0
- package/dist/integrations/installations-store.d.ts.map +1 -1
- package/dist/integrations/installations-store.js +24 -0
- package/dist/integrations/installations-store.js.map +1 -1
- package/dist/integrations/plugin.d.ts.map +1 -1
- package/dist/integrations/plugin.js +6 -5
- package/dist/integrations/plugin.js.map +1 -1
- package/dist/integrations/types.d.ts +7 -0
- package/dist/integrations/types.d.ts.map +1 -1
- package/dist/integrations/types.js.map +1 -1
- package/dist/integrations/webhook-handler.d.ts.map +1 -1
- package/dist/integrations/webhook-handler.js +16 -1
- package/dist/integrations/webhook-handler.js.map +1 -1
- package/dist/jobs/background-automation-runner.d.ts.map +1 -1
- package/dist/jobs/background-automation-runner.js +35 -2
- package/dist/jobs/background-automation-runner.js.map +1 -1
- package/dist/mcp/screen-memory-stdio.d.ts +7 -7
- package/dist/mcp/screen-memory-stdio.d.ts.map +1 -1
- package/dist/notifications/routes.d.ts +3 -3
- package/dist/observability/routes.d.ts +3 -3
- package/dist/provider-api/actions/custom-provider-registration.d.ts +14 -14
- package/dist/provider-api/actions/provider-api.d.ts +8 -8
- package/dist/provider-api/index.js +7 -3
- package/dist/provider-api/index.js.map +1 -1
- package/dist/scripts/call-agent.d.ts.map +1 -1
- package/dist/scripts/call-agent.js +6 -1
- package/dist/scripts/call-agent.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +25 -7
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-discovery.d.ts +2 -0
- package/dist/server/agent-discovery.d.ts.map +1 -1
- package/dist/server/agent-discovery.js.map +1 -1
- package/dist/server/builder-design-systems.d.ts +4 -1
- package/dist/server/builder-design-systems.d.ts.map +1 -1
- package/dist/server/builder-design-systems.js +11 -1
- package/dist/server/builder-design-systems.js.map +1 -1
- package/dist/server/credential-provider.d.ts.map +1 -1
- package/dist/server/credential-provider.js +49 -12
- package/dist/server/credential-provider.js.map +1 -1
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/onboarding-html.d.ts.map +1 -1
- package/dist/server/onboarding-html.js +37 -2
- package/dist/server/onboarding-html.js.map +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/shared/reasoning-effort.d.ts +1 -0
- package/dist/shared/reasoning-effort.d.ts.map +1 -1
- package/dist/shared/reasoning-effort.js +1 -1
- package/dist/shared/reasoning-effort.js.map +1 -1
- package/dist/templates/chat/app/components/layout/Sidebar.tsx +30 -3
- package/dist/templates/chat/changelog/2026-07-31-clicking-the-agent-native-logo-now-toggles-the-app-sidebar.md +6 -0
- package/dist/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +11 -0
- package/package.json +1 -1
- package/src/a2a/correlation.ts +11 -1
- package/src/a2a/types.ts +11 -3
- package/src/agent/engine/ai-sdk-engine.ts +33 -46
- package/src/agent/engine/builder-engine.ts +22 -10
- package/src/agent/engine/error-detail.ts +184 -3
- package/src/agent/engine/failure-taxonomy.ts +123 -0
- package/src/agent/engine/index.ts +8 -0
- package/src/agent/engine/registry.ts +92 -8
- package/src/agent/engine/translate-ai-sdk.ts +17 -2
- package/src/agent/production-agent.ts +13 -33
- package/src/agent/run-loop-with-resume.ts +1 -1
- package/src/agent/run-manager.ts +43 -14
- package/src/agent/run-store.ts +30 -3
- package/src/agent/thread-data-builder.ts +36 -4
- package/src/cli/templates-meta.ts +13 -0
- package/src/cli/workspace-dev.ts +1 -0
- package/src/client/error-format.ts +12 -0
- package/src/credentials/index.ts +51 -12
- package/src/extensions/url-safety.ts +46 -12
- package/src/integrations/adapters/slack.ts +32 -10
- package/src/integrations/google-docs-poller.ts +12 -1
- package/src/integrations/installations-store.ts +30 -0
- package/src/integrations/plugin.ts +5 -5
- package/src/integrations/types.ts +7 -0
- package/src/integrations/webhook-handler.ts +24 -1
- package/src/jobs/background-automation-runner.ts +38 -1
- package/src/provider-api/index.ts +8 -2
- package/src/scripts/call-agent.ts +6 -0
- package/src/server/agent-chat-plugin.ts +30 -9
- package/src/server/agent-discovery.ts +2 -0
- package/src/server/builder-design-systems.ts +21 -0
- package/src/server/credential-provider.ts +51 -12
- package/src/server/index.ts +1 -0
- package/src/server/onboarding-html.ts +37 -2
- package/src/shared/reasoning-effort.ts +1 -1
- package/src/templates/chat/app/components/layout/Sidebar.tsx +30 -3
- package/src/templates/chat/changelog/2026-07-31-clicking-the-agent-native-logo-now-toggles-the-app-sidebar.md +6 -0
- package/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +11 -0
- package/corpus/templates/clips/desktop/src/lib/media-device-selection.ts +0 -157
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
agentNativePath,
|
|
3
|
+
appBasePath,
|
|
4
|
+
} from "@agent-native/core/client/api-path";
|
|
2
5
|
import {
|
|
3
6
|
type AttributedRecentEdit,
|
|
4
7
|
type CollabUser,
|
|
@@ -13,6 +16,8 @@ import {
|
|
|
13
16
|
verticalListSortingStrategy,
|
|
14
17
|
} from "@dnd-kit/sortable";
|
|
15
18
|
import { CSS } from "@dnd-kit/utilities";
|
|
19
|
+
import { appStateKeyForBrowserTab } from "@shared/app-state-tabs";
|
|
20
|
+
import { hashSlideContent, type DeckFitState } from "@shared/slide-fit";
|
|
16
21
|
import {
|
|
17
22
|
IconPlus,
|
|
18
23
|
IconGripVertical,
|
|
@@ -27,6 +32,7 @@ import { createPortal } from "react-dom";
|
|
|
27
32
|
import { toast } from "sonner";
|
|
28
33
|
|
|
29
34
|
import SlideRenderer from "@/components/deck/SlideRenderer";
|
|
35
|
+
import type { SlideOverflowInfo } from "@/components/deck/SlideRenderer";
|
|
30
36
|
import { GoogleDocImportHint } from "@/components/editor/GoogleDocImportHint";
|
|
31
37
|
import {
|
|
32
38
|
isInsidePortaledLayer,
|
|
@@ -41,6 +47,7 @@ import type { Slide } from "@/context/DeckContext";
|
|
|
41
47
|
import { useAgentGenerating } from "@/hooks/use-agent-generating";
|
|
42
48
|
import { addSlideAgentMessage } from "@/lib/agent-visible-message";
|
|
43
49
|
import type { AspectRatio } from "@/lib/aspect-ratios";
|
|
50
|
+
import { TAB_ID } from "@/lib/tab-id";
|
|
44
51
|
|
|
45
52
|
interface EditorSidebarProps {
|
|
46
53
|
slides: Slide[];
|
|
@@ -61,6 +68,11 @@ interface EditorSidebarProps {
|
|
|
61
68
|
aspectRatio?: AspectRatio;
|
|
62
69
|
}
|
|
63
70
|
|
|
71
|
+
const DECK_FIT_STATE_KEYS = [
|
|
72
|
+
appStateKeyForBrowserTab("deck-fit-checks", TAB_ID),
|
|
73
|
+
"deck-fit-checks",
|
|
74
|
+
];
|
|
75
|
+
|
|
64
76
|
/** Extract the slide id from a `{kind:"paths",paths:["slides.<id>"]}` edit. */
|
|
65
77
|
function slideIdFromEdit(edit: AttributedRecentEdit): string | null {
|
|
66
78
|
const d = edit.descriptor;
|
|
@@ -183,6 +195,7 @@ function SortableSlideThumb({
|
|
|
183
195
|
registerButtonRef,
|
|
184
196
|
presenceUsers = [],
|
|
185
197
|
aspectRatio,
|
|
198
|
+
onOverflowChange,
|
|
186
199
|
readOnly = false,
|
|
187
200
|
}: {
|
|
188
201
|
slide: Slide;
|
|
@@ -195,6 +208,7 @@ function SortableSlideThumb({
|
|
|
195
208
|
registerButtonRef: (slideId: string, node: HTMLButtonElement | null) => void;
|
|
196
209
|
presenceUsers?: CollabUser[];
|
|
197
210
|
aspectRatio?: AspectRatio;
|
|
211
|
+
onOverflowChange: (info: SlideOverflowInfo) => void;
|
|
198
212
|
}) {
|
|
199
213
|
const t = useT();
|
|
200
214
|
const {
|
|
@@ -267,7 +281,11 @@ function SortableSlideThumb({
|
|
|
267
281
|
: "rgba(255,255,255,0.06)",
|
|
268
282
|
}}
|
|
269
283
|
>
|
|
270
|
-
<SlideRenderer
|
|
284
|
+
<SlideRenderer
|
|
285
|
+
slide={slide}
|
|
286
|
+
aspectRatio={aspectRatio}
|
|
287
|
+
onOverflowChange={onOverflowChange}
|
|
288
|
+
/>
|
|
271
289
|
</div>
|
|
272
290
|
</div>
|
|
273
291
|
</button>
|
|
@@ -567,6 +585,85 @@ export default function EditorSidebar({
|
|
|
567
585
|
const headerAddRef = useRef<HTMLButtonElement>(null);
|
|
568
586
|
const slideButtonRefs = useRef(new Map<string, HTMLButtonElement>());
|
|
569
587
|
const thumbScrollRef = useRef<HTMLDivElement>(null);
|
|
588
|
+
const measurementsRef = useRef(
|
|
589
|
+
new Map<
|
|
590
|
+
string,
|
|
591
|
+
{ contentHash: string; info: SlideOverflowInfo; measuredAt: number }
|
|
592
|
+
>(),
|
|
593
|
+
);
|
|
594
|
+
const writeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
595
|
+
|
|
596
|
+
const writeDeckFitState = useCallback(() => {
|
|
597
|
+
const currentSlideIds = new Set(slides.map((slide) => slide.id));
|
|
598
|
+
const measuredSlides = Object.fromEntries(
|
|
599
|
+
Array.from(measurementsRef.current.entries())
|
|
600
|
+
.filter(([slideId]) => currentSlideIds.has(slideId))
|
|
601
|
+
.map(([slideId, measurement]) => [
|
|
602
|
+
slideId,
|
|
603
|
+
{
|
|
604
|
+
contentHash: measurement.contentHash,
|
|
605
|
+
contentHeight: measurement.info.contentHeight,
|
|
606
|
+
contentWidth: measurement.info.contentWidth,
|
|
607
|
+
viewportHeight: measurement.info.viewportHeight,
|
|
608
|
+
viewportWidth: measurement.info.viewportWidth,
|
|
609
|
+
verticalOverflow: measurement.info.verticalOverflow,
|
|
610
|
+
horizontalOverflow: measurement.info.horizontalOverflow,
|
|
611
|
+
measuredAt: measurement.measuredAt,
|
|
612
|
+
},
|
|
613
|
+
]),
|
|
614
|
+
);
|
|
615
|
+
const payload: DeckFitState = {
|
|
616
|
+
deckId,
|
|
617
|
+
aspectRatio: aspectRatio ?? "16:9",
|
|
618
|
+
slides: measuredSlides,
|
|
619
|
+
};
|
|
620
|
+
const body = JSON.stringify(payload);
|
|
621
|
+
for (const key of DECK_FIT_STATE_KEYS) {
|
|
622
|
+
fetch(agentNativePath(`/_agent-native/application-state/${key}`), {
|
|
623
|
+
method: "PUT",
|
|
624
|
+
keepalive: true,
|
|
625
|
+
headers: {
|
|
626
|
+
"Content-Type": "application/json",
|
|
627
|
+
"X-Request-Source": TAB_ID,
|
|
628
|
+
},
|
|
629
|
+
body,
|
|
630
|
+
}).catch(() => {});
|
|
631
|
+
}
|
|
632
|
+
}, [aspectRatio, deckId, slides]);
|
|
633
|
+
|
|
634
|
+
const handleSlideOverflowChange = useCallback(
|
|
635
|
+
(slide: Slide, info: SlideOverflowInfo) => {
|
|
636
|
+
const contentHash = hashSlideContent(slide.content);
|
|
637
|
+
measurementsRef.current.set(slide.id, {
|
|
638
|
+
contentHash,
|
|
639
|
+
info,
|
|
640
|
+
measuredAt: Date.now(),
|
|
641
|
+
});
|
|
642
|
+
if (writeTimerRef.current) clearTimeout(writeTimerRef.current);
|
|
643
|
+
writeTimerRef.current = setTimeout(() => {
|
|
644
|
+
writeTimerRef.current = null;
|
|
645
|
+
writeDeckFitState();
|
|
646
|
+
}, 0);
|
|
647
|
+
},
|
|
648
|
+
[writeDeckFitState],
|
|
649
|
+
);
|
|
650
|
+
|
|
651
|
+
useEffect(() => {
|
|
652
|
+
measurementsRef.current.clear();
|
|
653
|
+
}, [deckId, aspectRatio]);
|
|
654
|
+
|
|
655
|
+
useEffect(() => {
|
|
656
|
+
return () => {
|
|
657
|
+
if (writeTimerRef.current) clearTimeout(writeTimerRef.current);
|
|
658
|
+
for (const key of DECK_FIT_STATE_KEYS) {
|
|
659
|
+
fetch(agentNativePath(`/_agent-native/application-state/${key}`), {
|
|
660
|
+
method: "DELETE",
|
|
661
|
+
keepalive: true,
|
|
662
|
+
headers: { "X-Request-Source": TAB_ID },
|
|
663
|
+
}).catch(() => {});
|
|
664
|
+
}
|
|
665
|
+
};
|
|
666
|
+
}, []);
|
|
570
667
|
|
|
571
668
|
// Resolve a recent-edit descriptor (`slides.<id>`) to the on-screen rect of
|
|
572
669
|
// that slide's thumbnail button, relative to the scroll container, so the
|
|
@@ -682,6 +779,9 @@ export default function EditorSidebar({
|
|
|
682
779
|
registerButtonRef={registerSlideButton}
|
|
683
780
|
presenceUsers={slidePresence?.get(slide.id) ?? []}
|
|
684
781
|
aspectRatio={aspectRatio}
|
|
782
|
+
onOverflowChange={(info) =>
|
|
783
|
+
handleSlideOverflowChange(slide, info)
|
|
784
|
+
}
|
|
685
785
|
/>
|
|
686
786
|
))}
|
|
687
787
|
</SortableContext>
|
|
@@ -200,10 +200,22 @@ export default function PromptPopover({
|
|
|
200
200
|
className="fixed z-[200] w-[min(420px,calc(100vw-24px))] rounded-xl border border-border bg-popover shadow-2xl shadow-black/60"
|
|
201
201
|
style={{ top: 0, left: 0, visibility: "visible" }}
|
|
202
202
|
>
|
|
203
|
-
<div className="px-3.5 pt-3 pb-2">
|
|
203
|
+
<div className="flex items-center justify-between gap-3 px-3.5 pt-3 pb-2">
|
|
204
204
|
<span className="text-sm font-medium text-foreground/90">
|
|
205
205
|
{title}
|
|
206
206
|
</span>
|
|
207
|
+
{onSkip && (
|
|
208
|
+
<button
|
|
209
|
+
type="button"
|
|
210
|
+
onClick={() => {
|
|
211
|
+
onSkip();
|
|
212
|
+
onOpenChange(false);
|
|
213
|
+
}}
|
|
214
|
+
className="shrink-0 cursor-pointer text-xs text-primary hover:text-primary/80"
|
|
215
|
+
>
|
|
216
|
+
{skipLabel}
|
|
217
|
+
</button>
|
|
218
|
+
)}
|
|
207
219
|
</div>
|
|
208
220
|
|
|
209
221
|
<div className="px-2 pb-2">
|
|
@@ -226,21 +238,6 @@ export default function PromptPopover({
|
|
|
226
238
|
promptText={promptText}
|
|
227
239
|
onSourceContextChange={setGoogleDocContext}
|
|
228
240
|
/>
|
|
229
|
-
|
|
230
|
-
{onSkip && (
|
|
231
|
-
<div className="flex justify-end border-t border-border px-3.5 py-2">
|
|
232
|
-
<button
|
|
233
|
-
type="button"
|
|
234
|
-
onClick={() => {
|
|
235
|
-
onSkip();
|
|
236
|
-
onOpenChange(false);
|
|
237
|
-
}}
|
|
238
|
-
className="cursor-pointer text-xs text-[#609FF8] hover:text-[#7AB2FA]"
|
|
239
|
-
>
|
|
240
|
-
{skipLabel}
|
|
241
|
-
</button>
|
|
242
|
-
</div>
|
|
243
|
-
)}
|
|
244
241
|
</div>
|
|
245
242
|
</>
|
|
246
243
|
);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { agentChat } from "@agent-native/core";
|
|
2
|
-
import {
|
|
2
|
+
import { sendToAgentChatAndConfirm } from "@agent-native/core/client/agent-chat";
|
|
3
3
|
import { agentNativePath } from "@agent-native/core/client/api-path";
|
|
4
4
|
import {
|
|
5
5
|
type AttributedRecentEdit,
|
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
RecentEditHighlights,
|
|
17
17
|
} from "@agent-native/toolkit/collab-ui";
|
|
18
18
|
import { appStateKeyForBrowserTab } from "@shared/app-state-tabs";
|
|
19
|
+
import { hashSlideContent } from "@shared/slide-fit";
|
|
19
20
|
import { IconMaximize, IconZoomIn, IconZoomOut } from "@tabler/icons-react";
|
|
20
21
|
import {
|
|
21
22
|
useState,
|
|
@@ -983,9 +984,13 @@ function syncOverflowToAppState(
|
|
|
983
984
|
payload: {
|
|
984
985
|
slideId: string;
|
|
985
986
|
deckId?: string;
|
|
987
|
+
contentHash: string;
|
|
986
988
|
contentHeight: number;
|
|
989
|
+
contentWidth: number;
|
|
987
990
|
viewportHeight: number;
|
|
991
|
+
viewportWidth: number;
|
|
988
992
|
verticalOverflow: number;
|
|
993
|
+
horizontalOverflow: number;
|
|
989
994
|
} | null,
|
|
990
995
|
) {
|
|
991
996
|
const keys = Array.from(
|
|
@@ -1159,7 +1164,7 @@ export default function SlideEditor({
|
|
|
1159
1164
|
w: number;
|
|
1160
1165
|
h: number;
|
|
1161
1166
|
} | null>(null);
|
|
1162
|
-
/**
|
|
1167
|
+
/** Content overflow for the current slide (both axes 0 = fits). Reported by the
|
|
1163
1168
|
* renderer so we can prompt the agent to rewrite the slide HTML instead of
|
|
1164
1169
|
* silently scaling it down (which created unbalanced right/bottom margins
|
|
1165
1170
|
* on slides whose content was too tall for the canvas). */
|
|
@@ -1167,6 +1172,9 @@ export default function SlideEditor({
|
|
|
1167
1172
|
null,
|
|
1168
1173
|
);
|
|
1169
1174
|
const [isAskingAgentToFix, setIsAskingAgentToFix] = useState(false);
|
|
1175
|
+
const repairRequestTimerRef = useRef<ReturnType<typeof setTimeout> | null>(
|
|
1176
|
+
null,
|
|
1177
|
+
);
|
|
1170
1178
|
const [isOverflowWarningDismissed, setIsOverflowWarningDismissed] =
|
|
1171
1179
|
useState(false);
|
|
1172
1180
|
const dims = getAspectRatioDims(aspectRatio);
|
|
@@ -1285,6 +1293,10 @@ export default function SlideEditor({
|
|
|
1285
1293
|
// Reset overflow state whenever the slide changes — the renderer will
|
|
1286
1294
|
// report the next measurement (or stay null if the new slide fits).
|
|
1287
1295
|
useEffect(() => {
|
|
1296
|
+
if (repairRequestTimerRef.current) {
|
|
1297
|
+
clearTimeout(repairRequestTimerRef.current);
|
|
1298
|
+
repairRequestTimerRef.current = null;
|
|
1299
|
+
}
|
|
1288
1300
|
setOverflowInfo(null);
|
|
1289
1301
|
setIsAskingAgentToFix(false);
|
|
1290
1302
|
setIsOverflowWarningDismissed(false);
|
|
@@ -1295,19 +1307,27 @@ export default function SlideEditor({
|
|
|
1295
1307
|
// measurement never leaks into a different deck/slide context.
|
|
1296
1308
|
useEffect(() => {
|
|
1297
1309
|
return () => {
|
|
1310
|
+
if (repairRequestTimerRef.current) {
|
|
1311
|
+
clearTimeout(repairRequestTimerRef.current);
|
|
1312
|
+
repairRequestTimerRef.current = null;
|
|
1313
|
+
}
|
|
1298
1314
|
syncOverflowToAppState(null);
|
|
1299
1315
|
};
|
|
1300
1316
|
}, []);
|
|
1301
1317
|
|
|
1302
1318
|
const handleOverflowChange = useCallback(
|
|
1303
1319
|
(info: SlideOverflowInfo) => {
|
|
1304
|
-
const overflowing =
|
|
1320
|
+
const overflowing =
|
|
1321
|
+
info.verticalOverflow > 0 || info.horizontalOverflow > 0 ? info : null;
|
|
1305
1322
|
// Dedup the React state update — the renderer fires on every
|
|
1306
1323
|
// measurement (so the action can confirm freshness via the app-state
|
|
1307
1324
|
// `measuredAt` timestamp), but most measurements report the same
|
|
1308
1325
|
// value and shouldn't churn the badge UI.
|
|
1309
1326
|
setOverflowInfo((prev) => {
|
|
1310
|
-
if (
|
|
1327
|
+
if (
|
|
1328
|
+
prev?.verticalOverflow === overflowing?.verticalOverflow &&
|
|
1329
|
+
prev?.horizontalOverflow === overflowing?.horizontalOverflow
|
|
1330
|
+
) {
|
|
1311
1331
|
return prev;
|
|
1312
1332
|
}
|
|
1313
1333
|
return overflowing;
|
|
@@ -1318,16 +1338,26 @@ export default function SlideEditor({
|
|
|
1318
1338
|
syncOverflowToAppState({
|
|
1319
1339
|
slideId: slide.id,
|
|
1320
1340
|
deckId,
|
|
1341
|
+
contentHash: hashSlideContent(slide.content),
|
|
1321
1342
|
contentHeight: info.contentHeight,
|
|
1343
|
+
contentWidth: info.contentWidth,
|
|
1322
1344
|
viewportHeight: info.viewportHeight,
|
|
1345
|
+
viewportWidth: info.viewportWidth,
|
|
1323
1346
|
verticalOverflow: info.verticalOverflow,
|
|
1347
|
+
horizontalOverflow: info.horizontalOverflow,
|
|
1324
1348
|
});
|
|
1325
1349
|
},
|
|
1326
1350
|
[slide.id, deckId],
|
|
1327
1351
|
);
|
|
1328
1352
|
|
|
1329
1353
|
const handleAskAgentToFixLayout = useCallback(() => {
|
|
1330
|
-
if (
|
|
1354
|
+
if (
|
|
1355
|
+
!overflowInfo ||
|
|
1356
|
+
(overflowInfo.verticalOverflow <= 0 &&
|
|
1357
|
+
overflowInfo.horizontalOverflow <= 0)
|
|
1358
|
+
) {
|
|
1359
|
+
return;
|
|
1360
|
+
}
|
|
1331
1361
|
const slideHeading = (() => {
|
|
1332
1362
|
if (typeof document === "undefined") return null;
|
|
1333
1363
|
const main = document.querySelector("[data-main-slide-canvas]");
|
|
@@ -1337,27 +1367,44 @@ export default function SlideEditor({
|
|
|
1337
1367
|
const dimsW = dims.width;
|
|
1338
1368
|
const dimsH = dims.height;
|
|
1339
1369
|
setIsAskingAgentToFix(true);
|
|
1340
|
-
|
|
1370
|
+
if (repairRequestTimerRef.current) {
|
|
1371
|
+
clearTimeout(repairRequestTimerRef.current);
|
|
1372
|
+
}
|
|
1373
|
+
// Delivery only proves that the prompt reached chat, not that an action
|
|
1374
|
+
// changed this slide. Release the control after one bounded repair window
|
|
1375
|
+
// so a stalled or no-op agent run cannot strand the warning UI.
|
|
1376
|
+
repairRequestTimerRef.current = setTimeout(() => {
|
|
1377
|
+
repairRequestTimerRef.current = null;
|
|
1378
|
+
setIsAskingAgentToFix(false);
|
|
1379
|
+
}, 30_000);
|
|
1380
|
+
void sendToAgentChatAndConfirm({
|
|
1341
1381
|
message: [
|
|
1342
|
-
`The current slide's content
|
|
1382
|
+
`The current slide's content overflows the canvas${overflowInfo.verticalOverflow > 0 ? ` vertically by ${overflowInfo.verticalOverflow}px` : ""}${overflowInfo.horizontalOverflow > 0 ? ` horizontally by ${overflowInfo.horizontalOverflow}px` : ""} and needs to be rewritten to fit.`,
|
|
1343
1383
|
``,
|
|
1344
1384
|
`Slide id: \`${slide.id}\``,
|
|
1345
1385
|
slideHeading ? `Slide heading: "${slideHeading}"` : null,
|
|
1346
|
-
`Canvas size: ${dimsW}x${dimsH}px (
|
|
1347
|
-
`Available content area inside the slide's padding: ${overflowInfo.viewportHeight}px
|
|
1348
|
-
`Natural rendered content
|
|
1386
|
+
`Canvas size: ${dimsW}x${dimsH}px (native render).`,
|
|
1387
|
+
`Available content area inside the slide's padding: ${overflowInfo.viewportWidth}x${overflowInfo.viewportHeight}px.`,
|
|
1388
|
+
`Natural rendered content: ${overflowInfo.contentWidth}x${overflowInfo.contentHeight}px inside a ${overflowInfo.viewportWidth}x${overflowInfo.viewportHeight}px content area.`,
|
|
1349
1389
|
``,
|
|
1350
|
-
`Please use \`view-screen\` to read the current slide HTML, then \`update-slide --fullContent\`
|
|
1390
|
+
`Please use \`view-screen\` to read the current slide HTML, then make one bounded \`update-slide --fullContent\` repair so its rendered content fits within ${overflowInfo.viewportWidth}x${overflowInfo.viewportHeight}px. Options to shrink the layout, in order of preference:`,
|
|
1351
1391
|
`1. Tighten copy — shorten headings/body, drop low-value bullets, replace prose with terse phrases.`,
|
|
1352
1392
|
`2. Reduce vertical density — fewer stacked cards, smaller gaps, smaller body font (don't go below 16px), shorter labels.`,
|
|
1353
1393
|
`3. Reduce slide padding (e.g. 40px top/bottom instead of 60-80px) if the layout is genuinely tight.`,
|
|
1354
1394
|
`4. If the content really can't be compressed without losing meaning, split it across two slides.`,
|
|
1355
1395
|
``,
|
|
1356
|
-
`Do NOT solve this by adding \`transform: scale()
|
|
1396
|
+
`Do NOT solve this by adding zoom, \`transform: scale()\`, clipping, or \`overflow: scroll\`. Preserve existing manually positioned absolute objects, including text boxes; rewrite only the overflowing flow layout so the HTML itself fits ${dimsW}x${dimsH}. After the write, verify the result with \`view-screen\`; do not repeat repairs in a loop.`,
|
|
1357
1397
|
]
|
|
1358
1398
|
.filter(Boolean)
|
|
1359
1399
|
.join("\n"),
|
|
1360
1400
|
submit: true,
|
|
1401
|
+
chatTarget: "local",
|
|
1402
|
+
}).then((delivery) => {
|
|
1403
|
+
if (!delivery.delivered) {
|
|
1404
|
+
// A missing or delayed chat handoff must not leave the only repair
|
|
1405
|
+
// control permanently disabled with no visible mutation to wait for.
|
|
1406
|
+
setIsAskingAgentToFix(false);
|
|
1407
|
+
}
|
|
1361
1408
|
});
|
|
1362
1409
|
}, [overflowInfo, slide.id, dims.width, dims.height]);
|
|
1363
1410
|
/** Marquee origin (viewport coords). Set on pointerdown. */
|
|
@@ -4134,6 +4181,7 @@ export default function SlideEditor({
|
|
|
4134
4181
|
!isOverflowWarningDismissed && (
|
|
4135
4182
|
<SlideOverflowWarning
|
|
4136
4183
|
verticalOverflow={overflowInfo.verticalOverflow}
|
|
4184
|
+
horizontalOverflow={overflowInfo.horizontalOverflow}
|
|
4137
4185
|
isAskingAgentToFix={isAskingAgentToFix}
|
|
4138
4186
|
dismissLabel={t("deckEditor.dismissLayoutWarning")}
|
|
4139
4187
|
onFix={handleAskAgentToFixLayout}
|
|
@@ -4,6 +4,7 @@ import { Button } from "@/components/ui/button";
|
|
|
4
4
|
|
|
5
5
|
interface SlideOverflowWarningProps {
|
|
6
6
|
verticalOverflow: number;
|
|
7
|
+
horizontalOverflow?: number;
|
|
7
8
|
isAskingAgentToFix: boolean;
|
|
8
9
|
dismissLabel: string;
|
|
9
10
|
onFix: () => void;
|
|
@@ -12,11 +13,20 @@ interface SlideOverflowWarningProps {
|
|
|
12
13
|
|
|
13
14
|
export function SlideOverflowWarning({
|
|
14
15
|
verticalOverflow,
|
|
16
|
+
horizontalOverflow = 0,
|
|
15
17
|
isAskingAgentToFix,
|
|
16
18
|
dismissLabel,
|
|
17
19
|
onFix,
|
|
18
20
|
onDismiss,
|
|
19
21
|
}: SlideOverflowWarningProps) {
|
|
22
|
+
const overflowLabel = [
|
|
23
|
+
verticalOverflow > 0 ? `vertical ${verticalOverflow}px` : "",
|
|
24
|
+
horizontalOverflow > 0 ? `horizontal ${horizontalOverflow}px` : "",
|
|
25
|
+
]
|
|
26
|
+
.filter(Boolean)
|
|
27
|
+
.join(", ");
|
|
28
|
+
const visibleOverflowLabel =
|
|
29
|
+
horizontalOverflow > 0 ? overflowLabel : `${verticalOverflow}px`;
|
|
20
30
|
return (
|
|
21
31
|
<div
|
|
22
32
|
role="status"
|
|
@@ -27,7 +37,7 @@ export function SlideOverflowWarning({
|
|
|
27
37
|
>
|
|
28
38
|
<IconAlertTriangle className="h-3.5 w-3.5 flex-shrink-0" stroke={2} />
|
|
29
39
|
<span className="leading-tight">
|
|
30
|
-
Layout overflows by {
|
|
40
|
+
Layout overflows by {visibleOverflowLabel}
|
|
31
41
|
</span>
|
|
32
42
|
<Button
|
|
33
43
|
size="sm"
|
|
@@ -99,9 +99,72 @@ export function Sidebar({ collapsed, onToggleCollapsed }: SidebarProps) {
|
|
|
99
99
|
/>
|
|
100
100
|
);
|
|
101
101
|
|
|
102
|
+
const brand = (
|
|
103
|
+
<div
|
|
104
|
+
className={cn(
|
|
105
|
+
"flex items-center gap-2",
|
|
106
|
+
collapsed ? "size-8 justify-center" : "min-w-0 flex-1",
|
|
107
|
+
)}
|
|
108
|
+
>
|
|
109
|
+
<img
|
|
110
|
+
src={appPath("/agent-native-icon-light.svg")}
|
|
111
|
+
alt=""
|
|
112
|
+
aria-hidden="true"
|
|
113
|
+
width={28}
|
|
114
|
+
height={16}
|
|
115
|
+
className="block h-4 w-7 shrink-0 object-contain object-center dark:hidden"
|
|
116
|
+
/>
|
|
117
|
+
<img
|
|
118
|
+
src={appPath("/agent-native-icon-dark.svg")}
|
|
119
|
+
alt=""
|
|
120
|
+
aria-hidden="true"
|
|
121
|
+
width={28}
|
|
122
|
+
height={16}
|
|
123
|
+
className="hidden h-4 w-7 shrink-0 object-contain object-center dark:block"
|
|
124
|
+
/>
|
|
125
|
+
{!collapsed && (
|
|
126
|
+
<span className="truncate text-sm font-semibold tracking-tight">
|
|
127
|
+
{t("navigation.brand")}
|
|
128
|
+
</span>
|
|
129
|
+
)}
|
|
130
|
+
</div>
|
|
131
|
+
);
|
|
132
|
+
const brandControl = onToggleCollapsed ? (
|
|
133
|
+
<Tooltip delayDuration={0}>
|
|
134
|
+
<TooltipTrigger asChild>
|
|
135
|
+
<button
|
|
136
|
+
type="button"
|
|
137
|
+
onClick={onToggleCollapsed}
|
|
138
|
+
aria-label={
|
|
139
|
+
collapsed
|
|
140
|
+
? t("sidebar.expandSidebar")
|
|
141
|
+
: t("sidebar.collapseSidebar")
|
|
142
|
+
}
|
|
143
|
+
className={cn(
|
|
144
|
+
"flex min-w-0 items-center rounded-md text-foreground outline-none transition-colors hover:bg-sidebar-accent/50 focus-visible:ring-2 focus-visible:ring-ring",
|
|
145
|
+
collapsed
|
|
146
|
+
? "size-8 justify-center"
|
|
147
|
+
: "w-full gap-2 px-1 py-1 text-start",
|
|
148
|
+
)}
|
|
149
|
+
data-sidebar-brand-toggle
|
|
150
|
+
>
|
|
151
|
+
{brand}
|
|
152
|
+
</button>
|
|
153
|
+
</TooltipTrigger>
|
|
154
|
+
<TooltipContent side="right">
|
|
155
|
+
{collapsed ? t("sidebar.expandSidebar") : t("sidebar.collapseSidebar")}
|
|
156
|
+
</TooltipContent>
|
|
157
|
+
</Tooltip>
|
|
158
|
+
) : (
|
|
159
|
+
brand
|
|
160
|
+
);
|
|
161
|
+
|
|
102
162
|
if (collapsed) {
|
|
103
163
|
return (
|
|
104
|
-
<aside className="flex h-full w-12 shrink-0 flex-col items-center
|
|
164
|
+
<aside className="flex h-full w-12 shrink-0 flex-col items-center overflow-hidden border-e border-border bg-sidebar text-sidebar-foreground transition-[width] duration-200 ease-out">
|
|
165
|
+
<div className="flex h-12 w-full shrink-0 items-center justify-center border-b border-border">
|
|
166
|
+
{brandControl}
|
|
167
|
+
</div>
|
|
105
168
|
<nav className="flex min-h-0 flex-1 flex-col items-center gap-1 overflow-y-auto pt-1">
|
|
106
169
|
{navItems.map((item) => {
|
|
107
170
|
const Icon = item.icon;
|
|
@@ -162,24 +225,8 @@ export function Sidebar({ collapsed, onToggleCollapsed }: SidebarProps) {
|
|
|
162
225
|
|
|
163
226
|
return (
|
|
164
227
|
<aside className="flex h-full w-56 min-w-0 shrink-0 flex-col overflow-hidden border-e border-border bg-sidebar text-sidebar-foreground transition-[width] duration-200 ease-out">
|
|
165
|
-
<div className="flex h-12 shrink-0 items-center
|
|
166
|
-
|
|
167
|
-
<img
|
|
168
|
-
src={appPath("/agent-native-icon-light.svg")}
|
|
169
|
-
alt=""
|
|
170
|
-
aria-hidden="true"
|
|
171
|
-
className="block h-4 w-auto dark:hidden"
|
|
172
|
-
/>
|
|
173
|
-
<img
|
|
174
|
-
src={appPath("/agent-native-icon-dark.svg")}
|
|
175
|
-
alt=""
|
|
176
|
-
aria-hidden="true"
|
|
177
|
-
className="hidden h-4 w-auto dark:block"
|
|
178
|
-
/>
|
|
179
|
-
<span className="text-sm font-semibold tracking-tight">
|
|
180
|
-
{t("navigation.brand")}
|
|
181
|
-
</span>
|
|
182
|
-
</div>
|
|
228
|
+
<div className="flex h-12 shrink-0 items-center border-b border-border px-4">
|
|
229
|
+
{brandControl}
|
|
183
230
|
</div>
|
|
184
231
|
|
|
185
232
|
<div className="flex min-h-0 flex-1 flex-col overflow-y-auto">
|
|
@@ -548,6 +548,10 @@ const messages = {
|
|
|
548
548
|
figFileTooLarge: "File too large (max {{maxSize}}).",
|
|
549
549
|
figParseFailed: "Could not start Builder indexing for that Figma file.",
|
|
550
550
|
updated: "Design system updated",
|
|
551
|
+
otherSources: "Other",
|
|
552
|
+
otherSourcesDescription:
|
|
553
|
+
"Connect from a website, code, files, or an existing design system.",
|
|
554
|
+
chooseSourcePrompt: "Choose one source to configure",
|
|
551
555
|
updateFailed: "Failed to update",
|
|
552
556
|
generationStarted: "Design system generation started",
|
|
553
557
|
generationStartedDescription:
|
|
@@ -589,6 +593,25 @@ const messages = {
|
|
|
589
593
|
"e.g. Always open with a single-stat title slide. Never use bullet lists longer than 3 items. Keep slide titles under 6 words...",
|
|
590
594
|
customInstructionsDescription:
|
|
591
595
|
"Saved with the design system. Re-applied every time the agent uses it to generate slides.",
|
|
596
|
+
sourceLabel: "Source",
|
|
597
|
+
sourceFigma: "Figma file",
|
|
598
|
+
sourceCode: "Code files",
|
|
599
|
+
sourceGitHub: "GitHub repository",
|
|
600
|
+
sourceMixed: "Multiple sources",
|
|
601
|
+
sourceBuilder: "Builder Design System Intelligence",
|
|
602
|
+
sourceIndexing: "Indexing in progress",
|
|
603
|
+
sourceIndexed: "Indexed",
|
|
604
|
+
sourceUnavailable: "Results unavailable",
|
|
605
|
+
sourceIndexingDescription:
|
|
606
|
+
"Builder is still processing this source. Results will appear here as they are ready.",
|
|
607
|
+
sourceIndexedDescription: "{{docs}} docs · {{tokens}} tokens indexed",
|
|
608
|
+
sourceIndexedDocsOnly: "{{docs}} docs indexed",
|
|
609
|
+
sourceIndexedTokensOnly: "{{tokens}} tokens indexed",
|
|
610
|
+
sourceUnavailableDescription:
|
|
611
|
+
"Builder could not load the latest source results.",
|
|
612
|
+
sourceOpenInBuilder: "Open in Builder",
|
|
613
|
+
loading: "Loading design system",
|
|
614
|
+
loadFailed: "We couldn't load this design system. Close and try again.",
|
|
592
615
|
cancel: "Cancel",
|
|
593
616
|
saving: "Saving...",
|
|
594
617
|
saveChanges: "Save Changes",
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* normalize server-side rather than trusting the model's output.
|
|
2
|
+
* Ensure the outer `.fmd-slide` wrapper has a padding declaration.
|
|
3
|
+
*
|
|
4
|
+
* Explicit padding is part of the slide layout, so preserve it. In particular,
|
|
5
|
+
* an overflow repair often needs to reduce vertical padding; rewriting that
|
|
6
|
+
* value here makes a successful-looking agent edit a no-op in the renderer.
|
|
8
7
|
*/
|
|
9
8
|
export function normalizeSlidePadding(html: string): string {
|
|
10
9
|
if (!html.includes('class="fmd-slide"')) return html;
|
|
@@ -13,15 +12,9 @@ export function normalizeSlidePadding(html: string): string {
|
|
|
13
12
|
/(<div\b[^>]*\bclass="fmd-slide"[^>]*\bstyle=")([^"]*)(")/,
|
|
14
13
|
(_match, before, style, after) => {
|
|
15
14
|
const hasPadding = /(?:^|;)\s*padding\s*:/i.test(style);
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
/(^|;)\s*padding\s*:\s*[^;]*/i,
|
|
20
|
-
`$1${style.startsWith("padding") ? "" : " "}padding: 80px 110px`,
|
|
21
|
-
);
|
|
22
|
-
} else {
|
|
23
|
-
nextStyle = `padding: 80px 110px;${style.startsWith(" ") ? "" : " "}${style}`;
|
|
24
|
-
}
|
|
15
|
+
const nextStyle = hasPadding
|
|
16
|
+
? style
|
|
17
|
+
: `padding: 80px 110px;${style.startsWith(" ") ? "" : " "}${style}`;
|
|
25
18
|
return `${before}${nextStyle}${after}`;
|
|
26
19
|
},
|
|
27
20
|
);
|
|
@@ -52,7 +52,7 @@ import {
|
|
|
52
52
|
useSlideComments,
|
|
53
53
|
type CommentThread,
|
|
54
54
|
} from "@/hooks/use-slide-comments";
|
|
55
|
-
import type
|
|
55
|
+
import { getAspectRatioDims, type AspectRatio } from "@/lib/aspect-ratios";
|
|
56
56
|
import {
|
|
57
57
|
deckAccessCheckKey,
|
|
58
58
|
shouldShowDeckEditorSkeleton,
|
|
@@ -254,6 +254,7 @@ export default function DeckEditor() {
|
|
|
254
254
|
}, []);
|
|
255
255
|
|
|
256
256
|
const deck = getDeck(id || "");
|
|
257
|
+
const fitDims = getAspectRatioDims(deck?.aspectRatio);
|
|
257
258
|
const currentDeckAccessKey = deckAccessCheckKey(id, org?.orgId);
|
|
258
259
|
const hasTeamJoinOption =
|
|
259
260
|
!org?.orgId &&
|
|
@@ -297,12 +298,12 @@ export default function DeckEditor() {
|
|
|
297
298
|
"Answers:",
|
|
298
299
|
formattedAnswers,
|
|
299
300
|
"",
|
|
300
|
-
|
|
301
|
+
`Every slide is rendered into a fixed native canvas (${fitDims.width}x${fitDims.height} CSS pixels; standard padding leaves ${Math.max(0, fitDims.width - 220)}x${Math.max(0, fitDims.height - 160)}px for main content). Keep the main content within that fit budget; split dense source material across more slides instead of packing it tightly. Never use zoom, transform: scale(), clipping, or scroll overflow to hide content overflow, and keep body text at least 16px.`,
|
|
301
302
|
"",
|
|
302
303
|
`Now generate the slides based on these preferences. Start a manage-progress run, add the first slide as soon as it is ready, then continue one slide at a time so the editor visibly fills in. Use add-slide with --deckId=${id} to add slides sequentially. Wait for each add-slide result before calling it again.`,
|
|
303
304
|
].join("\n"),
|
|
304
305
|
buildSkipContext: () =>
|
|
305
|
-
`The user skipped the pre-generation questions for deck ${id}. Proceed with reasonable defaults. Every slide is rendered into a fixed native canvas (
|
|
306
|
+
`The user skipped the pre-generation questions for deck ${id}. Proceed with reasonable defaults. Every slide is rendered into a fixed native canvas (${fitDims.width}x${fitDims.height} CSS pixels; standard padding leaves ${Math.max(0, fitDims.width - 220)}x${Math.max(0, fitDims.height - 160)}px for main content); keep each slide within that fit budget and split dense source material across more slides instead of packing it tightly. Never use zoom, transform: scale(), clipping, or scroll overflow to hide content overflow, and keep body text at least 16px. Start a manage-progress run, add the first slide as soon as it is ready, then continue sequentially using add-slide with --deckId=${id}. Wait for each add-slide result before calling it again.`,
|
|
306
307
|
});
|
|
307
308
|
|
|
308
309
|
const showQuestionFlow = Boolean(questionFlowQuestions?.length);
|
|
@@ -53,9 +53,9 @@ export default function DesignSystems() {
|
|
|
53
53
|
setShowSetup(true);
|
|
54
54
|
};
|
|
55
55
|
|
|
56
|
-
const handleSetDefault = async (id: string) => {
|
|
56
|
+
const handleSetDefault = async (id: string, isDefault: boolean) => {
|
|
57
57
|
try {
|
|
58
|
-
await callAction("set-default-design-system", { id });
|
|
58
|
+
await callAction("set-default-design-system", { id, isDefault });
|
|
59
59
|
refetch();
|
|
60
60
|
} catch (err) {
|
|
61
61
|
console.error("Failed to set default design system:", err);
|
|
@@ -264,9 +264,10 @@ export default function DesignSystems() {
|
|
|
264
264
|
data={parsed}
|
|
265
265
|
isDefault={ds.isDefault}
|
|
266
266
|
visibility={ds.visibility}
|
|
267
|
+
accessRole={ds.accessRole}
|
|
267
268
|
canManage={ds.canManage}
|
|
268
269
|
onClick={() => handleCardClick(ds.id)}
|
|
269
|
-
onSetDefault={() => handleSetDefault(ds.id)}
|
|
270
|
+
onSetDefault={() => handleSetDefault(ds.id, !ds.isDefault)}
|
|
270
271
|
onDelete={() => setDeleteId(ds.id)}
|
|
271
272
|
isWorkspaceDefault={workspaceDesignSystem?.id === ds.id}
|
|
272
273
|
canSetWorkspaceDefault={canManageWorkspaceDefaults}
|