@agent-native/core 0.131.5 → 0.131.7
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 +3 -3
- package/corpus/core/CHANGELOG.md +70 -0
- package/corpus/core/docs/content/agent-native-toolkit.mdx +13 -6
- package/corpus/core/docs/content/cloneable-saas.mdx +5 -5
- package/corpus/core/docs/content/creating-templates.mdx +9 -0
- package/corpus/core/docs/content/deployment.mdx +18 -12
- package/corpus/core/docs/content/doctor.mdx +8 -1
- package/corpus/core/docs/content/drop-in-agent.mdx +1 -1
- package/corpus/core/docs/content/extensions.mdx +18 -18
- package/corpus/core/docs/content/faq.mdx +4 -4
- package/corpus/core/docs/content/key-concepts.mdx +30 -21
- package/corpus/core/docs/content/security.mdx +2 -2
- package/corpus/core/docs/content/template-brain-developers.mdx +4 -1
- package/corpus/core/docs/content/template-mail-developers.mdx +4 -1
- package/corpus/core/docs/content/what-is-agent-native.mdx +6 -6
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/a2a/client.ts +449 -66
- package/corpus/core/src/a2a/correlation.ts +31 -0
- package/corpus/core/src/a2a/invoke.ts +4 -2
- package/corpus/core/src/a2a/types.ts +4 -0
- package/corpus/core/src/action.ts +3 -0
- package/corpus/core/src/agent/action-continuation-guidance.ts +2 -1
- package/corpus/core/src/agent/engine/registry.ts +98 -6
- package/corpus/core/src/agent/production-agent.ts +151 -18
- package/corpus/core/src/agent/run-loop-with-resume.ts +190 -3
- package/corpus/core/src/agent/run-manager.ts +117 -41
- package/corpus/core/src/agent/thread-debug-history.ts +86 -0
- package/corpus/core/src/agent/types.ts +3 -1
- package/corpus/core/src/cli/create.ts +11 -1
- package/corpus/core/src/cli/templates-meta.ts +2 -2
- package/corpus/core/src/client/agent-chat-adapter.ts +91 -13
- package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +11 -9
- package/corpus/core/src/client/sse-event-processor.ts +17 -3
- package/corpus/core/src/db/client.ts +57 -17
- package/corpus/core/src/guards/no-env-credentials.ts +2 -0
- package/corpus/core/src/integrations/adapters/slack.ts +8 -3
- package/corpus/core/src/localization/default-messages.ts +44 -0
- package/corpus/core/src/observability/traces.ts +78 -5
- package/corpus/core/src/scripts/call-agent.ts +294 -11
- package/corpus/core/src/scripts/describe-workspace-apps.ts +2 -2
- package/corpus/core/src/secrets/crypto.ts +156 -35
- package/corpus/core/src/secrets/storage.ts +64 -26
- package/corpus/core/src/server/agent-capabilities.ts +1 -1
- package/corpus/core/src/server/agent-chat/action-filters-a2a.ts +113 -7
- package/corpus/core/src/server/agent-chat/context-tools.ts +2 -0
- package/corpus/core/src/server/agent-chat/plugin-options.ts +34 -1
- package/corpus/core/src/server/agent-chat/prompt-resources.ts +1 -1
- package/corpus/core/src/server/agent-chat-plugin.ts +91 -59
- package/corpus/core/src/templates/default/.agents/skills/secrets/SKILL.md +19 -7
- package/corpus/core/src/templates/headless/.agents/skills/secrets/SKILL.md +19 -7
- package/corpus/core/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +18 -7
- package/corpus/core/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +15 -14
- package/corpus/core/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +19 -7
- package/corpus/core/src/vite/client.ts +1 -0
- package/corpus/templates/analytics/.agents/skills/dashboard-ops/SKILL.md +5 -4
- package/corpus/templates/analytics/.agents/skills/gong/SKILL.md +6 -4
- package/corpus/templates/analytics/AGENTS.md +7 -4
- package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +4 -3
- package/corpus/templates/analytics/changelog/2026-07-30-delegated-analytics-questions-now-return-a-useful-current-me.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-30-scheduled-dashboard-emails-complete-every-panel-without-pool.md +6 -0
- package/corpus/templates/analytics/scripts/emit-netlify-dashboard-report-cron.ts +28 -1
- package/corpus/templates/analytics/server/jobs/dashboard-report.ts +18 -11
- package/corpus/templates/analytics/server/lib/analytics-connector-catalog.ts +4 -4
- package/corpus/templates/analytics/server/lib/canonical-first-party-dashboard-repair.ts +9 -5
- package/corpus/templates/analytics/server/lib/dashboard-panel-query.ts +6 -2
- package/corpus/templates/analytics/server/lib/dashboard-panel-source-resolver.ts +11 -4
- package/corpus/templates/analytics/server/lib/dashboard-report-render.ts +49 -31
- package/corpus/templates/analytics/server/lib/first-party-analytics.ts +16 -8
- package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +9 -3
- package/corpus/templates/analytics/server/lib/production-serverless-runtime.ts +11 -0
- package/corpus/templates/analytics/server/lib/real-data-actions.ts +10 -0
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +3 -2
- package/corpus/templates/analytics/server/plugins/analytics-alert-jobs.ts +2 -1
- package/corpus/templates/analytics/server/plugins/dashboard-report-jobs.ts +2 -1
- package/corpus/templates/analytics/server/plugins/uptime-monitor-jobs.ts +1 -12
- package/corpus/templates/brain/.agents/skills/brain/RUNBOOK.md +54 -6
- package/corpus/templates/brain/.agents/skills/brain/SKILL.md +20 -9
- package/corpus/templates/brain/.agents/skills/ingestion-and-connectors/SKILL.md +33 -1
- package/corpus/templates/brain/AGENTS.md +3 -1
- package/corpus/templates/brain/README.md +4 -1
- package/corpus/templates/brain/actions/_schemas.ts +30 -8
- package/corpus/templates/brain/actions/ask-brain.ts +124 -14
- package/corpus/templates/brain/actions/create-source.ts +18 -2
- package/corpus/templates/brain/actions/enqueue-captures-distillation.ts +8 -123
- package/corpus/templates/brain/actions/enqueue-distillation.ts +6 -127
- package/corpus/templates/brain/actions/import-capture.ts +17 -5
- package/corpus/templates/brain/actions/import-transcript.ts +17 -5
- package/corpus/templates/brain/actions/update-source.ts +25 -5
- package/corpus/templates/brain/app/components/layout/Sidebar.tsx +1 -1
- package/corpus/templates/brain/changelog/2026-07-30-blessed-resources-can-feed-cited-company-answers.md +6 -0
- package/corpus/templates/brain/changelog/2026-07-30-the-left-sidebar-no-longer-shows-a-blank-organization-placeh.md +6 -0
- package/corpus/templates/brain/server/lib/brain.ts +49 -19
- package/corpus/templates/brain/server/lib/distillation-queue.ts +147 -0
- package/corpus/templates/brain/server/lib/source-policy.ts +264 -0
- package/corpus/templates/brain/server/plugins/agent-chat.ts +3 -2
- package/corpus/templates/brain/server/routes/api/_agent-native/brain/ingest.post.ts +116 -19
- package/corpus/templates/clips/app/components/meetings/google-oauth-identity-notice.tsx +51 -0
- package/corpus/templates/clips/app/i18n/en-US.ts +4 -0
- package/corpus/templates/clips/app/routes/_app.meetings._index.tsx +3 -1
- package/corpus/templates/clips/changelog/2026-07-30-google-calendar-warning.md +6 -0
- package/corpus/templates/content/app/components/editor/VisualEditor.tsx +72 -8
- package/corpus/templates/content/changelog/2026-07-30-the-slash-command-hint-now-stays-on-only-the-active-empty-li.md +6 -0
- package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +506 -11
- package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +148 -17
- package/corpus/templates/design/app/components/design/canvas-interactions/design-canvas-interactions.ts +357 -0
- package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +7 -466
- package/corpus/templates/design/app/components/design/inspector/scrub-input-utils.ts +15 -311
- package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +19 -997
- package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +8 -1216
- package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +31 -38
- package/corpus/templates/design/package.json +0 -1
- package/corpus/templates/dispatch/AGENTS.md +8 -0
- package/corpus/templates/dispatch/DEVELOPING.md +29 -0
- package/corpus/templates/dispatch/actions/view-screen.ts +34 -2
- package/corpus/templates/dispatch/app/i18n-data.ts +457 -0
- package/corpus/templates/dispatch/changelog/2026-07-30-delegated-dispatch-work-continues-reliably-in-the-background.md +6 -0
- package/corpus/templates/dispatch/changelog/2026-07-30-find-failed-runs-across-apps.md +6 -0
- package/corpus/templates/dispatch/netlify.toml +3 -0
- package/corpus/templates/plan/actions/get-visual-plan.ts +10 -6
- package/corpus/templates/plan/actions/patch-visual-plan-source.ts +117 -1
- package/corpus/templates/plan/actions/update-visual-plan.ts +56 -14
- package/corpus/templates/plan/app/pages/PlansPage.tsx +1 -1
- package/corpus/templates/plan/changelog/2026-07-30-plan-agents-recover-with-targeted-writes.md +6 -0
- package/corpus/templates/plan/shared/plan-content.ts +35 -0
- package/corpus/templates/slides/.agents/skills/analytics-data-for-decks/SKILL.md +8 -12
- package/corpus/templates/slides/AGENTS.md +4 -4
- package/corpus/templates/slides/actions/create-deck.ts +1 -1
- package/corpus/templates/slides/actions/duplicate-deck.ts +19 -4
- package/corpus/templates/slides/app/components/deck/DeckCard.tsx +2 -10
- package/corpus/templates/slides/app/components/deck/MermaidRenderer.tsx +12 -1
- package/corpus/templates/slides/app/components/deck/SlideRenderer.tsx +30 -13
- package/corpus/templates/slides/app/components/editor/DeckEditorSkeleton.tsx +35 -0
- package/corpus/templates/slides/app/components/editor/EditorSidebar.tsx +63 -56
- package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +21 -76
- package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +1110 -292
- package/corpus/templates/slides/app/components/editor/SlideOverflowWarning.tsx +53 -0
- package/corpus/templates/slides/app/components/editor/SlideStyleInspector.tsx +235 -18
- package/corpus/templates/slides/app/components/editor/SpeakerNotesPanel.tsx +4 -1
- package/corpus/templates/slides/app/components/editor/canvas-interactions/index.ts +11 -0
- package/corpus/templates/slides/app/components/editor/canvas-interactions/slides-canvas-adapter.ts +129 -0
- package/corpus/templates/slides/app/components/editor/selection-overlay-measurement.ts +70 -0
- package/corpus/templates/slides/app/components/editor/slide-object-interactions.ts +519 -65
- package/corpus/templates/slides/app/components/visual-editor/CanvasCommentPins.tsx +36 -426
- package/corpus/templates/slides/app/components/visual-editor/DrawOverlay.tsx +19 -458
- package/corpus/templates/slides/app/context/DeckContext.tsx +179 -72
- package/corpus/templates/slides/app/global.css +105 -0
- package/corpus/templates/slides/app/i18n/en-US.ts +8 -0
- package/corpus/templates/slides/app/lib/deck-editor-loading.ts +26 -0
- package/corpus/templates/slides/app/lib/mermaid-blocks.ts +27 -0
- package/corpus/templates/slides/app/pages/DeckEditor.tsx +71 -38
- package/corpus/templates/slides/app/pages/Index.tsx +98 -41
- package/corpus/templates/slides/changelog/2026-07-30-deck-loading-no-longer-flashes-an-unavailable-message.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-30-duplicating-a-deck-from-the-deck-list-now-opens-the-copy-imm.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-30-layout-overflow-warning-is-readable-and-dismissible.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-30-new-decks-now-start-with-an-empty-slide-list-when-no-slides-.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-30-shared-canvas-annotations.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-30-slide-objects-can-be-moved-as-a-group-copied-and-pasted-with.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-30-slide-text-editing-and-object-controls-now-match-google-slides.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-30-style-panel-now-scrolls-with-speaker-notes-open-shows-the-sl.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-30-top-toolbar-controls-now-use-consistent-sizing-with-undo-and.md +6 -0
- package/corpus/templates/slides/netlify.toml +3 -1
- package/corpus/templates/slides/package.json +0 -1
- package/corpus/templates/slides/server/lib/chat-attachments.ts +18 -0
- package/corpus/templates/slides/server/plugins/agent-chat.ts +5 -0
- package/corpus/templates/slides/vite.config.ts +0 -1
- package/corpus/toolkit/CHANGELOG.md +13 -0
- package/corpus/toolkit/README.md +19 -0
- package/corpus/toolkit/agent-native.eject.json +38 -0
- package/corpus/toolkit/package.json +29 -1
- package/corpus/toolkit/src/canvas-annotations/CanvasCommentPins.tsx +861 -0
- package/corpus/toolkit/src/canvas-annotations/DrawOverlay.tsx +1233 -0
- package/corpus/toolkit/src/canvas-annotations/index.ts +15 -0
- package/corpus/toolkit/src/canvas-annotations/types.ts +14 -0
- package/corpus/toolkit/src/canvas-interactions/canvas-interactions.ts +933 -0
- package/corpus/toolkit/src/canvas-interactions/index.ts +67 -0
- package/corpus/toolkit/src/design-tweaks/scrub-input-utils.ts +311 -0
- package/corpus/toolkit/src/design-tweaks/scrub-input.tsx +491 -0
- package/corpus/toolkit/src/design-tweaks/visual-style-controls.tsx +26 -171
- package/corpus/toolkit/src/index.ts +1 -0
- package/dist/a2a/client.d.ts +23 -0
- package/dist/a2a/client.d.ts.map +1 -1
- package/dist/a2a/client.js +309 -44
- package/dist/a2a/client.js.map +1 -1
- package/dist/a2a/correlation.d.ts +1 -0
- package/dist/a2a/correlation.d.ts.map +1 -1
- package/dist/a2a/correlation.js +27 -0
- package/dist/a2a/correlation.js.map +1 -1
- package/dist/a2a/invoke.d.ts.map +1 -1
- package/dist/a2a/invoke.js +4 -2
- package/dist/a2a/invoke.js.map +1 -1
- package/dist/a2a/types.d.ts +4 -0
- package/dist/a2a/types.d.ts.map +1 -1
- package/dist/a2a/types.js.map +1 -1
- package/dist/action.d.ts +3 -0
- package/dist/action.d.ts.map +1 -1
- package/dist/action.js.map +1 -1
- package/dist/agent/action-continuation-guidance.d.ts.map +1 -1
- package/dist/agent/action-continuation-guidance.js +2 -1
- package/dist/agent/action-continuation-guidance.js.map +1 -1
- package/dist/agent/engine/registry.d.ts.map +1 -1
- package/dist/agent/engine/registry.js +82 -8
- package/dist/agent/engine/registry.js.map +1 -1
- package/dist/agent/production-agent.d.ts +40 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +113 -15
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/run-loop-with-resume.d.ts +21 -0
- package/dist/agent/run-loop-with-resume.d.ts.map +1 -1
- package/dist/agent/run-loop-with-resume.js +163 -4
- package/dist/agent/run-loop-with-resume.js.map +1 -1
- package/dist/agent/run-manager.d.ts +16 -9
- package/dist/agent/run-manager.d.ts.map +1 -1
- package/dist/agent/run-manager.js +93 -42
- package/dist/agent/run-manager.js.map +1 -1
- package/dist/agent/thread-debug-history.d.ts +10 -0
- package/dist/agent/thread-debug-history.d.ts.map +1 -0
- package/dist/agent/thread-debug-history.js +68 -0
- package/dist/agent/thread-debug-history.js.map +1 -0
- package/dist/agent/types.d.ts +3 -1
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +6 -1
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/templates-meta.js +2 -2
- package/dist/cli/templates-meta.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +76 -13
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
- package/dist/client/resources/McpIntegrationDialog.js +1 -1
- package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +12 -3
- package/dist/client/sse-event-processor.js.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +48 -17
- package/dist/db/client.js.map +1 -1
- package/dist/guards/no-env-credentials.d.ts.map +1 -1
- package/dist/guards/no-env-credentials.js +2 -0
- package/dist/guards/no-env-credentials.js.map +1 -1
- package/dist/integrations/adapters/slack.js +7 -3
- package/dist/integrations/adapters/slack.js.map +1 -1
- package/dist/localization/default-messages.d.ts +43 -0
- package/dist/localization/default-messages.d.ts.map +1 -1
- package/dist/localization/default-messages.js +43 -0
- package/dist/localization/default-messages.js.map +1 -1
- package/dist/observability/traces.d.ts +3 -1
- package/dist/observability/traces.d.ts.map +1 -1
- package/dist/observability/traces.js +73 -4
- package/dist/observability/traces.js.map +1 -1
- package/dist/progress/routes.d.ts +1 -1
- package/dist/provider-api/actions/custom-provider-registration.d.ts +12 -12
- package/dist/provider-api/actions/provider-api.d.ts +13 -13
- package/dist/provider-api/corpus-jobs.d.ts +2 -2
- package/dist/scripts/call-agent.d.ts.map +1 -1
- package/dist/scripts/call-agent.js +237 -12
- package/dist/scripts/call-agent.js.map +1 -1
- package/dist/scripts/describe-workspace-apps.js +2 -2
- package/dist/scripts/describe-workspace-apps.js.map +1 -1
- package/dist/secrets/crypto.d.ts +36 -21
- package/dist/secrets/crypto.d.ts.map +1 -1
- package/dist/secrets/crypto.js +134 -33
- package/dist/secrets/crypto.js.map +1 -1
- package/dist/secrets/storage.d.ts +6 -6
- package/dist/secrets/storage.d.ts.map +1 -1
- package/dist/secrets/storage.js +43 -26
- package/dist/secrets/storage.js.map +1 -1
- package/dist/server/agent-capabilities.js +1 -1
- package/dist/server/agent-capabilities.js.map +1 -1
- package/dist/server/agent-chat/action-filters-a2a.d.ts +17 -3
- package/dist/server/agent-chat/action-filters-a2a.d.ts.map +1 -1
- package/dist/server/agent-chat/action-filters-a2a.js +94 -3
- package/dist/server/agent-chat/action-filters-a2a.js.map +1 -1
- package/dist/server/agent-chat/context-tools.d.ts.map +1 -1
- package/dist/server/agent-chat/context-tools.js +2 -0
- package/dist/server/agent-chat/context-tools.js.map +1 -1
- package/dist/server/agent-chat/plugin-options.d.ts +23 -0
- package/dist/server/agent-chat/plugin-options.d.ts.map +1 -1
- package/dist/server/agent-chat/plugin-options.js +4 -1
- package/dist/server/agent-chat/plugin-options.js.map +1 -1
- package/dist/server/agent-chat/prompt-resources.js +1 -1
- package/dist/server/agent-chat/prompt-resources.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts +2 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +79 -56
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/realtime-token.d.ts +1 -1
- package/dist/templates/default/.agents/skills/secrets/SKILL.md +19 -7
- package/dist/templates/headless/.agents/skills/secrets/SKILL.md +19 -7
- package/dist/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +18 -7
- package/dist/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +15 -14
- package/dist/templates/workspace-core/.agents/skills/secrets/SKILL.md +19 -7
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +1 -0
- package/dist/vite/client.js.map +1 -1
- package/docs/content/agent-native-toolkit.mdx +13 -6
- package/docs/content/cloneable-saas.mdx +5 -5
- package/docs/content/creating-templates.mdx +9 -0
- package/docs/content/deployment.mdx +18 -12
- package/docs/content/doctor.mdx +8 -1
- package/docs/content/drop-in-agent.mdx +1 -1
- package/docs/content/extensions.mdx +18 -18
- package/docs/content/faq.mdx +4 -4
- package/docs/content/key-concepts.mdx +30 -21
- package/docs/content/security.mdx +2 -2
- package/docs/content/template-brain-developers.mdx +4 -1
- package/docs/content/template-mail-developers.mdx +4 -1
- package/docs/content/what-is-agent-native.mdx +6 -6
- package/package.json +3 -3
- package/src/a2a/client.ts +449 -66
- package/src/a2a/correlation.ts +31 -0
- package/src/a2a/invoke.ts +4 -2
- package/src/a2a/types.ts +4 -0
- package/src/action.ts +3 -0
- package/src/agent/action-continuation-guidance.ts +2 -1
- package/src/agent/engine/registry.ts +98 -6
- package/src/agent/production-agent.ts +151 -18
- package/src/agent/run-loop-with-resume.ts +190 -3
- package/src/agent/run-manager.ts +117 -41
- package/src/agent/thread-debug-history.ts +86 -0
- package/src/agent/types.ts +3 -1
- package/src/cli/create.ts +11 -1
- package/src/cli/templates-meta.ts +2 -2
- package/src/client/agent-chat-adapter.ts +91 -13
- package/src/client/resources/McpIntegrationDialog.tsx +11 -9
- package/src/client/sse-event-processor.ts +17 -3
- package/src/db/client.ts +57 -17
- package/src/guards/no-env-credentials.ts +2 -0
- package/src/integrations/adapters/slack.ts +8 -3
- package/src/localization/default-messages.ts +44 -0
- package/src/observability/traces.ts +78 -5
- package/src/scripts/call-agent.ts +294 -11
- package/src/scripts/describe-workspace-apps.ts +2 -2
- package/src/secrets/crypto.ts +156 -35
- package/src/secrets/storage.ts +64 -26
- package/src/server/agent-capabilities.ts +1 -1
- package/src/server/agent-chat/action-filters-a2a.ts +113 -7
- package/src/server/agent-chat/context-tools.ts +2 -0
- package/src/server/agent-chat/plugin-options.ts +34 -1
- package/src/server/agent-chat/prompt-resources.ts +1 -1
- package/src/server/agent-chat-plugin.ts +91 -59
- package/src/templates/default/.agents/skills/secrets/SKILL.md +19 -7
- package/src/templates/headless/.agents/skills/secrets/SKILL.md +19 -7
- package/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +18 -7
- package/src/templates/workspace-core/.agents/skills/composable-mini-apps/SKILL.md +15 -14
- package/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +19 -7
- package/src/vite/client.ts +1 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Skeleton } from "@/components/ui/skeleton";
|
|
2
|
+
|
|
3
|
+
export function DeckEditorSkeleton({ label }: { label: string }) {
|
|
4
|
+
return (
|
|
5
|
+
<div
|
|
6
|
+
className="flex h-full min-h-0 flex-1 flex-col overflow-hidden bg-background"
|
|
7
|
+
role="status"
|
|
8
|
+
aria-label={label}
|
|
9
|
+
data-testid="deck-editor-loading"
|
|
10
|
+
>
|
|
11
|
+
<div className="flex h-11 shrink-0 items-center gap-3 border-b border-border px-3">
|
|
12
|
+
<Skeleton className="size-8 rounded-md" />
|
|
13
|
+
<Skeleton className="h-5 w-36" />
|
|
14
|
+
<div className="ml-auto flex items-center gap-2">
|
|
15
|
+
<Skeleton className="h-8 w-20 rounded-md" />
|
|
16
|
+
<Skeleton className="size-8 rounded-md" />
|
|
17
|
+
<Skeleton className="size-8 rounded-md" />
|
|
18
|
+
</div>
|
|
19
|
+
</div>
|
|
20
|
+
<div className="flex min-h-0 flex-1">
|
|
21
|
+
<div className="hidden w-56 shrink-0 flex-col gap-4 border-r border-border p-4 sm:w-64 md:flex">
|
|
22
|
+
{[0, 1, 2].map((index) => (
|
|
23
|
+
<div key={index} className="flex gap-3">
|
|
24
|
+
<Skeleton className="h-4 w-4 shrink-0 rounded-sm" />
|
|
25
|
+
<Skeleton className="aspect-video flex-1 rounded-md" />
|
|
26
|
+
</div>
|
|
27
|
+
))}
|
|
28
|
+
</div>
|
|
29
|
+
<div className="flex min-w-0 flex-1 items-center justify-center bg-muted/20 p-6">
|
|
30
|
+
<Skeleton className="aspect-video w-full max-w-4xl rounded-md shadow-sm" />
|
|
31
|
+
</div>
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|
|
34
|
+
);
|
|
35
|
+
}
|
|
@@ -51,14 +51,14 @@ interface EditorSidebarProps {
|
|
|
51
51
|
onDuplicateSlide: (id: string) => void;
|
|
52
52
|
onDeleteSlide: (id: string) => void;
|
|
53
53
|
onAddEmptySlide: () => void;
|
|
54
|
+
/** Viewer-role decks get thumbnails only: no add, duplicate, or delete. */
|
|
55
|
+
readOnly?: boolean;
|
|
54
56
|
/** Presence map: slideId → list of users currently viewing that slide */
|
|
55
57
|
slidePresence?: Map<string, CollabUser[]>;
|
|
56
58
|
/** Lingering recent edits (e.g. agent edits) to highlight over thumbnails. */
|
|
57
59
|
recentEdits?: AttributedRecentEdit[];
|
|
58
60
|
/** Deck aspect ratio (defaults to 16:9 when omitted) */
|
|
59
61
|
aspectRatio?: AspectRatio;
|
|
60
|
-
/** True while a newly-created deck is being populated slide by slide. */
|
|
61
|
-
deckGenerating?: boolean;
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
/** Extract the slide id from a `{kind:"paths",paths:["slides.<id>"]}` edit. */
|
|
@@ -183,6 +183,7 @@ function SortableSlideThumb({
|
|
|
183
183
|
registerButtonRef,
|
|
184
184
|
presenceUsers = [],
|
|
185
185
|
aspectRatio,
|
|
186
|
+
readOnly = false,
|
|
186
187
|
}: {
|
|
187
188
|
slide: Slide;
|
|
188
189
|
index: number;
|
|
@@ -190,6 +191,7 @@ function SortableSlideThumb({
|
|
|
190
191
|
onSelect: () => void;
|
|
191
192
|
onDuplicate: () => void;
|
|
192
193
|
onDelete: () => void;
|
|
194
|
+
readOnly?: boolean;
|
|
193
195
|
registerButtonRef: (slideId: string, node: HTMLButtonElement | null) => void;
|
|
194
196
|
presenceUsers?: CollabUser[];
|
|
195
197
|
aspectRatio?: AspectRatio;
|
|
@@ -204,6 +206,7 @@ function SortableSlideThumb({
|
|
|
204
206
|
isDragging,
|
|
205
207
|
} = useSortable({
|
|
206
208
|
id: slide.id,
|
|
209
|
+
disabled: readOnly,
|
|
207
210
|
});
|
|
208
211
|
|
|
209
212
|
const style = {
|
|
@@ -270,38 +273,40 @@ function SortableSlideThumb({
|
|
|
270
273
|
</button>
|
|
271
274
|
|
|
272
275
|
{/* Actions - always visible on touch devices */}
|
|
273
|
-
|
|
274
|
-
<
|
|
275
|
-
<
|
|
276
|
-
<
|
|
277
|
-
|
|
278
|
-
e
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
<
|
|
291
|
-
<
|
|
292
|
-
|
|
293
|
-
e
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
276
|
+
{!readOnly && (
|
|
277
|
+
<div className="absolute top-2 right-2 flex gap-0.5 sm:opacity-0 sm:group-hover:opacity-100">
|
|
278
|
+
<Tooltip>
|
|
279
|
+
<TooltipTrigger asChild>
|
|
280
|
+
<button
|
|
281
|
+
onClick={(e) => {
|
|
282
|
+
e.stopPropagation();
|
|
283
|
+
onDuplicate();
|
|
284
|
+
}}
|
|
285
|
+
className="p-1.5 rounded bg-black/60 backdrop-blur-sm border border-white/10 hover:bg-black/80"
|
|
286
|
+
aria-label={t("editorSidebar.duplicateSlide")}
|
|
287
|
+
>
|
|
288
|
+
<IconCopy className="w-3 h-3 text-white/60" />
|
|
289
|
+
</button>
|
|
290
|
+
</TooltipTrigger>
|
|
291
|
+
<TooltipContent>{t("editorSidebar.duplicate")}</TooltipContent>
|
|
292
|
+
</Tooltip>
|
|
293
|
+
<Tooltip>
|
|
294
|
+
<TooltipTrigger asChild>
|
|
295
|
+
<button
|
|
296
|
+
onClick={(e) => {
|
|
297
|
+
e.stopPropagation();
|
|
298
|
+
onDelete();
|
|
299
|
+
}}
|
|
300
|
+
className="p-1.5 rounded bg-black/60 backdrop-blur-sm border border-white/10 hover:bg-red-900/80"
|
|
301
|
+
aria-label={t("editorSidebar.deleteSlide")}
|
|
302
|
+
>
|
|
303
|
+
<IconTrash className="w-3 h-3 text-white/60" />
|
|
304
|
+
</button>
|
|
305
|
+
</TooltipTrigger>
|
|
306
|
+
<TooltipContent>{t("editorSidebar.delete")}</TooltipContent>
|
|
307
|
+
</Tooltip>
|
|
308
|
+
</div>
|
|
309
|
+
)}
|
|
305
310
|
</div>
|
|
306
311
|
);
|
|
307
312
|
}
|
|
@@ -550,10 +555,10 @@ export default function EditorSidebar({
|
|
|
550
555
|
onDuplicateSlide,
|
|
551
556
|
onDeleteSlide,
|
|
552
557
|
onAddEmptySlide,
|
|
558
|
+
readOnly = false,
|
|
553
559
|
slidePresence,
|
|
554
560
|
recentEdits,
|
|
555
561
|
aspectRatio,
|
|
556
|
-
deckGenerating = false,
|
|
557
562
|
}: EditorSidebarProps) {
|
|
558
563
|
const t = useT();
|
|
559
564
|
const activeIndex = slides.findIndex((s) => s.id === activeSlideId);
|
|
@@ -577,7 +582,6 @@ export default function EditorSidebar({
|
|
|
577
582
|
[],
|
|
578
583
|
);
|
|
579
584
|
const { generating, submit: agentSubmit } = useAgentGenerating();
|
|
580
|
-
const showGeneratingSlide = deckGenerating || addSlideGenerating;
|
|
581
585
|
|
|
582
586
|
const registerSlideButton = useCallback(
|
|
583
587
|
(slideId: string, node: HTMLButtonElement | null) => {
|
|
@@ -638,7 +642,7 @@ export default function EditorSidebar({
|
|
|
638
642
|
<span className="text-xs font-medium text-muted-foreground uppercase tracking-wider">
|
|
639
643
|
{t("editorSidebar.slides")}
|
|
640
644
|
</span>
|
|
641
|
-
{
|
|
645
|
+
{readOnly ? null : addSlideGenerating ? (
|
|
642
646
|
<IconLoader2 className="w-4 h-4 text-muted-foreground animate-spin" />
|
|
643
647
|
) : (
|
|
644
648
|
<Tooltip>
|
|
@@ -674,13 +678,14 @@ export default function EditorSidebar({
|
|
|
674
678
|
onSelect={() => onSelectSlide(slide.id)}
|
|
675
679
|
onDuplicate={() => onDuplicateSlide(slide.id)}
|
|
676
680
|
onDelete={() => onDeleteSlide(slide.id)}
|
|
681
|
+
readOnly={readOnly}
|
|
677
682
|
registerButtonRef={registerSlideButton}
|
|
678
683
|
presenceUsers={slidePresence?.get(slide.id) ?? []}
|
|
679
684
|
aspectRatio={aspectRatio}
|
|
680
685
|
/>
|
|
681
686
|
))}
|
|
682
687
|
</SortableContext>
|
|
683
|
-
{
|
|
688
|
+
{addSlideGenerating && (
|
|
684
689
|
<GeneratingSlideSkeleton
|
|
685
690
|
index={slides.length}
|
|
686
691
|
aspectRatio={aspectRatio}
|
|
@@ -697,24 +702,26 @@ export default function EditorSidebar({
|
|
|
697
702
|
)}
|
|
698
703
|
</div>
|
|
699
704
|
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
705
|
+
{!readOnly && (
|
|
706
|
+
<AddSlidePopover
|
|
707
|
+
open={addOpen}
|
|
708
|
+
onOpenChange={setAddOpen}
|
|
709
|
+
anchorRef={headerAddRef}
|
|
710
|
+
deckId={deckId}
|
|
711
|
+
deckTitle={deckTitle}
|
|
712
|
+
activeSlideId={activeSlideId}
|
|
713
|
+
slideCount={slides.length}
|
|
714
|
+
activeSlideIndex={activeIndex >= 0 ? activeIndex : 0}
|
|
715
|
+
agentSubmit={(msg, ctx) => {
|
|
716
|
+
setAddSlideGenerating(true);
|
|
717
|
+
agentSubmit(msg, ctx);
|
|
718
|
+
}}
|
|
719
|
+
onDuplicateCurrent={
|
|
720
|
+
activeSlideId ? () => onDuplicateSlide(activeSlideId) : undefined
|
|
721
|
+
}
|
|
722
|
+
onAddEmpty={onAddEmptySlide}
|
|
723
|
+
/>
|
|
724
|
+
)}
|
|
718
725
|
</div>
|
|
719
726
|
);
|
|
720
727
|
}
|
|
@@ -17,8 +17,6 @@ import {
|
|
|
17
17
|
IconLayoutSidebar,
|
|
18
18
|
IconPhoto,
|
|
19
19
|
IconHistory,
|
|
20
|
-
IconArrowBackUp,
|
|
21
|
-
IconArrowForwardUp,
|
|
22
20
|
IconFolderOpen,
|
|
23
21
|
IconSettings,
|
|
24
22
|
IconSchema,
|
|
@@ -67,7 +65,6 @@ import {
|
|
|
67
65
|
} from "@/lib/aspect-ratios";
|
|
68
66
|
import type { GoogleSlidesExportResult } from "@/lib/export-google-slides-client";
|
|
69
67
|
import { parseUploadResponse } from "@/lib/upload-response";
|
|
70
|
-
import { shortcutLabel } from "@/lib/utils";
|
|
71
68
|
|
|
72
69
|
import { ExportMenu } from "./ExportMenu";
|
|
73
70
|
interface EditorToolbarProps {
|
|
@@ -90,10 +87,6 @@ interface EditorToolbarProps {
|
|
|
90
87
|
historyOpen: boolean;
|
|
91
88
|
onShowHistory: () => void;
|
|
92
89
|
historyButtonRef: React.RefObject<HTMLButtonElement | null>;
|
|
93
|
-
onUndo: () => void;
|
|
94
|
-
onRedo: () => void;
|
|
95
|
-
canUndo: boolean;
|
|
96
|
-
canRedo: boolean;
|
|
97
90
|
currentSlide?: Slide;
|
|
98
91
|
onUpdateSlide?: (updates: Partial<Omit<Slide, "id">>) => void;
|
|
99
92
|
/** Active users on the current slide (from collab awareness) */
|
|
@@ -171,6 +164,8 @@ const backgroundOptions = [
|
|
|
171
164
|
];
|
|
172
165
|
|
|
173
166
|
const HEX_COLOR_PATTERN = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i;
|
|
167
|
+
const TOOLBAR_ICON_BUTTON_CLASS =
|
|
168
|
+
"inline-flex size-8 flex-shrink-0 items-center justify-center rounded-md transition-colors";
|
|
174
169
|
|
|
175
170
|
/** Native <input type="color"> only accepts 3/6-digit hex — fall back to
|
|
176
171
|
* black for gradients or other raw CSS values so the picker still opens. */
|
|
@@ -247,10 +242,6 @@ export default function EditorToolbar({
|
|
|
247
242
|
assetsButtonRef,
|
|
248
243
|
onShowHistory,
|
|
249
244
|
historyButtonRef,
|
|
250
|
-
onUndo,
|
|
251
|
-
onRedo,
|
|
252
|
-
canUndo,
|
|
253
|
-
canRedo,
|
|
254
245
|
currentSlide,
|
|
255
246
|
onUpdateSlide,
|
|
256
247
|
activeUsers,
|
|
@@ -426,10 +417,10 @@ export default function EditorToolbar({
|
|
|
426
417
|
<TooltipTrigger asChild>
|
|
427
418
|
<Link
|
|
428
419
|
to="/"
|
|
429
|
-
className=
|
|
420
|
+
className={`${TOOLBAR_ICON_BUTTON_CLASS} hover:bg-accent`}
|
|
430
421
|
aria-label={t("editorToolbar.backToDecks")}
|
|
431
422
|
>
|
|
432
|
-
<IconArrowLeft className="
|
|
423
|
+
<IconArrowLeft className="size-4 text-muted-foreground" />
|
|
433
424
|
</Link>
|
|
434
425
|
</TooltipTrigger>
|
|
435
426
|
<TooltipContent>{t("editorToolbar.backToDecks")}</TooltipContent>
|
|
@@ -440,12 +431,12 @@ export default function EditorToolbar({
|
|
|
440
431
|
<TooltipTrigger asChild>
|
|
441
432
|
<button
|
|
442
433
|
onClick={onToggleSidebar}
|
|
443
|
-
className={
|
|
434
|
+
className={`${TOOLBAR_ICON_BUTTON_CLASS} md:hidden hover:bg-accent ${
|
|
444
435
|
sidebarOpen ? "text-muted-foreground" : "text-muted-foreground/70"
|
|
445
436
|
}`}
|
|
446
437
|
aria-label={t("editorToolbar.toggleSlideList")}
|
|
447
438
|
>
|
|
448
|
-
<IconLayoutSidebar className="
|
|
439
|
+
<IconLayoutSidebar className="size-4" />
|
|
449
440
|
</button>
|
|
450
441
|
</TooltipTrigger>
|
|
451
442
|
<TooltipContent>{t("editorToolbar.toggleSlideList")}</TooltipContent>
|
|
@@ -486,14 +477,14 @@ export default function EditorToolbar({
|
|
|
486
477
|
closeAll();
|
|
487
478
|
setLayoutOpen(!layoutOpen);
|
|
488
479
|
}}
|
|
489
|
-
className={
|
|
480
|
+
className={`${TOOLBAR_ICON_BUTTON_CLASS} ${
|
|
490
481
|
layoutOpen
|
|
491
482
|
? "text-foreground/90 bg-accent"
|
|
492
483
|
: "text-muted-foreground hover:text-foreground/70 hover:bg-accent"
|
|
493
484
|
}`}
|
|
494
485
|
aria-label={t("editorToolbar.slideSettings")}
|
|
495
486
|
>
|
|
496
|
-
<IconSettings className="
|
|
487
|
+
<IconSettings className="size-4" />
|
|
497
488
|
</button>
|
|
498
489
|
</TooltipTrigger>
|
|
499
490
|
<TooltipContent>{t("editorToolbar.slideSettings")}</TooltipContent>
|
|
@@ -665,7 +656,7 @@ graph TD
|
|
|
665
656
|
console.error("Mermaid to Excalidraw failed:", err);
|
|
666
657
|
}
|
|
667
658
|
}}
|
|
668
|
-
className="flex items-center gap-2 w-full px-3 py-1.5 text-xs text-[
|
|
659
|
+
className="flex items-center gap-2 w-full px-3 py-1.5 text-xs text-[hsl(var(--accent-cyan))]/80 hover:text-[hsl(var(--accent-cyan))] hover:bg-accent/50 transition-colors"
|
|
669
660
|
>
|
|
670
661
|
<IconTransform className="w-3 h-3" />
|
|
671
662
|
{t("editorToolbar.convertMermaidToExcalidraw")}
|
|
@@ -719,8 +710,8 @@ graph TD
|
|
|
719
710
|
{/* Aspect Ratio section (deck-level) */}
|
|
720
711
|
{onSetAspectRatio && (
|
|
721
712
|
<>
|
|
722
|
-
<div className="mx-2 my-1.5 border-t border-
|
|
723
|
-
<div className="px-3 py-1.5 text-[10px] font-medium text-
|
|
713
|
+
<div className="mx-2 my-1.5 border-t border-border" />
|
|
714
|
+
<div className="px-3 py-1.5 text-[10px] font-medium text-muted-foreground/70 uppercase tracking-wider">
|
|
724
715
|
{t("editorToolbar.aspectRatio")}
|
|
725
716
|
</div>
|
|
726
717
|
<div className="px-3 pb-2.5 grid grid-cols-4 gap-1">
|
|
@@ -734,7 +725,7 @@ graph TD
|
|
|
734
725
|
className={`px-1.5 py-1 rounded text-[10px] font-medium border ${
|
|
735
726
|
active
|
|
736
727
|
? "bg-[#609FF8]/20 text-[#609FF8] border-[#609FF8]/30"
|
|
737
|
-
: "text-
|
|
728
|
+
: "text-muted-foreground hover:text-foreground hover:bg-accent/50 border-transparent"
|
|
738
729
|
}`}
|
|
739
730
|
>
|
|
740
731
|
{r}
|
|
@@ -764,7 +755,7 @@ graph TD
|
|
|
764
755
|
aria-label={t("editorToolbar.addTextBox")}
|
|
765
756
|
aria-pressed={textBoxMode}
|
|
766
757
|
aria-keyshortcuts="T"
|
|
767
|
-
className={
|
|
758
|
+
className={`${TOOLBAR_ICON_BUTTON_CLASS} ${
|
|
768
759
|
textBoxMode
|
|
769
760
|
? "bg-accent text-foreground"
|
|
770
761
|
: "text-muted-foreground hover:bg-accent hover:text-foreground/70"
|
|
@@ -796,14 +787,14 @@ graph TD
|
|
|
796
787
|
<TooltipTrigger asChild>
|
|
797
788
|
<DropdownMenuTrigger asChild>
|
|
798
789
|
<button
|
|
799
|
-
className={
|
|
790
|
+
className={`${TOOLBAR_ICON_BUTTON_CLASS} relative cursor-pointer ${
|
|
800
791
|
anyToolActive || toolsOpen
|
|
801
792
|
? "bg-accent text-foreground"
|
|
802
793
|
: "text-muted-foreground hover:text-foreground/70 hover:bg-accent"
|
|
803
794
|
}`}
|
|
804
795
|
aria-label={t("editorToolbar.slideTools")}
|
|
805
796
|
>
|
|
806
|
-
<IconTool className="
|
|
797
|
+
<IconTool className="size-4" />
|
|
807
798
|
{anyToolActive && !toolsOpen && (
|
|
808
799
|
<span className="absolute top-1 right-1 w-1.5 h-1.5 rounded-full bg-[#609FF8]" />
|
|
809
800
|
)}
|
|
@@ -869,52 +860,6 @@ graph TD
|
|
|
869
860
|
</DropdownMenu>
|
|
870
861
|
)}
|
|
871
862
|
|
|
872
|
-
{/* Edit-only cluster — undo/redo */}
|
|
873
|
-
{canEdit && (
|
|
874
|
-
<>
|
|
875
|
-
{/* Separator */}
|
|
876
|
-
<div className="hidden h-5 w-px flex-shrink-0 bg-border/70 sm:block" />
|
|
877
|
-
|
|
878
|
-
{/* Undo/Redo */}
|
|
879
|
-
<div className="flex items-center flex-shrink-0">
|
|
880
|
-
<Tooltip>
|
|
881
|
-
<TooltipTrigger asChild>
|
|
882
|
-
<button
|
|
883
|
-
onClick={onUndo}
|
|
884
|
-
disabled={!canUndo}
|
|
885
|
-
className="p-2.5 sm:p-1.5 rounded-md hover:bg-accent disabled:opacity-20 transition-colors"
|
|
886
|
-
aria-label={t("editorToolbar.undo")}
|
|
887
|
-
>
|
|
888
|
-
<IconArrowBackUp className="w-3.5 h-3.5 text-muted-foreground" />
|
|
889
|
-
</button>
|
|
890
|
-
</TooltipTrigger>
|
|
891
|
-
<TooltipContent>
|
|
892
|
-
{t("editorToolbar.undoWithShortcut", {
|
|
893
|
-
shortcut: shortcutLabel("cmd+z"),
|
|
894
|
-
})}
|
|
895
|
-
</TooltipContent>
|
|
896
|
-
</Tooltip>
|
|
897
|
-
<Tooltip>
|
|
898
|
-
<TooltipTrigger asChild>
|
|
899
|
-
<button
|
|
900
|
-
onClick={onRedo}
|
|
901
|
-
disabled={!canRedo}
|
|
902
|
-
className="p-2.5 sm:p-1.5 rounded-md hover:bg-accent disabled:opacity-20 transition-colors"
|
|
903
|
-
aria-label={t("editorToolbar.redo")}
|
|
904
|
-
>
|
|
905
|
-
<IconArrowForwardUp className="w-3.5 h-3.5 text-muted-foreground" />
|
|
906
|
-
</button>
|
|
907
|
-
</TooltipTrigger>
|
|
908
|
-
<TooltipContent>
|
|
909
|
-
{t("editorToolbar.redoWithShortcut", {
|
|
910
|
-
shortcut: shortcutLabel("cmd+shift+z"),
|
|
911
|
-
})}
|
|
912
|
-
</TooltipContent>
|
|
913
|
-
</Tooltip>
|
|
914
|
-
</div>
|
|
915
|
-
</>
|
|
916
|
-
)}
|
|
917
|
-
|
|
918
863
|
{/* Save status — subtle "Saving…" / "Saved" / offline pill. Renders
|
|
919
864
|
nothing when idle. Only meaningful for editors. */}
|
|
920
865
|
{canEdit && (
|
|
@@ -941,14 +886,14 @@ graph TD
|
|
|
941
886
|
<button
|
|
942
887
|
onClick={onToggleStyle}
|
|
943
888
|
data-slide-style-trigger="true"
|
|
944
|
-
className={
|
|
889
|
+
className={`${TOOLBAR_ICON_BUTTON_CLASS} relative ${
|
|
945
890
|
styleOpen
|
|
946
891
|
? "bg-accent text-foreground"
|
|
947
892
|
: "text-muted-foreground hover:bg-accent hover:text-foreground/70"
|
|
948
893
|
}`}
|
|
949
894
|
aria-label={t("styleInspector.title")}
|
|
950
895
|
>
|
|
951
|
-
<IconPalette className="
|
|
896
|
+
<IconPalette className="size-4" />
|
|
952
897
|
</button>
|
|
953
898
|
</TooltipTrigger>
|
|
954
899
|
<TooltipContent>{t("styleInspector.title")}</TooltipContent>
|
|
@@ -961,14 +906,14 @@ graph TD
|
|
|
961
906
|
<TooltipTrigger asChild>
|
|
962
907
|
<button
|
|
963
908
|
onClick={onToggleComments}
|
|
964
|
-
className={
|
|
909
|
+
className={`${TOOLBAR_ICON_BUTTON_CLASS} relative ${
|
|
965
910
|
commentsOpen
|
|
966
911
|
? "text-foreground bg-accent"
|
|
967
912
|
: "text-muted-foreground hover:text-foreground/70 hover:bg-accent"
|
|
968
913
|
}`}
|
|
969
914
|
aria-label={t("editorToolbar.comments")}
|
|
970
915
|
>
|
|
971
|
-
<IconMessage className="
|
|
916
|
+
<IconMessage className="size-4" />
|
|
972
917
|
{unresolvedCommentCount > 0 && (
|
|
973
918
|
<span className="absolute -top-0.5 -right-0.5 w-3.5 h-3.5 rounded-full bg-[#609FF8] text-[8px] font-bold text-black flex items-center justify-center leading-none">
|
|
974
919
|
{unresolvedCommentCount > 9 ? "9+" : unresolvedCommentCount}
|
|
@@ -1053,10 +998,10 @@ graph TD
|
|
|
1053
998
|
<DropdownMenuTrigger asChild>
|
|
1054
999
|
<button
|
|
1055
1000
|
ref={historyButtonRef}
|
|
1056
|
-
className=
|
|
1001
|
+
className={`${TOOLBAR_ICON_BUTTON_CLASS} cursor-pointer text-muted-foreground hover:bg-accent hover:text-foreground/70`}
|
|
1057
1002
|
aria-label={t("editorToolbar.more")}
|
|
1058
1003
|
>
|
|
1059
|
-
<IconDotsVertical className="
|
|
1004
|
+
<IconDotsVertical className="size-4" />
|
|
1060
1005
|
</button>
|
|
1061
1006
|
</DropdownMenuTrigger>
|
|
1062
1007
|
</TooltipTrigger>
|