@superblocksteam/library 2.0.70-next.8 → 2.0.71-next.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsx-wrapper-l2f8GWJ7.js","names":["sectionDefs: Array<PropertiesPanelSectionDefinition>","properties: WidgetPropertyDefinition<any>[]","children: Record<string, WidgetPropertyDefinition<DataType>>","category: PropsCategory","exhaustiveCheck: never","baseControlType: ControlType","inputType: InputType | undefined","panelConfig: PropertiesPanelDefinition | undefined","contentDef: Record<string, Section>","variants: UnionVariant<typeof this.shared>[]","parentPath","managedPropsList: ManagedPropsList","editMode: boolean | undefined","editMode","icon: React.ReactNode","color: string","SuccessIcon","ErrorIcon","InfoIcon","WarningIcon","positionToPlacement: Record<NotificationPosition, Position>","profile","context","appMode: AppMode | undefined","cleanedBody: Record<string, any>","init: RequestInit","jsonValues: { error?: { message: string } }[]","e: HttpError | TypeError | any","result: ApiV2ExecutionResponse","returnBlockOutput: ApiV2ExecutionResponse[\"output\"]","filesForRequest: Record<string, FileRequestParam>","result: Record<string, unknown>","rootStore: RootStore","apisToSet: Array<DeleteMeLibraryApi & { scopeId: string }>","context","ApiHmrTracker","superblocksContext","events: Array<StreamEvent>","editMode","appMode","authResult: any","fetchByPathParams: {\n path: string;\n applicationId: string;\n commitId?: string;\n branchName?: string;\n profile: { name: string; id: string };\n viewMode: OrchestratorViewMode;\n }","diff","value","res: string[]","entry","reactionOptions: IReactionOptions<any, boolean>","initialState: OUTPUT","lastValue: unknown","disposers: IDisposer[]","dataType: EntityDefinition[\"props\"][string][\"dataType\"]","objectFields: Record<string, any>","rootStore: RootStore","entityDefinitions: Record<string, EntityDefinition>","entityDefinition: EntityDefinition","entityDefEntry: EntityDefinition[\"props\"][string]","catalogs: Array<CatalogWithInternalDetails>","configs: Record<string, EditorConfig>","ApiManager","StyledClarkIcon: React.FC","ClarkIcon","rootStore","AiStarsIcon","rootStore","rootStore","Component","selectorProps: Record<string, string>","ErrorBoundary"],"sources":["../src/edit-mode/get-edit-store.ts","../src/lib/user-facing/properties-panel/properties-panel-definition.ts","../src/lib/user-facing/properties-panel/props-builder.ts","../src/lib/user-facing/properties-panel/create-managed-props-list.ts","../src/lib/internal-details/is-edit-mode.ts","../src/lib/utils/clean-object.ts","../src/lib/internal-details/lib/iframe.ts","../src/edit-mode/base-editor-bridge.ts","../src/edit-mode/message-queue.ts","../src/edit-mode/superblocks-editor-bridge.ts","../src/lib/internal-details/location-store.ts","../src/lib/user-facing/assets/icons/system-danger.svg","../src/lib/user-facing/assets/icons/system-error.svg","../src/lib/user-facing/assets/icons/system-info.svg","../src/lib/user-facing/assets/icons/system-success.svg","../src/lib/user-facing/styling/colors.ts","../src/lib/user-facing/themes/classnames.ts","../src/lib/user-facing/utils/notification.tsx","../src/lib/internal-details/scope/types.ts","../src/lib/internal-details/superblocks-context.tsx","../src/lib/internal-details/lib/resolve-id-singleton.ts","../src/lib/internal-details/lib/features/api-hmr-tracker.ts","../src/lib/tracing/context-utils.ts","../src/lib/utils/generate-id.ts","../src/lib/internal-details/lib/features/api-utils.ts","../src/lib/internal-details/lib/features/file-utils.ts","../src/lib/internal-details/lib/features/url-utils.ts","../src/lib/internal-details/lib/features/api-store.ts","../src/lib/internal-details/lib/evaluator/sanitize-object.ts","../src/edit-mode/mobx-sync/create-patch.ts","../src/edit-mode/mobx-sync/deep-observe.ts","../src/edit-mode/mobx-sync/mobx-editor-sync.ts","../src/lib/internal-details/lib/features/type-defs-utils.ts","../src/lib/internal-details/lib/features/component-registry.ts","../src/lib/internal-details/lib/root-store.ts","../src/lib/user-facing/assets/images/clark.svg","../src/lib/internal-details/internal-components/common.ts","../src/edit-mode/assets/ai-stars.svg","../src/lib/internal-details/internal-components/fix-with-clark-button.tsx","../src/lib/internal-details/css-constants.ts","../src/lib/internal-details/lib/suspense/suspense-fallback.tsx","../src/lib/user-facing/component-base/error-boundary.tsx","../src/lib/utils/widget-wrapper-naming.ts","../src/edit-mode/edit-wrapper.tsx","../src/edit-mode/instance-tracker.ts","../src/edit-mode/jsx-wrapper.tsx"],"sourcesContent":["import type { EditStore } from \"./edit-store.js\";\n\n/**\n * Get the global EditStore instance\n * @returns The EditStore instance\n */\n\nexport function getEditStore(): EditStore {\n if (\n !window.__SUPERBLOCKS_EDITOR_HOOK__ ||\n !window.__SUPERBLOCKS_EDITOR_HOOK__.isInitialized\n ) {\n throw new Error(\"EditStore not initialized\");\n }\n return (window as any).__SUPERBLOCKS_EDITOR_HOOK__;\n}\n","import { type Section, type Prop, CompositeProp } from \"./props-builder.js\";\nimport type {\n PropertiesPanelDefinition,\n PropertiesPanelSectionDefinition,\n WidgetPropertyDefinition,\n} from \"@superblocksteam/library-shared/props\";\n\nfunction createPropertiesPanelDefinition(\n sections: Record<string, Section>,\n componentProps: Record<string, unknown>,\n): PropertiesPanelDefinition {\n const sectionDefs: Array<PropertiesPanelSectionDefinition> = [];\n\n const getSectionChildren = (\n propDefinitions: Partial<Record<string, Prop<any, any>>>,\n parentPath: string,\n ) => {\n const properties: WidgetPropertyDefinition<any>[] = [];\n\n /**\n * There are three ways we can display a Composite prop:\n * 1. Prop control + popover panel (e.g: TextStyle)\n * 2. Prop control (e.g: Border)\n * 3. Inline, without a prop control (e.g: Search prop on Table, which contains backgroundColor, borderRadius, etc.)\n *\n * isCompositeWithInlineNestedProps is used to determine if a prop is of type (3).\n */\n const isCompositeWithInlineNestedProps = (\n prop: Prop<any, any>,\n fullPath: string,\n ): prop is InstanceType<typeof CompositeProp<any>> => {\n if (\n !(prop instanceof CompositeProp) ||\n !prop.hasPropertiesPanelDisplay()\n ) {\n return false;\n }\n\n const displayMode = prop.propertiesPanelChildrenDisplayMode();\n if (!displayMode) {\n return false;\n }\n\n const resolvedDisplayMode =\n typeof displayMode === \"function\"\n ? displayMode(componentProps, fullPath)\n : displayMode;\n\n return resolvedDisplayMode?.type === \"inline\";\n };\n\n for (const [name, prop] of Object.entries(propDefinitions)) {\n if (!prop) continue;\n const fullPath = parentPath ? `${parentPath}.${name}` : name;\n\n if (isCompositeWithInlineNestedProps(prop, fullPath)) {\n // For case (3) we dive into the composite props, and treat nested props as regular props\n const inlinePropertiesDefs = getSectionChildren(\n prop.nestedProps,\n fullPath,\n );\n properties.push(...inlinePropertiesDefs);\n } else if (prop.hasPropertiesPanelDisplay()) {\n // For case (1) and (2) we do not dive into the composite props for panel purposes\n // because we will want to write the entire composite prop as a single update\n // for example, in the JSX if the user updates the \"topLeft\" property of a\n // \"borderRadius\" composite prop, we want to update the \"borderRadius\" prop\n // as a whole, not just the \"topLeft\" property\n\n const def = prop.setName(fullPath).toDefinition(componentProps);\n if (def) {\n properties.push(def);\n }\n }\n }\n\n return properties;\n };\n\n for (const section of Object.values(sections)) {\n const children = getSectionChildren(section.props, \"\");\n if (children.length === 0) {\n continue;\n }\n sectionDefs.push({\n name: section.name,\n category: section.category,\n children,\n showHeader: section.propertiesPanelConfig.showHeader,\n isDefaultOpen: section.propertiesPanelConfig.isDefaultOpen,\n headerType: section.propertiesPanelConfig.headerType,\n subHeader: section.propertiesPanelConfig.subHeader,\n });\n }\n\n return { sections: sectionDefs };\n}\n\nexport { createPropertiesPanelDefinition };\n","import {\n type ControlType,\n type DataType,\n type DataTypeString,\n type PropertiesPanelDefinition,\n type PropertiesPanelDisplay,\n type PropertyForData,\n type WidgetPropertyDefinition,\n type Relation,\n PropsCategory,\n InputType,\n} from \"@superblocksteam/library-shared/props\";\nimport { createManagedPropsList } from \"./create-managed-props-list.js\";\nimport { createPropertiesPanelDefinition } from \"./properties-panel-definition.js\";\nimport type { InjectedProps } from \"../../internal-details/sb-wrapper.jsx\";\nimport type { SbComponentProps } from \"./../component-base/sb-component.js\";\n\nimport type {\n InputProp,\n SingleInputProp,\n EntityFunction,\n} from \"../../internal-details/lib/evaluator/entity-types.js\";\nimport type { EvaluateOrValueComputedArgs } from \"@superblocksteam/library-shared\";\nimport type {\n Callback,\n EvaluatedPropertiesPanelDisplay,\n HeaderType,\n} from \"@superblocksteam/library-shared/props\";\nimport type {\n Entity,\n PropertyInfo,\n SbElement,\n} from \"@superblocksteam/library-shared/types\";\nimport type { ReactNode } from \"react\";\n\ntype Exact<T, Shape> = T extends Shape\n ? Exclude<keyof T, keyof Shape> extends never\n ? T\n : never\n : never;\n\n// TODO(mark): types types types\n// TODO(mark): This might not belong here as it's specific to the custom widget\nexport type CustomComponentRenderFunction = (\n props: any,\n state: any,\n) => React.ReactNode;\n\nexport type SideEffectCallback = (params: {\n sourceId: SbElement;\n updates: Record<string, PropertyInfo<unknown>>;\n widgetMeta: Record<string, unknown> | undefined;\n widgetState: Record<string, unknown> | undefined;\n propertiesDefinition: PropertiesDefinition;\n // TODO (alex): eval side effect signature may be different\n}) => Record<\n SbElement,\n {\n meta?: Record<string, unknown>;\n props?: Record<string, PropertyInfo<unknown>>;\n }\n>;\n\nfunction mergeRelations(\n existingRelations: Relation[][],\n relations: Relation[][],\n): Relation[][] {\n if (!existingRelations || existingRelations.length === 0) {\n return relations;\n }\n if (!relations || relations.length === 0) {\n return existingRelations;\n }\n const mergedRelations =\n existingRelations && existingRelations.length > 0\n ? existingRelations.flatMap((existing) =>\n relations.map((relation) => [...existing, ...relation]),\n )\n : relations;\n return mergedRelations;\n}\n\ntype ManagedProp<T extends DataType = DataType> = PropertyForData<T> & {\n default?: SingleInputProp<T>;\n defaultOnAdd?: SingleInputProp<T>;\n\n /**\n * Controls binding nesting behavior:\n * - true: Allows bindings to be nested at any depth within this property\n * - false: Only allows bindings at the top level (unless the property is composite)\n */\n nestedBindings?: boolean;\n\n /**\n * Indicates this property should be evaluated per-context (e.g., per-row in tables)\n * When true, the property value will be evaluated for each context with access to context variables\n */\n contextual?: boolean;\n computedArgs?: EvaluateOrValueComputedArgs;\n};\n\ntype ManagedPropsList = Array<\n ManagedProp & {\n propertiesPanelDisplay?: PropertiesPanelDisplay<any>;\n }\n>;\n\n/**\n * Merges shared and variant properties for union types without creating intersections\n * Variant properties override shared properties with the same key\n */\ntype MergeUnionVariant<\n SHARED extends Record<string, Prop<any, any>>,\n VARIANT extends Record<string, Prop<any, any>>,\n> = Omit<SHARED, keyof VARIANT> & VARIANT;\n\n/**\n * Converts a union type to an intersection type\n * Used to merge multiple section props into a single props type\n */\ntype UnionToIntersection<U> = (U extends any ? (x: U) => void : never) extends (\n x: infer I extends U,\n) => void\n ? I\n : never;\n\n/**\n * Controls how default values affect property optionality\n * - RequiredIfDefault: Properties with default values become required\n * - AlwaysOptional: All properties become optional regardless of defaults\n */\ntype DefaultValueBehavior = \"RequiredIfDefault\" | \"AlwaysOptional\";\n\n/**\n * Extracts the concrete type from a property definition\n *\n * For evaluated props: returns the actual value type\n *\n * For non-evaluated props: returns InputProp<ValueType>\n */\n/**\n * Extracts the concrete type from a property definition\n * Enhanced to handle contextual properties\n */\ntype ExtractPropType<\n T,\n DefaultsBehavior extends DefaultValueBehavior,\n IsEvaluated extends boolean,\n> =\n T extends Record<string, Prop<any, any, any>>\n ? ExtractProps<T, DefaultsBehavior, IsEvaluated>\n : T extends RecordProp<infer U>\n ? Record<string, ExtractProps<U, DefaultsBehavior, IsEvaluated>>\n : T extends CompositeProp<infer U>\n ? IsEvaluated extends true\n ? ExtractProps<U, DefaultsBehavior, IsEvaluated>\n : InputProp<ExtractProps<U, DefaultsBehavior, true>>\n : T extends UnionProp<infer SHARED, infer VARIANTS>\n ? VARIANTS extends readonly any[]\n ? {\n [I in keyof VARIANTS]: ExtractProps<\n MergeUnionVariant<SHARED, VARIANTS[I]>,\n DefaultsBehavior,\n IsEvaluated\n >;\n }[number]\n : never\n : T extends Prop<infer V, infer _HasDefault, infer ContextualProps>\n ? IsEvaluated extends true\n ? ContextualProps extends undefined\n ? V extends Callback\n ? (...args: any[]) => Promise<void>\n : V\n : ContextualProps extends any[]\n ? (...args: ContextualProps) => V\n : InputProp<V>\n : InputProp<V>\n : never;\n/**\n * Extracts a flat props object from a properties definition\n * Handles optionality based on DefaultValueBehavior\n */\ntype ExtractProps<\n T,\n DefaultsBehavior extends DefaultValueBehavior,\n IsEvaluated extends boolean,\n> =\n T extends Record<string, Section>\n ? ExtractProps<MergeSections<T>, DefaultsBehavior, IsEvaluated>\n : T extends SectionPropRecord\n ? DefaultsBehavior extends \"AlwaysOptional\"\n ? {\n [K in keyof T as T[K] extends Prop<any, any, any>\n ? K\n : never]?: ExtractPropType<T[K], DefaultsBehavior, IsEvaluated>;\n }\n : {\n [K in keyof T as T[K] extends Prop<any, infer HasDefault, any>\n ? HasDefault extends true\n ? K\n : never\n : never]: ExtractPropType<T[K], DefaultsBehavior, IsEvaluated>;\n } & {\n [K in keyof T as T[K] extends Prop<any, infer HasDefault, any>\n ? HasDefault extends false\n ? K\n : never\n : never]?: ExtractPropType<T[K], DefaultsBehavior, IsEvaluated>;\n }\n : never;\n\n/**\n * Handles non Prop types, aka our default types and CSS props\n */\nexport type RawPropsToExternal<T = Record<string, unknown>> = {\n [K in keyof T as undefined extends T[K] ? never : K]: SingleInputProp<T[K]>;\n} & {\n [K in keyof T as undefined extends T[K] ? K : never]?: SingleInputProp<\n Exclude<T[K], undefined>\n >;\n};\n\ntype SectionPropertiesPanelConfig = {\n showHeader?: boolean;\n isDefaultOpen?: boolean;\n headerType?: HeaderType;\n subHeader?: string;\n};\n\n/**\n * Merges all sections in a properties definition into a single props type\n */\ntype MergeSections<\n T extends Record<string, Section>,\n Merged = UnionToIntersection<T[keyof T]>,\n> = Merged extends Section<any, infer U> ? U : never;\n\n/**\n * Identical to InternalProps but without the base props\n */\ntype EntityProps<\n Definition extends PropertiesDefinition,\n MergedSections = MergeSections<Definition>,\n> = ExtractProps<MergedSections, \"RequiredIfDefault\", true>;\n\n/**\n * Internal props used by the component implementation\n * - Properties with defaults are required\n * - Properties are fully evaluated to their final types\n */\ntype InternalProps<\n Definition extends PropertiesDefinition,\n FlattenedProps = EntityProps<Definition>,\n BaseProps = Omit<SbComponentProps, keyof FlattenedProps>,\n> = FlattenedProps & BaseProps & InjectedProps;\n\n// Make specific properties optional\ntype MakeOptional<T, K extends string> = Omit<T, K & keyof T> &\n Partial<Pick<T, K & keyof T>>;\n\n// Clean out properties that are index signatures or string-based keys, otherwise, Omit will result in a type that is basically {[x: string]: any}\ntype CleanProps<T> = {\n [K in keyof T as string extends K ? never : K]: T[K];\n};\n\ntype InternalPropsWithOptional<\n Definition extends PropertiesDefinition,\n OptionalProps extends string,\n InternalPropsWithDefinition = InternalProps<Definition>,\n> = InternalPropsWithDefinition extends infer U\n ? U extends any\n ? MakeOptional<CleanProps<U>, OptionalProps> & {\n [key: string]: any; // Add back the index signature for additional keys\n }\n : never\n : never;\n\n/**\n * External props exposed to component consumers\n * - All properties are optional regardless of defaults\n * - Properties accept InputProp values (bindings/functions)\n */\ntype ExternalProps<\n Definition extends PropertiesDefinition,\n MergedSections = MergeSections<Definition>,\n FlattenedProps = ExtractProps<MergedSections, \"AlwaysOptional\", false>,\n BaseProps = Omit<SbComponentProps, keyof FlattenedProps>,\n> = FlattenedProps & RawPropsToExternal<BaseProps>;\n\ntype PropertiesDefinition = Record<string, Section>;\n\ntype SectionDefinition<T extends Record<string, Prop<any, any>>> = {\n props: T;\n showHeader?: boolean;\n isDefaultOpen?: boolean;\n headerType?: HeaderType;\n subHeader?: string;\n};\n\nfunction getChildren(\n input: CompositeInputs,\n path: string,\n props: Record<string, unknown>,\n) {\n function getChildrenFromSection(section: Section) {\n return Object.keys(section.props).reduce(\n (acc, key) => {\n const prop = section.props[key];\n if (!prop) return acc;\n const definition = prop.setName(path + \".\" + key).toDefinition(props);\n if (definition) {\n acc[key] = definition;\n }\n return acc;\n },\n {} as Record<string, WidgetPropertyDefinition<DataType>>,\n );\n }\n\n let children: Record<string, WidgetPropertyDefinition<DataType>>;\n if (input instanceof Section) {\n // Case 1: content is a Section\n children = getChildrenFromSection(input);\n } else if (Object.values(input).every((c) => c instanceof Section)) {\n // Case 2: content is a Record<string, Section>\n children = Object.values(input).reduce((acc, section) => {\n return { ...acc, ...getChildrenFromSection(section) };\n }, {});\n } else {\n // Case 3: content is a Record<string, Prop<any, any, any>>\n children = Object.fromEntries(\n Object.entries(input).map(([key, prop]) => {\n return [key, prop.setName(path + \".\" + key).toDefinition(props)];\n }),\n );\n }\n return children;\n}\n\nexport type SectionPropRecord<Props = Record<string, any>> = Partial<{\n [K in keyof Props]: Prop<Props[K], any>;\n}>;\n\nclass Section<\n TProps = any, // Component props type for validation\n T extends SectionPropRecord<TProps> = SectionPropRecord<TProps>,\n> {\n props: T = {} as T;\n\n propertiesPanelConfig: SectionPropertiesPanelConfig = {\n showHeader: true,\n isDefaultOpen: true,\n };\n\n constructor(readonly category: PropsCategory) {}\n\n static category<Props = any>(category: PropsCategory) {\n return new Section<Props, SectionPropRecord<Props>>(category);\n }\n\n children<\n INP extends\n | SectionPropRecord<TProps>\n | CompositeProp<any>\n | UnionProp<any, any>,\n OUT extends INP extends CompositeProp<infer CU>\n ? CU\n : INP extends UnionProp<infer SHARED, infer VARIANTS>\n ? VARIANTS extends readonly any[]\n ? {\n [I in keyof VARIANTS]: MergeUnionVariant<SHARED, VARIANTS[I]>;\n }[number]\n : never\n : INP,\n >(\n props: INP extends CompositeProp<any> | UnionProp<any, any>\n ? INP\n : Exact<INP, SectionPropRecord<TProps>>,\n ): Section<TProps, T & OUT> {\n if (props instanceof CompositeProp || props instanceof RecordProp) {\n this.props = { ...this.props, ...props.getProps() } as unknown as T & OUT;\n } else if (props instanceof UnionProp) {\n this.props = { ...this.props, ...props.getProps() } as unknown as T & OUT;\n } else {\n this.props = { ...this.props, ...props } as unknown as T & OUT;\n }\n return this as unknown as Section<TProps, T & OUT>;\n }\n\n add = this.children;\n\n propertiesPanel(config: Omit<SectionDefinition<any>, \"props\">) {\n this.propertiesPanelConfig = {\n ...this.propertiesPanelConfig,\n ...config,\n };\n return this;\n }\n\n get name() {\n switch (this.category) {\n case PropsCategory.Content:\n return \"Content\";\n case PropsCategory.Routing:\n return \"Routing\";\n case PropsCategory.Interaction:\n return \"Interaction\";\n case PropsCategory.Layout:\n return \"Layout\";\n case PropsCategory.Appearance:\n return \"Appearance\";\n case PropsCategory.Permissions:\n return \"Permissions\";\n case PropsCategory.EventHandlers:\n return \"Actions\";\n case PropsCategory.Styles:\n return \"Styles\";\n case PropsCategory.Uncategorized:\n return \"Uncategorized\";\n default:\n return \"Uncategorized\";\n }\n }\n}\n\nclass Prop<\n Type extends DataType,\n _HasDefault extends boolean = false,\n _ContextualArgs extends\n | any[]\n | undefined\n | ((entity: Entity) => any[] | undefined) = undefined,\n> {\n protected prop: ManagedProp<Type>;\n\n /**\n * Relations are an array of arrays\n * each sub-array is AND requirements, and each element is an OR requirement\n */\n protected relations: Relation[][] = [];\n\n protected constructor(typeString: DataTypeString) {\n this.prop = {\n path: \"\",\n dataType: typeString,\n };\n }\n\n static unset(): Prop<undefined> {\n return new Prop(\"any\") as Prop<undefined>;\n }\n\n static string<T extends string>(): Prop<T> {\n return new Prop(\"string\") as Prop<T>;\n }\n\n static number<T extends number>(): Prop<T> {\n return new Prop(\"number\") as Prop<T>;\n }\n\n static boolean<T extends boolean>(): Prop<T> {\n return new Prop(\"boolean\") as Prop<T>;\n }\n\n static array<T>(): Prop<Array<T>> {\n return new Prop(\"array\") as Prop<Array<T>>;\n }\n\n static any<T = any>(): Prop<T> {\n return new Prop(\"any\") as Prop<T>;\n }\n\n static jsx<T extends ReactNode>(): Prop<T> {\n return new Prop(\"jsx\") as Prop<T>;\n }\n\n static literal<T extends Readonly<string | number | boolean>>(\n value: T,\n ): Prop<T, true> {\n switch (typeof value) {\n case \"string\":\n return Prop.string().default(value) as Prop<T, true>;\n case \"number\":\n return Prop.number().default(value) as Prop<T, true>;\n case \"boolean\":\n return Prop.boolean().default(value) as Prop<T, true>;\n default: {\n const exhaustiveCheck: never = value;\n throw new Error(`Invalid literal value: ${exhaustiveCheck}`);\n }\n }\n }\n\n static eventHandler(): Prop<any> {\n return new Prop(\"eventHandler\") as Prop<any>;\n }\n\n static function<ARGS extends any[] = any[], RETURN = any>(\n implementation: EntityFunction<ARGS, RETURN>,\n ) {\n return new FunctionProp(implementation);\n }\n\n /**\n * Creates a composite property, which is a property that contains nested properties. For example,\n * the following composite property:\n *\n * ```ts\n * const prop = Prop.composite({\n * name: Prop.string(),\n * age: Prop.number(),\n * });\n * ```\n *\n * is equivalent to the following type:\n *\n * ```ts\n * type Prop = {\n * name: string;\n * age: number;\n * };\n * ```\n */\n static composite<T extends CompositeInputs>(props: T) {\n return new CompositeProp<T>(props);\n }\n\n /**\n * Creates a record property, which is a record that maps string keys to the nestedproperties. For example,\n * the following record property:\n *\n * ```ts\n * const prop = Prop.record({\n * name: Prop.string(),\n * age: Prop.number(),\n * });\n * ```\n *\n * is equivalent to the following type:\n *\n * ```ts\n * type Prop = Record<string, {\n * name: string;\n * age: number;\n * }>;\n * ```\n */\n static record<T extends CompositeInputs>(props: T) {\n return new RecordProp<T>(props);\n }\n\n static union<\n SHARED extends Record<string, Prop<unknown, boolean>>,\n VARIANTS extends UnionVariant<SHARED>[] = UnionVariant<SHARED>[],\n >(props: { shared: SHARED; variants: VARIANTS }) {\n return new UnionProp<SHARED, VARIANTS>(props.shared, props.variants);\n }\n\n default(de: SingleInputProp<DataType>): Prop<Type, true> {\n this.prop.default = de;\n if (\n this.prop.propertiesPanelDisplay &&\n this.prop.propertiesPanelDisplay.defaultValue === undefined\n ) {\n this.prop.propertiesPanelDisplay.defaultValue = de;\n }\n return this as unknown as Prop<Type, true>;\n }\n\n contextual<TContext extends any[] | undefined = any[]>(\n computedArgs?: EvaluateOrValueComputedArgs,\n ) {\n this.prop.contextual = true;\n this.prop.computedArgs = computedArgs;\n return this as Prop<Type, _HasDefault, TContext>;\n }\n\n setName(name: string) {\n this.prop.path = name;\n return this;\n }\n\n propertiesPanel<CT extends ControlType>(\n schema: Omit<\n Partial<PropertiesPanelDisplay<Type, CT>>,\n \"isTriggerProperty\"\n >,\n ) {\n // map dataType to control type\n let baseControlType: ControlType;\n let isJSConvertible = true;\n let isTriggerProperty = false;\n let inputType: InputType | undefined;\n switch (this.prop.dataType) {\n case \"string\":\n baseControlType = \"INPUT_TEXT\";\n break;\n case \"number\":\n baseControlType = \"INPUT_TEXT\";\n inputType = InputType.NUMBER;\n break;\n case \"array\":\n baseControlType = \"INPUT_TEXT\";\n break;\n case \"boolean\":\n baseControlType = \"SWITCH\";\n break;\n case \"eventHandler\":\n baseControlType = \"EVENT_HANDLER\";\n isJSConvertible = false;\n isTriggerProperty = true;\n break;\n case \"jsx\":\n baseControlType = \"JSX\";\n break;\n case \"any\":\n default:\n baseControlType = \"INPUT_JS_EXPR\";\n break;\n }\n\n const propertiesPanelDisplay = {\n controlType: baseControlType,\n isJSConvertible,\n isTriggerProperty,\n defaultValue: schema.defaultValue ?? this.prop.default,\n defaultOnAdd: this.prop.propertiesPanelDisplay?.defaultOnAdd,\n inputType,\n ...schema,\n } as PropertiesPanelDisplay<Type>;\n\n this.prop.propertiesPanelDisplay = propertiesPanelDisplay;\n return this;\n }\n\n setDisplayProperty<K extends keyof PropertiesPanelDisplay<Type>>(\n property: K,\n value: PropertiesPanelDisplay<Type>[K],\n ) {\n if (!this.prop.propertiesPanelDisplay) return this;\n this.prop.propertiesPanelDisplay[property] = value;\n return this;\n }\n\n docs(docs: Exclude<PropertyForData<DataType>[\"docs\"], undefined>) {\n this.prop.docs = docs;\n return this;\n }\n\n build() {\n return this.prop;\n }\n\n toDefinition(\n props: Record<string, unknown>,\n ): WidgetPropertyDefinition<DataType> | undefined {\n const evaluatedProperties = Object.entries(\n this.prop.propertiesPanelDisplay ?? {},\n ).reduce(\n (acc, [key, value]) => {\n if (typeof value === \"function\") {\n try {\n // TODO(mark): type this like is used to take in entity and scopedState\n acc[key] = value.bind(props)(this.prop.path);\n } catch (e) {\n console.error(`Error evaluating property ${key}:`, e);\n }\n }\n return acc;\n },\n {} as Record<string, unknown>,\n ) as Partial<EvaluatedPropertiesPanelDisplay<Type>>;\n\n if (evaluatedProperties.isVisible === false) {\n return undefined;\n }\n\n const propertiesPanelDisplay = {\n ...this.prop.propertiesPanelDisplay,\n ...evaluatedProperties,\n } as EvaluatedPropertiesPanelDisplay<Type>;\n\n if (\"treatDefaultAsNull\" in propertiesPanelDisplay) {\n if (propertiesPanelDisplay.treatDefaultAsNull) {\n if (propertiesPanelDisplay.defaultOnAdd === undefined) {\n propertiesPanelDisplay.defaultOnAdd =\n propertiesPanelDisplay.defaultValue;\n }\n\n propertiesPanelDisplay.defaultValue = undefined;\n }\n }\n\n let panelConfig: PropertiesPanelDefinition | undefined;\n\n const childrenDisplay = propertiesPanelDisplay?.childrenDisplayMode;\n const isPopover = childrenDisplay?.type === \"popover\";\n if (isPopover) {\n if (!(this instanceof CompositeProp || this instanceof RecordProp)) {\n console.error(this);\n throw new Error(\n \"Only composite properties can be used in popover properties at the moment\",\n );\n }\n const content = this.getProps();\n const { type, ...rest } = childrenDisplay;\n\n let contentDef: Record<string, Section>;\n if (content instanceof Section) {\n // Case 1: content is a Section\n contentDef = { content };\n } else if (Object.values(content).every((c) => c instanceof Section)) {\n // Case 2: content is a Record<string, Section>\n contentDef = content as Record<string, Section>;\n } else {\n // Case 3: content is a Record<string, Prop<any, any, any>>\n contentDef = {\n content: Section.category(PropsCategory.Content)\n .propertiesPanel({\n showHeader: false,\n })\n .children(content as Record<string, Prop<any, any>>),\n };\n }\n panelConfig = {\n ...createPropertiesPanelDefinition(contentDef, props),\n ...rest,\n };\n }\n if (this.prop.computedArgs) {\n propertiesPanelDisplay.computedArgs =\n typeof this.prop.computedArgs === \"function\"\n ? this.prop.computedArgs(props)\n : this.prop.computedArgs;\n }\n\n const propertiesPanelDisplayWithPanelConfig = {\n ...propertiesPanelDisplay,\n ...(panelConfig && { panelConfig }),\n };\n\n return {\n path: this.prop.path,\n dataType: this.prop.dataType,\n relations: this.relations,\n propertiesPanelDisplay: propertiesPanelDisplayWithPanelConfig,\n };\n }\n\n getRelations() {\n return this.relations;\n }\n\n dependsOn(relations: Relation[][]) {\n this.relations = relations;\n return this;\n }\n\n hasPropertiesPanelDisplay() {\n return this.prop.propertiesPanelDisplay !== undefined;\n }\n\n get type() {\n return this.prop.dataType;\n }\n\n get path() {\n return this.prop.path;\n }\n}\n\ntype CompositeInputs =\n | Record<string, Section>\n | Section\n | Record<string, Prop<unknown, boolean>>;\n\n/**\n * See {@link Prop.composite}\n */\nclass CompositeProp<T extends CompositeInputs> extends Prop<unknown, boolean> {\n typeString = \"composite\" as const;\n nestedProps: T;\n\n constructor(props: T) {\n super(\"composite\");\n this.nestedProps = props;\n }\n\n getProps() {\n return this.nestedProps;\n }\n\n toDefinition(\n props: Record<string, unknown>,\n ): WidgetPropertyDefinition<DataType> | undefined {\n const definition = super.toDefinition(props);\n if (!definition) {\n return undefined;\n }\n return {\n ...definition,\n children: getChildren(this.nestedProps, this.prop.path, props),\n };\n }\n\n propertiesPanelChildrenDisplayMode() {\n return this.prop.propertiesPanelDisplay?.childrenDisplayMode;\n }\n}\n\n/**\n * See {@link Prop.record}\n */\nclass RecordProp<T extends CompositeInputs> extends Prop<\n Record<string, any>,\n boolean\n> {\n typeString = \"recordOf\" as const;\n nestedProps: T;\n\n constructor(props: T) {\n super(\"recordOf\");\n this.nestedProps = props;\n }\n\n getProps() {\n return this.nestedProps;\n }\n\n toDefinition(\n props: Record<string, unknown>,\n ): WidgetPropertyDefinition<DataType> | undefined {\n const definition = super.toDefinition(props);\n if (!definition) {\n return undefined;\n }\n\n return {\n ...definition,\n children: getChildren(this.nestedProps, this.prop.path, props),\n };\n }\n}\n\nexport interface ActionPanel {\n arguments?: Record<string, Prop<any>>;\n}\nclass FunctionProp<ARGS extends any[] = any[], RETURN = any> extends Prop<\n EntityFunction<ARGS, RETURN>,\n true\n> {\n typeString = \"function\" as const;\n private _actionPanel: ActionPanel | undefined;\n\n constructor(implementation: EntityFunction<ARGS, RETURN>) {\n super(\"function\");\n this.default(implementation);\n }\n\n actionPanel(panel?: ActionPanel) {\n this._actionPanel = panel || {};\n return this;\n }\n\n getActionPanel() {\n return this._actionPanel;\n }\n}\n\nexport type UnionVariant<SHARED extends Record<string, Prop<any>>> = {\n [K in keyof SHARED]: Prop<any>;\n};\n\nclass UnionProp<\n SHARED extends Record<string, Prop<unknown, boolean>>,\n VARIANTS extends UnionVariant<SHARED>[] = UnionVariant<SHARED>[],\n _OUTPUT = VARIANTS extends readonly any[]\n ? {\n [I in keyof VARIANTS]: SHARED & VARIANTS[I];\n }[number]\n : never,\n> extends Prop<any> {\n typeString = \"union\" as const;\n shared: SHARED;\n variants: VARIANTS;\n\n constructor(shared: SHARED, variants: VARIANTS) {\n super(\"any\");\n this.shared = shared;\n this.variants = variants;\n }\n\n getProps() {\n const sharedKeys = Object.keys(this.shared);\n const variants: UnionVariant<typeof this.shared>[] = this.variants;\n const preMergeRelationsMap = variants.reduce(\n (acc, v) => {\n Object.entries(v).forEach(([key, prop]) => {\n const existingRelations = acc[key] ?? [];\n const newRelations = prop.getRelations() ?? [];\n acc[key] = [...existingRelations, ...newRelations];\n });\n return acc;\n },\n {} as Record<string, Relation[][]>,\n );\n const mergedVariants = variants.reduce(\n (acc, v) => {\n // These are the constants that are shared between the variant and the shared props\n const variantConstants = Object.entries(v).filter(([key]) =>\n sharedKeys.includes(key),\n );\n // These are the relations that are unique to the variant\n // For example, shared has style and variant has style == \"rounded\"\n // Then the relations for the variant are the { key: style value: \"rounded\" }\n const relations = variantConstants.map(([key, prop]) => {\n // check if this v already has a relation for his key\n return {\n key,\n value: prop.build().default,\n };\n });\n // Now we filter out the shared keys and add dependencies to the variant\n const filteredVariant = Object.fromEntries(\n Object.entries(v)\n .filter(([key]) => !sharedKeys.includes(key))\n .map(([key, prop]) => {\n const existingRelations = prop?.getRelations() ?? [];\n const preMergeRelations = preMergeRelationsMap[key];\n const existingNonPreMergeRelations = existingRelations.filter(\n (r) => !preMergeRelations.some((p) => p === r),\n );\n // within a union, the conditions are OR'ed, but across unions, the conditions are AND'ed\n const newProp = prop.dependsOn([\n ...existingNonPreMergeRelations,\n ...mergeRelations(preMergeRelations, [relations]),\n ]);\n\n // If this property already exists in acc, merge the relations using OR logic\n if (acc[key]) {\n const existingPropRelations = acc[key].getRelations() ?? [];\n const newPropRelations = newProp.getRelations() ?? [];\n\n const seenHashes = new Set<string>();\n const uniqueRelations = [\n ...existingPropRelations,\n ...newPropRelations,\n ].filter((relationGroup) => {\n const hash = relationGroup\n .map((r) => `${r.key}:${String(r.value)}`)\n .sort()\n .join(\"|\");\n if (seenHashes.has(hash)) {\n return false;\n }\n seenHashes.add(hash);\n return true;\n });\n\n return [key, acc[key].dependsOn(uniqueRelations)];\n }\n\n return [key, newProp];\n }),\n );\n\n return { ...acc, ...filteredVariant };\n },\n {} as Record<string, Prop<any>>,\n );\n return { ...this.shared, ...mergedVariants };\n }\n}\n\nexport type {\n Relation,\n ManagedProp,\n ManagedPropsList,\n InternalProps,\n InternalPropsWithOptional,\n ExternalProps,\n EntityProps,\n MergeSections,\n ExtractProps,\n ExtractPropType,\n PropertiesDefinition,\n};\n\nexport {\n Prop,\n CompositeProp,\n RecordProp,\n UnionProp,\n FunctionProp,\n Section,\n PropsCategory,\n createManagedPropsList,\n};\n","import {\n Prop,\n CompositeProp,\n UnionProp,\n RecordProp,\n Section,\n} from \"./props-builder.js\";\nimport type { ManagedPropsList } from \"./props-builder.js\";\nimport type { DataType } from \"@superblocksteam/library-shared/props\";\nimport type { ScopedState } from \"@superblocksteam/library-shared/types\";\n\nexport const RECORD_PATH_IDENTIFIER = \"*\";\n\nfunction buildCompositeDefault(\n prop: Prop<any, false>,\n name: string,\n parentDefault?: Record<string, any>,\n) {\n const defaultThroughParent = parentDefault?.[name];\n const selfDefault = prop.build().default;\n // Honor parent default\n let propDefault = defaultThroughParent ?? selfDefault;\n if (!propDefault && typeof parentDefault === \"function\") {\n propDefault = function getNestedDefault(this: any, s: ScopedState) {\n return parentDefault.call(this, s)?.[name];\n };\n }\n return propDefault;\n}\n\nfunction buildPropLeafDefault(\n prop: Prop<any, false>,\n name: string,\n parentDefault?: Record<string, any>,\n) {\n const defaultThroughParent = parentDefault?.[name];\n const selfDefault = prop.build().default;\n // Honor self default\n let propDefault = selfDefault ?? defaultThroughParent;\n if (!propDefault && typeof parentDefault === \"function\") {\n propDefault = function getNestedDefault(this: any, s: ScopedState) {\n return parentDefault.call(this, s)?.[name];\n };\n }\n return propDefault;\n}\n\n/**\n * Core traversal function that walks through all properties in sections\n * and calls the provided callback for each leaf property.\n */\nfunction traverseProps(\n sections: Record<string, Section>,\n onProp: (\n prop: Prop<DataType>,\n fullPath: string,\n name: string,\n parentDefault?: Record<string, any>,\n ) => void,\n parentPath = \"\",\n) {\n const processProps = ({\n props,\n parentPath,\n parentDefault,\n }: {\n props: Partial<Record<string, Prop<DataType>>>;\n parentPath: string;\n parentDefault?: Record<string, any>;\n }) => {\n for (const [name, prop] of Object.entries(props)) {\n if (!prop) continue;\n const fullPath = parentPath ? `${parentPath}.${name}` : name;\n if (prop instanceof CompositeProp) {\n const compositeDefault = buildCompositeDefault(\n prop,\n name,\n parentDefault,\n );\n\n processProps({\n props: prop.nestedProps,\n parentPath: fullPath,\n parentDefault: compositeDefault,\n });\n } else if (prop instanceof RecordProp) {\n const recordPath = `${fullPath}.${RECORD_PATH_IDENTIFIER}`;\n processProps({\n props: prop.nestedProps,\n parentPath: recordPath,\n parentDefault: prop.build().default as any,\n });\n } else if (prop instanceof Section) {\n // the section path is opaque, it should not be part of a property path\n processProps({\n props: prop.props,\n parentPath,\n });\n } else if (prop instanceof UnionProp) {\n const sharedKeys = Object.keys(prop.shared);\n processProps({\n props: prop.shared,\n parentPath: fullPath,\n });\n\n for (const variant of prop.variants) {\n const variantWithoutSharedKeys = Object.fromEntries(\n Object.entries(variant).filter(\n ([key]) => !sharedKeys.includes(key),\n ),\n ) as Record<string, Prop<DataType, any>>;\n processProps({\n props: variantWithoutSharedKeys,\n parentPath: fullPath,\n });\n }\n } else if (prop instanceof Prop) {\n // Call the callback for each leaf property\n onProp(prop, fullPath, name, parentDefault);\n } else {\n console.warn(\"Invalid prop type\", { name, prop });\n }\n }\n };\n\n for (const section of Object.values(sections)) {\n processProps({\n props: section.props,\n parentPath,\n parentDefault: undefined,\n });\n }\n}\n\nexport function createInternalPropsList(\n sections: Record<string, Section>,\n parentPath = \"\",\n): Array<{ path: string; factory: () => any }> {\n const internalPropsList: Array<{ path: string; factory: () => any }> = [];\n\n traverseProps(\n sections,\n (prop, fullPath) => {\n const builtProp = prop.setName(fullPath).build();\n if (builtProp.dataType === \"internal\" && builtProp.default) {\n internalPropsList.push({\n path: fullPath,\n factory: builtProp.default as () => any,\n });\n }\n },\n parentPath,\n );\n\n return internalPropsList;\n}\n\nfunction createManagedPropsList(\n sections: Record<string, Section>,\n parentPath = \"\",\n): ManagedPropsList {\n const managedPropsList: ManagedPropsList = [];\n\n traverseProps(\n sections,\n (prop, fullPath, name, parentDefault) => {\n let configuredProp = prop.setName(fullPath);\n\n const propDefault = buildPropLeafDefault(prop, name, parentDefault);\n if (propDefault !== undefined) {\n configuredProp = configuredProp.default(propDefault);\n }\n\n const builtProp = configuredProp.build();\n\n // Skip internal properties from managed props list\n // Internal properties are handled separately and not exposed/tracked\n if (builtProp.dataType === \"internal\") {\n return;\n }\n\n // TODO(code-mode): This spread is here because the fullPath is overwritten by other setName calls\n managedPropsList.push({ ...builtProp });\n },\n parentPath,\n );\n\n return managedPropsList;\n}\n\nexport { createManagedPropsList };\n","const getIsEditMode = () => {\n const envMode = (window as any)._SB_VIEW_MODE;\n return envMode === \"dev\";\n};\n\nlet editMode: boolean | undefined;\n\nexport const isEditMode = () => {\n if (editMode === undefined) {\n editMode = getIsEditMode();\n }\n return editMode;\n};\n","import { toJS } from \"mobx\";\nimport { isValidElement } from \"react\";\n\nexport const isReactElement = (obj: any) => {\n return (\n obj &&\n (obj.$$typeof === Symbol.for(\"react.element\") ||\n isValidElement(obj) ||\n (typeof Node !== \"undefined\" && obj instanceof Node))\n );\n};\n\n/**\n * Check if an object is a Window object (including cross-origin windows)\n */\nconst isWindowObject = (obj: any): boolean => {\n if (!obj || typeof obj !== \"object\") {\n return false;\n }\n // Check if it's a Window without accessing properties that might throw SecurityError\n try {\n return obj instanceof Window || obj === window || obj?.window === obj;\n } catch {\n // If we get a SecurityError, it's likely a cross-origin window\n return true;\n }\n};\n\n/**\n * Cleans an object by removing proxy wrappers and filtering out functions.\n * This is useful for preparing objects for JSON serialization.\n */\nexport function cleanObject<T>(obj: T): unknown {\n // Don't try to process Window objects - they can cause SecurityError with cross-origin iframes\n if (isWindowObject(obj)) {\n return undefined;\n }\n\n // sometimes its a proxy in our managers\n try {\n obj = toJS(obj);\n } catch (error) {\n // If toJS throws (e.g., SecurityError from cross-origin access), skip this object\n if (error instanceof Error && error.name === \"SecurityError\") {\n return undefined;\n }\n // Re-throw other errors\n throw error;\n }\n\n // Remove functions\n if (!obj || typeof obj !== \"object\") {\n return typeof obj === \"function\" ? undefined : obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(cleanObject).filter((item) => item !== undefined);\n }\n\n if (isReactElement(obj)) {\n return undefined;\n }\n\n return Object.entries(obj).reduce(\n (acc, [key, value]) => {\n // TODO: make this a bit more robust. a lot of theme objects are shared, so\n // using a seen set doesn't quite work, this just handles the case where we shove a\n // bind onto an entity\n if (obj === value || key === \"bind\") {\n return acc;\n }\n\n const cleaned = cleanObject(value);\n if (cleaned !== undefined) {\n acc[key] = cleaned;\n }\n return acc;\n },\n {} as Record<string, unknown>,\n );\n}\n","import { cleanObject } from \"../../utils/clean-object.js\";\nimport type {\n FromChildToParentMessageTypes,\n FromChildToParentMessageTypesMap,\n FromParentToChildMessageTypes,\n FromParentToChildMessageTypesMap,\n} from \"./types.js\";\n\nexport function isEmbeddedBySuperblocksFirstParty() {\n return typeof window !== \"undefined\" && window !== window.parent;\n}\n\n// TODO: window.opener for 'open in new tab' feature\nconst PARENT_REF =\n typeof window !== \"undefined\" && window !== window.parent\n ? window.parent\n : null;\nconst SELF_REF = typeof window !== \"undefined\" ? window : null;\n\nfunction parentMessageHandler(e: MessageEvent) {\n // Make sure the message is coming from either:\n // - The parent window\n // - The same window (for devbox)\n if (e.source !== PARENT_REF && e.source !== SELF_REF) return;\n\n const event = new SbIframeEventInternal(\n e.data.type as FromParentToChildMessageTypes,\n e.data,\n );\n iframeMessageHandler.dispatchEvent(event);\n}\n\nif (isEmbeddedBySuperblocksFirstParty() && PARENT_REF) {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n typeof window !== \"undefined\" &&\n window.addEventListener(\"message\", parentMessageHandler);\n}\n\n/** @deprecated Use editorBridge instead */\nexport function sendMessageImmediately<\n MT extends FromChildToParentMessageTypes,\n>(\n message: {\n type: MT;\n payload?: FromChildToParentMessageTypesMap[MT];\n [key: string]: any;\n },\n options?: {\n // For when you have debounced the sendMessage and want better stats\n overrideStartTime: number;\n },\n) {\n if (!PARENT_REF) {\n console.warn(\n \"PARENT_REF is not set, message not delivered. Message: \",\n message,\n );\n return;\n }\n\n message = cleanObject(message) as typeof message;\n\n if (isEmbeddedBySuperblocksFirstParty()) {\n if (!PARENT_REF) throw new Error(\"Parent is not set\");\n try {\n PARENT_REF.postMessage(\n {\n ...message,\n startTime: options?.overrideStartTime ?? +new Date(),\n },\n \"*\",\n );\n } catch (e) {\n console.error(\"Error sending message to parent\", message, e);\n }\n }\n}\n\nclass SbIframeEventInternal<T = Record<string, any>> extends Event {\n data: { payload: T; startTime: number; [key: string]: any };\n constructor(\n type: FromParentToChildMessageTypes,\n data: { payload: T; startTime: number; [key: string]: any },\n ) {\n super(type);\n this.data = data;\n }\n}\n\n// We are using a custom event target so that you each of our custom postMessage types\n// is a separate handler\ninterface MessageHandler extends EventTarget {\n addEventListener<MT extends FromParentToChildMessageTypes>(\n type: MT,\n callback: IframeEventHandler<MT>,\n ): void;\n addEventListener(\n type: string,\n callback: EventListenerOrEventListenerObject | null,\n ): void;\n removeEventListener<MT extends FromParentToChildMessageTypes>(\n type: MT,\n callback: IframeEventHandler<MT>,\n ): void;\n removeEventListener(\n type: string,\n callback: EventListenerOrEventListenerObject | null,\n ): void;\n}\n\n// This is a hack to get around the fact that we can't overload the addEventListener method\nclass SbMessageHandler extends (EventTarget as {\n new (): MessageHandler;\n prototype: MessageHandler;\n}) {\n // Parent implements all functionalityza\n}\n\nexport type IframeEventHandler<MT extends FromParentToChildMessageTypes> = (\n event: SbIframeEventInternal<FromParentToChildMessageTypesMap[MT]>,\n) => void;\n\nexport const iframeMessageHandler = new SbMessageHandler();\n\nexport type IframeEvent<T> = T extends FromParentToChildMessageTypes\n ? MessageEvent<{ type: T; payload: FromParentToChildMessageTypesMap[T] }>\n : never;\n","import { sendMessageImmediately } from \"../lib/internal-details/lib/iframe.js\";\nimport type { FromChildToParentMessageTypesMap } from \"../lib/index.js\";\nimport type {\n StreamEvent,\n RouteInfo,\n} from \"../lib/internal-details/lib/types.js\";\nimport type { PropertiesPanelDefinition } from \"@superblocksteam/library-shared/props\";\nimport type {\n AiContextMode,\n ApiRunRecord,\n ConsoleLogEntry,\n EditOperationPayload,\n EditOperationType,\n InteractionMode,\n RuntimeErrorData,\n SbElement,\n SbSelector,\n} from \"@superblocksteam/library-shared/types\";\n\n// interface for the public methods in SuperblocksEditorBridge\nexport interface SuperblocksParentBridgeInterface {\n // Connection methods\n connected(): void;\n sendReady(): void;\n sendLoadError(error: string): void;\n sendAppFrameWillReload(): void;\n\n // Notification methods\n sendNotification(\n type: \"success\" | \"error\" | \"info\" | \"warning\",\n message: string,\n description?: string,\n ): void;\n\n // Widget Operations\n selectWidgets(sourceIds: SbElement[], selectorIdHint?: SbSelector): void;\n editOpRequest<T extends EditOperationType>(\n type: T,\n payload: EditOperationPayload<T>[\"payload\"],\n ): void;\n undo(): void;\n redo(): void;\n\n // API Operations\n sendStreamedApiEvent(event: StreamEvent, apiName: string): void;\n sendStreamedApiMessage(message: any, apiName: string): void;\n setApiStarted(apiName: string): void;\n setApiResponse(apiName: string, response: unknown): void;\n\n // Navigation Operations\n navigateTo(path: string, newWindow?: boolean): void;\n\n // Properties Panel Operations\n updatePropertiesPanels(\n updates: Record<string, PropertiesPanelDefinition>,\n ): void;\n addPropertiesPanel(id: string, definition: PropertiesPanelDefinition): void;\n addApiRunRecord(apiId: string, run: ApiRunRecord): void;\n updateApiRunRecord(\n apiId: string,\n callId: string,\n updates: Partial<Omit<ApiRunRecord, \"id\" | \"callId\">>,\n ): void;\n\n // Editor Synced Store Operations\n initializeEditorSyncedStore(\n payload: FromChildToParentMessageTypesMap[\"codeMode/editor-synced-store/init\"],\n ): void;\n updateEditorSyncedStore(\n payload: FromChildToParentMessageTypesMap[\"codeMode/editor-synced-store/update\"],\n ): void;\n\n // Promise Operations\n resolvePromise(callbackId: string, payload: unknown): void;\n rejectPromise(callbackId: string, payload: unknown): void;\n\n // Click Operations\n canvasClicked(): void;\n registerContextMenuClick(\n sourceId: SbElement,\n selectorId: SbSelector,\n clientX: number,\n clientY: number,\n ): void;\n\n // Route Operations\n updateRoute(routeInfo: RouteInfo): void;\n\n // Socket Operations\n socketError(message: string): void;\n\n // AI Operations\n aiGenerate(prompt: string, forceSend?: boolean): void;\n addComponentToAiContext(sourceId: SbElement, selectorId: SbSelector): void;\n toggleComponentInAiContext(\n sourceId: SbElement,\n selectorId: SbSelector,\n label?: string,\n ): void;\n setAiContextMode(mode: AiContextMode): void;\n sendAiLoaderState?(shouldShowLoader: boolean): void;\n sendRuntimeError(data: RuntimeErrorData, forceSend?: boolean): void;\n sendClearRuntimeError(id: string, forceSend?: boolean): void;\n sendConsoleLog(data: ConsoleLogEntry): void;\n\n setInteractionMode(mode: InteractionMode): void;\n\n // Screenshot Operations\n sendCaptureScreenshotResponse(\n callbackId: string,\n dataUrl?: string,\n error?: string,\n ): void;\n sendPingAppReadyForScreenshotResponse(\n callbackId: string,\n isReady: boolean,\n ): void;\n}\n\nexport class DeployedParentBridge implements SuperblocksParentBridgeInterface {\n navigateTo(url: string, newWindow?: boolean): void {\n sendMessageImmediately({\n type: \"navigate-to\",\n payload: {\n url,\n newWindow,\n },\n });\n }\n\n connected(): void {}\n sendReady(): void {}\n sendLoadError(_error: string): void {}\n sendAppFrameWillReload(): void {}\n sendNotification(\n _type: \"success\" | \"error\" | \"info\" | \"warning\",\n _message: string,\n _description?: string,\n ): void {}\n selectWidgets(_sourceIds: SbElement[], _selectorIdHint?: SbSelector): void {}\n editOpRequest<T extends EditOperationType>(\n _type: T,\n _payload: EditOperationPayload<T>[\"payload\"],\n ): void {}\n undo(): void {}\n redo(): void {}\n sendStreamedApiEvent(_event: StreamEvent, _apiName: string): void {}\n sendStreamedApiMessage(_message: any, _apiName: string): void {}\n setApiStarted(_apiName: string): void {}\n setApiResponse(_apiName: string, _response: unknown): void {}\n updatePropertiesPanels(\n _updates: Record<string, PropertiesPanelDefinition>,\n ): void {}\n addPropertiesPanel(\n _id: string,\n _definition: PropertiesPanelDefinition,\n ): void {}\n addApiRunRecord(_apiId: string, _run: ApiRunRecord): void {}\n updateApiRunRecord(\n _apiId: string,\n _callId: string,\n _updates: Partial<Omit<ApiRunRecord, \"id\" | \"callId\">>,\n ): void {}\n initializeEditorSyncedStore(\n _payload: FromChildToParentMessageTypesMap[\"codeMode/editor-synced-store/init\"],\n ): void {}\n updateEditorSyncedStore(\n _payload: FromChildToParentMessageTypesMap[\"codeMode/editor-synced-store/update\"],\n ): void {}\n resolvePromise(_callbackId: string, _payload: unknown): void {}\n rejectPromise(_callbackId: string, _payload: unknown): void {}\n canvasClicked(): void {}\n registerContextMenuClick(\n _sourceId: SbElement,\n _selectorId: SbSelector,\n _clientX: number,\n _clientY: number,\n ): void {}\n updateRoute(routeInfo: RouteInfo): void {\n sendMessageImmediately({\n type: \"route-change\",\n payload: routeInfo,\n });\n }\n socketError(_message: string): void {}\n aiGenerate(_prompt: string): void {}\n addComponentToAiContext(\n _sourceId: SbElement,\n _selectorId: SbSelector,\n ): void {}\n toggleComponentInAiContext(\n _sourceId: SbElement,\n _selectorId: SbSelector,\n _label?: string,\n ): void {}\n setAiContextMode(_mode: AiContextMode): void {}\n sendAiLoaderState(_shouldShowLoader: boolean): void {}\n sendRuntimeError(_data: RuntimeErrorData): void {}\n sendClearRuntimeError(_id: string): void {}\n sendConsoleLog(_data: ConsoleLogEntry): void {}\n setInteractionMode(_mode: InteractionMode): void {}\n\n sendCaptureScreenshotResponse(\n _callbackId: string,\n _dataUrl?: string,\n _error?: string,\n ): void {}\n sendPingAppReadyForScreenshotResponse(\n _callbackId: string,\n _isReady: boolean,\n ): void {}\n}\n","import { throttle } from \"lodash\";\nimport { sendMessageImmediately } from \"../lib/internal-details/lib/iframe.js\";\nimport type { PayloadAction } from \"@superblocksteam/library-shared/types\";\n\nconst MESSAGE_BATCH_TIME = 50;\n\nconst DEFAULT_KEY = \"default\";\n\nexport type QueueMergeOptions = {\n key: string;\n mergeFn: (\n existing: PayloadAction<unknown>[] | undefined,\n newMessage: PayloadAction<unknown>,\n ) => PayloadAction<unknown>[]; // mutations allowed\n};\n\nclass MessageQueue {\n private keyedActionQueue: Record<string, PayloadAction<unknown>[]> = {};\n\n constructor() {}\n\n private flattenKeyedQueue(): PayloadAction<unknown>[] {\n return Object.values(this.keyedActionQueue).flat();\n }\n\n private triggerSendFromQueue = throttle(() => {\n sendMessageImmediately(\n {\n type: \"iframe-action-batch\",\n payload: this.flattenKeyedQueue(),\n },\n {\n overrideStartTime: Date.now() - MESSAGE_BATCH_TIME,\n },\n );\n this.keyedActionQueue = {};\n }, MESSAGE_BATCH_TIME);\n\n public queueMessage(\n message: PayloadAction<unknown>,\n mergeOptions?: QueueMergeOptions,\n ) {\n if (mergeOptions) {\n const { key, mergeFn } = mergeOptions;\n this.keyedActionQueue[key] ??= [];\n this.keyedActionQueue[key] = mergeFn(this.keyedActionQueue[key], message);\n } else {\n this.keyedActionQueue[DEFAULT_KEY] ??= [];\n this.keyedActionQueue[DEFAULT_KEY].push(message);\n }\n\n this.triggerSendFromQueue();\n }\n}\n\nexport default new MessageQueue();\n","import { isEditMode } from \"../lib/internal-details/is-edit-mode.js\";\nimport { sendMessageImmediately as legacySendImmediate } from \"../lib/internal-details/lib/iframe.js\";\nimport {\n DeployedParentBridge,\n type SuperblocksParentBridgeInterface,\n} from \"./base-editor-bridge.js\";\nimport { getEditStore } from \"./get-edit-store.js\";\nimport {\n type QueueMergeOptions,\n default as MessageQueue,\n} from \"./message-queue.js\";\nimport type {\n FromChildToParentMessageTypes,\n FromChildToParentMessageTypesMap,\n} from \"../lib/index.js\";\nimport type {\n StreamEvent,\n RouteInfo,\n} from \"../lib/internal-details/lib/types.js\";\nimport type { PropertiesPanelDefinition } from \"@superblocksteam/library-shared/props\";\nimport type {\n AiContextMode,\n EditOperationPayload,\n EditOperationType,\n PayloadAction,\n InteractionMode,\n RuntimeErrorData,\n SbElement,\n SbSelector,\n ConsoleLogEntry,\n} from \"@superblocksteam/library-shared/types\";\n\ntype MessagePayload<T extends FromChildToParentMessageTypes> = {\n type: T;\n payload: FromChildToParentMessageTypesMap[T];\n callbackId?: string;\n};\n\nexport class SuperblocksEditorBridge implements SuperblocksParentBridgeInterface {\n private static instance: SuperblocksParentBridgeInterface;\n\n private messagesToSend: Array<{\n payload: MessagePayload<any>;\n mergeOptions?: QueueMergeOptions;\n }> = [];\n private connectedToParent = false;\n\n public static getInstance(): SuperblocksParentBridgeInterface {\n const editMode = isEditMode();\n if (!SuperblocksEditorBridge.instance) {\n SuperblocksEditorBridge.instance = editMode\n ? new SuperblocksEditorBridge()\n : new DeployedParentBridge();\n }\n return SuperblocksEditorBridge.instance;\n }\n\n public connected() {\n this.connectedToParent = true;\n this.messagesToSend.forEach((message) =>\n this.queueMessage(message.payload, message.mergeOptions),\n );\n this.messagesToSend = [];\n }\n\n public sendReady() {\n this.sendImmediate<\"sb-ready\">(\n {\n type: \"sb-ready\",\n payload: void 0,\n },\n true,\n );\n }\n\n public sendLoadError(error: string) {\n this.sendImmediate<\"sb-load-error\">(\n {\n type: \"sb-load-error\",\n payload: { error },\n },\n true,\n );\n }\n\n public sendAppFrameWillReload() {\n this.sendImmediate<\"sb-app-frame-will-reload\">(\n {\n type: \"sb-app-frame-will-reload\",\n payload: void 0,\n },\n true,\n );\n }\n\n // Notifications\n public sendNotification(\n type: \"success\" | \"error\" | \"info\" | \"warning\",\n message: string,\n description?: string,\n ) {\n this.queueMessage<\"codeMode/sendNotification\">({\n type: \"codeMode/sendNotification\",\n payload: { type, message, description },\n });\n }\n\n // Widget Operations\n public selectWidgets(sourceIds: SbElement[], selectorIdHint?: SbSelector) {\n this.queueMessage<\"client:selectWidgets\">({\n type: \"client:selectWidgets\",\n payload: { sourceIds, selectorIdHint },\n });\n }\n\n public editOpRequest<T extends EditOperationType>(\n type: T,\n payload: EditOperationPayload<T>[\"payload\"],\n ) {\n this.sendImmediate<\"sb-edit-operation-request\">({\n type: \"sb-edit-operation-request\",\n payload: { type, payload },\n });\n }\n\n public undo() {\n this.sendImmediate<\"undo\">({\n type: \"undo\",\n payload: void 0,\n });\n }\n\n public redo() {\n this.sendImmediate<\"redo\">({\n type: \"redo\",\n payload: void 0,\n });\n }\n\n public sendStreamedApiEvent(event: StreamEvent, apiName: string) {\n this.sendImmediate<\"api/stream-event\">({\n type: \"api/stream-event\",\n payload: { event, apiName },\n });\n }\n\n public sendStreamedApiMessage(message: any, apiName: string) {\n this.sendImmediate<\"api/stream-message\">({\n type: \"api/stream-message\",\n payload: { message, apiName },\n });\n }\n\n public setApiStarted(apiName: string) {\n this.sendImmediate<\"api/started-execution\">({\n type: \"api/started-execution\",\n payload: { apiName },\n });\n }\n\n public setApiResponse(apiName: string, response: unknown) {\n this.sendImmediate<\"api/set-api-response\">({\n type: \"api/set-api-response\",\n payload: { apiName, response },\n });\n }\n\n // Navigation Operations\n public navigateTo(path: string, newWindow?: boolean) {\n this.sendImmediate<\"navigate-to\">({\n type: \"navigate-to\",\n payload: { url: path, newWindow },\n });\n }\n\n // Properties Panel Operations\n public updatePropertiesPanels(\n updates: Record<string, PropertiesPanelDefinition>,\n ) {\n this.queueMessage<\"codeMode/updatePropertiesPanels\">({\n type: \"codeMode/updatePropertiesPanels\",\n payload: updates,\n });\n }\n\n public addPropertiesPanel(id: string, definition: PropertiesPanelDefinition) {\n this.queueMessage<\"codeMode/addPropertiesPanel\">({\n type: \"codeMode/addPropertiesPanel\",\n payload: { id, definition },\n });\n }\n\n public addApiRunRecord(\n apiId: string,\n run: FromChildToParentMessageTypesMap[\"codeMode/addApiRunRecord\"][\"run\"],\n ) {\n this.queueMessage<\"codeMode/addApiRunRecord\">({\n type: \"codeMode/addApiRunRecord\",\n payload: { apiId, run },\n });\n }\n\n public updateApiRunRecord(\n apiId: string,\n callId: string,\n updates: Partial<\n Omit<\n FromChildToParentMessageTypesMap[\"codeMode/addApiRunRecord\"][\"run\"],\n \"id\" | \"callId\"\n >\n >,\n ) {\n this.queueMessage<\"codeMode/updateApiRunRecord\">({\n type: \"codeMode/updateApiRunRecord\",\n payload: { apiId, callId, updates },\n });\n }\n\n // Editor Synced Store Operations\n public initializeEditorSyncedStore(\n payload: FromChildToParentMessageTypesMap[\"codeMode/editor-synced-store/init\"],\n ) {\n this.queueMessage<\"codeMode/editor-synced-store/init\">({\n type: \"codeMode/editor-synced-store/init\",\n payload,\n });\n }\n\n private mergeSyncedStoreUpdate(\n existingActions: PayloadAction<unknown>[] | undefined,\n newAction: PayloadAction<unknown>,\n ) {\n if (!existingActions || existingActions.length === 0) {\n return [newAction];\n }\n const firstAction = existingActions[0] as PayloadAction<\n FromChildToParentMessageTypesMap[\"codeMode/editor-synced-store/update\"]\n >;\n const newActionPatches = (\n newAction as PayloadAction<\n FromChildToParentMessageTypesMap[\"codeMode/editor-synced-store/update\"]\n >\n ).payload.patch;\n firstAction.payload.patch = Array.isArray(firstAction.payload.patch)\n ? firstAction.payload.patch\n : [firstAction.payload.patch];\n firstAction.payload.patch.push(\n ...(Array.isArray(newActionPatches)\n ? newActionPatches\n : [newActionPatches]),\n );\n\n return existingActions;\n }\n\n public updateEditorSyncedStore(\n payload: FromChildToParentMessageTypesMap[\"codeMode/editor-synced-store/update\"],\n ) {\n this.queueMessage<\"codeMode/editor-synced-store/update\">(\n {\n type: \"codeMode/editor-synced-store/update\",\n payload,\n },\n {\n key: `synced-store-update-${payload.storeId}`,\n mergeFn: this.mergeSyncedStoreUpdate,\n },\n );\n }\n\n // Promise Operations\n public resolvePromise(callbackId: string, payload: unknown) {\n this.sendImmediate<\"resolve-promise\">({\n type: \"resolve-promise\",\n callbackId,\n payload,\n });\n }\n\n public rejectPromise(callbackId: string, payload: unknown) {\n this.sendImmediate<\"reject-promise\">({\n type: \"reject-promise\",\n callbackId,\n payload,\n });\n }\n\n public canvasClicked() {\n this.sendImmediate<\"register-click\">({\n type: \"register-click\",\n payload: {\n type: \"INSIDE_IFRAME_CLICKED\",\n context: {\n sourceId: \"\",\n clientX: 0,\n clientY: 0,\n },\n },\n });\n }\n\n public registerContextMenuClick(\n sourceId: SbElement,\n selectorId: SbSelector,\n clientX: number,\n clientY: number,\n ) {\n this.sendImmediate<\"register-click\">({\n type: \"register-click\",\n payload: {\n type: \"OPEN_CONTEXT_MENU\",\n context: {\n sourceId,\n selectorId,\n clientX,\n clientY,\n },\n },\n });\n }\n\n public updateRoute(routeInfo: RouteInfo) {\n this.sendImmediate(\n {\n type: \"route-change\",\n payload: routeInfo,\n },\n // a route change might cause this.connectedToParent to be false,\n // make sure the message is always sent\n true,\n );\n }\n\n public addComponentToAiContext(sourceId: SbElement, selectorId: SbSelector) {\n const editStore = getEditStore();\n\n if (editStore?.ai.isAlternateSourceIdTarget(sourceId, selectorId)) {\n editStore.ai.addTargetedSelector(selectorId);\n return;\n }\n\n const label =\n editStore.runtimeTrackingStore.getComponent(selectorId)?.displayName;\n\n this.sendImmediate<\"ai-updates\">({\n type: \"ai-updates\",\n payload: {\n type: \"add-component-to-context\",\n component: sourceId,\n label,\n selectorId,\n },\n });\n }\n\n public toggleComponentInAiContext(\n sourceId: SbElement,\n selectorId: SbSelector,\n label?: string,\n ) {\n const editStore = getEditStore();\n\n if (editStore?.ai.isAlternateSourceIdTarget(sourceId, selectorId)) {\n editStore.ai.toggleTargetedSelector(selectorId);\n return;\n }\n this.sendImmediate<\"ai-updates\">({\n type: \"ai-updates\",\n payload: {\n type: \"toggle-component-in-context\",\n component: sourceId,\n label: label,\n selectorId,\n },\n });\n }\n\n public setAiContextMode(mode: AiContextMode) {\n this.sendImmediate<\"ai-updates\">({\n type: \"ai-updates\",\n payload: { type: \"set-ai-context-mode\", mode },\n });\n }\n\n public aiGenerate(prompt: string, forceSend = false) {\n const sanitizedPrompt = clampPromptLength(prompt);\n this.sendImmediate<\"ai-updates\">(\n {\n type: \"ai-updates\",\n payload: {\n type: \"ai-generate\",\n prompt: sanitizedPrompt,\n },\n },\n forceSend,\n );\n }\n\n public sendAiLoaderState(shouldShowLoader: boolean) {\n this.sendImmediate<\"ai-updates\">({\n type: \"ai-updates\",\n payload: { type: \"loader-state\", shouldShowLoader },\n });\n }\n\n public socketError(message: string) {\n this.sendImmediate<\"socket/error\">({\n type: \"socket/error\",\n payload: { message },\n });\n }\n\n public sendRuntimeError(data: RuntimeErrorData, forceSend = false) {\n this.sendImmediate<\"runtime-error\">(\n {\n type: \"runtime-error\",\n payload: data,\n },\n forceSend,\n );\n }\n\n public sendClearRuntimeError(id: string, forceSend = false) {\n this.sendImmediate<\"clear-runtime-error\">(\n {\n type: \"clear-runtime-error\",\n payload: { id },\n },\n forceSend,\n );\n }\n\n public sendConsoleLog(data: ConsoleLogEntry) {\n this.sendImmediate<\"console-log\">({\n type: \"console-log\",\n payload: data,\n });\n }\n\n public setInteractionMode(mode: InteractionMode) {\n this.sendImmediate<\"set-interaction-mode\">({\n type: \"set-interaction-mode\",\n payload: { interactionMode: mode },\n });\n }\n\n // Screenshot Operations\n public sendCaptureScreenshotResponse(\n callbackId: string,\n dataUrl?: string,\n error?: string,\n ) {\n this.sendImmediate<\"capture-screenshot-response\">({\n type: \"capture-screenshot-response\",\n payload: {\n callbackId,\n dataUrl,\n error,\n },\n });\n }\n\n public sendPingAppReadyForScreenshotResponse(\n callbackId: string,\n isReady: boolean,\n ) {\n this.sendImmediate<\"ping-app-ready-for-screenshot-response\">({\n type: \"ping-app-ready-for-screenshot-response\",\n payload: {\n callbackId,\n isReady,\n },\n });\n }\n\n // Private implementation details\n private queueMessage<T extends FromChildToParentMessageTypes>(\n message: MessagePayload<T>,\n mergeOptions?: QueueMergeOptions,\n ) {\n if (!this.connectedToParent) {\n this.messagesToSend.push({ payload: message, mergeOptions });\n } else {\n MessageQueue.queueMessage(message, mergeOptions);\n }\n }\n\n private sendImmediate<T extends FromChildToParentMessageTypes>(\n message: MessagePayload<T>,\n forceSend = false,\n ) {\n if (!this.connectedToParent && !forceSend) {\n this.messagesToSend.push({ payload: message });\n } else {\n legacySendImmediate(message);\n }\n }\n}\n\n// Roughly 4:1 chars to tokens, so 4k tokens\nconst MAX_AI_PROMPT_LENGTH = 16000;\nconst TRUNCATION_SUFFIX = \"... (truncated)\";\n\nfunction clampPromptLength(prompt: string): string {\n if (prompt.length <= MAX_AI_PROMPT_LENGTH) {\n return prompt;\n }\n\n const available = Math.max(\n MAX_AI_PROMPT_LENGTH - TRUNCATION_SUFFIX.length,\n 0,\n );\n return `${prompt.slice(0, available)}${TRUNCATION_SUFFIX}`;\n}\n\nexport const editorBridge = SuperblocksEditorBridge.getInstance();\n","import { getQueryParams } from \"@superblocksteam/library-shared\";\nimport { action } from \"mobx\";\nimport {\n matchRoutes,\n type DataRouter,\n type Location,\n type Params,\n} from \"react-router\";\nimport { editorBridge } from \"../../edit-mode/superblocks-editor-bridge.js\";\nimport type { RootStore } from \"./lib/root-store.js\";\nimport type { RouteInfo } from \"./lib/types.js\";\n\nexport class LocationStore {\n route?: RouteInfo;\n rootStore: RootStore;\n\n constructor(rootStore: RootStore) {\n this.rootStore = rootStore;\n }\n\n @action\n updateLocation(\n location: Location,\n routes: DataRouter[\"routes\"],\n params: Readonly<Params<string>>,\n ): void {\n this.route = this.locationToRouteInfo(location, routes, params);\n this.sendLocationToEditor();\n }\n\n sendLocationToEditor() {\n if (!this.route) return;\n editorBridge.updateRoute(this.route);\n }\n\n /**\n * Recursively searches through route tree (including nested children) to find a matching route\n */\n private findMatchingRoute(routes: DataRouter[\"routes\"], pathname: string) {\n const matchingRoutes = matchRoutes(routes, pathname);\n const match = matchingRoutes?.at(-1);\n return match;\n }\n\n locationToRouteInfo(\n location: Location,\n routes: DataRouter[\"routes\"],\n params: Readonly<Params<string>>,\n ): RouteInfo | undefined {\n const match = this.findMatchingRoute(routes, location.pathname);\n\n if (!match?.pathname) return;\n\n return {\n hash: location.hash,\n pathname: location.pathname,\n queryParams: getQueryParams(location.search),\n route: match.pathname,\n routeParams: params,\n };\n }\n}\n","<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M8 15C11.866 15 15 11.866 15 8C15 4.13401 11.866 1 8 1C4.13401 1 1 4.13401 1 8C1 11.866 4.13401 15 8 15ZM8.75001 5C8.75001 4.58579 8.41422 4.25 8.00001 4.25C7.58579 4.25 7.25001 4.58579 7.25001 5V8C7.25001 8.41421 7.58579 8.75 8.00001 8.75C8.41422 8.75 8.75001 8.41421 8.75001 8V5ZM8 9.75001C7.44772 9.75001 7 10.1977 7 10.75C7 11.3023 7.44772 11.75 8 11.75C8.55228 11.75 9 11.3023 9 10.75C9 10.1977 8.55228 9.75001 8 9.75001Z\" fill=\"currentColor\"/>\n</svg>\n","<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M15 8C15 11.866 11.866 15 8 15C4.13401 15 1 11.866 1 8C1 4.13401 4.13401 1 8 1C11.866 1 15 4.13401 15 8ZM5.94194 5.05806C5.69786 4.81398 5.30214 4.81398 5.05806 5.05806C4.81398 5.30214 4.81398 5.69786 5.05806 5.94194L7.11612 8L5.05806 10.0581C4.81398 10.3021 4.81398 10.6979 5.05806 10.9419C5.30214 11.186 5.69786 11.186 5.94194 10.9419L8 8.88388L10.0581 10.9419C10.3021 11.186 10.6979 11.186 10.9419 10.9419C11.186 10.6979 11.186 10.3021 10.9419 10.0581L8.88388 8L10.9419 5.94194C11.186 5.69786 11.186 5.30214 10.9419 5.05806C10.6979 4.81398 10.3021 4.81398 10.0581 5.05806L8 7.11612L5.94194 5.05806Z\" fill=\"currentColor\"/>\n</svg>\n","<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M8 1C6.61553 1 5.26216 1.41054 4.11101 2.17971C2.95987 2.94888 2.06266 4.04213 1.53285 5.32122C1.00303 6.6003 0.86441 8.00776 1.13451 9.36563C1.4046 10.7235 2.07129 11.9708 3.05026 12.9497C4.02922 13.9287 5.2765 14.5954 6.63437 14.8655C7.99224 15.1356 9.3997 14.997 10.6788 14.4672C11.9579 13.9373 13.0511 13.0401 13.8203 11.889C14.5895 10.7378 15 9.38447 15 8C14.9964 6.14458 14.2578 4.36617 12.9458 3.05418C11.6338 1.7422 9.85542 1.00356 8 1ZM7.86539 4.23077C8.02513 4.23077 8.18129 4.27814 8.31412 4.36689C8.44694 4.45564 8.55046 4.58178 8.6116 4.72937C8.67273 4.87696 8.68872 5.03936 8.65756 5.19603C8.62639 5.35271 8.54947 5.49663 8.43651 5.60959C8.32355 5.72254 8.17964 5.79947 8.02296 5.83063C7.86628 5.8618 7.70388 5.8458 7.5563 5.78467C7.40871 5.72354 7.28257 5.62001 7.19381 5.48719C7.10506 5.35437 7.05769 5.19821 7.05769 5.03846C7.05769 4.82425 7.14279 4.61881 7.29426 4.46734C7.44573 4.31586 7.65117 4.23077 7.86539 4.23077ZM8.53846 11.7692H8C7.85719 11.7692 7.72023 11.7125 7.61925 11.6115C7.51827 11.5105 7.46154 11.3736 7.46154 11.2308V8C7.31873 8 7.18177 7.94327 7.08079 7.84229C6.97981 7.74131 6.92308 7.60435 6.92308 7.46154C6.92308 7.31873 6.97981 7.18177 7.08079 7.08079C7.18177 6.97981 7.31873 6.92308 7.46154 6.92308H8C8.14281 6.92308 8.27977 6.97981 8.38075 7.08079C8.48173 7.18177 8.53846 7.31873 8.53846 7.46154V10.6923C8.68127 10.6923 8.81823 10.749 8.91921 10.85C9.0202 10.951 9.07692 11.088 9.07692 11.2308C9.07692 11.3736 9.0202 11.5105 8.91921 11.6115C8.81823 11.7125 8.68127 11.7692 8.53846 11.7692Z\" fill=\"currentColor\"/>\n</svg>\n","<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M8 15C11.866 15 15 11.866 15 8C15 4.13401 11.866 1 8 1C4.13401 1 1 4.13401 1 8C1 11.866 4.13401 15 8 15ZM11.4419 6.94194C11.686 6.69786 11.686 6.30214 11.4419 6.05806C11.1979 5.81398 10.8021 5.81398 10.5581 6.05806L7.5 9.11612L5.94194 7.55806C5.69786 7.31398 5.30214 7.31398 5.05806 7.55806C4.81398 7.80214 4.81398 8.19786 5.05806 8.44194L7.05806 10.4419C7.30214 10.686 7.69786 10.686 7.94194 10.4419L11.4419 6.94194Z\" fill=\"currentColor\"/>\n</svg>\n","export const colors = {\n WHITE: \"#FFFFFF\",\n BLACK: \"#000000\",\n PLATFORM_BLACK: \"#0E141B\",\n\n // TODO: Consider replace WHITE with this.\n OFF_WHITE: \"#F2F2F2\",\n DISABLED: \"rgba(0, 0, 0, 0.25)\",\n\n GREY_25: \"#F9FAFB\",\n GREY_50: \"#F3F4F6\",\n GREY_100: \"#E8EAED\",\n GREY_200: \"#C6CAD2\",\n GREY_300: \"#A4AAB7\",\n GREY_400: \"#818A9C\",\n GREY_500: \"#6C7689\",\n GREY_600: \"#5A6272\",\n GREY_700: \"#454D5F\",\n GREY_800: \"#2F3437\",\n GREY_900: \"#121517\",\n GRAY_GRID: \"#CCD3DB\",\n\n RED_500_8: \"rgba(255, 72, 72, 0.08)\",\n RED_25: \"#FF48481F\",\n RED_500: \"#FF4848\",\n RED_600: \"#DB4949\",\n RED_700: \"#C54141\",\n\n ORANGE_25: \"#FFEEC5\",\n ORANGE_600: \"#FA8A0F\",\n\n SUBTLE_BLUE: \"#29bbff14\", // Deprecated. Not defined in figma\n SUBTLE_BLUE_SOLID: \"#eefaff\", // Deprecated. Not defined in figma\n\n ACCENT_BLUE_NEW_DARKER: \"#0087E0\",\n BLUE_MINMAX_LABELS: \"#0062A3\",\n DRAG_PREVIEW_BLUE: \"rgba(0, 135, 224, 0.16)\",\n ACCENT_BLUE_500: \"#27BBFF\",\n ACCENT_BLUE_500_04: \"#27BBFF0A\",\n ACCENT_BLUE_500_25: \"#27BBFF14\",\n ACCENT_BLUE_500_50: \"#27BBFF1F\",\n ACCENT_BLUE_500_18: \"#27BBFF2E\", // Deprecated. Not defined in figma\n ACCENT_BLUE_500_24: \"#27BBFF3D\", // Deprecated. Not defined in figma\n ACCENT_BLUE_500_48: \"#27BBFF7A\", // Deprecated. Not defined in figma\n ACCENT_BLUE_600: \"#00A8F5\",\n ACCENT_BLUE_700: \"#009AE0\",\n ACCENT_ORANGE: \"#FF9F35\",\n ACCENT_ORANGE_04: \"#FF9F350A\",\n ACCENT_ORANGE_24: \"#FF9F353D\",\n LIGHT_ORANGE: \"#FF9F351E\",\n ACCENT_ORANGE_600: \"#FA8A0F\",\n SUBTLE_PURPLE: \"#643ADF14\",\n ACCENT_PURPLE: \"#643ADF\",\n LIGHT_PURPLE: \"#643ADF1E\",\n ACCENT_PURPLE_500: \"#7C4FF8\",\n ACCENT_PURPLE_600: \"#5227CE\",\n SUBTLE_GREEN: \"#14CDB714\",\n LIGHT_GREEN: \"#9BDCAD\",\n ACCENT_GREEN: \"#14CDB7\",\n ACCENT_GREEN_600: \"#08BAA5\",\n LIGHT_PINK: `rgba(255, 98, 164, 0.12)`,\n ACCENT_PINK: \"#FF62A4\",\n\n HOVER_BLUE: \"#E3F8FF\",\n HOVER_GREEN: \"#14CDB724\",\n\n CLICK_GREEN: \"#14CDB734\",\n\n INFO: \"#27BBFF\",\n WARNING: \"#FF9F35\",\n DANGER: \"#F45252\",\n DANGER_BRIGHT: \"rgba(255, 72, 72, 1.0)\",\n DANGER_SUBTLE: \"#F452521F\",\n SUCCESS: \"#0CC26D\",\n\n NONE: \"transparent\",\n} as const;\n\nexport type SuperblocksColor = keyof typeof colors;\n","export const MODIFIER_CLASSNAMES = {\n DISABLED_MODIFIER: \"sb-disabled\",\n ERROR_MODIFIER: \"sb-error\",\n ACTIVE_MODIFIER: \"sb-active\",\n};\n\nexport const CLASS_NAMES = {\n ...MODIFIER_CLASSNAMES,\n // user-controllable typefaces\n HEADING1: \"sb-heading-1\",\n HEADING2: \"sb-heading-2\",\n HEADING3: \"sb-heading-3\",\n HEADING4: \"sb-heading-4\",\n HEADING5: \"sb-heading-5\",\n HEADING6: \"sb-heading-6\",\n BODY1: \"sb-body-1\",\n BODY2: \"sb-body-2\",\n BODY3: \"sb-body-3\",\n LINK: \"sb-link\",\n INPUT_LABEL: \"sb-input-label\",\n LABEL: \"sb-label\",\n CODE_TEXT: \"sb-code\",\n INPUT_TEXT: \"sb-input-text\",\n INPUT_PLACEHOLDER: \"sb-input-placeholder\",\n BUTTON_LABEL: \"sb-button-label\",\n\n // built-in typefaces\n SYSTEM_TEXT: \"sb-system-text\",\n BUILTIN_BODY: \"sb-builtin-body\",\n ELLIPSIS_TEXT: \"sb-ellipsis-text\",\n\n // buttons\n BUTTON: \"sb-button\",\n PRIMARY_BUTTON: \"sb-button-primary\",\n SECONDARY_BUTTON: \"sb-button-secondary\",\n SECONDARY_NEUTRAL_BUTTON: \"sb-button-secondary-neutral\",\n TERTIARY_BUTTON: \"sb-button-tertiary\",\n SYSTEM_BUTTON: \"sb-button-system\",\n // inputs\n INPUT: \"sb-input\",\n SWITCH: \"sb-switch\",\n CHECKBOX: \"sb-checkbox\",\n RADIO: \"sb-radio\",\n // containers\n SECTION: \"sb-section\",\n ROUNDED_CONTAINER: \"sb-rounded-container\",\n\n CANVAS: \"sb-canvas\", // the inner canvas of a container\n DEFAULT_CONTAINER: \"sb-default-container\", // used for container-like wrappers (i.e. table, graph, etc.)\n\n DEFAULT_CONTAINER_STYLE_CARD: \"sb-default-container-style-card\", // used for container components\n DEFAULT_CONTAINER_STYLE_NONE: \"sb-default-container-style-none\", // used for container components\n\n DEFAULT_CONTAINER_BORDER: \"sb-default-container-border\", // used to render container borders, which are customizable + overlay the component\n\n CONTAINER_BORDER_OUTLINE: \"sb-container-border-overlay\",\n POPOVER_WRAPPER: \"sb-popover-wrapper\",\n TAB: \"sb-tab\",\n MODAL: \"sb-modal\",\n SLIDEOUT: \"sb-slideout\",\n BORDER_BOTTOM: \"sb-util-border-bottom\",\n BORDER_TOP: \"sb-util-border-top\",\n NOTIFICATION: \"sb-notification\",\n STYLED_SCROLLBAR: \"sb-scrollable\",\n TOOLTIP: \"sb-tooltip\",\n // menus\n DROPDOWN: \"sb-dropdown\",\n DROPDOWN_MENU: \"sb-dropdown-menu\",\n MENU_ITEM: \"sb-menu-item\",\n TAG_INPUT: \"sb-tag-input\",\n DATEPICKER: \"sb-datepicker\",\n // icons\n DROPDOWN_CLEAR_ICON: \"sb-dropdown-clear-icon\",\n CARET_ICON: \"sb-caret-icon\",\n PRIMARY_COLOR_ICON: \"sb-primary-color-icon\",\n CLOSE_ICON: \"sb-close-icon\",\n ICON: \"sb-icon\",\n // misc\n PAGINATOR: \"sb-rc-paginator\",\n CODE_EDITOR: \"sb-code-editor\",\n ERROR_INLINE_MESSAGE: \"sb-error-inline-message\",\n};\n","import { NotificationPosition } from \"@superblocksteam/library-shared/types\";\nimport isString from \"lodash/isString\";\nimport React from \"react\";\nimport { toast } from \"sonner\";\nimport styled from \"styled-components\";\nimport WarningIcon from \"../assets/icons/system-danger.svg\";\nimport ErrorIcon from \"../assets/icons/system-error.svg\";\nimport InfoIcon from \"../assets/icons/system-info.svg\";\nimport SuccessIcon from \"../assets/icons/system-success.svg\";\nimport { colors } from \"../styling/colors.js\";\nimport { CLASS_NAMES } from \"../themes/classnames.js\";\nimport type { NotificationType } from \"@superblocksteam/library-shared/types\";\nimport type { ToastT } from \"sonner\";\n\ntype NotificationConfig = {\n key?: string;\n message: JSX.Element | string;\n description?: JSX.Element | string;\n // Duration in seconds\n duration?: number;\n placement?: NotificationPosition;\n style?: React.CSSProperties;\n dataTest?: string;\n type: NotificationType;\n};\n\n// Used to keep track of active notifications and collapse them when displayed\nconst activeNotifications = new Map<string, { count: number; message: any }>();\n\nconst StatusIconWrapper = styled.div<{\n color: string;\n}>`\n color: ${(props) => props.color};\n font-size: 16px;\n margin-top: -2px;\n margin-left: -10px;\n svg {\n width: 18px;\n height: 18px;\n }\n`;\n\nconst MessageWrapper = styled.div`\n font-size: 12px;\n font-weight: 500;\n line-height: 1.3;\n margin-left: -26px;\n margin-right: 0;\n white-space: pre-wrap;\n`;\n\nconst DescriptionWrapper = styled.div`\n font-size: 12px;\n margin-left: -26px;\n margin-right: -10px;\n`;\nconst styleMessage = (\n message: string | JSX.Element,\n dataTest?: string,\n): JSX.Element => {\n return (\n <MessageWrapper data-test={dataTest ? dataTest : \"notification\"}>\n {message}\n </MessageWrapper>\n );\n};\n\nconst styleDescription = (\n description: undefined | string | JSX.Element,\n): undefined | JSX.Element => {\n if (!description) {\n return undefined;\n }\n return <DescriptionWrapper>{description}</DescriptionWrapper>;\n};\n\nconst messageWithCount = (\n key: string | undefined,\n message: string | JSX.Element,\n dataTest?: string,\n) => {\n let updatedMessage = message;\n if (key) {\n const count = (activeNotifications.get(key)?.count ?? 0) + 1;\n activeNotifications.set(key, { count: count, message });\n if (count > 1 && isString(message)) {\n // If message is a string, add count to message\n updatedMessage = `${message} (${count} times)`;\n }\n }\n return styleMessage(updatedMessage, dataTest);\n};\n\n/**\n * When a Key is used,\n * duplicate notifications are not shown but the timeout is added to the first notification.\n * @returns A string key based on inputs\n */\nconst getKey = (\n type: string,\n message: string | JSX.Element,\n description: string | JSX.Element | undefined,\n duration: number | undefined,\n) => {\n return isString(message)\n ? `${type}--${String(message)}--${description}--${duration}`\n : undefined;\n};\n\nconst removeNotificationsWithKey = (key: string) => {\n document\n .querySelectorAll(`[data-testid=\"notification_${key}\"]`)\n .forEach((el) => {\n el.remove();\n });\n};\n\nconst attrSafeKey = (str: string) => {\n return str.replace(/\\W+/g, \"_\");\n};\n\nconst getIcon = (type: NotificationType) => {\n let icon: React.ReactNode;\n let color: string;\n switch (type) {\n case \"success\":\n icon = <SuccessIcon />;\n color = colors.SUCCESS;\n break;\n case \"error\":\n icon = <ErrorIcon />;\n color = colors.DANGER;\n break;\n case \"info\":\n icon = <InfoIcon />;\n color = colors.INFO;\n break;\n case \"warning\":\n icon = <WarningIcon />;\n color = colors.WARNING;\n break;\n }\n return <StatusIconWrapper color={color}>{icon}</StatusIconWrapper>;\n};\n\nfunction onAlertClose(key: string | undefined) {\n if (key) {\n activeNotifications.delete(key);\n }\n}\n\nexport function cleanNotification() {\n toast.dismiss();\n activeNotifications.clear();\n}\n\nexport function closeNotification(key: string) {\n if (!key) {\n return;\n }\n toast.dismiss(key);\n removeNotificationsWithKey(attrSafeKey(key));\n activeNotifications.delete(key);\n}\n\ntype Position = NonNullable<ToastT[\"position\"]>;\n\nconst positionToPlacement: Record<NotificationPosition, Position> = {\n [NotificationPosition.bottom]: \"bottom-center\",\n [NotificationPosition.top]: \"top-center\",\n [NotificationPosition.topLeft]: \"top-left\",\n [NotificationPosition.topRight]: \"top-right\",\n [NotificationPosition.bottomLeft]: \"bottom-left\",\n [NotificationPosition.bottomRight]: \"bottom-right\",\n} as const;\n\nexport function sendNotification({\n message,\n description,\n duration,\n key = getKey(\"success\", message, description, duration),\n placement = NotificationPosition.bottomRight,\n style,\n dataTest,\n type,\n}: NotificationConfig) {\n const icon = getIcon(type);\n\n const handleClose = () => {\n onAlertClose(key);\n if (key) {\n removeNotificationsWithKey(attrSafeKey(`notification-${key}`));\n }\n };\n\n if (key) {\n toast.dismiss(key);\n removeNotificationsWithKey(attrSafeKey(`notification-${key}`));\n }\n\n const position = positionToPlacement[placement];\n\n toast.success(messageWithCount(key, message, dataTest), {\n id: key,\n description: styleDescription(description),\n icon,\n duration: duration ? duration * 1000 : undefined,\n position: position,\n className: CLASS_NAMES.NOTIFICATION,\n style: style,\n onDismiss: handleClose,\n onAutoClose: handleClose,\n });\n}\n","import type { UrlState } from \"@superblocksteam/library-shared/types\";\nimport type { Profile, RouteDef } from \"@superblocksteam/shared\";\n\nexport const AppMode = {\n EDIT: \"EDIT\",\n PUBLISHED: \"PUBLISHED\",\n PREVIEW: \"PREVIEW\",\n} as const;\nexport type AppMode = (typeof AppMode)[keyof typeof AppMode];\n\nexport interface Global {\n mode?: AppMode;\n user?: User;\n URL?: UrlState;\n groups?: Group[];\n deployedAt?: string;\n createdAt?: string;\n selectedProfileId?: string;\n profiles?: Profiles;\n routes?: { [id: string]: RouteDef };\n currentRoute?: {\n routeDef: RouteDef;\n params: Record<string, string>;\n };\n app?: {\n id: string;\n name: string;\n };\n}\n\ntype User = {\n name: string;\n email: string;\n id: string;\n groups: Group[];\n username: string;\n metadata: Record<string, unknown>;\n};\n\ntype Group = {\n id: string;\n name: string;\n size: number;\n};\n\ntype Profiles = {\n available: Profile[];\n selected?: Profile;\n default: Profile;\n};\n","import { URL_PARAMS } from \"@superblocksteam/library-shared\";\nimport { makeAutoObservable, reaction, toJS } from \"mobx\";\nimport {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useSyncExternalStore,\n} from \"react\";\nimport type { AppMode } from \"./scope/types\";\nimport type { Profile } from \"@superblocksteam/shared\";\n\ntype User = {\n name: string;\n email: string;\n id: string;\n groups: Group[];\n username: string;\n metadata: Record<string, unknown>;\n};\n\ntype Group = {\n id: string;\n name: string;\n size: number;\n};\n\ntype Profiles = {\n available: Profile[];\n selected?: Profile;\n default: Profile;\n};\n\nexport class SuperblocksAppContext {\n private context?: {\n user?: User;\n groups?: Group[];\n selectedProfileId?: string;\n profiles?: Profiles;\n viewMode?: any;\n app?: {\n id: string;\n name: string;\n };\n };\n\n constructor() {\n makeAutoObservable(this);\n }\n\n get user() {\n return this.context?.user;\n }\n\n get groups() {\n return this.context?.groups;\n }\n\n get selectedProfile() {\n return this.context?.profiles?.selected;\n }\n\n get profiles() {\n return this.context?.profiles;\n }\n\n setProfile(profileName: string) {\n const profile = this.context?.profiles?.available.find(\n (profile) => profile.displayName === profileName,\n );\n if (profile && this.context?.profiles) {\n this.context.profiles.selected = profile;\n } else if (!profile || !this.context?.profiles) {\n throw new Error(`Profile ${profileName} not found`);\n }\n }\n\n updateContext(context: Partial<SuperblocksAppContext>) {\n this.context = {\n ...this.context,\n ...context,\n };\n }\n\n getGlobal() {\n return this.context;\n }\n}\n\nexport const context = new SuperblocksAppContext();\n\nexport const SuperblocksContext = createContext<SuperblocksAppContext>(context);\n\nexport function SuperblocksContextProvider({\n children,\n value: contextOverride,\n}: {\n children: React.ReactNode;\n value?: SuperblocksAppContext;\n}) {\n if (contextOverride) {\n return (\n <SuperblocksContext.Provider value={contextOverride}>\n {children}\n </SuperblocksContext.Provider>\n );\n }\n\n return (\n <SuperblocksContext.Provider value={context}>\n {children}\n </SuperblocksContext.Provider>\n );\n}\n\nexport function useSuperblocksContext() {\n return useContext(SuperblocksContext);\n}\n\nexport function useSuperblocksUser() {\n const context = useSuperblocksContext();\n const user = useSyncExternalStore(\n (onStoreChange) => {\n return reaction(() => context.user, onStoreChange);\n },\n () => context.user,\n () => context.user,\n );\n\n const cleanedUser = useMemo(() => toJS(user), [user]);\n return cleanedUser;\n}\n\nexport function useSuperblocksGroups() {\n const context = useSuperblocksContext();\n const groups = useSyncExternalStore(\n (onStoreChange) => {\n return reaction(() => context.groups, onStoreChange);\n },\n () => context.groups,\n () => context.groups,\n );\n\n const cleanedGroups = useMemo(() => toJS(groups), [groups]);\n return cleanedGroups;\n}\n\nexport function useSuperblocksProfiles() {\n const context = useSuperblocksContext();\n const profiles = useSyncExternalStore(\n (onStoreChange) => {\n return reaction(() => context.profiles, onStoreChange);\n },\n () => context.profiles,\n () => context.profiles,\n );\n const cleanedProfiles = useMemo(() => toJS(profiles), [profiles]);\n const setProfile = useCallback(\n (profileName: string) => {\n context.setProfile(profileName);\n },\n [context],\n );\n return { profiles: cleanedProfiles, setProfile };\n}\n\nlet appMode: AppMode | undefined;\n\nexport function getAppMode(): AppMode | undefined {\n if (!appMode) {\n appMode = new URL(window.location.href).searchParams.get(\n URL_PARAMS.appMode,\n ) as AppMode | undefined;\n if (!appMode) {\n console.warn(\"No app mode found in URL\");\n }\n }\n return appMode;\n}\n","// TODO(code-mode): Remove import from edit-mode\nimport { editorBridge } from \"../../../edit-mode/superblocks-editor-bridge.js\";\nimport { isEmbeddedBySuperblocksFirstParty } from \"./iframe.js\";\n\nconst EMBED_STRING = `embedded-`;\n\nlet promiseCount = 0;\nconst resolverMap = new Map<string, (...args: any[]) => any>();\nconst rejectorMap = new Map<string, (...args: any[]) => any>();\n\nconst multiUseCallbacks = new Map<string, (...args: any[]) => any>();\n\nexport function addNewPromise(\n resolver: (...args: any[]) => any,\n isMultiUse = false,\n rejecter?: (...args: any[]) => any,\n) {\n const promiseId = `${\n isEmbeddedBySuperblocksFirstParty() ? EMBED_STRING : \"\"\n }p${++promiseCount}`;\n resolverMap.set(promiseId, resolver);\n if (isMultiUse) {\n multiUseCallbacks.set(promiseId, resolver);\n }\n if (rejecter) {\n rejectorMap.set(promiseId, rejecter);\n }\n return promiseId;\n}\n\nexport function resolveById(id: string, payload: any) {\n const isEmbedId = id.startsWith(EMBED_STRING);\n if (\n (isEmbeddedBySuperblocksFirstParty() && !isEmbedId) ||\n (!isEmbeddedBySuperblocksFirstParty() && isEmbedId)\n ) {\n editorBridge.resolvePromise(id, payload);\n } else {\n try {\n const resolver = resolverMap.get(id);\n if (!resolver) {\n throw new Error(`Promise not found for id ${id}`);\n }\n resolver(payload);\n if (!multiUseCallbacks.has(id)) {\n resolverMap.delete(id);\n rejectorMap.delete(id);\n }\n } catch (e) {\n console.log(\"[internal] [resolveById] Error resolving promise\", e);\n }\n }\n}\n\nexport function rejectById(id: string, payload: any) {\n const isEmbedId = id.startsWith(EMBED_STRING);\n if (\n (isEmbeddedBySuperblocksFirstParty() && !isEmbedId) ||\n (!isEmbeddedBySuperblocksFirstParty() && isEmbedId)\n ) {\n editorBridge.rejectPromise(id, payload);\n } else {\n try {\n const rejecter = rejectorMap.get(id);\n if (!rejecter) {\n throw new Error(`Promise not found for id ${id}`);\n }\n rejecter(payload);\n if (!multiUseCallbacks.has(id)) {\n resolverMap.delete(id);\n rejectorMap.delete(id);\n }\n } catch (e) {\n console.log(\"[internal] [rejectById] Error rejecting promise\", e);\n }\n }\n}\n\nexport function clearMultiCallback(id: string) {\n multiUseCallbacks.delete(id);\n}\n","type RefResult = {\n hardRef?: object;\n weakRef: WeakRef<object>;\n clearTimer?: ReturnType<typeof setTimeout>;\n};\n\nclass ApiHmrTracker {\n static CLEAR_REF_DELAY = 180e3; // 3 minutes\n\n private reloadCount: number = 0;\n private propagatedReloadCount: number = 0; // acts like a watermark to indicate the highest reload count that has been processed by React\n\n private seenHashes: Set<string> = new Set();\n private lastResultByHash: Record<string, RefResult> = {};\n\n private clearRefAfterDelay(value: RefResult) {\n clearTimeout(value.clearTimer);\n value.clearTimer = setTimeout(() => {\n value.clearTimer = undefined;\n delete value.hardRef;\n }, ApiHmrTracker.CLEAR_REF_DELAY);\n }\n\n private getAndRefreshResult(callHash: string) {\n const lastResult = this.lastResultByHash[callHash];\n if (!lastResult) {\n return null;\n }\n\n const result = lastResult.hardRef ?? lastResult.weakRef.deref();\n if (result) {\n this.clearRefAfterDelay(lastResult);\n return result;\n }\n\n return null;\n }\n\n // should skip if an only if all of the following are true:\n // - we've already seen this call hash (that means the API has executed already)\n // - the result is still valid (we have a valid cache entry to return)\n // - the reload count is not the same as the propagated reload count (AKA - we're likely in the middle of an HMR update)\n public shouldSkipRun(callHash: string) {\n if (!this.seenHashes.has(callHash)) {\n this.seenHashes.add(callHash);\n return false;\n }\n\n const result = this.getAndRefreshResult(callHash);\n // stored result has expired and GC'd so API must be re-run\n if (!result) {\n return false;\n }\n\n // finally, check if we're likely in the middle of an HMR update\n return this.propagatedReloadCount !== this.reloadCount;\n }\n\n public getCachedResult(callHash: string) {\n return this.getAndRefreshResult(callHash);\n }\n\n public setResult(callHash: string, result: object) {\n this.lastResultByHash[callHash] = {\n weakRef: new WeakRef(result),\n hardRef: result,\n };\n this.clearRefAfterDelay(this.lastResultByHash[callHash]);\n }\n\n public incReloadCount() {\n this.reloadCount++;\n }\n\n public dontSkipUntilNextReload() {\n this.propagatedReloadCount = Math.max(\n this.propagatedReloadCount,\n this.reloadCount,\n );\n }\n\n private mountLikeTimer: ReturnType<typeof setTimeout> | null = null;\n\n public reportJSXActivity() {\n const reloadCount = this.reloadCount;\n if (!this.mountLikeTimer) {\n this.mountLikeTimer = setTimeout(() => {\n requestIdleCallback(() => {\n this.propagatedReloadCount = Math.max(\n this.propagatedReloadCount,\n reloadCount,\n );\n this.mountLikeTimer = null;\n });\n }, 0);\n }\n // then there is already a propagation about to happen, so don't do anything\n }\n}\n\nconst tracker = new ApiHmrTracker();\n\nif (import.meta.hot) {\n import.meta.hot.on(\"vite:beforeUpdate\", () => {\n tracker.incReloadCount();\n });\n}\n\nexport default tracker;\n","import { propagation, trace, context, ROOT_CONTEXT } from \"@opentelemetry/api\";\nimport { getTracer } from \"../utils.js\";\nimport type { Context, Span } from \"@opentelemetry/api\";\n\nexport function getContextFromTraceHeaders(\n traceHeaders: Record<string, string>,\n): Context {\n let parentContext = context.active();\n\n try {\n parentContext = propagation.extract(context.active(), traceHeaders);\n } catch (error) {\n console.warn(\n \"Failed to extract parent context from headers\",\n traceHeaders,\n error,\n );\n }\n\n return parentContext;\n}\n\nexport function createIframeSpan(\n name: string,\n attributes: Record<string, any>,\n parentContext?: Context,\n) {\n const tracer = getTracer(\"superblocks-iframe\");\n return tracer.startSpan(name, { attributes }, parentContext);\n}\n\nexport function getTraceContextHeadersFromSpan(\n span: Span,\n): Record<string, string> {\n const traceContextHeaders = {};\n const contextWithSpan = trace.setSpan(ROOT_CONTEXT, span);\n propagation.inject(contextWithSpan, traceContextHeaders);\n return traceContextHeaders;\n}\n","export const generateId = () => {\n return Math.random().toString(36).substring(2, 15);\n};\n","import { context } from \"@opentelemetry/api\";\nimport {\n ViewMode,\n SUPERBLOCKS_REQUEST_ID_HEADER,\n SUPERBLOCKS_AUTHORIZATION_HEADER,\n decodeBytestrings,\n} from \"@superblocksteam/shared\";\nimport { ApiResponseType } from \"@superblocksteam/shared\";\nimport {\n getContextFromTraceHeaders,\n createIframeSpan,\n getTraceContextHeadersFromSpan,\n} from \"../../../tracing/context-utils.js\";\nimport { cleanObject } from \"../../../utils/clean-object.js\";\nimport { generateId } from \"../../../utils/generate-id.js\";\nimport type {\n ApiV2ExecutionRequest,\n ApiV2ExecutionResponse,\n ExecutionEvent,\n ExecutionResponse,\n StreamEvent,\n} from \"../types.js\";\nimport type { Agent } from \"@superblocksteam/shared\";\n\nexport type ExecuteV2ApiParams = {\n body: ApiV2ExecutionRequest;\n apiName?: string;\n environment: string;\n eventType: string; // TODO(code-mode/api) figure out if we need a type for this, probably not\n notifyOnSystemError: boolean;\n // organization: Organization;\n responseType: ApiResponseType;\n onMessage?: (message: any) => void;\n processStreamEvents?: (event: StreamEvent) => void;\n controlFlowOnlyFiles?: FileRequestParam[];\n abortController?: AbortController;\n baseUrl: string;\n agents: Array<Agent>;\n viewMode: ViewMode;\n accessToken: string;\n token: string;\n traceHeaders?: Record<string, string>;\n};\n\nexport async function executeV2Api(\n params: ExecuteV2ApiParams,\n): Promise<ExecutionResponse | undefined | void> {\n const {\n body,\n apiName,\n controlFlowOnlyFiles,\n notifyOnSystemError,\n eventType,\n onMessage,\n processStreamEvents,\n responseType,\n abortController,\n baseUrl,\n // agents,\n // organization,\n viewMode,\n accessToken,\n token,\n traceHeaders,\n } = params;\n\n let parentContext = context.active();\n\n if (traceHeaders) {\n parentContext = getContextFromTraceHeaders(traceHeaders);\n }\n\n let applicationId = \"unknown\";\n if (\"fetchByPath\" in body) {\n applicationId = body.fetchByPath.applicationId;\n }\n const span = createIframeSpan(\n \"iframe_execute_v2_api\",\n {\n \"api-name\": apiName || \"unknown\",\n \"application-id\": applicationId,\n event_type: eventType,\n response_type: responseType,\n view_mode: viewMode,\n },\n parentContext,\n );\n\n try {\n // Clean the body to handle proxy objects before stringifying\n let cleanedBody: Record<string, any>;\n try {\n cleanedBody = cleanObject(body) as Record<string, any>;\n } catch {\n cleanedBody = structuredClone(body);\n }\n\n if (controlFlowOnlyFiles && controlFlowOnlyFiles.length > 0) {\n cleanedBody = {\n ...cleanedBody,\n files: controlFlowOnlyFiles,\n };\n }\n\n // TODO(code-mode/api) deployed mode\n\n // Inject current trace context for server continuation\n const traceContextHeaders = getTraceContextHeadersFromSpan(span);\n\n const init: RequestInit = {\n method: HttpMethod.Post,\n body: JSON.stringify(cleanedBody),\n signal: abortController?.signal,\n headers: {\n [SUPERBLOCKS_AUTHORIZATION_HEADER]: `Bearer ${accessToken}`,\n Authorization: `Bearer ${token}`,\n [SUPERBLOCKS_REQUEST_ID_HEADER]: generateId(),\n // Include trace context headers for distributed tracing\n ...traceContextHeaders,\n },\n credentials: \"include\" as RequestCredentials,\n };\n\n const result =\n responseType === ApiResponseType.STREAM\n ? await fetchServerStream({\n augmentedInit: init,\n fullUrl: baseUrl,\n // TODO(code-mode/api)\n timeoutId: setTimeout(() => {}, 1000),\n onMessage,\n processStreamEvents,\n })\n : await fetchServer({\n augmentedInit: init,\n fullUrl: baseUrl,\n // TODO(code-mode/api)\n timeoutId: setTimeout(() => {}, 1000),\n });\n\n return result as ExecutionResponse | undefined;\n } catch (err) {\n const message = `Failed to execute ${apiName || \"API\"}. ${err}`;\n\n // https://app.clickup.com/t/8650101/EG-16438\n //this corresponds to \"signal is aborted without reason\" which we should not surface as it happens when switching pages\n const suppressError =\n viewMode !== ViewMode.EDITOR && (err as any)?.code === 20;\n\n if (notifyOnSystemError && !suppressError) {\n // TODO(code-mode/api)\n // sendErrorUINotification({\n // message,\n // });\n console.log(`[internal] [executeV2Api] ${message}`);\n }\n\n // Preserve HTTP status code from HttpError if available\n const statusCode = err instanceof HttpError ? err.code : undefined;\n\n return {\n systemError: message,\n statusCode,\n };\n } finally {\n span.end();\n }\n}\n\nexport const HttpMethod = {\n Get: \"GET\",\n Post: \"POST\",\n Put: \"PUT\",\n Patch: \"PATCH\",\n Delete: \"DELETE\",\n} as const;\n\ntype HttpMethodName = (typeof HttpMethod)[keyof typeof HttpMethod];\n\ntype FileRequestParam = {\n originalName: string;\n buffer: string; // base64 encoded string\n encoding: \"base64\";\n mimetype: \"text/plain\";\n};\n\nexport interface HttpCallOptions extends BaseCallOptions {\n baseUrl?: string;\n // We do not support generic file uploads- only specific /execute calls support this\n controlFlowOnlyFiles?: FileRequestParam[];\n bodyIsFormData?: boolean;\n}\n\ninterface BaseCallOptions {\n method: HttpMethodName;\n url: string;\n body?: Record<string, any>;\n query?: Record<string, string | string[]>;\n params?: Record<string, unknown>;\n timeout?: number;\n abortController?: AbortController;\n // TODO(code-mode/api)\n // diagnosticMetadata?: AgentDiagnosticMetadata;\n // TODO(code-mode/api)\n // responseType?: ApiResponseType;\n headers?: Record<string, string>;\n signal?: AbortSignal;\n priority?: RequestPriority;\n}\n\nexport const stream = async ({\n url,\n headers,\n body,\n onMessage,\n onComplete,\n onError,\n defaultError,\n method,\n baseUrl = \"/api/\",\n signal,\n init: overrideInit,\n}: {\n url: string;\n init?: RequestInit;\n headers?: Record<string, string>;\n body?: Record<string, any>;\n onMessage: (message: any) => void;\n onComplete: () => void;\n onError: (error: string, statusCode?: number) => void;\n defaultError?: string;\n method?: HttpMethodName;\n baseUrl?: string;\n signal?: AbortSignal;\n}): Promise<void> => {\n const init: RequestInit = overrideInit ?? {\n body: JSON.stringify(body),\n headers,\n method,\n };\n try {\n const response = await fetch(`${baseUrl}${url}`, init);\n if (!response.ok) {\n try {\n const parsed = await response.json();\n\n throw new HttpError(\n response.status,\n !response.status || response.status >= 500,\n parsed?.error?.message ??\n parsed?.responseMeta?.error?.message ??\n defaultError,\n );\n } catch (e) {\n if (e instanceof HttpError) {\n throw e;\n }\n //response cannot be parsed to json, throwing http error as it is the cause\n throw new HttpError(\n response.status,\n !response.status || response.status >= 500,\n response.statusText,\n );\n }\n }\n if (!response.body) {\n return;\n }\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let done = false;\n\n let lastChunk = \"\";\n while (!done) {\n if (signal && signal.aborted) {\n return; // Stop processing if the fetch was cancelled\n }\n const { value, done: readerDone } = await reader.read();\n const chunk = lastChunk + decoder.decode(value);\n const messages = chunk.split(\"\\n\");\n\n let jsonValues: { error?: { message: string } }[] = [];\n try {\n jsonValues = messages\n .filter(Boolean)\n .map((message) => JSON.parse(message.trim()));\n // Reset the last chunk if we were able to parse the message\n lastChunk = \"\";\n } catch (e) {\n // If we can't parse the message, it's probably because we only got a partial message\n // Append the chunk to the last chunk and try again next time\n lastChunk = chunk;\n\n // If we fail to parse and the reader is done, then we should throw an error\n // as we won't be able to parse the message\n if (readerDone) {\n throw e;\n }\n }\n\n for (const jsonValue of jsonValues.filter(Boolean)) {\n if (jsonValue?.error) {\n onError(jsonValue.error.message ?? defaultError);\n return;\n }\n onMessage(jsonValue);\n }\n\n done = readerDone && lastChunk === \"\";\n }\n } catch (e: HttpError | TypeError | any) {\n if (e.name === \"AbortError\") {\n console.log(\"[internal] [stream] Fetch was cancelled\");\n } else {\n onError(e.message ?? defaultError, e.code);\n }\n } finally {\n onComplete();\n }\n};\n\ninterface BaseFetchOptions {\n augmentedInit: RequestInit;\n timeoutId: ReturnType<typeof setTimeout>;\n body?: Record<string, any>;\n path?: string;\n // TODO(code-mode/api)\n // diagnosticMetadata?: AgentDiagnosticMetadata;\n // errorHandlingOptions?: ErrorHandlingOptions;\n}\n\ninterface FetchOptions extends BaseFetchOptions {\n fullUrl: string;\n}\n\ninterface StreamingFetchOptions extends FetchOptions {\n onMessage?: (message: any) => void;\n processStreamEvents?: (event: any) => void;\n}\n\nconst fetchServerStream = async ({\n augmentedInit,\n fullUrl,\n timeoutId,\n onMessage,\n processStreamEvents,\n}: StreamingFetchOptions): Promise<void> => {\n const handleMessage = (message: any) => {\n if (message?.result?.event?.data) {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n onMessage && onMessage(message.result.event.data);\n } else if (message?.result?.event?.start || message?.result?.event?.end) {\n // if the message is a start or end message, we want to process it so we can show the live execution results\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n processStreamEvents && processStreamEvents(message);\n }\n };\n\n const onComplete = () => {\n clearTimeout(timeoutId);\n };\n\n const onError = (error: string, statusCode?: number) => {\n // Create error and throw directly - let executeV2Api handle it\n // TODO(Mark): Error handling should not be special for block outputs -\n // we should treat streaming errors the same as non-streaming errors\n if (statusCode != null) {\n throw new HttpError(statusCode, !statusCode || statusCode >= 500, error);\n } else {\n throw new TypeError(error);\n }\n };\n\n return stream({\n url: fullUrl,\n init: augmentedInit,\n onMessage: handleMessage,\n onComplete,\n onError,\n baseUrl: \"\",\n signal: augmentedInit?.signal ?? undefined,\n });\n};\n\nconst getErrorMessageFromObject = (message: object) => {\n const messageJSONString = JSON.stringify(message);\n const regex = /\"message\"\\s*:\\s*\"([^\"]*)\"/;\n const match = regex.exec(messageJSONString);\n return match ? match[1] : messageJSONString;\n};\n\nconst fetchServer = <TResult>({\n augmentedInit,\n fullUrl,\n timeoutId,\n // errorHandlingOptions,\n}: FetchOptions): Promise<TResult> => {\n return fetch(fullUrl, augmentedInit)\n .then(async (response) => {\n try {\n if (response.status === 204) {\n return null;\n }\n const json = await response.json();\n if (response.ok && json) {\n if (json.data == null) {\n return json; // v2 API endpoints do not wrap\n }\n return json.data as TResult;\n } else {\n let message = json.responseMeta?.error?.message ?? json?.message;\n if (typeof message === \"object\") {\n message = getErrorMessageFromObject(message);\n }\n throw new HttpError(\n response.status,\n !response.status || response.status >= 500,\n message,\n );\n }\n } catch (e) {\n //response with json parsed, but has error code\n if (e instanceof HttpError) {\n throw e;\n }\n //response cannot be parsed to json, throwing http error as it is the cause\n throw new HttpError(\n response.status,\n !response.status || response.status >= 500,\n response.statusText,\n );\n }\n })\n .finally(() => clearTimeout(timeoutId));\n};\n\nexport class HttpError extends Error {\n code: number;\n critical: boolean;\n\n constructor(code: number, critical = false, m?: string) {\n super(m);\n this.code = code;\n this.critical = critical;\n }\n}\n\nexport const parseStreamResult = (\n streamResult: Array<StreamEvent>,\n options?: {\n includeFinalOutput?: boolean;\n },\n): undefined | ApiV2ExecutionResponse => {\n if (!streamResult || !Array.isArray(streamResult) || !streamResult.length) {\n return;\n }\n const execution = streamResult[0].result.execution;\n const [errors, events] = streamResult.reduce(\n (accum: [{ message: string }[], ExecutionEvent[]], event) => {\n if (event.result.event.end && event.result.event.end.error) {\n accum[0].push(event.result.event.end.error);\n }\n accum[1].push(event.result.event);\n\n return accum;\n },\n [[], []],\n );\n const result: ApiV2ExecutionResponse = {\n execution,\n events,\n errors,\n status: \"STATUS_COMPLETED\",\n };\n\n if (options?.includeFinalOutput) {\n // Check for a Return block, which should be the api result rather than just the last block\n let returnBlockOutput: ApiV2ExecutionResponse[\"output\"];\n for (let i = 0; i < streamResult.length; i++) {\n const streamEvent = streamResult[i];\n if (\n streamEvent.result.event.type === \"BLOCK_TYPE_RETURN\" &&\n streamEvent.result.event.end\n ) {\n returnBlockOutput = streamEvent.result.event.end\n ?.output as ApiV2ExecutionResponse[\"output\"];\n break;\n }\n }\n if (returnBlockOutput) {\n result.output = returnBlockOutput;\n } else {\n const output = streamResult[streamResult.length - 1].result.event.end\n ?.output as ApiV2ExecutionResponse[\"output\"];\n result.output = output;\n }\n }\n\n return result;\n};\n\nexport const isApiV2ExecutionResponse = (\n response: ExecutionResponse | undefined | void,\n): response is ApiV2ExecutionResponse => {\n return !!response && \"output\" in response && response?.output?.result != null;\n};\n\nexport const decodeBytestringsInV2ExecutionResponse = (\n response: ExecutionResponse,\n) => {\n if (!isApiV2ExecutionResponse(response)) {\n return;\n }\n if (response.output) {\n response.output.result = decodeBytestrings(response.output.result, false);\n }\n if (Array.isArray(response.events)) {\n response.events.forEach((event) => {\n const typedEvent = event as ExecutionEvent;\n if (typedEvent?.end?.output?.result != null) {\n typedEvent.end.output.result = decodeBytestrings(\n typedEvent.end.output.result,\n false,\n );\n }\n });\n }\n};\n","import type { FileMetadataPrivate } from \"@superblocksteam/shared\";\n\ntype FileRequestParam = {\n originalName: string;\n buffer: string;\n encoding: \"base64\";\n mimetype: \"text/plain\";\n};\n\nfunction getFileUploadId(file: File): string {\n const name = file.name.replace(/[^a-zA-Z0-9.-]/g, \"_\");\n const size = file.size;\n const lastModified = file.lastModified;\n\n return `${name}-${size}-${lastModified}`;\n}\n\nfunction getFileInputData(f: File): FileMetadataPrivate {\n const superblocksId = getFileUploadId(f);\n\n const nameParts = f.name.split(\".\");\n const extension = nameParts.length > 1 ? nameParts.pop() || \"\" : \"\";\n\n return {\n $superblocksId: superblocksId,\n name: f.name,\n extension,\n type: f.type,\n size: f.size,\n encoding: \"text\" as const,\n };\n}\n\nasync function formatFileForRequest(\n file: File,\n fileId: string,\n): Promise<FileRequestParam> {\n const base64 = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve((reader.result as string).split(\",\")[1]);\n reader.onerror = () =>\n reject(new Error(reader.error?.message || \"Unknown error reading file\"));\n reader.readAsDataURL(file);\n });\n\n return {\n originalName: fileId,\n buffer: base64,\n encoding: \"base64\" as const,\n mimetype: \"text/plain\" as const,\n };\n}\n\nexport async function getInputsWithFileMetadata(\n inputs: Record<string, unknown>,\n): Promise<{\n inputs: Record<string, unknown>;\n files: Array<FileRequestParam>;\n}> {\n const filesForRequest: Record<string, FileRequestParam> = {};\n\n const processValue = async (value: unknown): Promise<unknown> => {\n // null is something we can send over the HTTP request, undefined is not, and Clark likes to write both\n // null and undefined interchangeably in it's code, so we just need to help it along here.\n if (value === undefined) {\n return null;\n }\n if (value instanceof File) {\n const inputData = getFileInputData(value);\n if (!filesForRequest[inputData.$superblocksId]) {\n filesForRequest[inputData.$superblocksId] = await formatFileForRequest(\n value,\n inputData.$superblocksId,\n );\n }\n return inputData;\n } else if (Array.isArray(value)) {\n return await Promise.all(value.map((item) => processValue(item)));\n } else if (\n typeof value === \"object\" &&\n value != null &&\n value.constructor === Object\n ) {\n return await processObject(value as Record<string, unknown>);\n }\n return value;\n };\n\n const processObject = async (\n obj: Record<string, unknown>,\n ): Promise<Record<string, unknown>> => {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[key] = await processValue(value);\n }\n return result;\n };\n\n const finalInputs = await processObject(inputs);\n return { inputs: finalInputs, files: Object.values(filesForRequest) };\n}\n","type StringEndsWithSlash = `${string}/`;\n\n/**\n * Ensures a base URL has a trailing slash for proper path joining.\n *\n * Without a trailing slash, the URL constructor treats the last segment as a file\n * and replaces it instead of appending:\n *\n * new URL(\"v2/execute\", \"https://example.com/opa\").href\n * = \"https://example.com/v2/execute\" (WRONG - /opa is replaced!)\n *\n * new URL(\"v2/execute\", \"https://example.com/opa/\").href\n * = \"https://example.com/opa/v2/execute\" (CORRECT)\n */\nexport function withTrailingSlash(baseUrl: string): StringEndsWithSlash {\n return baseUrl.endsWith(\"/\")\n ? (baseUrl as StringEndsWithSlash)\n : `${baseUrl}/`;\n}\n","import {\n ApiResponseType,\n OrchestratorViewMode,\n ViewMode,\n} from \"@superblocksteam/shared\";\nimport { action } from \"mobx\";\n// TODO(code-mode): Remove import from edit-mode\nimport { editorBridge } from \"../../../../edit-mode/superblocks-editor-bridge.js\";\nimport { sendNotification } from \"../../../user-facing/utils/notification.jsx\";\nimport { isEditMode } from \"../../is-edit-mode.js\";\nimport { AppMode } from \"../../scope/types.js\";\nimport {\n context as superblocksContext,\n getAppMode,\n} from \"../../superblocks-context.js\";\nimport { addNewPromise } from \"../resolve-id-singleton.js\";\nimport ApiHmrTracker from \"./api-hmr-tracker.js\";\nimport {\n decodeBytestringsInV2ExecutionResponse,\n executeV2Api,\n isApiV2ExecutionResponse,\n parseStreamResult,\n} from \"./api-utils.js\";\nimport { getInputsWithFileMetadata } from \"./file-utils.js\";\nimport { withTrailingSlash } from \"./url-utils.js\";\nimport type { RootStore } from \"../root-store.js\";\nimport type { StreamEvent, ExecutionResponse } from \"../types.js\";\nimport type { ExecuteV2ApiParams } from \"./api-utils.js\";\nimport type {\n DeleteMeLibraryApi,\n SbApiRunOptions,\n} from \"@superblocksteam/library-shared/types\";\n\nexport type ApiResult<T = any> = {\n data?: T;\n error?: string;\n};\n\ntype ApiCallContext = {\n apiId: string;\n apiName: string;\n path: string;\n inputs: Record<string, any>;\n options: SbApiRunOptions;\n callback?: () => Promise<unknown>;\n};\n\ntype InternalExecuteApiParams = {\n apiId: string;\n apiName: string;\n path: string;\n inputs: Record<string, any>;\n options: SbApiRunOptions;\n callId?: string;\n callback?: () => Promise<unknown>;\n isTestRun?: boolean;\n injectedCallerId?: string; // EDIT MODE ONLY\n};\n\nclass ApiManager {\n private _agentUrls: string[] = [];\n private token: string | undefined;\n private accessToken: string | undefined;\n private runningApiControllers: Record<string, AbortController> = {};\n private waitForInitApiPromise: Promise<void> | undefined = undefined;\n private waitForBootstrapPromise: Promise<void> | undefined = undefined;\n private resolveBootstrapPromise: (() => void) | undefined = undefined;\n // Store call contexts for re-running APIs from the editor\n private callContexts: Record<string, ApiCallContext> = {};\n\n constructor(readonly rootStore: RootStore) {\n this.waitForBootstrapPromise = new Promise((resolve) => {\n this.resolveBootstrapPromise = resolve;\n });\n }\n\n set agentUrls(urls: string[]) {\n this._agentUrls = urls;\n }\n\n setTokens(token: string, accessToken: string) {\n this.token = token;\n this.accessToken = accessToken;\n }\n isInitialized() {\n return !!this.token && !!this.accessToken;\n }\n\n /**\n * Selects a random agent URL from the available agents and returns it normalized\n * (with trailing slash) to ensure proper URL path joining.\n */\n private getRandomAgentBaseUrl(): string | undefined {\n if (!this._agentUrls.length) {\n return undefined;\n }\n const agentUrl =\n this._agentUrls[Math.floor(Math.random() * this._agentUrls.length)];\n return withTrailingSlash(agentUrl);\n }\n\n private async awaitInitApiIfNeeded() {\n if (this.waitForInitApiPromise) {\n await this.waitForInitApiPromise;\n }\n }\n\n private async awaitBootstrapIfNeeded() {\n if (this.waitForBootstrapPromise) {\n await this.waitForBootstrapPromise;\n }\n }\n\n notifyBootstrapComplete() {\n if (this.resolveBootstrapPromise) {\n this.resolveBootstrapPromise();\n }\n }\n\n loadApiManifest({\n apis = {},\n }: {\n apis?: Record<string, { api: DeleteMeLibraryApi; scopeId: string }>;\n }) {\n const apisToSet: Array<DeleteMeLibraryApi & { scopeId: string }> =\n Object.values(apis).map(({ api, scopeId }) => {\n api.apiPb.metadata.id = api.apiPb.metadata.name; // TODO get rid of this once SABS is updated\n return {\n ...api,\n scopeId,\n };\n });\n\n const waitForInitApiPromise = new Promise((resolve) => {\n const callbackId = addNewPromise(resolve);\n window.parent.postMessage(\n {\n type: \"set-apis-deployed-mode\",\n payload: {\n apis: apisToSet,\n callbackId,\n },\n },\n \"*\",\n );\n });\n\n this.waitForInitApiPromise = waitForInitApiPromise as Promise<void>;\n }\n\n @action\n async rerunApiByCallId(callId: string): Promise<ApiResult> {\n const context = this.callContexts[callId];\n if (!context) {\n console.error(`No call context found for callId: ${callId}`);\n throw new Error(`No call context found for callId: ${callId}`);\n }\n\n // If a callback is available, invoke it to trigger the original state updates\n // The callback will internally call runApiByPath with the same callId and callback\n if (context.callback) {\n await context.callback();\n return { data: undefined, error: undefined };\n }\n\n // Fallback to direct execution if no callback\n // Pass the original callId so we don't create a new run record\n const result = await this.executeApi({\n apiId: context.apiId,\n apiName: context.apiName,\n path: context.path,\n inputs: context.inputs,\n options: context.options,\n callId, // Reuse the same callId\n callback: undefined, // No callback for fallback execution\n });\n\n return { data: result.data, error: result.error };\n }\n\n @action\n async runApiByPath({\n path,\n inputs,\n callId,\n callback,\n isTestRun,\n injectedCallerId,\n }: {\n path: string;\n inputs: SbApiRunOptions;\n callId?: string;\n callback?: () => Promise<unknown>;\n isTestRun?: boolean;\n injectedCallerId?: string;\n }): Promise<ApiResult> {\n console.debug(\"[api-store.runApiByPath] Called with:\", {\n path,\n inputs,\n callId,\n isTestRun,\n hasCallback: !!callback,\n });\n\n await this.awaitInitApiIfNeeded();\n await this.awaitBootstrapIfNeeded();\n\n // take name on /apis/<name>/api.yaml\n const apiName = path.match(/^\\/apis\\/([^/]+)\\/api\\.yaml$/)?.[1];\n if (!apiName) {\n console.error(\"[api-store] Invalid path:\", path);\n throw new Error(`Invalid path: ${path}`);\n }\n\n console.debug(\"[api-store.runApiByPath] Extracted apiName:\", apiName);\n\n editorBridge.setApiStarted(apiName);\n\n console.debug(\"[api-store.runApiByPath] Executing API internally...\");\n\n const result = await this.executeApi({\n apiId: apiName,\n apiName,\n path,\n inputs: inputs,\n options: inputs ?? {},\n callId,\n isTestRun,\n callback,\n injectedCallerId,\n });\n\n console.debug(\n \"[api-store.runApiByPath] Execution complete, calling setApiResponse for:\",\n apiName,\n );\n editorBridge.setApiResponse(apiName, result.parsedResult);\n\n return { data: result.data, error: result.error };\n }\n\n private getHMRCallHash(params: InternalExecuteApiParams): string {\n return `${params.injectedCallerId ?? \"\"}-${params.apiId}`;\n }\n\n private getCachedHMRExecution(params: InternalExecuteApiParams): null | {\n parsedResult: ExecutionResponse | undefined;\n data: any;\n error: string | undefined;\n } {\n if (params.callId) {\n return null;\n }\n\n const hmrCallHash = this.getHMRCallHash(params);\n if (ApiHmrTracker.shouldSkipRun(hmrCallHash)) {\n const result = ApiHmrTracker.getCachedResult(hmrCallHash);\n if (result) {\n return result as any;\n }\n }\n return null;\n }\n\n private async executeApi(params: InternalExecuteApiParams): Promise<{\n parsedResult: ExecutionResponse | undefined;\n data: any;\n error: string | undefined;\n }> {\n if (isEditMode()) {\n const cachedResult = this.getCachedHMRExecution(params);\n if (cachedResult) {\n console.debug(\"[api-store] Using cached result\", params);\n return cachedResult;\n }\n const result = await this.executeApiInternal(params);\n ApiHmrTracker.setResult(this.getHMRCallHash(params), result);\n return result;\n }\n\n return this.executeApiInternal(params);\n }\n\n private async executeApiInternal({\n apiId,\n apiName,\n path,\n inputs,\n options,\n callId: providedCallId,\n callback,\n isTestRun,\n }: InternalExecuteApiParams): Promise<{\n parsedResult: ExecutionResponse | undefined;\n data: any;\n error: string | undefined;\n }> {\n const executionStartTime = Date.now();\n const callId =\n providedCallId ??\n `${apiId}-${executionStartTime}-${Math.random().toString(36).substr(2, 9)}`;\n\n // If this is a re-run (callId already exists), set loading state\n const isRerun = !!this.callContexts[callId];\n if (isRerun) {\n editorBridge.updateApiRunRecord(apiId, callId, {\n loading: true,\n });\n }\n\n if (!this.rootStore.applicationId) {\n sendNotification({\n message:\n \"No application ID was found, ensure the app was bootstrap correctly.\",\n type: \"error\",\n });\n return {\n parsedResult: {\n status: \"STATUS_COMPLETED\",\n execution: \"\",\n errors: [\n {\n message:\n \"No application ID was found, ensure the app was bootstrap correctly.\",\n },\n ],\n },\n data: null,\n error: \"No application ID was found\",\n };\n }\n\n if (!this._agentUrls.length) {\n sendNotification({\n message: \"No active agent found\",\n type: \"error\",\n });\n return {\n parsedResult: {\n status: \"STATUS_COMPLETED\",\n execution: \"\",\n errors: [{ message: \"No active agent found\" }],\n },\n data: null,\n error: \"No active agent found\",\n };\n }\n\n const agentBaseUrl = this.getRandomAgentBaseUrl()!;\n const orchestratorUrl = new URL(\"v2/execute\", agentBaseUrl).href;\n\n const profileKey = superblocksContext.profiles?.selected?.key ?? \"staging\";\n const profileId = superblocksContext.profiles?.selected?.id ?? \"\";\n\n const events: Array<StreamEvent> = [];\n\n await this.rootStore.editStore?.operationManager.ensureFilesSynced();\n\n // Create abort controller for this API execution\n const abortController = new AbortController();\n this.runningApiControllers[apiName] = abortController;\n\n const editMode = isEditMode();\n\n // Determine the actual view mode for profile restrictions\n const appMode = getAppMode();\n const orchestratorViewMode =\n appMode === AppMode.PREVIEW\n ? OrchestratorViewMode.PREVIEW\n : appMode === AppMode.PUBLISHED\n ? OrchestratorViewMode.DEPLOYED\n : OrchestratorViewMode.EDIT;\n\n // TODO when we support streaming - this should come from the API config\n // Right now we only stream in edit mode in order to support the API editor\n const isStream = editMode ? true : false;\n\n const waitForAuthPromise = new Promise((resolve) => {\n const callbackId = addNewPromise(resolve);\n window.parent.postMessage(\n {\n type: \"authenticate-api-request\",\n payload: {\n apiId,\n callbackId,\n },\n },\n \"*\",\n );\n });\n const authResult: any = await waitForAuthPromise;\n // TODO do something with authResult.errors\n if (authResult?.errors && authResult.errors.length > 0) {\n console.error(\n \"API Authentication returned with errors\",\n authResult.errors,\n );\n }\n\n const { traceHeaders, ...restArgs } = options;\n\n const { inputs: finalInputs, files } = await getInputsWithFileMetadata({\n ...restArgs,\n ...inputs,\n });\n\n // Determine which commitId/branchName to send based on view mode:\n // - EDIT mode (1): send branchName=\"main\"\n // - PREVIEW mode (2): extract commitId from URL query params\n // - DEPLOYED mode (3): send branchName=\"main\" (orchestrator needs it to construct URL, server will ignore and lookup deployedCommitId)\n const fetchByPathParams: {\n path: string;\n applicationId: string;\n commitId?: string;\n branchName?: string;\n profile: { name: string; id: string };\n viewMode: OrchestratorViewMode;\n } = {\n path,\n applicationId: this.rootStore.applicationId ?? \"\",\n profile: {\n name: profileKey,\n id: profileId,\n },\n viewMode: orchestratorViewMode,\n };\n\n // Add commitId or branchName based on mode\n if (orchestratorViewMode === OrchestratorViewMode.EDIT) {\n // EDIT mode: use branch name\n fetchByPathParams.branchName = \"main\";\n } else if (orchestratorViewMode === OrchestratorViewMode.PREVIEW) {\n // PREVIEW mode: extract commitId from URL\n const urlParams = new URLSearchParams(window.location.search);\n const commitId = urlParams.get(\"commitId\");\n if (commitId) {\n fetchByPathParams.commitId = commitId;\n } else {\n fetchByPathParams.branchName = \"main\";\n }\n } else if (orchestratorViewMode === OrchestratorViewMode.DEPLOYED) {\n // DEPLOYED mode: send branchName so orchestrator knows what URL to call\n // Server will ignore it and lookup deployedCommitId based on viewMode=3\n fetchByPathParams.branchName = \"main\";\n }\n\n const syncResponse = await executeV2Api({\n body: {\n inputs: finalInputs,\n fetchByPath: fetchByPathParams,\n options: {\n includeEventOutputs: editMode,\n includeEvents: isStream || editMode,\n includeResolved: editMode,\n },\n },\n apiName,\n controlFlowOnlyFiles: files,\n environment: profileKey,\n eventType: \"api\",\n notifyOnSystemError: true,\n responseType: isStream ? ApiResponseType.STREAM : ApiResponseType.SYNC,\n baseUrl: isStream ? orchestratorUrl + \"/stream\" : orchestratorUrl,\n agents: [],\n viewMode: editMode ? ViewMode.EDITOR : ViewMode.DEPLOYED,\n accessToken: this.accessToken ?? \"\",\n token: this.token ?? \"\",\n traceHeaders: traceHeaders,\n abortController,\n onMessage: (message: any) => {\n editorBridge.sendStreamedApiMessage(message, apiName);\n },\n processStreamEvents: (event: StreamEvent) => {\n events.push(event);\n editorBridge.sendStreamedApiEvent(event, apiName);\n },\n } satisfies ExecuteV2ApiParams);\n\n const parsedResult =\n (isStream\n ? (parseStreamResult(events, {\n includeFinalOutput: true,\n }) ?? syncResponse) // Fall back to syncResponse if stream had no events (e.g., early error)\n : syncResponse) ?? undefined;\n\n if (parsedResult) {\n decodeBytestringsInV2ExecutionResponse(parsedResult);\n }\n\n delete this.runningApiControllers[apiName];\n\n const error = this.findError(parsedResult ?? undefined);\n const data = isApiV2ExecutionResponse(parsedResult)\n ? parsedResult?.output?.result\n : null;\n\n const executionEndTime = Date.now();\n const timeTaken = executionEndTime - executionStartTime;\n\n this.callContexts[callId] = {\n apiId,\n apiName,\n path,\n inputs,\n options,\n callback,\n };\n\n if (isRerun) {\n editorBridge.updateApiRunRecord(apiId, callId, {\n timestamp: executionStartTime,\n statusCode: this.extractStatusCode(parsedResult),\n timeTaken,\n inputs,\n response: data,\n error,\n loading: false,\n isTestRun,\n });\n } else {\n editorBridge.addApiRunRecord(apiId, {\n id: `${apiId}-${executionStartTime}`,\n callId,\n timestamp: executionStartTime,\n statusCode: this.extractStatusCode(parsedResult),\n timeTaken,\n inputs,\n response: data,\n error,\n loading: false,\n isTestRun,\n });\n }\n\n return { parsedResult, data, error };\n }\n\n private findError(apiResponse?: ExecutionResponse): string | undefined {\n if (apiResponse && \"systemError\" in apiResponse) {\n // For client errors (4xx), show the error message in run records\n // For server errors (5xx) or network errors, don't show in run records\n // (they're framework/infrastructure errors, not API business logic errors)\n const statusCode = apiResponse.statusCode ?? 500;\n if (statusCode >= 400 && statusCode < 500) {\n return apiResponse.systemError;\n }\n return undefined;\n }\n\n const firstUnhandledError = apiResponse?.errors?.find(\n (error) => !error?.handled,\n );\n\n if (!firstUnhandledError) {\n return undefined;\n }\n return `Error in API: ${firstUnhandledError?.message}`;\n }\n\n private extractStatusCode(response?: ExecutionResponse): number {\n if (!response) return 500;\n if (\"systemError\" in response) {\n // Use the actual HTTP status code if available, otherwise default to 500\n return response.statusCode ?? 500;\n }\n if (\"errors\" in response && response.errors && response.errors.length > 0) {\n // Check if the error has a status code in extensions (GraphQL-style errors)\n const firstError = response.errors[0];\n\n // Try structured fields first\n let statusCode =\n (firstError as any)?.extensions?.statusCode ??\n (firstError as any)?.extensions?.http?.status;\n\n // If not found, try parsing from the message string\n if (!statusCode && (firstError as any)?.message) {\n const message = (firstError as any).message as string;\n // Look for \"status code XXX\" pattern\n const match = message.match(/status code (\\d+)/i);\n if (match) {\n statusCode = parseInt(match[1], 10);\n }\n }\n\n if (statusCode) {\n return statusCode;\n }\n return 500;\n }\n if (\"status\" in response && response.status === \"STATUS_COMPLETED\")\n return 200;\n return 500;\n }\n\n @action\n async cancelApi(apiName: string, _scopeId?: string) {\n const abortController = this.runningApiControllers[apiName];\n\n if (!abortController) {\n console.warn(`No running API execution found for ${apiName}`);\n return;\n }\n\n // Abort the HTTP request\n abortController.abort();\n delete this.runningApiControllers[apiName];\n\n // Notify editor bridge of cancellation\n editorBridge.setApiResponse(apiName, {\n status: \"STATUS_CANCELLED\",\n execution: null,\n events: [],\n errors: [{ message: \"API execution was cancelled\" }],\n output: null,\n });\n }\n}\n\nexport default ApiManager;\n","import { toJS } from \"mobx\";\nimport type {\n Entity,\n ScopedState,\n} from \"@superblocksteam/library-shared/types\";\n\n// Cache for previous entity values to provide fallbacks when suspense is disabled\nconst objectFallbackCache = new WeakMap<object, Record<string, any>>();\n\nfunction sanitizeObject<T extends object>(obj: T): T {\n // Get or create fallback cache for this entity\n if (!objectFallbackCache.has(obj)) {\n objectFallbackCache.set(obj, {});\n }\n const fallbackCache = objectFallbackCache.get(obj)!;\n\n return new Proxy(obj, {\n get(target, prop) {\n try {\n const value = target[prop as keyof T];\n // Cache successful access for future fallback\n if (typeof prop === \"string\") {\n fallbackCache[prop] = value;\n }\n return value;\n } catch (error) {\n if (error instanceof Promise) {\n // Return cached value or undefined instead of throwing promise\n return typeof prop === \"string\" ? fallbackCache[prop] : undefined;\n }\n throw error;\n }\n },\n }) as T;\n}\n\nfunction sanitizeEntity<T extends Entity>(entity: T): T {\n return sanitizeObject(entity);\n}\n\nfunction sanitizeScopedState(state: ScopedState): ScopedState {\n return new Proxy(state, {\n get(target, prop) {\n const value = target[prop as keyof ScopedState];\n if (value && typeof value === \"object\" && \"type\" in value) {\n // This looks like an entity, sanitize it\n return sanitizeObject(value);\n }\n return value;\n },\n });\n}\n\nfunction sanitizedToJS<T>(value: T): T {\n if (value === null || value === undefined || typeof value !== \"object\") {\n return toJS(value);\n }\n return toJS(sanitizeObject(value));\n}\n\nexport { sanitizeObject, sanitizeEntity, sanitizeScopedState, sanitizedToJS };\n","import { pathStringToArray } from \"@superblocksteam/library-shared\";\nimport diff, { type Difference } from \"microdiff\";\nimport { isReactElement } from \"../../lib/utils/clean-object.js\";\nimport type { MobXPatch } from \"@superblocksteam/library-shared/types\";\n\nexport const microPatches = (\n oldValue: any,\n newValue: any,\n baseStr: string,\n): MobXPatch[] => {\n const cleanedOldValue = removeBindAndReactElements(oldValue);\n const cleanedNewValue = removeBindAndReactElements(newValue);\n if (cleanedOldValue === undefined) {\n return [\n {\n op: \"add\",\n path: pathStringToArray(baseStr),\n value: cleanedNewValue,\n },\n ];\n }\n\n // Handle primitive value changes that microdiff can't handle (microdiff only supports arrays, objects and other builtins like Regex, Date, etc.)\n if (isPrimitive(cleanedOldValue) || isPrimitive(cleanedNewValue)) {\n if (cleanedOldValue !== cleanedNewValue) {\n return [\n {\n op: \"update\",\n path: pathStringToArray(baseStr),\n value: cleanedNewValue,\n } as const,\n ] satisfies MobXPatch[];\n }\n return []; // No change\n }\n\n const diffs = diff(cleanedOldValue, cleanedNewValue);\n const basePath = pathStringToArray(baseStr);\n return diffs.map((diff) => toMobXPatchFromMicroDiff(diff, basePath));\n};\n\nfunction isPrimitive(value: any): boolean {\n return (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n typeof value === \"undefined\"\n );\n}\n\nfunction toMobXPatchFromMicroDiff(\n diff: Difference,\n basePath: (string | number)[],\n): MobXPatch {\n const type = diff.type;\n const fullPath = [...basePath, ...diff.path];\n\n switch (type) {\n case \"CREATE\":\n return {\n op: \"add\",\n path: fullPath,\n value: diff.value,\n } satisfies MobXPatch;\n case \"CHANGE\": {\n return {\n op: \"update\",\n path: fullPath,\n value: diff.value,\n } satisfies MobXPatch;\n }\n case \"REMOVE\":\n return {\n op: \"remove\",\n path: fullPath,\n } satisfies MobXPatch;\n default:\n throw new Error(`Unhandled diff type: ${type}`);\n }\n}\n\nconst removeBindAndReactElements = (value: any): any => {\n if (!value || typeof value !== \"object\") {\n return value;\n }\n if (isReactElement(value)) {\n return undefined;\n }\n if (Array.isArray(value)) {\n return value.map(removeBindAndReactElements);\n }\n return Object.fromEntries(\n Object.entries(value).map(([key, value]) => {\n if (key === \"bind\") {\n return [key, undefined];\n }\n return [key, removeBindAndReactElements(value)];\n }),\n );\n};\n","import {\n observe,\n isObservableMap,\n isObservableObject,\n isObservableArray,\n values,\n entries,\n} from \"mobx\";\nimport type { IObjectDidChange, IArrayDidChange, IMapDidChange } from \"mobx\";\n\nexport type IDisposer = () => void;\n\ntype IChange = IObjectDidChange | IArrayDidChange | IMapDidChange;\n\ntype Entry = {\n dispose: IDisposer;\n path: string;\n parent: Entry | undefined;\n};\n\nexport type ObserveListener<T> = (\n change: IChange,\n path: string,\n root: T,\n) => void;\n\nfunction buildPath(entry: Entry | undefined): string {\n if (!entry) return \"ROOT\";\n const res: string[] = [];\n while (entry.parent) {\n res.push(entry.path);\n entry = entry.parent;\n }\n return res.reverse().join(\"/\");\n}\n\nfunction isRecursivelyObservable(thing: any) {\n return (\n isObservableObject(thing) ||\n isObservableArray(thing) ||\n isObservableMap(thing)\n );\n}\n\n/**\n * Given an object, deeply observes the given object.\n * It is like `observe` from mobx, but applied recursively, including all future children.\n *\n * Note that the given object cannot ever contain cycles and should be a tree.\n *\n * As benefit: path and root will be provided in the callback, so the signature of the listener is\n * (change, path, root) => void\n *\n * The returned disposer can be invoked to clean up the listener\n *\n * deepObserve cannot be used on computed values.\n *\n * @example\n * const disposer = deepObserve(target, (change, path) => {\n * console.dir(change)\n * })\n */\nexport function deepObserve<T = any>(\n target: T,\n listener: ObserveListener<T>,\n): IDisposer {\n const entrySet = new WeakMap<any, Entry>();\n\n function genericListener(change: IChange) {\n const entry = entrySet.get(change.object)!;\n processChange(change, entry);\n listener(change, buildPath(entry), target);\n }\n\n function processChange(change: IChange, parent: Entry) {\n switch (change.type) {\n // Object changes\n case \"add\": // also for map\n observeRecursively(change.newValue, parent, change.name);\n break;\n case \"update\": // also for array and map\n unobserveRecursively(change.oldValue);\n observeRecursively(\n change.newValue,\n parent,\n (change as any).name || \"\" + (change as any).index,\n );\n break;\n case \"remove\": // object\n case \"delete\": // map\n unobserveRecursively(change.oldValue);\n break;\n // Array changes\n case \"splice\":\n change.removed.map(unobserveRecursively);\n change.added.forEach((value, idx) =>\n observeRecursively(value, parent, \"\" + (change.index + idx)),\n );\n // update paths\n for (\n let i = change.index + change.addedCount;\n i < change.object.length;\n i++\n ) {\n if (isRecursivelyObservable(change.object[i])) {\n const entry = entrySet.get(change.object[i]);\n if (entry) entry.path = \"\" + i;\n }\n }\n break;\n }\n }\n\n function observeRecursively(\n thing: any,\n parent: Entry | undefined,\n path: string,\n ) {\n if (isRecursivelyObservable(thing)) {\n const entry = entrySet.get(thing);\n if (entry) {\n if (entry.parent !== parent || entry.path !== path)\n // MWE: this constraint is artificial, and this tool could be made to work with cycles,\n // but it increases administration complexity, has tricky edge cases and the meaning of 'path'\n // would become less clear. So doesn't seem to be needed for now\n throw new Error(\n `The same observable object cannot appear twice in the same tree,` +\n ` trying to assign it to '${buildPath(parent)}/${path}',` +\n ` but it already exists at '${buildPath(entry.parent)}/${entry.path}'`,\n );\n } else {\n const entry = {\n parent,\n path,\n dispose: observe(thing, genericListener),\n };\n entrySet.set(thing, entry);\n entries(thing).forEach(([key, value]) =>\n observeRecursively(value, entry, \"\" + key),\n );\n }\n }\n }\n\n function unobserveRecursively(thing: any) {\n if (isRecursivelyObservable(thing)) {\n const entry = entrySet.get(thing);\n if (!entry) return;\n entrySet.delete(thing);\n entry.dispose();\n values(thing).forEach(unobserveRecursively);\n }\n }\n\n observeRecursively(target, undefined, \"\");\n\n return () => {\n unobserveRecursively(target);\n };\n}\n","import { toMobXPatch } from \"@superblocksteam/library-shared\";\nimport { pick } from \"lodash\";\nimport { isComputedProp, reaction } from \"mobx\";\nimport { isEditMode } from \"../../lib/internal-details/is-edit-mode.js\";\nimport { sanitizedToJS } from \"../../lib/internal-details/lib/evaluator/sanitize-object.js\";\nimport { editorBridge } from \"../superblocks-editor-bridge.js\";\nimport { microPatches } from \"./create-patch.js\";\nimport { deepObserve } from \"./deep-observe.js\";\nimport type { IDisposer } from \"./deep-observe.js\";\nimport type { KeyToState } from \"@superblocksteam/library-shared/types\";\nimport type { IReactionOptions } from \"mobx\";\n\nexport interface MobXEditorSyncOptions<\n SID extends keyof KeyToState = keyof KeyToState,\n OUTPUT extends KeyToState[SID] = KeyToState[SID],\n STORE = OUTPUT,\n> {\n /* A unique identifier to ensure only the intended target receives these messages */\n storeId: SID & string;\n\n /* The observable store to sync (pass your data-only store) */\n store: STORE;\n\n /**\n * A function that takes the store and returns a view/projection of the store.\n * This is useful for syncing only a subset of the store in a different shape.\n */\n projection?: (store: STORE) => OUTPUT;\n\n /**\n * When provided, only patches under these keys are forwarded.\n * Other changes are dropped.\n */\n keys?: Record<keyof OUTPUT, true>;\n\n /**\n * Debounce time in milliseconds.\n */\n debounce?: number;\n}\n\n/**\n * Syncs a mobx store to the editor automatically through postmessage\n */\nexport function startEditorSync<\n SID extends keyof KeyToState = keyof KeyToState,\n OUTPUT extends KeyToState[SID] = KeyToState[SID],\n STORE = any,\n>(options: MobXEditorSyncOptions<SID, OUTPUT, STORE>): () => void {\n if (!isEditMode()) {\n return () => {};\n }\n\n const { store, storeId, keys, projection, debounce } = options;\n\n const reactionOptions: IReactionOptions<any, boolean> = {\n delay: debounce,\n name: `editor-sync(${storeId})`,\n };\n\n // Send the initial state to the editor\n let initialState: OUTPUT;\n if (keys) {\n const p = pick(store, Object.keys(keys));\n initialState = sanitizedToJS(p as unknown as OUTPUT);\n } else if (projection) {\n initialState = sanitizedToJS(projection(store));\n } else {\n initialState = sanitizedToJS(store as unknown as OUTPUT);\n }\n\n editorBridge.initializeEditorSyncedStore({\n storeId,\n initialState,\n });\n\n // Are we using selectors?\n if (projection) {\n // Re-evaluate projection for each key in each reaction:\n const initialProjection = projection(store);\n const projectionKeys = Object.keys(initialProjection);\n const createDisposer = (key: string) => {\n let lastValue: unknown;\n\n return reaction(\n () => {\n const currentProjection = projection(store);\n return sanitizedToJS(currentProjection[key as keyof OUTPUT]);\n },\n (value) => {\n const diffs = microPatches(lastValue, value, key);\n lastValue = value;\n const isSame = diffs.length === 0;\n if (!isSame) {\n editorBridge.updateEditorSyncedStore({\n storeId,\n patch: diffs,\n });\n }\n },\n reactionOptions,\n );\n };\n\n const projectionDisposers = projectionKeys.reduce(\n (acc, key) => {\n const disposer = createDisposer(key);\n acc[key] = disposer;\n return acc;\n },\n {} as Record<string, IDisposer>,\n );\n // add a disposer for the keys of the entire projection\n const projectionKeysDisposer = reaction(\n () => Object.keys(projection(store)),\n (newKeys: string[]) => {\n const lastKeys = Object.keys(projectionDisposers);\n const deletedKeys = lastKeys.filter((key) => !newKeys.includes(key));\n const addedKeys = newKeys.filter((key) => !lastKeys.includes(key));\n\n // Add new keys\n addedKeys.forEach((key) => {\n projectionDisposers[key] = createDisposer(key);\n // send an initial patch to the editor to create the key\n editorBridge.updateEditorSyncedStore({\n storeId,\n patch: {\n op: \"update\",\n path: [key],\n value: sanitizedToJS(projection(store)[key as keyof OUTPUT]),\n },\n });\n });\n\n // dispose of any keys that are no longer in the projection\n deletedKeys.forEach((key) => {\n projectionDisposers[key]();\n delete projectionDisposers[key];\n editorBridge.updateEditorSyncedStore({\n storeId,\n patch: {\n op: \"remove\",\n path: [key],\n },\n });\n });\n },\n reactionOptions,\n );\n return () => {\n projectionKeysDisposer();\n Object.values(projectionDisposers).forEach((disposer) => disposer());\n };\n }\n\n // Get all computed keys, as they are not observable by deepObserve\n const keyArr = Object.keys(keys ?? (store as any));\n const computedKeys = keyArr.filter((key) => isComputedProp(store, key));\n const observableKeys = keyArr.filter((key) => !computedKeys.includes(key));\n const disposers: IDisposer[] = [];\n // Create a reaction for each computed key\n const computedDisposers = computedKeys.map((key) =>\n reaction(\n () => store[key as keyof STORE],\n (value) => {\n editorBridge.updateEditorSyncedStore({\n storeId,\n patch: {\n op: \"update\",\n path: [key],\n value,\n },\n });\n },\n reactionOptions,\n ),\n );\n disposers.push(...computedDisposers);\n\n // We must deepObserve if there are non-computed keys,\n // We must also deepObserve if keys are NOT supplied, because new keys may be added\n const hasNonComputedKeys = observableKeys.length > 0;\n const userRestrictedToKeys = keys !== undefined;\n if (hasNonComputedKeys || !userRestrictedToKeys) {\n const deepDisposer = deepObserve(store, (change, pathStr) => {\n // Convert change to patch using utility function\n const patch = toMobXPatch(change, pathStr);\n if (keys && !keys[patch.path[0] as keyof OUTPUT]) {\n return;\n }\n\n // Post the patch along with the unique channelId.\n try {\n editorBridge.updateEditorSyncedStore({\n storeId,\n patch,\n });\n } catch (error) {\n console.error(\n `[startEditorSync][${storeId}] Failed to send patch:`,\n error,\n );\n }\n });\n disposers.push(deepDisposer);\n }\n\n return () => {\n disposers.forEach((disposer) => disposer());\n };\n}\n","import type { ManagedProp } from \"../../../user-facing/properties-panel/props-builder\";\nimport type { EntityDefinition } from \"@superblocksteam/library-shared/props\";\n\nexport const analyzePropertyType = (\n propData: ManagedProp,\n prop: any,\n): EntityDefinition[\"props\"][string][\"dataType\"] => {\n let dataType: EntityDefinition[\"props\"][string][\"dataType\"];\n\n if (\n propData.dataType === \"composite\" &&\n prop &&\n typeof prop.getProps === \"function\"\n ) {\n const nestedProps = prop.getProps();\n const objectFields: Record<string, any> = {};\n\n // Recursively analyze nested properties\n for (const [key, nestedProp] of Object.entries(nestedProps)) {\n if (nestedProp && typeof (nestedProp as any).build === \"function\") {\n const nestedPropData = (nestedProp as any).build();\n if (nestedPropData && nestedPropData.isExternallyReadable) {\n const nestedAnalysis = analyzePropertyType(\n nestedPropData,\n nestedProp,\n );\n objectFields[key] = nestedAnalysis;\n }\n }\n }\n\n // If we have readable nested properties, use the object structure as the dataType\n if (Object.keys(objectFields).length > 0) {\n dataType = objectFields;\n }\n } else if (propData.dataType === \"dimension\") {\n dataType = {\n mode: \"string\", // \"px\" | \"fit\" | \"fill\" | \"%\" | \"columns\" | \"rows\"\n value: \"number\", // Optional numeric value\n };\n } else if (\n propData.dataType === \"string\" ||\n propData.dataType === \"number\" ||\n propData.dataType === \"boolean\" ||\n propData.dataType === \"array\" ||\n propData.dataType === \"function\"\n ) {\n dataType =\n propData.dataType as EntityDefinition[\"props\"][string][\"dataType\"];\n } else {\n dataType = \"unknown\";\n }\n\n return dataType;\n};\n","import { makeAutoObservable } from \"mobx\";\nimport { startEditorSync } from \"../../../../edit-mode/mobx-sync/mobx-editor-sync.js\";\nimport { RECORD_PATH_IDENTIFIER } from \"../../../user-facing/properties-panel/create-managed-props-list.js\";\nimport { analyzePropertyType } from \"./type-defs-utils.js\";\nimport type {\n ManagedPropsList,\n PropertiesDefinition,\n Prop,\n} from \"../../../user-facing/properties-panel/props-builder.js\";\nimport type { EditorTemplate } from \"../../sb-wrapper.jsx\";\nimport type { RootStore } from \"../root-store.js\";\nimport type { EntityDefinition } from \"@superblocksteam/library-shared/props\";\nimport type {\n ComponentRegistryShareState,\n CatalogWithInternalDetails,\n EditorConfig,\n} from \"@superblocksteam/library-shared/types\";\nimport type * as React from \"react\";\n\nexport type DefaultTagNames = {\n container: string;\n button: string;\n text: string;\n};\n\n/**\n * Metadata stored for each registered component\n */\ntype ComponentMetadata = {\n type: string;\n propertiesDefinition: PropertiesDefinition;\n managedProps: ManagedPropsList;\n internalProps: Array<{ path: string; factory: () => any }>;\n editorTemplates: Array<EditorTemplate<any>>;\n editorConfig?: EditorConfig;\n};\n\n/**\n * TODO: The component registry could be split into two a thin layer always on, and move some stuff to the EditStore.\n * Some of the actions (rename, delete) and some of the data (isDroppable) are editor-only.\n */\nexport class ComponentRegistry implements ComponentRegistryShareState {\n // Primary registry: component type name (e.g., \"Badge\") -> all metadata\n // This is the main lookup path since most operations start with the type string\n private _componentRegistry = new Map<string, ComponentMetadata>();\n\n // Reverse index: raw component function -> component type name\n // Used only for component identity checking (isSbComponent)\n private _componentToType = new WeakMap<React.ComponentType<any>, string>();\n\n private _defaultContainerType: string | undefined;\n private _defaultButtonType: string | undefined;\n private _defaultTextType: string | undefined;\n\n constructor(readonly rootStore: RootStore) {\n makeAutoObservable(this);\n\n startEditorSync({\n store: this,\n storeId: \"component-registry\",\n keys: {\n customComponentList: true,\n libraryComponentCatalogs: true,\n libraryComponentEditorConfigs: true,\n entityDefinitions: true,\n },\n });\n }\n\n private getOrCreateMetadata(type: string): ComponentMetadata {\n let metadata = this._componentRegistry.get(type);\n if (!metadata) {\n metadata = {\n type,\n propertiesDefinition: {} as PropertiesDefinition,\n managedProps: [],\n internalProps: [],\n editorTemplates: [],\n editorConfig: undefined,\n };\n this._componentRegistry.set(type, metadata);\n }\n return metadata;\n }\n\n addComponent(\n type: string,\n rawComponent: React.ElementType,\n propertiesDefinition: PropertiesDefinition,\n ) {\n const metadata = this.getOrCreateMetadata(type);\n metadata.propertiesDefinition = propertiesDefinition;\n\n // Only add to WeakMap if it's a component reference (not a string)\n if (typeof rawComponent !== \"string\") {\n this._componentToType.set(rawComponent, type);\n }\n }\n\n deleteComponent(type: string) {\n this._componentRegistry.delete(type);\n }\n\n renameComponent(oldName: string, newName: string) {\n const metadata = this._componentRegistry.get(oldName);\n if (metadata) {\n metadata.type = newName;\n this._componentRegistry.set(newName, metadata);\n this._componentRegistry.delete(oldName);\n }\n }\n\n addManagedProps(type: string, props: ManagedPropsList) {\n const metadata = this.getOrCreateMetadata(type);\n metadata.managedProps = props;\n }\n\n deleteManagedProps(type: string) {\n const metadata = this.getOrCreateMetadata(type);\n metadata.managedProps = [];\n }\n\n addEditorTemplate(type: string, template: EditorTemplate<any>) {\n const metadata = this.getOrCreateMetadata(type);\n const existingTemplates = metadata.editorTemplates;\n if (\n existingTemplates.some(\n (t) =>\n t.catalog?.displayName === template.catalog?.displayName &&\n t.catalog?.category === template.catalog?.category,\n )\n ) {\n return;\n }\n metadata.editorTemplates = [...existingTemplates, template];\n }\n\n getEditorTemplates(type: string) {\n return this._componentRegistry.get(type)?.editorTemplates;\n }\n\n getEditorConfigFromComponentType(type: any) {\n const componentStrType = this.getTypeForComponent(type);\n return componentStrType\n ? this.getEditorConfig(componentStrType)\n : undefined;\n }\n\n addEditorConfig(type: string, config: EditorConfig) {\n if (config.useAs) {\n if (config.useAs.defaultContainer) {\n this._defaultContainerType = type;\n }\n if (config.useAs.defaultButton) {\n this._defaultButtonType = type;\n }\n if (config.useAs.defaultText) {\n this._defaultTextType = type;\n }\n }\n\n const metadata = this.getOrCreateMetadata(type);\n metadata.editorConfig = config;\n }\n\n addInternalProps(\n type: string,\n props: Array<{ path: string; factory: () => any }>,\n ) {\n const metadata = this.getOrCreateMetadata(type);\n metadata.internalProps = props;\n }\n\n getInternalProps(type: string): Array<{ path: string; factory: () => any }> {\n return this._componentRegistry.get(type)?.internalProps ?? [];\n }\n\n getEditorConfig(type: string) {\n return this._componentRegistry.get(type)?.editorConfig;\n }\n\n get entityDefinitions(): Record<string, EntityDefinition> {\n const entityDefinitions: Record<string, EntityDefinition> = {};\n\n for (const [componentType, metadata] of this._componentRegistry.entries()) {\n const propertiesDefinition = metadata.propertiesDefinition;\n if (!propertiesDefinition) {\n continue;\n }\n\n const entityDefinition: EntityDefinition = {\n description: metadata.editorConfig?.description,\n props: {},\n };\n for (const section of Object.values(propertiesDefinition)) {\n for (const [propKey, propValue] of Object.entries(section.props)) {\n if (!propValue) continue;\n const prop = propValue as Prop<any, any>;\n const propData = prop.build();\n if (propData && propData.isExternallyReadable) {\n const dataType = analyzePropertyType(propData, prop);\n\n const entityDefEntry: EntityDefinition[\"props\"][string] = {\n label: propData.docs?.label,\n description: propData.docs?.description,\n isSettable: propData.isExternallySettable,\n dataType,\n };\n\n entityDefinition.props[propKey] = entityDefEntry;\n }\n }\n }\n\n entityDefinitions[componentType] = entityDefinition;\n }\n\n return entityDefinitions;\n }\n\n get libraryComponentCatalogs() {\n const catalogs: Array<CatalogWithInternalDetails> = [];\n\n for (const [componentType, metadata] of this._componentRegistry.entries()) {\n for (const template of metadata.editorTemplates) {\n const catalog = template.catalog;\n if (catalog) {\n catalogs.push({\n ...catalog,\n componentType,\n });\n }\n }\n }\n\n return catalogs;\n }\n\n get libraryComponentEditorConfigs() {\n const configs: Record<string, EditorConfig> = {};\n\n for (const [componentType, metadata] of this._componentRegistry.entries()) {\n if (metadata.editorConfig) {\n configs[componentType] = metadata.editorConfig;\n }\n }\n\n return configs;\n }\n\n get customComponentList(): string[] {\n return Array.from(this._componentRegistry.keys());\n }\n\n get containerTypes() {\n // TODO - if we support more of these, add them here\n return new Set([this.defaultTagNames.container]);\n }\n\n get defaultTagNames(): DefaultTagNames {\n if (!this._defaultContainerType) {\n console.warn(\n \"No default container registered - defaulting to 'Container'.\",\n );\n }\n if (!this._defaultButtonType) {\n console.warn(\"No default button registered - defaulting to 'Button'.\");\n }\n if (!this._defaultTextType) {\n console.warn(\"No default text registered - defaulting to 'Text'.\");\n }\n return {\n container: this._defaultContainerType ?? \"Container\",\n button: this._defaultButtonType ?? \"Button\",\n text: this._defaultTextType ?? \"Text\",\n };\n }\n\n get managedPropsRegistry() {\n const registry = new Map<string, ManagedPropsList>();\n for (const [type, metadata] of this._componentRegistry.entries()) {\n registry.set(type, metadata.managedProps);\n }\n return registry;\n }\n\n getManagedProps(type: string): ManagedPropsList {\n return this._componentRegistry.get(type)?.managedProps ?? [];\n }\n\n /**\n * Get the component type string for a raw component reference.\n * Used for registry-based component identity checking.\n */\n getTypeForComponent(component: React.ComponentType<any>): string | undefined {\n return this._componentToType.get(component);\n }\n\n /**\n * Check if a component or element type is registered in the component registry.\n * Accepts both component references and string element names (e.g., \"div\").\n * Used for component identity checking instead of symbol-based approach.\n */\n hasComponent(component: React.ElementType | string): boolean {\n if (typeof component === \"string\") {\n // String element like \"div\" - check the main registry\n return this._componentRegistry.has(component);\n }\n // Component reference - check the WeakMap\n return this._componentToType.has(component);\n }\n\n /**\n * Get the property path with the record identifier if it exists. For example,\n * `columns.columnName.label` becomes `columns.*.label`, for record properties.\n */\n getPropertyWithRecordIdentifier(type: string, path: string) {\n const managedProps = this.getManagedProps(type);\n const splitPath = path.split(\".\");\n if (splitPath.length === 1) {\n return path;\n }\n const [parentKey, _maybeTheRecordKey, ...rest] = splitPath;\n\n for (const prop of managedProps) {\n // we don't always have a managed prop for the parent, only leafs\n if (\n prop.path.startsWith(parentKey) &&\n prop.path.includes(RECORD_PATH_IDENTIFIER) &&\n rest.length > 0 &&\n prop.path.endsWith(rest.join(\".\"))\n ) {\n return [parentKey, RECORD_PATH_IDENTIFIER, rest.join(\".\")].join(\".\");\n }\n }\n return path;\n }\n}\n","import { action, makeObservable } from \"mobx\";\nimport { observable } from \"mobx\";\nimport { LocationStore } from \"../location-store.js\";\nimport ApiManager from \"./features/api-store.js\";\nimport { ComponentRegistry } from \"./features/component-registry.js\";\nimport type { EditStore } from \"../../../edit-mode/edit-store.js\";\n\nclass RootStore {\n apis: ApiManager;\n componentRegistry: ComponentRegistry;\n\n editStore?: EditStore;\n locationStore: LocationStore;\n\n currentPageScopeId: string | undefined;\n applicationId: string | undefined;\n userId: string | undefined;\n\n windowOriginUrl: string | undefined;\n\n private editorRegisteredCallbacks: (() => void)[] = [];\n\n constructor() {\n this.apis = new ApiManager(this);\n this.componentRegistry = new ComponentRegistry(this);\n\n this.locationStore = new LocationStore(this);\n\n makeObservable(this, {\n editStore: observable.shallow,\n setEditStore: action,\n\n applicationId: observable,\n userId: observable,\n });\n }\n\n setEditStore(editStore: EditStore) {\n if (this.editStore) return;\n this.editStore = editStore;\n }\n\n notifyEditorRegistered() {\n this.editorRegisteredCallbacks.forEach((fn) => fn());\n this.editorRegisteredCallbacks = [];\n }\n\n // TODO: this is temporary until we have a method to ensure the editor is registered as soon as possible, i.e. before iframe messages\n onEditorRegistered(fn: () => void) {\n this.editorRegisteredCallbacks.push(fn);\n }\n}\n\nexport type { RootStore };\nexport default new RootStore();\n","<svg width=\"28\" height=\"20\" viewBox=\"0 0 28 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M20.4101 1.23853C17.6302 1.48173 15.5588 3.8863 15.7067 6.65157L18.3547 6.41988C18.5199 5.44519 19.325 4.66603 20.3558 4.57584C21.5806 4.46868 22.6602 5.37468 22.7674 6.59942C22.8594 7.65142 22.204 8.59642 21.2411 8.90995L21.4215 10.9716L21.4564 10.9921C22.0311 10.9419 22.6694 10.5377 23.0253 10.2436C24.6427 8.90661 24.7352 7.04449 24.7312 6.57165C24.7306 6.50857 24.7781 6.45461 24.841 6.44911L25.1108 6.42549C25.2166 6.41622 25.294 6.32392 25.2779 6.21892C25.21 5.77476 24.9744 4.64168 24.2597 3.80041C24.1964 3.72586 24.2411 3.60595 24.3386 3.59742L24.741 3.56221C24.8834 3.54975 24.9588 3.39563 24.8716 3.28231C24.3794 2.64217 22.8772 1.02267 20.4101 1.23853Z\" fill=\"url(#paint0_linear_735_5200)\"/>\n<path opacity=\"0.12\" d=\"M18.3328 6.98742C18.4399 8.21219 19.5197 9.11815 20.7444 9.011L21.2988 8.9625C20.6867 6.22284 19.3122 5.41204 19.3122 5.41204C19.4647 5.02627 20.3564 4.57581 20.3564 4.57581C19.1316 4.68296 18.2257 5.76269 18.3328 6.98742Z\" fill=\"#2A333D\"/>\n<path d=\"M6.64987 12.5642L6.69529 13.0564L6.46722 10.4494C5.43191 10.2861 4.60087 9.43595 4.50537 8.34472C4.39291 7.05918 5.34387 5.92583 6.62945 5.81337C7.39383 5.74649 8.10441 6.0556 8.57856 6.58745L11.1668 6.36103C10.4551 4.10391 8.25129 2.56222 5.79599 2.77703C3.32876 2.99288 2.13065 4.8486 1.75707 5.56449C1.69093 5.69126 1.79187 5.82995 1.93428 5.81749L2.33677 5.78226C2.43422 5.77372 2.4991 5.88407 2.44967 5.96849C1.89186 6.92107 1.85662 8.07787 1.86689 8.52707C1.86932 8.63326 1.96153 8.71072 2.06734 8.70145L2.33717 8.67787C2.40002 8.67237 2.45614 8.71726 2.46656 8.77949C2.54466 9.24587 2.95917 11.0636 4.78418 12.0994C5.18572 12.3273 6.07514 12.6145 6.64987 12.5642Z\" fill=\"url(#paint1_linear_735_5200)\"/>\n<path opacity=\"0.12\" d=\"M9.16108 7.93755C9.27354 9.22309 8.32258 10.3564 7.037 10.4689L6.45508 10.5198C6.58846 7.57624 7.86146 6.48755 7.86146 6.48755C7.63354 6.11659 6.62969 5.81347 6.62969 5.81347C7.91527 5.70101 9.04858 6.65197 9.16108 7.93755Z\" fill=\"#2A333D\"/>\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M21.7197 10.5433C21.2588 7.17688 19.0225 4.53246 15.0345 4.29123C14.926 4.28465 14.8717 4.28138 14.8331 4.25957C14.7984 4.24004 14.7721 4.21207 14.7547 4.17627C14.7353 4.13642 14.7353 4.08396 14.7353 3.97907V3.40726C14.7353 3.24855 14.5539 3.15816 14.4272 3.25371L13.4886 3.9615C13.3619 4.05704 13.1805 3.96665 13.1805 3.80796V3.44681C13.1805 3.28132 12.986 3.19286 12.862 3.30248C12.5925 3.54078 12.3235 3.77969 12.0552 4.01934C11.7949 4.252 11.6647 4.3683 11.5548 4.45011C11.4127 4.55592 11.4033 4.56207 11.2497 4.6503C11.131 4.71857 10.836 4.85477 10.2459 5.12715C7.45166 6.41715 6.1424 9.01238 6.39366 11.8842C6.82328 16.795 9.79797 18.5358 14.6601 18.1105C18.8747 17.7417 22.4177 15.6412 21.7197 10.5433ZM11.6391 10.2C11.7824 10.8209 11.4792 11.4211 10.9618 11.5405C10.4443 11.66 9.90866 11.2535 9.76532 10.6325C9.72401 10.4537 9.71978 10.2765 9.74705 10.112C9.83313 10.172 9.94328 10.1967 10.0535 10.1713C10.2605 10.1235 10.3895 9.91696 10.3418 9.71C10.3135 9.58746 10.2295 9.49219 10.1228 9.44484C10.2162 9.37223 10.3238 9.31942 10.4426 9.292C10.9601 9.17254 11.4957 9.57904 11.6391 10.2ZM18.6818 10.0523C19.1923 9.90592 19.4637 9.29065 19.2881 8.67811C19.1124 8.06554 18.5562 7.68761 18.0457 7.834C17.8998 7.87584 17.7734 7.956 17.6714 8.0635C17.7887 8.10177 17.8856 8.19569 17.9222 8.32331C17.9807 8.52746 17.8627 8.74046 17.6585 8.79904C17.5647 8.82592 17.469 8.81554 17.3872 8.77661C17.3812 8.91638 17.3977 9.06234 17.4395 9.20819C17.6152 9.82073 18.1714 10.1987 18.6818 10.0523ZM13.2339 13.6482L12.9811 10.7518C12.8867 9.67019 13.6397 8.69777 14.7106 8.51854C15.7814 8.33927 16.8101 9.01346 17.073 10.0668L17.7772 12.8876C18.1036 14.1952 17.2462 15.5034 15.917 15.7259C14.5879 15.9485 13.3511 14.9907 13.2339 13.6482Z\" fill=\"currentColor\"/>\n<path opacity=\"0.5\" d=\"M13.8809 14.0962C14.3767 14.5024 15.0394 14.7029 15.7267 14.5879C16.4141 14.4728 16.9753 14.0674 17.3119 13.5219C17.254 14.3216 16.6582 15.0169 15.822 15.1569C14.9857 15.2969 14.196 14.8335 13.8809 14.0962Z\" fill=\"url(#paint2_linear_735_5200)\"/>\n<path opacity=\"0.5\" d=\"M13.1914 13.1439C13.5758 14.1383 14.6198 14.7733 15.728 14.5878C16.8363 14.4023 17.6166 13.4619 17.6561 12.3965L17.7787 12.8875C18.1051 14.1951 17.2477 15.5033 15.9185 15.7258C14.5894 15.9483 13.3526 14.9906 13.2354 13.648L13.1914 13.1439Z\" fill=\"url(#paint3_linear_735_5200)\"/>\n<defs>\n<linearGradient id=\"paint0_linear_735_5200\" x1=\"21.6358\" y1=\"4.1488\" x2=\"17.0271\" y2=\"8.78507\" gradientUnits=\"userSpaceOnUse\">\n<stop stop-color=\"currentColor\"/>\n<stop offset=\"1\" stop-color=\"currentColor\" stop-opacity=\"0.84\"/>\n</linearGradient>\n<linearGradient id=\"paint1_linear_735_5200\" x1=\"4.53449\" y1=\"6.60276\" x2=\"10.6431\" y2=\"9.71249\" gradientUnits=\"userSpaceOnUse\">\n<stop stop-color=\"currentColor\"/>\n<stop offset=\"1\" stop-color=\"currentColor\" stop-opacity=\"0.84\"/>\n</linearGradient>\n<linearGradient id=\"paint2_linear_735_5200\" x1=\"15.7877\" y1=\"13.8659\" x2=\"16.0042\" y2=\"15.0933\" gradientUnits=\"userSpaceOnUse\">\n<stop stop-color=\"currentColor\" stop-opacity=\"0.6\"/>\n<stop offset=\"1\" stop-color=\"currentColor\"/>\n</linearGradient>\n<linearGradient id=\"paint3_linear_735_5200\" x1=\"15.7043\" y1=\"13.5969\" x2=\"16.0698\" y2=\"15.6702\" gradientUnits=\"userSpaceOnUse\">\n<stop stop-color=\"currentColor\" stop-opacity=\"0.6\"/>\n<stop offset=\"1\" stop-color=\"currentColor\"/>\n</linearGradient>\n</defs>\n</svg>\n","import styled from \"styled-components\";\nimport ClarkIcon from \"../../user-facing/assets/images/clark.svg\";\nimport { colors } from \"../../user-facing/styling/colors.js\";\nimport type React from \"react\";\n\nexport const ErrorIconContainer = styled.div`\n width: 60px;\n height: 60px;\n min-width: 60px;\n min-height: 60px;\n background: linear-gradient(135deg, #aab 0%, #000033 50%, #000066 100%);\n border-radius: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0 auto 16px;\n flex-shrink: 0;\n animation: scaleIn 0.3s ease-out forwards;\n opacity: 0;\n box-shadow:\n 0 0 1px black,\n 0 4px 12px rgba(0, 85, 187, 0.15),\n 0 2px 4px rgba(0, 85, 187, 0.05);\n\n @keyframes scaleIn {\n from {\n transform: scale(0.8);\n opacity: 0;\n }\n to {\n transform: scale(1);\n opacity: 1;\n }\n }\n`;\n\nexport const StyledClarkIcon: React.FC = styled(ClarkIcon)`\n width: 54px;\n height: 54px;\n color: white;\n margin-top: 3px;\n margin-left: 1px;\n animation: scaleIn 0.7s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;\n opacity: 0;\n\n @keyframes scaleIn {\n 0% {\n transform: scale(0.6);\n opacity: 0;\n }\n 50% {\n transform: scale(1.1);\n }\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n }\n`;\n\nexport const ErrorTitle = styled.h2`\n font-family: Inter;\n color: rgba(0, 0, 0, 0.85);\n font-weight: 600;\n font-size: 24px;\n line-height: 1.35;\n text-align: center;\n margin-bottom: 6px;\n flex-shrink: 0;\n`;\n\nexport const ErrorMessage = styled.p`\n font-family: Inter;\n font-size: 14px;\n color: #6c7689;\n line-height: 1.5715;\n text-align: center;\n flex-shrink: 0;\n margin-top: 0;\n margin-bottom: 16px;\n`;\n\nexport const ErrorDetails = styled.details`\n margin-top: 24px;\n text-align: left;\n background-color: #f9fafb;\n border-radius: 6px;\n padding: 16px;\n box-shadow:\n 0px 0px 1px 0px #22272f52,\n 0px 1px 3px 0px #22272f1f;\n flex-shrink: 0;\n font-family: Inter;\n\n &[open] summary {\n margin-bottom: 12px;\n }\n`;\n\nexport const ErrorSummary = styled.summary`\n cursor: pointer;\n font-weight: 500;\n color: #374151;\n font-size: 14px;\n user-select: none;\n`;\n\nexport const ErrorStack = styled.pre`\n font-size: 12px;\n color: #dc2626;\n overflow: auto;\n white-space: pre-wrap;\n margin: 16px;\n font-family: monospace;\n`;\n\nexport const ErrorContainer = styled.div`\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10;\n background: rgba(255, 255, 255, 0.5);\n pointer-events: auto;\n`;\n\nexport const ErrorContent = styled.div`\n max-width: 700px;\n padding: 40px;\n overflow-y: auto;\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 20px;\n\n opacity: 0;\n animation: fadeIn 0.3s ease-out forwards;\n\n @keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n }\n`;\n\nexport const SecondaryButton = styled.button`\n color: ${colors.GREY_700};\n border: 1px solid ${colors.GREY_100};\n width: fit-content;\n border-radius: 4px;\n padding: 6px 12px;\n cursor: pointer;\n height: fit-content;\n font-size: 12px;\n\n &:hover {\n opacity: 0.8;\n }\n\n &:active {\n opacity: 0.6;\n }\n`;\n\nexport const ActionsContainer = styled.div`\n display: flex;\n gap: 12px;\n align-items: center;\n justify-content: center;\n`;\n","<svg width=\"13\" height=\"14\" viewBox=\"0 0 13 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M10.5004 0.900391C10.7822 0.900391 11.026 1.09647 11.0864 1.3717L11.2193 1.97662C11.2527 2.12902 11.3718 2.24805 11.5242 2.28152L12.1291 2.41435C12.4043 2.47479 12.6004 2.7186 12.6004 3.00038C12.6004 3.28217 12.4043 3.52598 12.1291 3.58642L11.5242 3.71928C11.3718 3.75274 11.2527 3.87177 11.2193 4.02417L11.0864 4.62909C11.026 4.90431 10.7822 5.10039 10.5004 5.10039C10.2186 5.10039 9.9748 4.90431 9.91436 4.62909L9.78151 4.02417C9.74805 3.87177 9.62902 3.75274 9.47662 3.71928L8.87169 3.58642C8.59647 3.52598 8.40039 3.28217 8.40039 3.00038C8.40039 2.7186 8.59648 2.47479 8.8717 2.41435L9.47661 2.28152C9.62902 2.24805 9.74805 2.12902 9.78151 1.97662L9.91436 1.3717C9.97479 1.09647 10.2186 0.900391 10.5004 0.900391ZM5.07658 3.83304C5.00213 3.57671 4.76731 3.40039 4.50039 3.40039C4.23347 3.40039 3.99865 3.57672 3.9242 3.83304L3.70907 4.57373C3.47987 5.36287 2.86285 5.97989 2.0737 6.20909L1.33304 6.4242C1.07672 6.49865 0.900394 6.73347 0.900391 7.00038C0.900387 7.2673 1.07671 7.50212 1.33303 7.57658L2.07376 7.79173C2.86287 8.02094 3.47987 8.63794 3.70907 9.42705L3.9242 10.1677C3.99865 10.4241 4.23348 10.6004 4.50039 10.6004C4.76731 10.6004 5.00213 10.4241 5.07658 10.1677L5.29171 9.42705C5.52092 8.63794 6.13791 8.02094 6.92702 7.79173L7.66775 7.57658C7.92407 7.50212 8.10039 7.2673 8.10039 7.00038C8.10039 6.73347 7.92406 6.49865 7.66774 6.4242L6.92708 6.20909C6.13793 5.97989 5.52091 5.36287 5.29171 4.57373L5.07658 3.83304ZM11.0864 9.37185C11.026 9.09663 10.7822 8.90054 10.5004 8.90054C10.2186 8.90054 9.97479 9.09663 9.91436 9.37185L9.78151 9.97677C9.74805 10.1292 9.62902 10.2482 9.47662 10.2817L8.8717 10.4145C8.59647 10.4749 8.40039 10.7188 8.40039 11.0005C8.40039 11.2823 8.59647 11.5261 8.8717 11.5866L9.47662 11.7194C9.62902 11.7529 9.74805 11.8719 9.78151 12.0243L9.91436 12.6292C9.97479 12.9045 10.2186 13.1005 10.5004 13.1005C10.7822 13.1005 11.026 12.9045 11.0864 12.6292L11.2193 12.0243C11.2527 11.8719 11.3718 11.7529 11.5242 11.7194L12.1291 11.5866C12.4043 11.5261 12.6004 11.2823 12.6004 11.0005C12.6004 10.7188 12.4043 10.4749 12.1291 10.4145L11.5242 10.2817C11.3718 10.2482 11.2527 10.1292 11.2193 9.97677L11.0864 9.37185Z\" fill=\"currentColor\"/>\n</svg>\n","import styled from \"styled-components\";\nimport AiStarsIcon from \"../../../edit-mode/assets/ai-stars.svg\";\nimport { editorBridge } from \"../../../edit-mode/superblocks-editor-bridge.js\";\nimport { colors } from \"../../user-facing/styling/colors.js\";\nimport rootStore from \"../lib/root-store.js\";\nimport type { IdentifierInfo } from \"../types.js\";\n\nconst MAX_STACK_FRAMES = 10;\nconst MAX_PROMPT_LENGTH = 8000;\n\n// Build a prompt by keeping the leading error message, skipping noisy node_modules frames,\n// annotating how many frames were dropped, and capping total length before dispatching.\nfunction buildRuntimeErrorPrompt(error: Error | undefined): string {\n const defaultPrompt = \"Fix this error: Unknown error\";\n if (!error) {\n return defaultPrompt;\n }\n\n const stackLines = error.stack?.split(\"\\n\") ?? [];\n const [messageLine, ...rawFrames] = stackLines;\n const message = (messageLine || error.message || error.toString()).trim();\n\n const filteredFrames = rawFrames.filter(\n (line) => line && !line.includes(\"node_modules\"),\n );\n const selectedFrames = filteredFrames.slice(0, MAX_STACK_FRAMES);\n const omittedCount = filteredFrames.length - selectedFrames.length;\n\n const frameSection = [\n ...selectedFrames,\n ...(omittedCount > 0\n ? [\n `... (${omittedCount} additional frame${omittedCount > 1 ? \"s\" : \"\"} omitted)`,\n ]\n : []),\n ]\n .map((line) => line.trimEnd())\n .join(\"\\n\");\n\n const details = frameSection ? `${message}\\n${frameSection}` : message;\n const prompt = `Fix this error: ${details}`;\n\n if (prompt.length <= MAX_PROMPT_LENGTH) {\n return prompt;\n }\n\n const suffix = \"... (truncated)\";\n const availableChars = Math.max(MAX_PROMPT_LENGTH - suffix.length, 0);\n return `${prompt.slice(0, availableChars)}${suffix}`;\n}\n\nconst FixWithClarkButtonContainer = styled.button`\n padding: 6px 12px;\n background-color: ${colors.ACCENT_BLUE_500};\n border-radius: 4px;\n border: none;\n color: white;\n height: fit-content;\n display: flex;\n gap: 4px;\n cursor: pointer;\n transition: opacity 0.2s;\n font-size: 12px;\n align-items: center;\n\n &:hover:not(:disabled) {\n opacity: 0.8;\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n`;\n\nexport function FixWithClarkButton({\n identifier,\n error,\n onClick,\n}: {\n onClick?: () => void;\n identifier?: IdentifierInfo;\n error: Error | undefined;\n}) {\n const isAiEditing = rootStore.editStore?.ai.getIsEditing() ?? false;\n\n const handleFixWithAi = () => {\n onClick?.();\n\n if (identifier) {\n editorBridge.addComponentToAiContext(\n identifier.sourceId,\n identifier.selectorId,\n );\n }\n\n const prompt = buildRuntimeErrorPrompt(error);\n editorBridge.aiGenerate(prompt, true);\n };\n\n return (\n <FixWithClarkButtonContainer\n onClick={handleFixWithAi}\n disabled={isAiEditing}\n >\n <AiStarsIcon /> Fix with Clark\n </FixWithClarkButtonContainer>\n );\n}\n","export const CSS_CLASSES = {\n SUSPENSE_FALLBACK: \"sb-suspense-fallback\",\n ANCHOR_NAME: \"sb-anchor-name\",\n} as const;\n","import { useMemo, type CSSProperties, type ReactNode } from \"react\";\nimport styled, { keyframes } from \"styled-components\";\nimport { CSS_CLASSES } from \"../../css-constants.js\";\n\ninterface Props {\n children?: ReactNode;\n className?: string;\n style?: () => CSSProperties;\n noBorderRadius?: boolean;\n}\n\nconst shimmerAnimation = keyframes`\n 0% {\n background-position: -200px 0;\n }\n 100% {\n background-position: calc(200px + 100%) 0;\n }\n`;\n\nconst ShimmerDiv = styled.div<{\n $backgroundColor: string;\n $shimmerHighlight: string;\n $borderRadius: string;\n}>`\n min-height: 12px;\n min-width: 12px;\n background-color: ${(props) => props.$backgroundColor};\n border-radius: ${(props) => props.$borderRadius};\n position: relative;\n overflow: hidden;\n background: linear-gradient(\n 90deg,\n ${(props) => props.$backgroundColor} 25%,\n ${(props) => props.$shimmerHighlight} 50%,\n ${(props) => props.$backgroundColor} 75%\n );\n background-size: max(100%, 200px) 100%;\n animation: ${shimmerAnimation} 5s infinite linear;\n`;\n\n/**\n * Default fallback component displayed while components are suspended.\n */\nexport function SuspenseFallback({ style, className, noBorderRadius }: Props) {\n const backgroundColor = \"#f8f9fa\";\n const shimmerHighlight = \"#ffffff\";\n const borderRadius = noBorderRadius ? \"0px\" : \"4px\";\n\n const classes = useMemo(\n () => [CSS_CLASSES.ANCHOR_NAME, className].filter(Boolean).join(\" \"),\n [className],\n );\n\n return (\n <ShimmerDiv\n $backgroundColor={backgroundColor}\n $shimmerHighlight={shimmerHighlight}\n $borderRadius={borderRadius}\n style={style?.()}\n className={classes}\n data-test=\"suspense-fallback\"\n />\n );\n}\n","import { reaction, type IReactionDisposer } from \"mobx\";\nimport { Observer } from \"mobx-react-lite\";\nimport React, { Component } from \"react\";\nimport styled from \"styled-components\";\nimport { editorBridge } from \"../../../edit-mode/superblocks-editor-bridge.js\";\nimport { SecondaryButton } from \"../../internal-details/internal-components/common.js\";\nimport { FixWithClarkButton } from \"../../internal-details/internal-components/fix-with-clark-button.jsx\";\nimport { isEditMode } from \"../../internal-details/is-edit-mode.js\";\nimport rootStore from \"../../internal-details/lib/root-store.js\";\nimport { SuspenseFallback } from \"../../internal-details/lib/suspense/suspense-fallback.js\";\nimport { generateId } from \"../../utils/generate-id.js\";\nimport { colors } from \"../styling/colors.js\";\nimport type { IdentifierInfo } from \"../../internal-details/types.js\";\n\nimport type { ErrorInfo, ReactNode } from \"react\";\n\nconst ErrorBoundaryContainer = styled.div`\n background: white;\n padding: 10px;\n display: flex;\n flex-direction: column;\n gap: 8px;\n border: 1px solid ${colors.GREY_100};\n border-left: 3px solid ${colors.RED_500};\n border-radius: 4px;\n width: 100%;\n color: ${colors.GREY_700};\n`;\n\nconst ErrorDetailsContainer = styled.div`\n display: flex;\n flex-direction: column;\n gap: 8px;\n`;\n\nconst ErrorActionsContainer = styled.div`\n display: flex;\n justify-content: flex-end;\n align-items: center;\n gap: 8px;\n`;\n\ninterface Props {\n children: ReactNode;\n header?: string;\n identifier?: IdentifierInfo;\n}\n\ninterface State {\n id: string;\n hasError: boolean;\n error?: Error;\n}\n\nclass ErrorBoundary extends Component<Props, State> {\n state: State = {\n id: generateId(),\n hasError: false,\n };\n\n private disposeAutoReset?: IReactionDisposer;\n\n static getDerivedStateFromError(e: Error): State {\n const error =\n e instanceof Error\n ? e\n : new Error(\n typeof e === \"object\" && e !== null ? JSON.stringify(e) : String(e),\n );\n return {\n id: generateId(),\n hasError: true,\n error,\n };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n console.error(\"Uncaught error:\", error, errorInfo);\n if (isEditMode()) {\n rootStore.editStore?.ai.handleRuntimeError({\n id: this.state.id,\n error: String(error),\n errorInfo,\n identifier: this.props.identifier,\n });\n }\n }\n\n reset = () => {\n if (isEditMode()) {\n rootStore.editStore?.ai.clearRuntimeError(this.state.id);\n }\n this.setState({ hasError: false, error: undefined });\n };\n\n componentWillUnmount() {\n // Clear runtime error if component unmounts while in error state\n if (this.state.hasError && isEditMode()) {\n rootStore.editStore?.ai.clearRuntimeError(this.state.id);\n }\n // Clean up auto-reset watcher if still pending\n this.disposeAutoReset?.();\n }\n\n handleFixWithClarkInitiated = () => {\n const ai = rootStore.editStore?.ai;\n if (!ai) return;\n\n // Clean up any existing watcher\n this.disposeAutoReset?.();\n this.disposeAutoReset = undefined;\n\n // Set up one-shot watcher for AI completion\n let sawStart = ai.getIsEditing();\n this.disposeAutoReset = reaction(\n () => ai.getIsEditing(),\n (isEditing) => {\n if (!sawStart && isEditing) {\n sawStart = true;\n }\n if (sawStart && !isEditing) {\n this.reset();\n this.disposeAutoReset?.();\n this.disposeAutoReset = undefined;\n }\n },\n { fireImmediately: true, name: \"error-boundary-ai-auto-reset\" },\n );\n };\n\n handleFixWithAi() {\n const { identifier } = this.props;\n\n if (identifier) {\n editorBridge.addComponentToAiContext(\n identifier.sourceId,\n identifier.selectorId,\n );\n }\n\n let prompt = `Fix this error: `;\n\n if (this.state.error?.stack) {\n const lines = this.state.error.stack.split(\"\\n\");\n const nodeModulesIndex = lines.findIndex((line) =>\n line.includes(\"node_modules\"),\n );\n const relevantLines =\n nodeModulesIndex > -1 ? lines.slice(0, nodeModulesIndex) : lines;\n\n prompt += relevantLines.slice(0, 5).join(\"\\n\");\n } else {\n prompt += this.state.error?.toString();\n }\n\n editorBridge.aiGenerate(prompt);\n }\n\n render() {\n if (this.state.hasError) {\n return (\n <Observer>\n {() => {\n // Check if AI is currently generating\n const isAIGenerating =\n rootStore.editStore?.ai.getIsEditing() ?? false;\n\n if (isAIGenerating) {\n // During AI generation, show shimmer loader\n // Error is already reported to AI in componentDidCatch\n return <SuspenseFallback />;\n }\n\n // When AI is not generating, show full error UI\n return (\n <ErrorBoundaryContainer>\n <ErrorDetailsContainer>\n <h3>{this.props.header || \"Something went wrong.\"}</h3>\n <details style={{ fontSize: \"0.8em\" }}>\n <summary style={{ paddingLeft: \"0.25rem\" }}>\n Error details\n </summary>\n <div\n style={{\n marginTop: \"0.5rem\",\n maxWidth: \"100%\",\n overflowX: \"auto\",\n scrollbarWidth: \"thin\",\n }}\n >\n <pre\n style={{\n color: \"gray\",\n }}\n >\n <code>\n {this.state.error?.stack\n ? this.state.error.stack\n : this.state.error?.toString()}\n </code>\n </pre>\n </div>\n </details>\n </ErrorDetailsContainer>\n <ErrorActionsContainer>\n {isEditMode() && (\n <FixWithClarkButton\n onClick={this.handleFixWithClarkInitiated}\n error={this.state.error}\n identifier={this.props.identifier}\n />\n )}\n <SecondaryButton onClick={this.reset}>\n Try again\n </SecondaryButton>\n </ErrorActionsContainer>\n </ErrorBoundaryContainer>\n );\n }}\n </Observer>\n );\n }\n return this.props.children;\n }\n}\n\nexport default ErrorBoundary;\n","import { isComponentTypeDetached } from \"./is-component-type-detached.js\";\nimport type { SbSelector } from \"@superblocksteam/library-shared/types\";\n\nexport const getWidgetAnchorName = (selectorId: SbSelector) => {\n return `--widget-${selectorId}`;\n};\n\nexport const getWidgetRectAnchorName = (selectorId: SbSelector) => {\n return `--widget-rect-${selectorId}`;\n};\n\n/**\n * @deprecated see ENG-1634. should use getWidgetAnchorName instead.\n */\nexport const getWidgetDropAreaAnchorName = (\n selectorId: SbSelector | null,\n _widgetType?: string,\n) => {\n // if (widgetType && isComponentTypeDetached(widgetType)) {\n // return `--widget-drop-area-${instanceId}`;\n // }\n return `--widget-${selectorId}`;\n};\n\nexport const getEditWrapperId = (selectorId: SbSelector) => {\n return `sb-edit-wrapper-${selectorId}`;\n};\n\nexport const getEditWrapperIdWithType = (\n selectorId: SbSelector,\n widgetType?: string,\n) => {\n if (widgetType && isComponentTypeDetached(widgetType)) {\n return `sb-edit-wrapper-for-${widgetType}-${selectorId}`;\n }\n return `sb-edit-wrapper-${selectorId}`;\n};\n","import polyfill from \"@oddbird/css-anchor-positioning/fn\";\n\nimport { getWidgetAnchorName } from \"../lib/utils/widget-wrapper-naming.js\";\n\nimport type { SbSelector } from \"@superblocksteam/library-shared/types\";\nimport type React from \"react\";\nimport type { CSSProperties } from \"react\";\n\nif (\n typeof window !== \"undefined\" &&\n typeof document.documentElement !== \"undefined\" &&\n !(\"anchorName\" in document.documentElement.style)\n) {\n polyfill();\n}\n\n// The variable --anchor-name is used in the CSS to set the anchor name for the widget\n// on the actual widget element.\nexport const createAnchorNameStyle = (props: {\n selectorId: SbSelector;\n}): React.CSSProperties | undefined => {\n return {\n \"--anchor-name\": getWidgetAnchorName(props.selectorId),\n } as CSSProperties;\n};\n","/**\n * Tracks and recycles instance numbers for each sourceId to generate stable, unique selector IDs.\n * When components unmount, their instance numbers are released and can be reused.\n */\nclass InstanceTracker {\n private sourceIdToUsedInstances = new Map<string, Set<number>>();\n\n getNextAvailableInstance(sourceId: string): number {\n const usedInstances =\n this.sourceIdToUsedInstances.get(sourceId) ?? new Set();\n\n // Find the smallest unused instance number\n let instance = 0;\n while (usedInstances.has(instance)) {\n instance++;\n }\n\n usedInstances.add(instance);\n this.sourceIdToUsedInstances.set(sourceId, usedInstances);\n\n return instance;\n }\n\n releaseInstance(sourceId: string, instance: number): void {\n const usedInstances = this.sourceIdToUsedInstances.get(sourceId);\n if (usedInstances) {\n usedInstances.delete(instance);\n if (usedInstances.size === 0) {\n this.sourceIdToUsedInstances.delete(sourceId);\n }\n }\n }\n}\n\nexport const instanceTracker = new InstanceTracker();\n","import {\n NO_SELECT_ATTRIBUTE,\n SELECTOR_ID_ATTRIBUTE,\n SOURCE_ID_ATTRIBUTE,\n} from \"@superblocksteam/library-shared\";\nimport React, { useEffect, useMemo, useRef } from \"react\";\nimport rootStore from \"../lib/internal-details/lib/root-store.js\";\nimport ErrorBoundary from \"../lib/user-facing/component-base/error-boundary.js\";\nimport { createAnchorNameStyle } from \"./edit-wrapper.js\";\nimport { instanceTracker } from \"./instance-tracker.js\";\nimport type {\n SbElement,\n SbSelector,\n} from \"@superblocksteam/library-shared/types\";\n\nexport type JSXContextType = {\n selectorId: SbSelector;\n sourceId: SbElement;\n};\n\nexport const JSXContext = React.createContext<JSXContextType>({\n selectorId: \"S-<unknown>\" satisfies SbSelector,\n sourceId: \"SB-<unknown>\" satisfies SbElement,\n});\n\nexport const makeWrappedComponent = (type: any) => {\n const isTag = typeof type === \"string\";\n const isRegisteredSbComponent =\n rootStore.componentRegistry.hasComponent(type);\n\n const Component = React.forwardRef((props: any, ref: any) => {\n const { selectorId: parentSelectorId } = useJSXContext();\n\n const sourceId = props[SOURCE_ID_ATTRIBUTE];\n const noSelect = props[NO_SELECT_ATTRIBUTE];\n\n const instanceNumberRef = useRef<number>();\n const selectorId = useRef<SbSelector>(\"S-<unknown>\" satisfies SbSelector);\n if (selectorId.current === \"S-<unknown>\") {\n instanceNumberRef.current =\n instanceTracker.getNextAvailableInstance(sourceId);\n selectorId.current =\n `S-x-${sourceId}-${instanceNumberRef.current}` as SbSelector;\n }\n\n useEffect(() => {\n rootStore.editStore?.runtimeTrackingStore.registerComponent(\n selectorId.current,\n {\n sourceId,\n type,\n parentSelectorId,\n isSbComponent: isRegisteredSbComponent,\n isHtmlElement: isTag,\n noSelect,\n },\n );\n return () => {\n rootStore.editStore?.runtimeTrackingStore.unregisterComponent(\n selectorId.current,\n );\n if (instanceNumberRef.current !== undefined) {\n instanceTracker.releaseInstance(sourceId, instanceNumberRef.current);\n }\n };\n // These deps should NOT change during the component lifecycle\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n rootStore.editStore?.runtimeTrackingStore.updatePropsForComponent(\n selectorId.current,\n props,\n );\n }, [props]);\n\n const jsxContext = useMemo(\n () =>\n ({\n selectorId: selectorId.current,\n sourceId,\n }) satisfies JSXContextType,\n [sourceId],\n );\n\n const selectorProps: Record<string, string> = {\n [SELECTOR_ID_ATTRIBUTE]: selectorId.current,\n };\n\n if (parentSelectorId) {\n selectorProps[\"data-sb-parent-selector-id\"] = parentSelectorId;\n }\n\n const style = useMemo(() => {\n return {\n ...props.style,\n ...createAnchorNameStyle({\n selectorId: selectorId.current,\n }),\n };\n }, [props.style]);\n\n const element = React.createElement(type, {\n ref,\n ...props,\n ...selectorProps,\n className: [\"sb-anchor-name\", props.className].filter(Boolean).join(\" \"),\n style,\n });\n\n if (!rootStore.editStore?.isInitialized) {\n return (\n <JSXContext.Provider value={jsxContext}>{element}</JSXContext.Provider>\n );\n }\n\n return (\n <JSXContext.Provider value={jsxContext}>\n <ErrorBoundary>{element}</ErrorBoundary>\n </JSXContext.Provider>\n );\n });\n try {\n Component.displayName =\n typeof type === \"string\"\n ? type\n : type.displayName || type.name || \"Component\";\n } catch (e) {\n console.error(\"Error setting displayName\", e);\n }\n\n return Component;\n};\n\nexport const useJSXContext = () => {\n return React.useContext(JSXContext);\n};\n"],"mappings":"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"}