Files
webstudio/apps/builder/app/shared/copy-paste/fragment-utils.ts
Oleg Isonen d440e02990 feat: Add safer MCP authoring and draft-page verification (#5905)
- **Restore points for agent work**: Create named restore points before
major edits, review changes with a dry run, and safely revert project
content if needed.

- **Shared Slot authoring**: Agents can turn existing sections into
shared Slots and insert linked copies across pages, including valid
nested Slots.

- **DTCG and Figma token imports**: Import design tokens and CSS
variables through CLI, MCP, or direct paste, with aliases, modes,
composite values, and mappings supported.

- **Consistent token conflict handling**: Every paste workflow now
offers the same preserve, rename, or merge choices instead of silently
overwriting existing design tokens.

- **Draft-page previews**: Agents can generate and inspect previews of
draft pages without publishing them or exposing drafts in production
builds.

- **Safer MCP mutations**: Destructive operations require explicit
confirmation, invalid raw patches and invented record IDs are rejected,
and restore operations commit atomically.

- **More dependable agent contracts**: New tools have complete runtime
schemas, clearer validation errors, and consistent behavior across CLI,
MCP, Builder, and server APIs.
2026-07-17 23:16:39 +02:00

27 lines
941 B
TypeScript

import type { WebstudioFragment } from "@webstudio-is/sdk";
import { breakpointPasteLimitWarning } from "@webstudio-is/project-build/runtime";
import {
insertWebstudioFragmentAt,
type Insertable,
} from "../instance-utils/insert";
import { builderApi } from "../builder-api";
import { resolveFragmentTokenConflicts } from "../resolve-token-conflicts";
export const hasFragmentData = (fragment: WebstudioFragment) =>
fragment.children.length > 0 || fragment.styleSources.length > 0;
export const insertFragmentWithBreakpointWarning = async (
fragment: WebstudioFragment,
insertable?: Insertable
) => {
const conflictResolution = await resolveFragmentTokenConflicts(fragment);
if (conflictResolution === "cancel") {
return false;
}
return insertWebstudioFragmentAt(fragment, insertable, conflictResolution, {
onBreakpointLimitMerge: () => {
builderApi.toast.warn(breakpointPasteLimitWarning);
},
});
};