@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
|
@@ -18,13 +18,17 @@
|
|
|
18
18
|
* __RUNTIME_LAYER_SNAPSHOT_ENABLED__ — true only for URL-backed localhost apps
|
|
19
19
|
*
|
|
20
20
|
* Rules:
|
|
21
|
-
* •
|
|
21
|
+
* • The shared, build-time-inlined canvas interaction controller is the one
|
|
22
|
+
* permitted import. No runtime module lookup survives code generation.
|
|
23
|
+
* • No require of any module (DOM globals only at iframe runtime).
|
|
22
24
|
* • No references to outer/module scope (the code runs inside an iframe).
|
|
23
25
|
* • Wrap everything in a self-executing IIFE.
|
|
24
26
|
*
|
|
25
27
|
* keep in sync with hit-test.bridge.ts for the shared container/axis/placement
|
|
26
28
|
* helpers (search for "// keep in sync" comments).
|
|
27
29
|
*/
|
|
30
|
+
import { createCanvasGestureController } from "@agent-native/toolkit/canvas-interactions";
|
|
31
|
+
|
|
28
32
|
declare var __READ_ONLY__: boolean;
|
|
29
33
|
declare var __TEXT_EDITING_ENABLED__: boolean;
|
|
30
34
|
declare var __EDITOR_CHROME_SCALE_X__: string;
|
|
@@ -4908,6 +4912,34 @@ declare var __SELECTED_LAYER_DRAG_PRIORITY__: boolean;
|
|
|
4908
4912
|
: { move: "mousemove", up: "mouseup" };
|
|
4909
4913
|
}
|
|
4910
4914
|
|
|
4915
|
+
// The bridge is bundled into an iframe IIFE. Its canvas is expressed in the
|
|
4916
|
+
// iframe's CSS pixels, so client and canvas coordinates intentionally share
|
|
4917
|
+
// the same viewport. Keeping this conversion at the adapter boundary lets
|
|
4918
|
+
// the common controller own gesture lifecycle/threshold/Shift semantics
|
|
4919
|
+
// without teaching it Design's source patches, auto layout, or transforms.
|
|
4920
|
+
function bridgeGestureViewport() {
|
|
4921
|
+
var width = Math.max(
|
|
4922
|
+
1,
|
|
4923
|
+
window.innerWidth || document.documentElement.clientWidth || 1,
|
|
4924
|
+
);
|
|
4925
|
+
var height = Math.max(
|
|
4926
|
+
1,
|
|
4927
|
+
window.innerHeight || document.documentElement.clientHeight || 1,
|
|
4928
|
+
);
|
|
4929
|
+
return { left: 0, top: 0, width: width, height: height };
|
|
4930
|
+
}
|
|
4931
|
+
|
|
4932
|
+
function bridgeGesturePointer(e) {
|
|
4933
|
+
return {
|
|
4934
|
+
x: e.clientX,
|
|
4935
|
+
y: e.clientY,
|
|
4936
|
+
altKey: !!e.altKey,
|
|
4937
|
+
ctrlKey: !!e.ctrlKey,
|
|
4938
|
+
metaKey: !!e.metaKey,
|
|
4939
|
+
shiftKey: !!e.shiftKey,
|
|
4940
|
+
};
|
|
4941
|
+
}
|
|
4942
|
+
|
|
4911
4943
|
function elementFromEditorPoint(
|
|
4912
4944
|
clientX: number,
|
|
4913
4945
|
clientY: number,
|
|
@@ -9815,8 +9847,49 @@ declare var __SELECTED_LAYER_DRAG_PRIORITY__: boolean;
|
|
|
9815
9847
|
// clear-selection postMessage cannot swap selectedEl mid-drag and cause
|
|
9816
9848
|
// mutations on the wrong element or a null-deref in onUp.
|
|
9817
9849
|
var dragEl = gestureEl;
|
|
9818
|
-
var
|
|
9850
|
+
var gestureViewport = bridgeGestureViewport();
|
|
9851
|
+
// Design owns the advanced preview math below: snapping/guides, nested
|
|
9852
|
+
// auto-layout conversion, and cross-screen state all have source-aware
|
|
9853
|
+
// invariants. The shared controller owns only the browser gesture state
|
|
9854
|
+
// machine and emits the normalized pointer lifecycle that gates it.
|
|
9855
|
+
// Use the same threshold for the controller and the legacy moved flag so
|
|
9856
|
+
// a selected-box click remains a click instead of starting a persistence
|
|
9857
|
+
// gesture with a zero delta.
|
|
9819
9858
|
var DRAG_THRESHOLD = 3;
|
|
9859
|
+
var bridgeMoveController = createCanvasGestureController({
|
|
9860
|
+
capabilities: { move: true, resize: true },
|
|
9861
|
+
drag: {
|
|
9862
|
+
// Shield drags already crossed the outer threshold before reaching
|
|
9863
|
+
// startMove. Keeping their controller threshold at zero preserves the
|
|
9864
|
+
// first post-shield delta, while direct selection-chrome drags still
|
|
9865
|
+
// need a real threshold before they preview or persist.
|
|
9866
|
+
threshold: pointerStartParam ? 0 : DRAG_THRESHOLD,
|
|
9867
|
+
duplicateModifier: "alt",
|
|
9868
|
+
},
|
|
9869
|
+
adapter: {
|
|
9870
|
+
preview: function () {
|
|
9871
|
+
return { handled: true };
|
|
9872
|
+
},
|
|
9873
|
+
commit: function () {
|
|
9874
|
+
return { handled: true };
|
|
9875
|
+
},
|
|
9876
|
+
cancel: function () {
|
|
9877
|
+
return { handled: true };
|
|
9878
|
+
},
|
|
9879
|
+
},
|
|
9880
|
+
});
|
|
9881
|
+
bridgeMoveController.pointerDown({
|
|
9882
|
+
kind: "move",
|
|
9883
|
+
objectIds: [getSelector(gestureEl)],
|
|
9884
|
+
// `e` is deliberately the event that actually began the legacy move
|
|
9885
|
+
// lifecycle. `pointerStartParam` is only Design's outer shield
|
|
9886
|
+
// disambiguation origin; using it here would apply that first
|
|
9887
|
+
// threshold-crossing delta twice.
|
|
9888
|
+
pointer: bridgeGesturePointer(e),
|
|
9889
|
+
viewport: gestureViewport,
|
|
9890
|
+
canvas: { width: gestureViewport.width, height: gestureViewport.height },
|
|
9891
|
+
});
|
|
9892
|
+
var moved = false;
|
|
9820
9893
|
dndLog("start:free", { el: getSelector(gestureEl), isGroup: isGroupDrag });
|
|
9821
9894
|
var currentAutoLayoutTarget: {
|
|
9822
9895
|
anchor: Element;
|
|
@@ -9866,26 +9939,21 @@ declare var __SELECTED_LAYER_DRAG_PRIORITY__: boolean;
|
|
|
9866
9939
|
window.requestAnimationFrame(flushCrossScreenDragMove);
|
|
9867
9940
|
}
|
|
9868
9941
|
function onMove(ev) {
|
|
9942
|
+
var controllerMove = bridgeMoveController.pointerMove(
|
|
9943
|
+
bridgeGesturePointer(ev),
|
|
9944
|
+
);
|
|
9945
|
+
if (controllerMove.phase !== "active") return;
|
|
9869
9946
|
if (
|
|
9870
9947
|
!moved &&
|
|
9871
9948
|
Math.hypot(ev.clientX - startX, ev.clientY - startY) > DRAG_THRESHOLD
|
|
9872
9949
|
) {
|
|
9873
9950
|
moved = true;
|
|
9874
9951
|
}
|
|
9875
|
-
|
|
9876
|
-
|
|
9877
|
-
//
|
|
9878
|
-
|
|
9879
|
-
|
|
9880
|
-
// pressing/releasing Shift mid-drag re-evaluates every event, matching
|
|
9881
|
-
// how the resize path reads ev.shiftKey per-move rather than once.
|
|
9882
|
-
if (ev.shiftKey) {
|
|
9883
|
-
if (Math.abs(rawDx) > Math.abs(rawDy)) {
|
|
9884
|
-
rawDy = 0;
|
|
9885
|
-
} else {
|
|
9886
|
-
rawDx = 0;
|
|
9887
|
-
}
|
|
9888
|
-
}
|
|
9952
|
+
// The controller converts client deltas at the iframe boundary and
|
|
9953
|
+
// applies the live Shift dominant-axis constraint. Design-specific snap
|
|
9954
|
+
// and auto-layout handling decorates this normalized delta below.
|
|
9955
|
+
var rawDx = controllerMove.gesture.canvasDelta.x;
|
|
9956
|
+
var rawDy = controllerMove.gesture.canvasDelta.y;
|
|
9889
9957
|
var nextLeft = originLeft + rawDx;
|
|
9890
9958
|
var nextTop = originTop + rawDy;
|
|
9891
9959
|
// Alignment/smart-guide snapping: disabled while Cmd/Ctrl is held
|
|
@@ -9993,6 +10061,7 @@ declare var __SELECTED_LAYER_DRAG_PRIORITY__: boolean;
|
|
|
9993
10061
|
crossScreenDragMovePendingEv = null;
|
|
9994
10062
|
}
|
|
9995
10063
|
function cancelMoveDrag() {
|
|
10064
|
+
bridgeMoveController.cancel();
|
|
9996
10065
|
cleanupMoveDrag();
|
|
9997
10066
|
hideTransformBadge();
|
|
9998
10067
|
hideInsertionGuide();
|
|
@@ -10019,6 +10088,16 @@ declare var __SELECTED_LAYER_DRAG_PRIORITY__: boolean;
|
|
|
10019
10088
|
cancelMoveDrag();
|
|
10020
10089
|
}
|
|
10021
10090
|
function onUp(ev) {
|
|
10091
|
+
var controllerEnd = bridgeMoveController.pointerUp(
|
|
10092
|
+
bridgeGesturePointer(ev),
|
|
10093
|
+
);
|
|
10094
|
+
if (!controllerEnd.committed) {
|
|
10095
|
+
cleanupMoveDrag();
|
|
10096
|
+
hideTransformBadge();
|
|
10097
|
+
hideInsertionGuide();
|
|
10098
|
+
hideSnapGuides();
|
|
10099
|
+
return;
|
|
10100
|
+
}
|
|
10022
10101
|
cleanupMoveDrag();
|
|
10023
10102
|
hideTransformBadge();
|
|
10024
10103
|
hideInsertionGuide();
|
|
@@ -10224,6 +10303,45 @@ declare var __SELECTED_LAYER_DRAG_PRIORITY__: boolean;
|
|
|
10224
10303
|
// Capture the element rotation once at drag-start so per-move projection is
|
|
10225
10304
|
// cheap and consistent even if the transform changes during the drag.
|
|
10226
10305
|
var resizeTheta = (currentRotation(resizeEl) * Math.PI) / 180;
|
|
10306
|
+
var resizeGestureViewport = bridgeGestureViewport();
|
|
10307
|
+
// Keep generic resize lifecycle in Toolkit while Design continues to own
|
|
10308
|
+
// rotated/Alt-centered/Scale-tool geometry. The generic rect emitted by
|
|
10309
|
+
// the controller is intentionally advisory here; applying it directly
|
|
10310
|
+
// would discard Design's rotation-projected resize invariants.
|
|
10311
|
+
var RESIZE_DRAG_THRESHOLD = 3;
|
|
10312
|
+
var bridgeResizeController = createCanvasGestureController({
|
|
10313
|
+
capabilities: { move: true, resize: true },
|
|
10314
|
+
drag: { threshold: RESIZE_DRAG_THRESHOLD, duplicateModifier: "alt" },
|
|
10315
|
+
minSize: 8,
|
|
10316
|
+
adapter: {
|
|
10317
|
+
preview: function () {
|
|
10318
|
+
return { handled: true };
|
|
10319
|
+
},
|
|
10320
|
+
commit: function () {
|
|
10321
|
+
return { handled: true };
|
|
10322
|
+
},
|
|
10323
|
+
cancel: function () {
|
|
10324
|
+
return { handled: true };
|
|
10325
|
+
},
|
|
10326
|
+
},
|
|
10327
|
+
});
|
|
10328
|
+
bridgeResizeController.pointerDown({
|
|
10329
|
+
kind: "resize",
|
|
10330
|
+
objectIds: [getSelector(resizeEl)],
|
|
10331
|
+
pointer: bridgeGesturePointer(e),
|
|
10332
|
+
viewport: resizeGestureViewport,
|
|
10333
|
+
canvas: {
|
|
10334
|
+
width: resizeGestureViewport.width,
|
|
10335
|
+
height: resizeGestureViewport.height,
|
|
10336
|
+
},
|
|
10337
|
+
handle: handle,
|
|
10338
|
+
rect: {
|
|
10339
|
+
x: origin.left,
|
|
10340
|
+
y: origin.top,
|
|
10341
|
+
width: origin.width,
|
|
10342
|
+
height: origin.height,
|
|
10343
|
+
},
|
|
10344
|
+
});
|
|
10227
10345
|
// Figma commit-semantics parity: a resize must only ever write the
|
|
10228
10346
|
// axis/axes the user actually dragged. A pure vertical edge-drag (handle
|
|
10229
10347
|
// "n"/"s", no Shift, scale tool off) must leave width completely alone —
|
|
@@ -10336,6 +10454,10 @@ declare var __SELECTED_LAYER_DRAG_PRIORITY__: boolean;
|
|
|
10336
10454
|
};
|
|
10337
10455
|
}
|
|
10338
10456
|
function onMove(ev) {
|
|
10457
|
+
var controllerMove = bridgeResizeController.pointerMove(
|
|
10458
|
+
bridgeGesturePointer(ev),
|
|
10459
|
+
);
|
|
10460
|
+
if (controllerMove.phase !== "active") return;
|
|
10339
10461
|
if (!resizeEl) return;
|
|
10340
10462
|
var rect = nextRect(ev);
|
|
10341
10463
|
if (rect.touchesWidth) widthTouched = true;
|
|
@@ -10382,6 +10504,7 @@ declare var __SELECTED_LAYER_DRAG_PRIORITY__: boolean;
|
|
|
10382
10504
|
clearActiveDragCancel(cancelResizeDrag);
|
|
10383
10505
|
}
|
|
10384
10506
|
function cancelResizeDrag() {
|
|
10507
|
+
bridgeResizeController.cancel();
|
|
10385
10508
|
cleanupResizeDrag();
|
|
10386
10509
|
hideTransformBadge();
|
|
10387
10510
|
if (resizeEl && document.documentElement.contains(resizeEl)) {
|
|
@@ -10404,7 +10527,15 @@ declare var __SELECTED_LAYER_DRAG_PRIORITY__: boolean;
|
|
|
10404
10527
|
stopNativeInteraction(ev);
|
|
10405
10528
|
cancelResizeDrag();
|
|
10406
10529
|
}
|
|
10407
|
-
function onUp() {
|
|
10530
|
+
function onUp(ev) {
|
|
10531
|
+
var controllerEnd = bridgeResizeController.pointerUp(
|
|
10532
|
+
bridgeGesturePointer(ev),
|
|
10533
|
+
);
|
|
10534
|
+
if (!controllerEnd.committed) {
|
|
10535
|
+
cleanupResizeDrag();
|
|
10536
|
+
hideTransformBadge();
|
|
10537
|
+
return;
|
|
10538
|
+
}
|
|
10408
10539
|
cleanupResizeDrag();
|
|
10409
10540
|
hideTransformBadge();
|
|
10410
10541
|
if (!resizeEl) return;
|
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
import {
|
|
2
|
+
resolveCanvasNudge,
|
|
3
|
+
resolveCanvasShortcut,
|
|
4
|
+
} from "@agent-native/toolkit/canvas-interactions";
|
|
5
|
+
import type {
|
|
6
|
+
CanvasCommand,
|
|
7
|
+
CanvasCommandDispatchResult,
|
|
8
|
+
CanvasCommandId,
|
|
9
|
+
CanvasInteractionAdapter,
|
|
10
|
+
CanvasInteractionCapabilities,
|
|
11
|
+
CanvasShortcut,
|
|
12
|
+
CanvasShortcutInput,
|
|
13
|
+
CanvasTextEditPolicy,
|
|
14
|
+
} from "@agent-native/toolkit/canvas-interactions";
|
|
15
|
+
|
|
16
|
+
import type { UseDesignHotkeysProps } from "@/hooks/useDesignHotkeys";
|
|
17
|
+
|
|
18
|
+
export type DesignCanvasInteractionHandlers = Pick<
|
|
19
|
+
UseDesignHotkeysProps,
|
|
20
|
+
| "onSelectAll"
|
|
21
|
+
| "onUndo"
|
|
22
|
+
| "onRedo"
|
|
23
|
+
| "onCopy"
|
|
24
|
+
| "onCut"
|
|
25
|
+
| "onPaste"
|
|
26
|
+
| "onDuplicate"
|
|
27
|
+
| "onDelete"
|
|
28
|
+
| "onNudge"
|
|
29
|
+
| "onBringForward"
|
|
30
|
+
| "onBringToFront"
|
|
31
|
+
| "onSendBackward"
|
|
32
|
+
| "onSendToBack"
|
|
33
|
+
| "onAlignSelection"
|
|
34
|
+
| "onDistributeSelection"
|
|
35
|
+
| "onGroup"
|
|
36
|
+
| "onUngroup"
|
|
37
|
+
| "onFrameSelection"
|
|
38
|
+
| "onEscape"
|
|
39
|
+
| "onEnter"
|
|
40
|
+
>;
|
|
41
|
+
|
|
42
|
+
export interface CreateDesignCanvasInteractionAdapterOptions {
|
|
43
|
+
shortcuts: DesignCanvasInteractionHandlers;
|
|
44
|
+
/**
|
|
45
|
+
* The shared command contract intentionally does not carry DOM events.
|
|
46
|
+
* Design provides the original event at this seam when it dispatches from
|
|
47
|
+
* its existing hotkey loop, preserving source/editor behavior.
|
|
48
|
+
*/
|
|
49
|
+
getHotkeyDetails?: (command: CanvasCommand) => DesignHotkeyDetails | null;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
type DesignHotkeyDetails = Parameters<
|
|
53
|
+
NonNullable<UseDesignHotkeysProps["onUndo"]>
|
|
54
|
+
>[0];
|
|
55
|
+
|
|
56
|
+
export interface DesignCanvasInteractionAdapter extends CanvasInteractionAdapter {
|
|
57
|
+
readonly id: "design";
|
|
58
|
+
readonly textEditing: Required<CanvasTextEditPolicy>;
|
|
59
|
+
dispatchShortcut(
|
|
60
|
+
command: CanvasCommandId,
|
|
61
|
+
event: KeyboardEvent,
|
|
62
|
+
): CanvasCommandDispatchResult;
|
|
63
|
+
dispatchKeyboardEvent(event: KeyboardEvent): CanvasCommandDispatchResult;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export const DESIGN_CANVAS_INTERACTION_CAPABILITIES = {
|
|
67
|
+
selection: true,
|
|
68
|
+
multiSelection: true,
|
|
69
|
+
marquee: true,
|
|
70
|
+
move: true,
|
|
71
|
+
resize: true,
|
|
72
|
+
rotation: true,
|
|
73
|
+
snapping: true,
|
|
74
|
+
alignment: true,
|
|
75
|
+
distribution: true,
|
|
76
|
+
duplicate: true,
|
|
77
|
+
clipboard: true,
|
|
78
|
+
delete: true,
|
|
79
|
+
nudge: true,
|
|
80
|
+
arrange: true,
|
|
81
|
+
grouping: true,
|
|
82
|
+
textEditing: true,
|
|
83
|
+
} satisfies CanvasInteractionCapabilities;
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Design's equivalent subset of the shared canvas command registry. The
|
|
87
|
+
* broader Figma shortcut catalogue remains in `useDesignHotkeys`: it has
|
|
88
|
+
* Design-only commands and platform rules which should not be projected onto
|
|
89
|
+
* other canvases. These entries are intentionally semantic rather than tied
|
|
90
|
+
* to the iframe/source persistence implementation.
|
|
91
|
+
*/
|
|
92
|
+
export const DESIGN_CANVAS_SHORTCUTS: readonly CanvasShortcut[] = [
|
|
93
|
+
{ command: "select-all", key: "a", modifiers: ["primary"] },
|
|
94
|
+
{ command: "undo", key: "z", modifiers: ["primary"] },
|
|
95
|
+
{ command: "redo", key: "z", modifiers: ["primary", "shift"] },
|
|
96
|
+
{ command: "copy", key: "c", modifiers: ["primary"] },
|
|
97
|
+
{ command: "cut", key: "x", modifiers: ["primary"] },
|
|
98
|
+
{ command: "paste", key: "v", modifiers: ["primary"] },
|
|
99
|
+
{ command: "duplicate", key: "d", modifiers: ["primary"] },
|
|
100
|
+
{ command: "delete", key: "Backspace" },
|
|
101
|
+
{ command: "delete", key: "Delete" },
|
|
102
|
+
{
|
|
103
|
+
command: "bring-forward",
|
|
104
|
+
key: "]",
|
|
105
|
+
code: "BracketRight",
|
|
106
|
+
modifiers: ["primary"],
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
command: "send-backward",
|
|
110
|
+
key: "[",
|
|
111
|
+
code: "BracketLeft",
|
|
112
|
+
modifiers: ["primary"],
|
|
113
|
+
},
|
|
114
|
+
{ command: "bring-to-front", key: "]" },
|
|
115
|
+
{ command: "send-to-back", key: "[" },
|
|
116
|
+
{
|
|
117
|
+
command: "bring-to-front",
|
|
118
|
+
key: "]",
|
|
119
|
+
code: "BracketRight",
|
|
120
|
+
modifiers: ["primary", "alt"],
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
command: "send-to-back",
|
|
124
|
+
key: "[",
|
|
125
|
+
code: "BracketLeft",
|
|
126
|
+
modifiers: ["primary", "alt"],
|
|
127
|
+
},
|
|
128
|
+
];
|
|
129
|
+
|
|
130
|
+
/** Shared semantic lookup used by Design's live hotkey shell. */
|
|
131
|
+
export function resolveDesignCanvasShortcut(
|
|
132
|
+
input: CanvasShortcutInput,
|
|
133
|
+
): CanvasCommandId | null {
|
|
134
|
+
return resolveCanvasShortcut(input, DESIGN_CANVAS_SHORTCUTS);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function canvasCommandForDesignKeyboardEvent(
|
|
138
|
+
event: KeyboardEvent,
|
|
139
|
+
): CanvasCommandId | null {
|
|
140
|
+
const shortcut = resolveDesignCanvasShortcut({
|
|
141
|
+
key: event.key,
|
|
142
|
+
code: event.code,
|
|
143
|
+
metaKey: event.metaKey,
|
|
144
|
+
ctrlKey: event.ctrlKey,
|
|
145
|
+
shiftKey: event.shiftKey,
|
|
146
|
+
altKey: event.altKey,
|
|
147
|
+
});
|
|
148
|
+
if (shortcut) return shortcut;
|
|
149
|
+
if (event.metaKey || event.ctrlKey || event.altKey) return null;
|
|
150
|
+
return (
|
|
151
|
+
resolveCanvasNudge({ key: event.key, shiftKey: event.shiftKey })?.command ??
|
|
152
|
+
null
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
function dispatchDesignShortcut(
|
|
157
|
+
command: CanvasCommand,
|
|
158
|
+
details: DesignHotkeyDetails | null,
|
|
159
|
+
handlers: DesignCanvasInteractionHandlers,
|
|
160
|
+
): CanvasCommandDispatchResult {
|
|
161
|
+
if (!details) return { handled: false, reason: "unhandled" };
|
|
162
|
+
|
|
163
|
+
switch (command.id) {
|
|
164
|
+
case "undo":
|
|
165
|
+
return runShortcutHandler(handlers.onUndo, details);
|
|
166
|
+
case "redo":
|
|
167
|
+
return runShortcutHandler(handlers.onRedo, details);
|
|
168
|
+
case "copy":
|
|
169
|
+
return runShortcutHandler(handlers.onCopy, details);
|
|
170
|
+
case "cut":
|
|
171
|
+
return runShortcutHandler(handlers.onCut, details);
|
|
172
|
+
case "paste":
|
|
173
|
+
return runShortcutHandler(handlers.onPaste, details);
|
|
174
|
+
case "duplicate":
|
|
175
|
+
return runShortcutHandler(handlers.onDuplicate, details);
|
|
176
|
+
case "delete":
|
|
177
|
+
return runShortcutHandler(handlers.onDelete, details);
|
|
178
|
+
case "bring-forward":
|
|
179
|
+
return runShortcutHandler(handlers.onBringForward, details);
|
|
180
|
+
case "bring-to-front":
|
|
181
|
+
return runShortcutHandler(handlers.onBringToFront, details);
|
|
182
|
+
case "send-backward":
|
|
183
|
+
return runShortcutHandler(handlers.onSendBackward, details);
|
|
184
|
+
case "send-to-back":
|
|
185
|
+
return runShortcutHandler(handlers.onSendToBack, details);
|
|
186
|
+
case "group":
|
|
187
|
+
return runShortcutHandler(handlers.onGroup, details);
|
|
188
|
+
case "ungroup":
|
|
189
|
+
return runShortcutHandler(handlers.onUngroup, details);
|
|
190
|
+
case "frame-selection":
|
|
191
|
+
return runShortcutHandler(handlers.onFrameSelection, details);
|
|
192
|
+
case "escape":
|
|
193
|
+
return runShortcutHandler(handlers.onEscape, details);
|
|
194
|
+
case "enter":
|
|
195
|
+
return runShortcutHandler(handlers.onEnter, details);
|
|
196
|
+
case "nudge-left":
|
|
197
|
+
return runNudgeHandler(handlers.onNudge, details, "left", command);
|
|
198
|
+
case "nudge-right":
|
|
199
|
+
return runNudgeHandler(handlers.onNudge, details, "right", command);
|
|
200
|
+
case "nudge-up":
|
|
201
|
+
return runNudgeHandler(handlers.onNudge, details, "up", command);
|
|
202
|
+
case "nudge-down":
|
|
203
|
+
return runNudgeHandler(handlers.onNudge, details, "down", command);
|
|
204
|
+
case "align-left":
|
|
205
|
+
return runAlignHandler(handlers.onAlignSelection, details, "left");
|
|
206
|
+
case "align-center":
|
|
207
|
+
return runAlignHandler(handlers.onAlignSelection, details, "center-h");
|
|
208
|
+
case "align-right":
|
|
209
|
+
return runAlignHandler(handlers.onAlignSelection, details, "right");
|
|
210
|
+
case "align-top":
|
|
211
|
+
return runAlignHandler(handlers.onAlignSelection, details, "top");
|
|
212
|
+
case "align-middle":
|
|
213
|
+
return runAlignHandler(handlers.onAlignSelection, details, "center-v");
|
|
214
|
+
case "align-bottom":
|
|
215
|
+
return runAlignHandler(handlers.onAlignSelection, details, "bottom");
|
|
216
|
+
case "distribute-horizontal":
|
|
217
|
+
return runDistributeHandler(
|
|
218
|
+
handlers.onDistributeSelection,
|
|
219
|
+
details,
|
|
220
|
+
"horizontal",
|
|
221
|
+
);
|
|
222
|
+
case "distribute-vertical":
|
|
223
|
+
return runDistributeHandler(
|
|
224
|
+
handlers.onDistributeSelection,
|
|
225
|
+
details,
|
|
226
|
+
"vertical",
|
|
227
|
+
);
|
|
228
|
+
case "arrange-front":
|
|
229
|
+
return runShortcutHandler(handlers.onBringToFront, details);
|
|
230
|
+
case "arrange-back":
|
|
231
|
+
return runShortcutHandler(handlers.onSendToBack, details);
|
|
232
|
+
case "select-all":
|
|
233
|
+
return runShortcutHandler(handlers.onSelectAll, details);
|
|
234
|
+
case "nudge":
|
|
235
|
+
return { handled: false, reason: "unhandled" };
|
|
236
|
+
}
|
|
237
|
+
return { handled: false, reason: "unhandled" };
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
function runShortcutHandler(
|
|
241
|
+
handler:
|
|
242
|
+
| ((details: {
|
|
243
|
+
event: KeyboardEvent;
|
|
244
|
+
key: string;
|
|
245
|
+
primary: boolean;
|
|
246
|
+
shift: boolean;
|
|
247
|
+
alt: boolean;
|
|
248
|
+
repeat: boolean;
|
|
249
|
+
}) => void)
|
|
250
|
+
| undefined,
|
|
251
|
+
details: {
|
|
252
|
+
event: KeyboardEvent;
|
|
253
|
+
key: string;
|
|
254
|
+
primary: boolean;
|
|
255
|
+
shift: boolean;
|
|
256
|
+
alt: boolean;
|
|
257
|
+
repeat: boolean;
|
|
258
|
+
},
|
|
259
|
+
): CanvasCommandDispatchResult {
|
|
260
|
+
if (!handler) return { handled: false, reason: "unhandled" };
|
|
261
|
+
handler(details);
|
|
262
|
+
return { handled: true };
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
function runNudgeHandler(
|
|
266
|
+
handler: UseDesignHotkeysProps["onNudge"],
|
|
267
|
+
details: DesignHotkeyDetails,
|
|
268
|
+
direction: "left" | "right" | "up" | "down",
|
|
269
|
+
command: CanvasCommand,
|
|
270
|
+
): CanvasCommandDispatchResult {
|
|
271
|
+
if (!handler) return { handled: false, reason: "unhandled" };
|
|
272
|
+
const amount = Math.max(
|
|
273
|
+
Math.abs(command.delta?.x ?? 0),
|
|
274
|
+
Math.abs(command.delta?.y ?? 0),
|
|
275
|
+
);
|
|
276
|
+
handler({ ...details, direction, largeStep: amount >= 10 || details.shift });
|
|
277
|
+
return { handled: true };
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
function runAlignHandler(
|
|
281
|
+
handler: UseDesignHotkeysProps["onAlignSelection"],
|
|
282
|
+
details: DesignHotkeyDetails,
|
|
283
|
+
edge: "left" | "center-h" | "right" | "top" | "center-v" | "bottom",
|
|
284
|
+
): CanvasCommandDispatchResult {
|
|
285
|
+
if (!handler) return { handled: false, reason: "unhandled" };
|
|
286
|
+
handler({ ...details, edge });
|
|
287
|
+
return { handled: true };
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
function runDistributeHandler(
|
|
291
|
+
handler: UseDesignHotkeysProps["onDistributeSelection"],
|
|
292
|
+
details: DesignHotkeyDetails,
|
|
293
|
+
axis: "horizontal" | "vertical",
|
|
294
|
+
): CanvasCommandDispatchResult {
|
|
295
|
+
if (!handler) return { handled: false, reason: "unhandled" };
|
|
296
|
+
handler({ ...details, axis });
|
|
297
|
+
return { handled: true };
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* The Design adapter is deliberately small. `DesignEditor` remains the owner
|
|
302
|
+
* of selection canonicalization and source writes; a future Toolkit canvas
|
|
303
|
+
* controller can call this object without importing the iframe bridge.
|
|
304
|
+
*
|
|
305
|
+
* Wiring points:
|
|
306
|
+
* - DesignCanvas onElementSelect / onElementDblClickText -> selection
|
|
307
|
+
* - DesignCanvas visual/text callbacks -> persistence
|
|
308
|
+
* - useDesignHotkeys handlers -> shortcuts
|
|
309
|
+
*/
|
|
310
|
+
export function createDesignCanvasInteractionAdapter(
|
|
311
|
+
options: CreateDesignCanvasInteractionAdapterOptions,
|
|
312
|
+
): DesignCanvasInteractionAdapter {
|
|
313
|
+
return {
|
|
314
|
+
id: "design",
|
|
315
|
+
capabilities: DESIGN_CANVAS_INTERACTION_CAPABILITIES,
|
|
316
|
+
textEditing: {
|
|
317
|
+
activation: "double-click",
|
|
318
|
+
escapeBehavior: "select-object",
|
|
319
|
+
},
|
|
320
|
+
dispatch: (command) =>
|
|
321
|
+
dispatchDesignShortcut(
|
|
322
|
+
command,
|
|
323
|
+
options.getHotkeyDetails?.(command) ?? null,
|
|
324
|
+
options.shortcuts,
|
|
325
|
+
),
|
|
326
|
+
dispatchShortcut: (command, event) =>
|
|
327
|
+
dispatchDesignShortcut(
|
|
328
|
+
{ id: command },
|
|
329
|
+
{
|
|
330
|
+
event,
|
|
331
|
+
key: event.key,
|
|
332
|
+
primary: event.metaKey || event.ctrlKey,
|
|
333
|
+
shift: event.shiftKey,
|
|
334
|
+
alt: event.altKey,
|
|
335
|
+
repeat: event.repeat,
|
|
336
|
+
},
|
|
337
|
+
options.shortcuts,
|
|
338
|
+
),
|
|
339
|
+
dispatchKeyboardEvent: (event) => {
|
|
340
|
+
const command = canvasCommandForDesignKeyboardEvent(event);
|
|
341
|
+
return command
|
|
342
|
+
? dispatchDesignShortcut(
|
|
343
|
+
{ id: command },
|
|
344
|
+
{
|
|
345
|
+
event,
|
|
346
|
+
key: event.key,
|
|
347
|
+
primary: event.metaKey || event.ctrlKey,
|
|
348
|
+
shift: event.shiftKey,
|
|
349
|
+
alt: event.altKey,
|
|
350
|
+
repeat: event.repeat,
|
|
351
|
+
},
|
|
352
|
+
options.shortcuts,
|
|
353
|
+
)
|
|
354
|
+
: { handled: false, reason: "unhandled" };
|
|
355
|
+
},
|
|
356
|
+
};
|
|
357
|
+
}
|