@nextblock-cms/cortex 0.13.8 → 0.13.10
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.
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const z=require("ai"),hn=require("./ai-global-agent-db-tools.cjs.js"),yn=require("./ai-global-agent-custom-block-tools.cjs.js"),Pt=require("./editor-document-from-html.cjs.js");require("./zod-config.cjs.js");const i=require("zod"),G=["text","heading","image","button","posts_grid","video_embed","section","form","testimonial","product_grid","featured_product","cart","checkout","product_details"],_n=1e4,bn={arabic:"ar",chinese:"zh",dutch:"nl",english:"en",french:"fr",francaise:"fr",francais:"fr",german:"de",italian:"it",japanese:"ja",korean:"ko",portuguese:"pt",russian:"ru",spanish:"es"},Nt=i.z.string().trim().min(1).max(2048).refine(e=>e.startsWith("/")||e.startsWith("#")||e.startsWith("http://")||e.startsWith("https://")||e.startsWith("mailto:")||e.startsWith("tel:"),"URL must be a relative path, hash link, http(s) URL, mailto URL, or tel URL."),yt=i.z.strictObject({label:i.z.string().trim().min(1).max(120),target:i.z.enum(["_self","_blank"]).optional(),url:Nt}),qe=yt.extend({children:i.z.array(yt).max(20).optional()}),kn=i.z.strictObject({label:i.z.string().trim().min(1).max(120).optional(),url:Nt.optional()}).refine(e=>!!(e.label||e.url),{message:"Navigation item match requires label or url."}),Q=i.z.strictObject({items:i.z.array(qe).min(1).max(30),languageCode:i.z.string().trim().min(2).max(80).default("en").describe('Locale code or language name, for example "en", "fr", "English", or "French".'),match:kn.optional().describe('For mode "update", identifies the existing navigation item to update.'),mode:i.z.enum(["append","replace","update"]).default("append")}),Z=i.z.strictObject({copyright:i.z.record(i.z.string().trim().min(2).max(12),i.z.string().trim().min(1).max(500)).optional(),languageCode:i.z.string().trim().min(2).max(80).default("en").describe('Locale code or language name, for example "en", "fr", "English", or "French".'),links:i.z.array(qe).min(1).max(30).optional()}),xe=i.z.strictObject({limit:i.z.number().int().min(1).max(8).default(4),query:i.z.string().trim().min(2).max(300)}),Re=i.z.object({currency:i.z.string().trim().min(3).max(3).optional().describe("Optional currency code for currency-specific monetary reports (e.g., USD, CAD). Do not set this for plain order-status counts unless the user asks for a currency."),query:i.z.string().describe("The analytical question about orders, products, or revenue."),reportType:i.z.enum(["revenue","orders","products","general"]).optional().default("general").describe("The focus area of the statistical report."),timeRange:i.z.enum(["today","this_month","last_7_days","last_30_days","last_month","last_90_days","all_time"]).optional().default("all_time").describe("The time period for the report. Use all_time for current order-status counts unless the user names a specific period.")}),Me=i.z.strictObject({contentType:i.z.enum(["page","post","product"]),currentEditor:i.z.strictObject({blockId:i.z.union([i.z.number().int().positive(),i.z.string().trim().min(1).max(120)]).nullable().optional(),blockType:i.z.string().trim().min(1).max(80).nullable().optional(),field:i.z.string().trim().min(1).max(120).nullable().optional()}).optional(),entityId:i.z.union([i.z.number().int().positive(),i.z.string().trim().min(1).max(120)]),languageId:i.z.number().int().positive().nullable().optional(),slug:i.z.string().trim().min(1).max(300).nullable().optional(),title:i.z.string().trim().min(1).max(300).nullable().optional(),translationGroupId:i.z.string().trim().min(1).max(120).nullable().optional()}),De=i.z.strictObject({includeBlockContent:i.z.boolean().default(!1),includeBlocks:i.z.boolean().default(!0)}),ee=i.z.strictObject({fields:i.z.strictObject({description_json:i.z.unknown().optional(),excerpt:i.z.string().max(2e3).nullable().optional(),feature_image_id:i.z.string().trim().min(1).max(2048).nullable().optional(),label:i.z.string().max(120).nullable().optional(),meta_description:i.z.string().max(500).nullable().optional(),meta_title:i.z.string().max(160).nullable().optional(),published_at:i.z.string().max(80).nullable().optional(),short_description:i.z.string().max(2e3).nullable().optional(),slug:i.z.string().trim().min(1).max(300).optional(),status:i.z.enum(["draft","published","active","archived"]).optional(),subtitle:i.z.string().max(300).nullable().optional(),title:i.z.string().trim().min(1).max(300).optional()}).partial()}),te=i.z.strictObject({blockId:i.z.number().int().positive(),blockType:i.z.enum(G).optional(),content:i.z.record(i.z.string(),i.z.unknown())}),ne=i.z.strictObject({blockIndex:i.z.number().int().min(0),blockType:i.z.enum(G).optional(),columnIndex:i.z.number().int().min(0),content:i.z.record(i.z.string(),i.z.unknown()),parentBlockId:i.z.number().int().positive()}),wn=i.z.enum(["page","post","product"]),H=i.z.strictObject({contentType:wn.optional(),entityId:i.z.union([i.z.number().int().positive(),i.z.string().trim().min(1).max(120)]).optional(),slug:i.z.string().trim().min(1).max(300).optional(),title:i.z.string().trim().min(1).max(300).optional()}),oe=i.z.strictObject({blockType:i.z.enum(G),content:i.z.record(i.z.string(),i.z.unknown()),order:i.z.number().int().min(0).optional()}),re=H.extend({images:i.z.array(i.z.string().trim().min(1).max(2048)).min(1).max(12).describe("External https image URLs (imported into the media library automatically) and/or existing media library ids. The first entry is the feature image (pages/posts) or the main product image (products).")}),ie=H.extend({anchorBlockId:i.z.number().int().positive().optional(),anchorBlockType:i.z.enum(G).optional(),block:oe,position:i.z.enum(["before","after","start","end"]).default("end")}),ae=i.z.strictObject({blocks:i.z.array(oe).max(20).optional(),contactEmail:i.z.string().email().optional(),feature_image_id:i.z.string().trim().min(1).max(2048).nullable().optional(),languageCode:i.z.string().trim().min(2).max(80).optional(),meta_description:i.z.string().max(500).nullable().optional(),meta_title:i.z.string().max(160).nullable().optional(),slug:i.z.string().trim().min(1).max(300).optional(),status:i.z.enum(["draft","published","archived"]).default("draft"),title:i.z.string().trim().min(1).max(300),translationGroupId:i.z.string().trim().min(1).max(120).optional()}),se=i.z.strictObject({blocks:i.z.array(oe).max(20).optional(),excerpt:i.z.string().max(2e3).nullable().optional(),feature_image_id:i.z.string().trim().min(1).max(2048).nullable().optional(),label:i.z.string().max(120).nullable().optional(),languageCode:i.z.string().trim().min(2).max(80).optional(),meta_description:i.z.string().max(500).nullable().optional(),meta_title:i.z.string().max(160).nullable().optional(),published_at:i.z.string().max(80).nullable().optional(),slug:i.z.string().trim().min(1).max(300).optional(),status:i.z.enum(["draft","published","archived"]).default("draft"),subtitle:i.z.string().max(300).nullable().optional(),title:i.z.string().trim().min(1).max(300),translationGroupId:i.z.string().trim().min(1).max(120).optional()}),ce=i.z.strictObject({blocks:i.z.array(oe).max(20).optional().describe("Content blocks for the product description area, same block vocabulary as create_cms_page. Rendered on the public product page in place of the plain description."),description_html:i.z.string().max(6e4).optional().describe("The product body as an HTML fragment (headings, paragraphs, lists, bold/italic/links). Converted to the editor document automatically. Prefer this over description_json."),description_json:i.z.unknown().optional(),freemius_plan_id:i.z.string().optional(),freemius_product_id:i.z.string().optional(),images:i.z.array(i.z.string().trim().min(1).max(2048)).max(12).optional().describe("Product images, in order: the first becomes the main product image and the rest the gallery. Each entry is either an external https image URL (imported into the media library automatically) or an existing media library id."),is_taxable:i.z.boolean().default(!0),languageCode:i.z.string().trim().min(2).max(80).optional(),meta_description:i.z.string().max(500).nullable().optional(),meta_title:i.z.string().max(160).nullable().optional(),payment_provider:i.z.enum(["stripe","freemius"]).default("stripe"),price:i.z.number().min(0).default(0),prices:i.z.record(i.z.string(),i.z.number().min(0)).optional(),product_type:i.z.enum(["physical","digital"]).default("physical"),sale_price:i.z.number().min(0).nullable().optional(),sale_prices:i.z.record(i.z.string(),i.z.number().min(0).nullable()).optional(),short_description:i.z.string().max(2e3).nullable().optional(),sku:i.z.string().trim().min(1).max(120).optional(),slug:i.z.string().trim().min(1).max(300).optional(),status:i.z.enum(["draft","active","archived"]).default("draft"),stock:i.z.number().int().min(0).default(0),title:i.z.string().trim().min(1).max(300),trial_period_days:i.z.number().int().min(0).default(0),trial_requires_payment_method:i.z.boolean().default(!1),translationGroupId:i.z.string().trim().min(1).max(120).optional(),upc:i.z.string().max(120).nullable().optional()}),le=H.extend({currencyCode:i.z.string().trim().min(3).max(3).optional(),endsAt:i.z.string().max(80).nullable().optional(),field:i.z.string().trim().min(1).max(120),startsAt:i.z.string().max(80).nullable().optional(),value:i.z.unknown()}),Ge=H,ue=H,Ut=i.z.discriminatedUnion("tool",[i.z.strictObject({input:ae,tool:i.z.literal("create_cms_page")}),i.z.strictObject({input:se,tool:i.z.literal("create_cms_post")}),i.z.strictObject({input:ce,tool:i.z.literal("create_cms_product")}),i.z.strictObject({input:ue,tool:i.z.literal("delete_cms_item")}),i.z.strictObject({input:le,tool:i.z.literal("update_cms_item_field")}),i.z.strictObject({input:te,tool:i.z.literal("update_content_block")}),i.z.strictObject({input:ie,tool:i.z.literal("insert_content_block")}),i.z.strictObject({input:ee,tool:i.z.literal("update_current_cms_fields")}),i.z.strictObject({input:Z,tool:i.z.literal("update_footer")}),i.z.strictObject({input:Q,tool:i.z.literal("update_navigation_bar")}),i.z.strictObject({input:ne,tool:i.z.literal("update_section_column_block")}),i.z.strictObject({input:re,tool:i.z.literal("set_content_images")})]),In=i.z.union([ae.extend({tool:i.z.literal("create_cms_page")}).transform(({tool:e,...t})=>({input:t,tool:e})),se.extend({tool:i.z.literal("create_cms_post")}).transform(({tool:e,...t})=>({input:t,tool:e})),ce.extend({tool:i.z.literal("create_cms_product")}).transform(({tool:e,...t})=>({input:t,tool:e})),ue.extend({tool:i.z.literal("delete_cms_item")}).transform(({tool:e,...t})=>({input:t,tool:e})),le.extend({tool:i.z.literal("update_cms_item_field")}).transform(({tool:e,...t})=>({input:t,tool:e})),te.extend({tool:i.z.literal("update_content_block")}).transform(({tool:e,...t})=>({input:t,tool:e})),ie.extend({tool:i.z.literal("insert_content_block")}).transform(({tool:e,...t})=>({input:t,tool:e})),ee.extend({tool:i.z.literal("update_current_cms_fields")}).transform(({tool:e,...t})=>({input:t,tool:e})),Z.extend({tool:i.z.literal("update_footer")}).transform(({tool:e,...t})=>({input:t,tool:e})),Q.extend({tool:i.z.literal("update_navigation_bar")}).transform(({tool:e,...t})=>({input:t,tool:e})),ne.extend({tool:i.z.literal("update_section_column_block")}).transform(({tool:e,...t})=>({input:t,tool:e})),re.extend({tool:i.z.literal("set_content_images")}).transform(({tool:e,...t})=>({input:t,tool:e}))]),Tn=i.z.string().transform((e,t)=>{const n=vn(e);return n.success?n.action:(t.addIssue({code:"custom",message:n.message}),i.z.NEVER)}),xn=i.z.union([Ut,In,Tn]),Ke=i.z.strictObject({actions:i.z.array(xn).min(1).max(8),summary:i.z.string().trim().min(1).max(500).optional()});function Cn(e){const t=[];let n="",o=0,r=null,a=!1;for(const s of e){if(r){n+=s,a?a=!1:s==="\\"?a=!0:s===r&&(r=null);continue}if(s==='"'||s==="'"){r=s,n+=s;continue}if(s==="["||s==="{"||s==="("){o++,n+=s;continue}if(s==="]"||s==="}"||s===")"){o=Math.max(0,o-1),n+=s;continue}if(s===","&&o===0){n.trim()&&t.push(n.trim()),n="";continue}n+=s}return n.trim()&&t.push(n.trim()),t}function _t(e){let t="";for(let n=0;n<e.length;n++){const o=e[n];if(o!=="'"){t+=o;continue}let r="",a=!1;for(n++;n<e.length;n++){const s=e[n];if(a){r+=s,a=!1;continue}if(s==="\\"){a=!0;continue}if(s==="'")break;r+=s}t+=JSON.stringify(r)}return t.replace(/\bTrue\b/g,"true").replace(/\bFalse\b/g,"false").replace(/\bNone\b/g,"null")}function zn(e){const t=e.trim();return t.startsWith("'")&&t.endsWith("'")||t.startsWith('"')&&t.endsWith('"')||t.startsWith("[")||t.startsWith("{")?JSON.parse(_t(t)):/^-?\d+(?:\.\d+)?$/.test(t)?Number(t):t==="true"||t==="True"?!0:t==="false"||t==="False"?!1:t==="null"||t==="None"?null:t}function Sn(e){const t={};for(const n of Cn(e)){const o=n.indexOf("=");if(o<=0)throw new Error(`Expected key=value argument, received "${n}".`);const r=n.slice(0,o).trim();if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(r))throw new Error(`Invalid argument name "${r}".`);t[r]=zn(n.slice(o+1))}return t}function vn(e){const n=e.trim().match(/^([a-z_]+)\(([\s\S]*)\)$/);if(!n)return{message:'Action plan actions must be JSON objects like { "tool": "create_cms_page", "input": { ... } }, not freeform text.',success:!1};const o=n[1];let r;try{r=Sn(n[2])}catch(c){return{message:c instanceof Error?c.message:"Could not parse action-plan command arguments.",success:!1}}const a={input:r,tool:o},s=Ut.safeParse(a);return s.success?{action:s.data,success:!0}:{message:`Invalid action-plan command "${o}": ${s.error.issues.map(c=>c.message).join("; ")}`,success:!1}}function En(e){return e.normalize("NFD").replace(/[\u0300-\u036f]/g,"").toLowerCase().replace(/\s+/g," ").trim()}function fe(e,t){return t.some(n=>e.includes(n))}function $n(e){const t=En(e),n=fe(t,["add ","insert ","put ","create "]),o=fe(t,["title","heading","description","intro","copy","paragraph"]),r=t.includes("form")&&fe(t,["above","before"]),a=t.includes("contact page")||t.includes("contact pages")||t.includes("contact us")||t.includes("contactez-nous"),s=t.includes("english")&&fe(t,["french","francais","francaise"]);return!n||!o||!r||!a||!s?null:{actions:[{input:{anchorBlockType:"form",block:{blockType:"text",content:{html_content:"<h2>Let us help you move faster</h2><p>Have a question, project idea, or need help choosing the right next step? Send us a message and the NextBlock team will get back to you soon.</p>"}},contentType:"page",position:"before",slug:"contact-us"},tool:"insert_content_block"},{input:{anchorBlockType:"form",block:{blockType:"text",content:{html_content:"<h2>Parlons de votre projet</h2><p>Vous avez une question, une idee de projet ou besoin d'aide pour avancer? Envoyez-nous un message et l'equipe NextBlock vous repondra rapidement.</p>"}},contentType:"page",position:"before",slug:"contactez-nous"},tool:"insert_content_block"}],summary:"Add visible title and description copy above the forms on the English and French Contact pages."}}const An=i.z.enum(G),bt=i.z.object({direction:i.z.string().optional(),stops:i.z.array(i.z.object({color:i.z.string(),position:i.z.number()})),type:i.z.enum(["linear","radial"])}),Pn=i.z.object({gradient:bt.optional(),image:i.z.object({alt_text:i.z.string().optional(),blur_data_url:i.z.string().optional(),external_url:i.z.string().optional(),height:i.z.number().optional(),media_id:i.z.string().optional(),object_key:i.z.string().optional(),overlay:i.z.object({gradient:bt,type:i.z.literal("gradient")}).optional(),position:i.z.enum(["center","top","bottom","left","right"]),quality:i.z.number().nullable().optional(),size:i.z.enum(["cover","contain"]),width:i.z.number().optional()}).optional(),min_height:i.z.string().optional(),solid_color:i.z.string().optional(),theme:i.z.enum(["primary","secondary","muted","accent","destructive"]).optional(),type:i.z.enum(["none","theme","solid","gradient","image"])}),Nn=i.z.object({block_type:An,content:i.z.record(i.z.string(),i.z.any()),temp_id:i.z.string().optional()}),Un=i.z.object({background:Pn,column_blocks:i.z.array(i.z.array(Nn)),column_gap:i.z.enum(["none","sm","md","lg","xl"]),container_type:i.z.enum(["full-width","container","container-sm","container-lg","container-xl"]),padding:i.z.object({bottom:i.z.enum(["none","sm","md","lg","xl"]),top:i.z.enum(["none","sm","md","lg","xl"])}),responsive_columns:i.z.object({desktop:i.z.union([i.z.literal(1),i.z.literal(2),i.z.literal(3),i.z.literal(4)]),mobile:i.z.union([i.z.literal(1),i.z.literal(2)]),tablet:i.z.union([i.z.literal(1),i.z.literal(2),i.z.literal(3)])}),vertical_alignment:i.z.enum(["start","center","end","stretch"]).optional()}),Fn={button:i.z.object({position:i.z.enum(["left","center","right"]).optional(),size:i.z.enum(["default","sm","lg","full"]).optional(),text:i.z.string(),url:i.z.string(),variant:i.z.enum(["default","outline","secondary","ghost","link"]).optional()}),cart:i.z.object({}),checkout:i.z.object({}),featured_product:i.z.object({imagePosition:i.z.enum(["left","right"]).default("left"),productId:i.z.string().min(1),showBackground:i.z.boolean().default(!1)}),form:i.z.object({fields:i.z.array(i.z.object({field_type:i.z.enum(["text","email","textarea","select","radio","checkbox"]),is_required:i.z.boolean(),label:i.z.string(),options:i.z.array(i.z.object({label:i.z.string(),value:i.z.string()})).optional(),placeholder:i.z.string().optional(),temp_id:i.z.string()})),recipient_email:i.z.string().email(),submit_button_text:i.z.string(),success_message:i.z.string()}),heading:i.z.object({level:i.z.union([i.z.literal(1),i.z.literal(2),i.z.literal(3),i.z.literal(4),i.z.literal(5),i.z.literal(6)]),textAlign:i.z.enum(["left","center","right","justify"]).optional(),textColor:i.z.enum(["primary","secondary","accent","muted","destructive","background"]).optional(),text_content:i.z.string()}),image:i.z.object({alt_text:i.z.string().optional(),caption:i.z.string().optional(),external_url:i.z.string().nullable().optional(),height:i.z.number().nullable().optional(),media_id:i.z.string().nullable().optional(),object_key:i.z.string().nullable().optional(),width:i.z.number().nullable().optional()}),posts_grid:i.z.object({columns:i.z.number().min(1).max(6),postsPerPage:i.z.number().min(1).max(50),showPagination:i.z.boolean(),title:i.z.string().optional()}),product_details:i.z.object({}),product_grid:i.z.object({categoryId:i.z.string().optional(),limit:i.z.number().min(1).max(20).default(6),title:i.z.string().optional(),type:i.z.enum(["latest","category"]).default("latest")}),section:Un,testimonial:i.z.object({author_name:i.z.string().min(1),author_title:i.z.string().optional(),image_url:i.z.string().url().optional().or(i.z.literal("")),quote:i.z.string().min(1)}),text:i.z.object({html_content:i.z.string()}),video_embed:i.z.object({autoplay:i.z.boolean().optional(),controls:i.z.boolean().optional(),title:i.z.string().optional(),url:i.z.string()})};function On(e){return G.includes(e)}function jn(e){return typeof e?.validateBlockContent=="function"?e.validateBlockContent:null}function Bn(e,t,n){const o=jn(n);if(o)return o(e,t);const r=Fn[e].safeParse(t);return r.success?{errors:[],isValid:!0,warnings:[]}:{errors:r.error.issues.map(a=>{const s=a.path.join(".");return s?`${s}: ${a.message}`:a.message}),isValid:!1,warnings:[]}}function kt(){return i.z.object({content:i.z.array(i.z.any()).optional(),type:i.z.literal("doc")})}function He(){try{const{revalidatePath:e}=require("next/cache");return e}catch{return null}}function C(e){if(!e?.supabase)throw new Error("A Supabase service client is required to execute Cortex AI global tools.");return e.supabase}function Ln(e,t,n){let o;const r=new Promise(a=>{o=setTimeout(()=>a(n()),t)});return Promise.race([e.finally(()=>{o&&clearTimeout(o)}),r])}function V(e){const t=Me.safeParse(e?.pageContext);if(!t.success)throw new Error("No current CMS page context is available. Open a page, post, or product edit screen before using this editing tool.");return t.data}function Ve(e){const t=typeof e.entityId=="number"?e.entityId:Number.parseInt(e.entityId,10);if(!Number.isInteger(t)||t<=0)throw new Error(`Current ${e.contentType} id must be a positive integer.`);return t}function Ft(e){const t=String(e.entityId||"").trim();if(!t)throw new Error(`Current ${e.contentType} id is missing.`);return t}function Ce(e){return e.contentType==="product"?Ft(e):Ve(e)}const qn=/^https?:\/\//i,Rn=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;async function de(e,t,n){if(typeof e!="string")return null;const o=e.trim();if(!o)return null;if(!qn.test(o)){if(Rn.test(o))return o;throw new Error(`"${o}" is not a usable image reference — provide an https:// image URL or a media library id.`)}const r=t?.importExternalImage;if(!r)throw new Error("I can only attach an image from a URL when media import is available here. Please pick an image from the media library instead.");const a=await r({altText:n,url:o});if("error"in a)throw new Error(`I could not import the image from that URL: ${a.error}`);return a.id}async function Ot(e,t,n){const o=[];for(let r=0;r<e.length;r+=1){const a=await de(e[r],t,`${n} image ${r+1}`);a&&o.push(a)}return o}async function Mn(e){const t=[...new Set(e.mediaIds)],{error:n}=await e.supabase.from("product_media").delete().eq("product_id",e.productId);if(n)throw new Error(`Could not clear the product's existing images: ${_(n)}`);if(t.length>0){const{error:o}=await e.supabase.from("product_media").insert(t.map((r,a)=>({media_id:r,product_id:e.productId,sort_order:a})));if(o)throw new Error(`Could not save the product images: ${_(o)}`)}return t}async function ze(e){if(!e.productId)return!1;const{data:t,error:n}=await e.supabase.from("product_drafts").select("id, blocks, meta").eq("product_id",e.productId).maybeSingle();if(n||!t)return!1;const o=e.patch({blocks:Array.isArray(t.blocks)?D(t.blocks):[],meta:E(t.meta)?D(t.meta):{}}),r={updated_at:new Date().toISOString()};if(o.blocks&&(r.blocks=o.blocks),o.meta&&(r.meta=o.meta),Object.keys(r).length===1)return!1;const{error:a}=await e.supabase.from("product_drafts").update(r).eq("id",t.id);if(a)throw new Error(`The product was updated, but its open draft could not be kept in sync: ${_(a)}. Publishing that draft would undo this change — publish or discard it in the product editor first.`);return!0}function jt(e){return typeof e=="string"?e.trim().replace(/^\/+|\/+$/g,""):""}function Dn(e,t){const n=jt(t??e.slug);return n?e.contentType==="page"?n==="home"?"/":`/${n}`:e.contentType==="post"?`/article/${n}`:`/product/${n}`:null}function Gn(e){const t=String(e.entityId);return e.contentType==="page"?`/cms/pages/${t}/edit`:e.contentType==="post"?`/cms/posts/${t}/edit`:`/cms/products/${t}/edit`}function N(e,t,n){const o=e?.revalidatePath??He();if(!o)return;o(Gn(t));const r=Dn(t,n);r&&o(r),t.contentType==="page"&&r!=="/"&&o("/"),t.contentType==="product"&&o("/cms/products")}function Bt(e){const t=e?.revalidatePath??He();t&&(t("/","layout"),t("/cms/navigation"))}function _(e){return e?typeof e=="object"&&"message"in e?String(e.message||"Unknown database error."):String(e):"Unknown database error."}async function Kn(){return Promise.resolve().then(()=>require("./ai-global-agent-ecommerce.cjs.js"))}function Pe(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(t=>Pe(t)).join(",")}]`:`{${Object.keys(e).filter(t=>t!=="temp_id").sort().map(t=>`${JSON.stringify(t)}:${Pe(e[t])}`).join(",")}}`}function Hn(e){let t=2166136261;const n=Pe(e);for(let o=0;o<n.length;o++)t^=n.charCodeAt(o),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}function Ne(e){return e.replace(/\s+/g," ").trim().toUpperCase()}function Vn(e,t,n){return`${Ne(`CONFIRM ${e} ${t}`)} #${Hn(n)}`}function Lt(e){return{confirmationPhrase:Vn(e.action,e.subject,e.payload),mutationExecuted:!1,preview:e.preview,requiresConfirmation:!0,success:!0}}function U(e,t){const n=e[t];return typeof n=="string"&&n.trim()?n.trim():null}function R(e,t){const n=Number(e[t]);return Number.isFinite(n)?n:null}function P(e,t,n=`${t}s`){return`${e} ${e===1?t:n}`}function Wn(e,t){const n=U(t,"summary");if(n)return n;const o=U(t,"title"),r=U(t,"slug"),a=U(t,"status"),s=U(t,"contentType"),c=U(t,"field"),u=U(t,"mode"),d=U(t,"languageCode"),l=R(t,"blockCount"),m=R(t,"itemCount"),h=R(t,"affectedCount");if(e==="create_cms_page"||e==="create_cms_post")return`Create ${a||"draft"} ${e==="create_cms_page"?"page":"post"} "${o||r||"Untitled"}"${r?` at slug "${r}"`:""}${l!==null?` with ${P(l,"content block")}`:""}.`;if(e==="create_cms_product"){const p=R(t,"imageCount"),g=R(t,"blockCount"),f=[p?P(p,"image"):null,g?P(g,"description block"):R(t,"descriptionLength")?"a full description":null].filter(Boolean);return`Create ${a||"draft"} product "${o||r||"Untitled"}"${r?` at slug "${r}"`:""}${f.length?` with ${f.join(" and ")}`:""}.`}if(e==="update_cms_item_field")return`Update ${c||"one field"} on the ${s||"CMS item"} "${o||r||"selected item"}".`;if(e==="update_navigation_bar")return`${u==="append"?"Add":u==="update"?"Update":"Replace"} ${m!==null?P(m,"navigation item"):"navigation items"} in the ${d||"selected"} header navigation.`;if(e==="update_footer"){const p=R(t,"linkCount");return`Update the ${d||"selected"} footer${p!==null?` with ${P(p,"link")}`:""}.`}return e==="update_content_block"?`Update the selected ${U(t,"blockType")||"content"} block.`:e==="insert_content_block"?`Insert ${U(t,"blockType")||"content"} block on the ${s||"CMS item"} "${o||r||"selected item"}".`:e==="update_section_column_block"?`Update the selected nested ${U(t,"nestedBlockType")||"section"} block.`:e==="delete_cms_item"||e==="prepare_delete_cms_item"?`Delete ${h!==null?P(h,s||"CMS item"):`the selected ${s||"CMS item"}`}${o||r?` for "${o||r}"`:""}.`:"Complete the requested CMS change."}function A(e){if(e.context?.skipConfirmation)return null;const t=Lt(e),n=Ne(e.context?.latestUserMessage||""),o=Ne(t.confirmationPhrase);return n.includes(o)?null:t}function We(e){const t=e?.actorUserId;if(!t)throw new Error("A confirmed CMS mutation requires an authenticated admin actor.");return t}function Je(){return globalThis.crypto?.randomUUID?.()||`id-${Date.now()}-${Math.random().toString(36).slice(2)}`}function L(e){return e.toLowerCase().trim().replace(/\s+/g,"-").replace(/[^a-z0-9-]/g,"").replace(/-+/g,"-").replace(/^-|-$/g,"").slice(0,300)}function Ye(e){return(e||"USD").trim().toUpperCase()}const Jn=new Set(["BIF","CLP","DJF","GNF","JPY","KMF","KRW","MGA","PYG","RWF","UGX","VND","VUV","XAF","XOF","XPF"]);function Yn(e){return Jn.has(Ye(e))?0:2}function qt(e,t){return Math.round(e*10**Yn(t))}function Xn(e,t){return!e||typeof e!="object"||Array.isArray(e)?{}:Object.entries(e).reduce((n,[o,r])=>{if(typeof r=="number"&&Number.isFinite(r)&&r>=0){const a=Ye(o||t);n[a]=qt(r,a)}return n},{})}function pe(e,t){if(!E(e))throw new Error(`${t} content must be a JSON object.`);return JSON.parse(JSON.stringify(e))}function D(e){return JSON.parse(JSON.stringify(e))}function E(e){return!!(e&&typeof e=="object"&&!Array.isArray(e))}function Ue(e,t){const n=D(e);for(const[o,r]of Object.entries(t))if(r!==void 0){if(E(r)&&E(n[o])){n[o]=Ue(n[o],r);continue}n[o]=D(r)}return n}function Rt(e,t){if(t.contentType==="product"){if(String(e.product_id??"")!==String(Ft(t)))throw new Error(`Block ${e.id} does not belong to the current product being edited.`);return}const n=Ve(t);if((t.contentType==="page"?Number(e.page_id):Number(e.post_id))!==n)throw new Error(`Block ${e.id} does not belong to the current ${t.contentType} being edited.`)}function be(e,t){const n=typeof e=="string"?e:"";if(!On(n))throw new Error(`${t} has unsupported block type "${n||"unknown"}".`);return n}function Mt(e,t,n){if(e&&e!==t)throw new Error(`${n} is a "${t}" block. Refusing to update it as "${e}".`)}function M(e,t,n,o){const r=Bn(e,t,o);if(!r.isValid)throw new Error(`${n} content is invalid for block type "${e}": ${r.errors.join("; ")}`)}function Dt(e){return e==="section"}function Qn(e){return typeof e.html_content=="string"?"text":typeof e.text=="string"&&typeof e.url=="string"?"button":typeof e.text_content=="string"?"heading":"media_id"in e||"object_key"in e||"external_url"in e?"image":typeof e.quote=="string"&&typeof e.author_name=="string"?"testimonial":typeof e.url=="string"&&("controls"in e||"autoplay"in e||"title"in e)?"video_embed":Array.isArray(e.fields)||typeof e.recipient_email=="string"?"form":"postsPerPage"in e||"showPagination"in e?"posts_grid":typeof e.productId=="string"?"featured_product":"limit"in e&&"type"in e?"product_grid":null}function ke(e){return`ai-${e}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}function Fe(e,t,n){if(!E(e))throw new Error(`${t} must be a JSON object.`);const o=e.block_type??e.blockType,r=be(o,t);if(Dt(r))throw new Error(`${t} cannot be a nested ${r} block.`);const a=Vt(r,pe(e.content,t),t,n),s=e.temp_id??e.tempId,c=typeof s=="string"&&s.trim()?s:ke(r);return{block_type:r,content:a,temp_id:c}}function Zn(e,t){const n=[];if("append_block"in e&&n.push(Fe(e.append_block,"Nested block to append",t)),"append_blocks"in e){const o=e.append_blocks;if(!Array.isArray(o))throw new Error("append_blocks must be an array of nested block objects.");o.forEach((r,a)=>{n.push(Fe(r,`Nested block to append ${a}`,t))})}return n}function eo(e,t){if("append_block"in e||"append_blocks"in e||"background"in e||"column_blocks"in e||"column_gap"in e||"container_type"in e||"padding"in e||"responsive_columns"in e||"vertical_alignment"in e)return null;const n=Qn(e);if(!n)return null;const o=pe(e,`Nested ${n} block`);return M(n,o,`Nested ${n} block`,t),{block_type:n,content:o,temp_id:ke(n)}}function to(e,t){const n=e.append_column_index??e.column_index;if(n===void 0)return 0;if(typeof n!="number"||!Number.isInteger(n)||n<0)throw new Error("append_column_index must be a non-negative integer.");if(t>0&&n>=t)throw new Error(`append_column_index ${n} is outside the existing ${t} column(s).`);return n}function no(e,t,n,o){if(!Dt(e))return Ue(t,n);const r={...n},a=Zn(r,o),s=eo(r,o);s&&a.push(s),delete r.append_block,delete r.append_blocks,delete r.append_column_index,delete r.column_index;const c=Ue(t,r);if(a.length>0){const u=Array.isArray(t.column_blocks)?D(t.column_blocks):[],d=to(n,u.length),l=u.length>0?u:[[]];for(;l.length<=d;)l.push([]);l[d]=[...l[d]||[],...a],c.column_blocks=l}return c}function oo(e,t){return{blockType:e.block_type,content:t?e.content:void 0,id:e.id,languageId:e.language_id,order:e.order,pageId:e.page_id,postId:e.post_id}}function K(e){return typeof e=="string"?e.trim().toLowerCase():""}function wt(e){return typeof e=="string"?e.trim().toLowerCase():""}function Gt(e){return e.reduce((t,n)=>t+1+(n.children?.length||0),0)}function _e(e){return typeof e=="string"?e.trim().toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g,""):""}async function W(e,t){const n=t.trim(),o=_e(n),r=bn[o],{data:a,error:s}=await e.from("languages").select("id, code, name, is_active");if(s)throw new Error(`Failed to load language "${t}": ${_(s)}`);const u=(Array.isArray(a)?a:[]).filter(l=>l.is_active!==!1),d=u.find(l=>{const m=_e(l.code),h=_e(l.name);return m===o||m===r||h===o});if(!d?.id||!d?.code){const l=u.map(m=>m.code).filter(Boolean).join(", ");throw new Error(`Language "${t}" was not found.${l?` Available languages: ${l}.`:""}`)}return{code:String(d.code),id:Number(d.id)}}async function Se(e,t){if(t)return W(e,t);const{data:n,error:o}=await e.from("languages").select("id, code, name, is_active, is_default");if(o)throw new Error(`Failed to load active languages: ${_(o)}`);const r=(Array.isArray(n)?n:[]).filter(s=>s.is_active!==!1),a=r.find(s=>s.is_default)||r.find(s=>_e(s.code)==="en")||r[0];if(!a?.id||!a?.code)throw new Error("No active CMS language is available for Cortex AI content creation.");return{code:String(a.code),id:Number(a.id)}}async function It(e){try{const{data:t,error:n}=await e.from("currencies").select("code, is_default, is_active").eq("is_active",!0);if(n)return"USD";const o=Array.isArray(t)?t:[],r=o.find(a=>a.is_default)||o[0];return Ye(r?.code||"USD")}catch{return"USD"}}async function ro(e){const t=e.contentType==="page"?"pages":e.contentType==="post"?"posts":"products";let n="id",o=e.entityId;if(o===void 0&&e.slug&&(n="slug",o=e.slug),o===void 0&&e.title&&(n="title",o=e.title),o===void 0)throw new Error(`A ${e.contentType} target requires an id, slug, title, or current edit context.`);const{data:r,error:a}=await e.supabase.from(t).select("*").eq(n,o);if(a)throw new Error(`Failed to resolve ${e.contentType}: ${_(a)}`);const s=Array.isArray(r)?r:r?[r]:[];if(s.length!==1)throw new Error(s.length===0?`No ${e.contentType} matched ${n} "${String(o)}".`:`Multiple ${e.contentType}s matched ${n} "${String(o)}"; use an exact id.`);return s[0]}async function me(e,t){const n=Me.safeParse(t?.pageContext).success?t?.pageContext:null,o=e.contentType||n?.contentType;if(!o)throw new Error("Target contentType is required when no current CMS edit context exists.");const r=e.entityId!==void 0||!!e.slug||!!e.title,a=e.entityId??(r?void 0:n?.entityId),s=e.slug??(r?void 0:n?.slug??void 0),c=e.title??(r?void 0:n?.title??void 0),u=await ro({contentType:o,entityId:a,slug:a===void 0&&s||void 0,supabase:C(t),title:a===void 0&&!s&&c||void 0});return{contentType:o,item:u}}async function we(e){const t=await ao({item:e.item,languageId:e.languageId,menuKey:e.menuKey,supabase:e.supabase}),n={label:e.item.label,language_id:e.languageId,menu_key:e.menuKey,order:e.order,page_id:t?.pageId??null,parent_id:e.parentId??null,...t?.navigationTranslationGroupId?{translation_group_id:t.navigationTranslationGroupId}:{},url:e.item.url},{data:o,error:r}=await e.supabase.from("navigation_items").insert(n).select("id").single();if(r)throw new Error(`Failed to insert ${e.menuKey} navigation item: ${_(r)}`);return Number(o.id)}function io(e){const t=e.trim();if(!t.startsWith("/")||t.startsWith("//"))return null;const n=t.split("?")[0]?.split("#")[0]||"",o=n==="/"?"home":n.replace(/^\/+|\/+$/g,"");return o&&!o.includes("/")?o:null}async function ao(e){const t=io(e.item.url);if(!t)return null;const{data:n,error:o}=await e.supabase.from("pages").select("id, slug, translation_group_id, language_id").eq("slug",t).eq("language_id",e.languageId);if(o)throw new Error(`Failed to resolve linked page for navigation item: ${_(o)}`);const r=Array.isArray(n)?n[0]:n;if(!r?.id)return null;let a=Je();if(r.translation_group_id){const{data:s,error:c}=await e.supabase.from("pages").select("id").eq("translation_group_id",r.translation_group_id);if(c)throw new Error(`Failed to inspect linked page translations for navigation item: ${_(c)}`);const u=new Set((Array.isArray(s)?s:[]).map(h=>String(h.id)).filter(Boolean)),{data:d,error:l}=await e.supabase.from("navigation_items").select("id, page_id, translation_group_id, menu_key").eq("menu_key",e.menuKey);if(l)throw new Error(`Failed to inspect related navigation translations: ${_(l)}`);const m=(Array.isArray(d)?d:[]).find(h=>h.translation_group_id&&u.has(String(h.page_id)));m?.translation_group_id&&(a=m.translation_group_id)}return{navigationTranslationGroupId:a,pageId:Number(r.id)}}async function Kt(e){const t=await W(e.supabase,e.languageCode),{data:n,error:o}=await e.supabase.from("navigation_items").select("id, parent_id").eq("menu_key",e.menuKey).eq("language_id",t.id);if(o)throw new Error(`Failed to inspect existing ${e.menuKey} navigation items: ${_(o)}`);const r=Array.isArray(n)?n:[],a=r.filter(d=>d.parent_id==null).length,s=Gt(e.items);Ht({existingItemCount:r.length,existingTopLevelCount:a,languageCode:t.code,menuKey:e.menuKey,replacementItemCount:s});const{error:c}=await e.supabase.from("navigation_items").delete().eq("menu_key",e.menuKey).eq("language_id",t.id);if(c)throw new Error(`Failed to clear ${e.menuKey} navigation items: ${_(c)}`);let u=0;for(const[d,l]of e.items.entries()){const m=await we({item:l,languageId:t.id,menuKey:e.menuKey,order:d,supabase:e.supabase});u++;for(const[h,p]of(l.children??[]).entries())await we({item:p,languageId:t.id,menuKey:e.menuKey,order:h,parentId:m,supabase:e.supabase}),u++}return{insertedCount:u,languageCode:t.code,menuKey:e.menuKey,skippedCount:0,updatedCount:0}}function Ht(e){if(!(e.existingItemCount===0||e.replacementItemCount>=e.existingItemCount))throw new Error(`Refusing destructive ${e.menuKey} navigation replacement for ${e.languageCode}: existing menu has ${e.existingItemCount} items (${e.existingTopLevelCount} top-level), but the replacement only contains ${e.replacementItemCount}. Use mode "update" for renaming or changing a single link, or provide the full menu.`)}async function so(e){const t=await W(e.supabase,e.languageCode),{data:n,error:o}=await e.supabase.from("navigation_items").select("id, parent_id").eq("menu_key",e.menuKey).eq("language_id",t.id);if(o)throw new Error(`Failed to inspect existing ${e.menuKey} navigation items: ${_(o)}`);const r=Array.isArray(n)?n:[];Ht({existingItemCount:r.length,existingTopLevelCount:r.filter(a=>a.parent_id==null).length,languageCode:t.code,menuKey:e.menuKey,replacementItemCount:Gt(e.items)})}async function co(e){if(e.items.length!==1)throw new Error('mode "update" requires exactly one navigation item.');const t=await W(e.supabase,e.languageCode),n=e.items[0],o=K(e.match?.url)||K(n.url),r=wt(e.match?.label),{data:a,error:s}=await e.supabase.from("navigation_items").select("id, label, url, parent_id, order").eq("menu_key",e.menuKey).eq("language_id",t.id);if(s)throw new Error(`Failed to load existing ${e.menuKey} navigation items: ${_(s)}`);const u=(Array.isArray(a)?a:[]).find(l=>{const m=K(l.url),h=wt(l.label);return!!(o&&m===o||r&&h===r)});if(!u?.id)throw new Error(`Could not find a ${e.menuKey} navigation item to update in ${t.code}. Use a matching label or url.`);const{error:d}=await e.supabase.from("navigation_items").update({label:n.label,url:n.url}).eq("id",u.id);if(d)throw new Error(`Failed to update ${e.menuKey} navigation item: ${_(d)}`);return{insertedCount:0,languageCode:t.code,menuKey:e.menuKey,skippedCount:0,updatedCount:1}}async function lo(e){const t=await W(e.supabase,e.languageCode),{data:n,error:o}=await e.supabase.from("navigation_items").select("id, url, parent_id, order").eq("menu_key",e.menuKey).eq("language_id",t.id);if(o)throw new Error(`Failed to load existing ${e.menuKey} navigation items: ${_(o)}`);let r=0,a=0;const s=Array.isArray(n)?n:[],c=new Set(s.map(l=>K(l.url)).filter(Boolean)),u=s.filter(l=>l.parent_id==null).map(l=>Number(l.order)).filter(Number.isFinite);let d=u.length>0?Math.max(...u)+1:s.length;for(const l of e.items){const m=K(l.url);if(m&&c.has(m)){a++;continue}const h=await we({item:l,languageId:t.id,menuKey:e.menuKey,order:d,supabase:e.supabase});r++,d++,m&&c.add(m);let p=0;for(const g of l.children??[]){const f=K(g.url);if(f&&c.has(f)){a++;continue}await we({item:g,languageId:t.id,menuKey:e.menuKey,order:p,parentId:h,supabase:e.supabase}),r++,p++,f&&c.add(f)}}return{insertedCount:r,languageCode:t.code,menuKey:e.menuKey,skippedCount:a,updatedCount:0}}function S(e){return typeof e=="string"&&e.trim()?e.trim():""}function uo(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function po(e){const t=S(e.field_type??e.fieldType??e.type??e.input_type).toLowerCase().replace(/\s+/g,"_"),n=S(e.label??e.name??e.placeholder).toLowerCase();return["email","textarea","select","radio","checkbox","text"].includes(t)?t:n.includes("email")?"email":n.includes("message")||n.includes("comment")||n.includes("details")?"textarea":"text"}function mo(e){return(Array.isArray(e)&&e.length>0?e:[{field_type:"text",is_required:!0,label:"Name",placeholder:"Your name"},{field_type:"email",is_required:!0,label:"Email",placeholder:"you@example.com"},{field_type:"textarea",is_required:!0,label:"Message",placeholder:"How can we help?"}]).map((n,o)=>{const r=E(n)?n:{},a=S(r.label??r.name)||(o===0?"Name":o===1?"Email":"Message"),s=po({...r,label:a}),c=r.is_required??r.isRequired??r.required;return{field_type:s,is_required:typeof c=="boolean"?c:!0,label:a,options:Array.isArray(r.options)?r.options:void 0,placeholder:S(r.placeholder)||void 0,temp_id:S(r.temp_id??r.tempId??r.id)||`field-${o+1}`}})}const go=new Set(["none","sm","md","lg","xl"]),Tt=new Set(["none","sm","md","lg","xl"]),fo=new Set(["full-width","container","container-sm","container-lg","container-xl"]),ho=new Set(["start","center","end","stretch"]),yo=new Set(["none","theme","solid","gradient","image"]),_o=new Set(["primary","secondary","muted","accent","destructive"]),bo=new Set(["center","top","bottom","left","right"]);function ko(e){return typeof e=="string"&&/^https?:\/\//i.test(e.trim())}function B(e,t,n){return typeof e=="string"&&t.has(e)?e:n}function wo(e){return Number.isFinite(e)?Math.min(4,Math.max(1,Math.round(e))):1}function Io(e){const t=[{color:"#1e3a8a",position:0},{color:"#3b82f6",position:100}];if(!E(e))return{direction:"to bottom right",stops:t,type:"linear"};const n=e.type==="radial"?"radial":"linear",o=Array.isArray(e.stops)&&e.stops.length>=2?e.stops:t;return{direction:typeof e.direction=="string"&&e.direction.trim()?e.direction:n==="radial"?"circle at center":"to bottom right",stops:o,type:n}}function To(e){if(!E(e))return{type:"none"};const t=B(e.type,yo,"none"),n=typeof e.min_height=="string"&&e.min_height.trim()?{min_height:e.min_height}:{};if(t==="theme")return{theme:B(e.theme,_o,"muted"),type:t,...n};if(t==="solid")return typeof e.solid_color=="string"&&e.solid_color.trim()?{solid_color:e.solid_color,type:t,...n}:{type:"none"};if(t==="gradient")return{gradient:Io(e.gradient),type:t,...n};if(t==="image"){const o=E(e.image)?e.image:null,r=o&&ko(o.external_url)?o.external_url.trim():null,a=!!(o&&typeof o.media_id=="string"&&o.media_id.trim()&&typeof o.object_key=="string"&&o.object_key.trim());return o&&(r||a)?{image:{...o,...r?{external_url:r}:{},position:B(o.position,bo,"center"),size:o.size==="contain"?"contain":"cover"},type:t,...n}:{type:"none"}}return{type:"none",...n}}function xo(e,t,n){const o=e.is_hero===!0;let r=Array.isArray(e.column_blocks)?e.column_blocks:[];r.length>0&&r.every(f=>E(f)&&!Array.isArray(f))&&(r=[r]);const a=r.map((f,k)=>(Array.isArray(f)?f:[]).map((w,b)=>Fe(w,`${t} column ${k} block ${b}`,n))),s=a.length>0?a:[[]],c=wo(s.length),u=E(e.responsive_columns)?e.responsive_columns:{},d=Number(u.tablet),l=Number(u.mobile),m=Number.isFinite(d)?Math.min(3,Math.max(1,Math.min(c,d))):Math.min(3,c),h=Number.isFinite(l)?Math.min(2,Math.max(1,l)):1,p=E(e.padding)?e.padding:{},g={...e,background:To(e.background),column_blocks:s,column_gap:B(e.column_gap,go,"lg"),container_type:B(e.container_type,fo,"container"),padding:{bottom:B(p.bottom,Tt,"xl"),top:B(p.top,Tt,"xl")},responsive_columns:{desktop:c,mobile:h,tablet:m},vertical_alignment:B(e.vertical_alignment,ho,o?"center":"start")};return g.slider===!0&&!(Array.isArray(g.slides)&&g.slides.length>0)&&(g.slider=!1),g}function Vt(e,t,n,o){if(e==="section"){const a=xo(t,n,o);return M(e,a,n,o),a}const r=D(t);if(e==="heading"&&(r.text_content=S(r.text_content)||S(r.text)||S(r.title)||S(r.heading)||"Untitled",r.level=typeof r.level=="number"?r.level:1),e==="text"){const a=S(r.html_content)||S(r.html)||S(r.content)||S(r.text);a&&(r.html_content=/<\/?[a-z][\s\S]*>/i.test(a)?a:`<p>${uo(a)}</p>`)}return e==="button"&&(r.text=S(r.text)||S(r.label)||S(r.title)||"Learn More",r.url=S(r.url)||S(r.href)||S(r.link)||"#"),e==="form"&&(r.fields=mo(r.fields),r.submit_button_text=S(r.submit_button_text??r.submitButtonText??r.button_text)||"Send Message",r.success_message=S(r.success_message??r.successMessage)||"Thanks for reaching out. We will reply as soon as possible."),M(e,r,n,o),r}function Ie(e,t,n){const o=Vt(e.blockType,pe(e.content,`Block ${t}`),`Block ${t}`,n);return{block_type:e.blockType,content:o,order:e.order??t}}function Co(e,t="Contact Us",n){return[Ie({blockType:"section",content:{is_hero:!0,background:{type:"none"},column_blocks:[[{block_type:"heading",content:{level:1,textAlign:"center",text_content:t},temp_id:ke("heading")},{block_type:"text",content:{html_content:"<p>Have a question, project, or support request? Send us a note and we will get back to you soon.</p>"},temp_id:ke("text")}]],column_gap:"lg",container_type:"container",padding:{bottom:"xl",top:"xl"},responsive_columns:{desktop:1,mobile:1,tablet:1},vertical_alignment:"center"}},0,n),Ie({blockType:"form",content:{fields:[{field_type:"text",is_required:!0,label:"Name",placeholder:"Your name",temp_id:"field-name"},{field_type:"email",is_required:!0,label:"Email",placeholder:"you@example.com",temp_id:"field-email"},{field_type:"textarea",is_required:!0,label:"Message",placeholder:"How can we help?",temp_id:"field-message"}],recipient_email:e,submit_button_text:"Send Message",success_message:"Thanks for reaching out. We will reply as soon as possible."}},1,n)]}function ve(e,t,n,o){return(!e||e.length===0)&&t?Co(t,n,o):(e||[]).map((r,a)=>Ie(r,a,o))}async function Xe(e){const t=e.contentType==="page"?"pages":e.contentType==="post"?"posts":"products",{data:n,error:o}=await e.supabase.from(t).select("id, title, slug, language_id").eq("slug",e.slug).eq("language_id",e.languageId);if(o)throw new Error(`Failed to check ${e.contentType} slug uniqueness: ${_(o)}`);const r=Array.isArray(n)?n:[];return r.length>0?{duplicate:!0,existingItem:r[0],mutationExecuted:!1,success:!1,message:`A ${e.contentType} with slug "${e.slug}" already exists for this language.`}:null}async function Qe(e){if(!e.suppliedTranslationGroupId)return{translationGroupId:void 0};const t=e.contentType==="page"?"pages":e.contentType==="post"?"posts":"products",{data:n,error:o}=await e.supabase.from(t).select("id, title, slug, language_id, translation_group_id").eq("translation_group_id",e.suppliedTranslationGroupId);if(o)throw new Error(`Failed to inspect ${e.contentType} translation group: ${_(o)}`);const r=Array.isArray(n)?n:[];if(r.length===0)return{result:{message:`The ${e.contentType} translation group "${e.suppliedTranslationGroupId}" was not found.`,mutationExecuted:!1,success:!1},translationGroupId:e.suppliedTranslationGroupId};const a=r.find(s=>Number(s.language_id)===e.languageId);return a?{result:{duplicateTranslation:!0,existingItem:a,message:`A ${e.contentType} translation already exists for ${e.languageCode} in this translation group.`,mutationExecuted:!1,success:!1},translationGroupId:e.suppliedTranslationGroupId}:{translationGroupId:e.suppliedTranslationGroupId}}async function Ze(e){if(e.blocks.length===0)return[];const t=e.blocks.map((r,a)=>({block_type:r.block_type,content:r.content,language_id:e.languageId,order:r.order??a,page_id:e.contentType==="page"?e.itemId:null,post_id:e.contentType==="post"?e.itemId:null,product_id:e.contentType==="product"?e.itemId:null})),{data:n,error:o}=await e.supabase.from("blocks").insert(t).select("*");if(o)throw new Error(`Failed to insert ${e.contentType} blocks: ${_(o)}`);return ge(e.blocks,e.supabase),Array.isArray(n)?n:[]}async function et(e){const t=e.contentType==="page"?"pages":e.contentType==="post"?"posts":"products";await e.supabase.from(t).delete().eq("id",e.itemId)}function tt(e,t){return e==="page"?`/cms/pages/${t}/edit`:e==="post"?`/cms/posts/${t}/edit`:`/cms/products/${t}/edit`}function xt(e){return e==="page"?"/cms/pages":e==="post"?"/cms/posts":"/cms/products"}async function nt(e,t){const n=Q.parse(e),o=C(t);n.mode==="replace"&&await so({items:n.items,languageCode:n.languageCode,menuKey:"HEADER",supabase:o});const r=A({action:"UPDATE NAVIGATION",context:t,payload:{input:n,tool:"update_navigation_bar"},preview:{itemCount:n.items.length,languageCode:n.languageCode,mode:n.mode,target:"header navigation"},subject:`${n.mode} header`});if(r)return r;const a=n.mode==="update"?await co({items:n.items,languageCode:n.languageCode,match:n.match,menuKey:"HEADER",supabase:o}):n.mode==="append"?await lo({items:n.items,languageCode:n.languageCode,menuKey:"HEADER",supabase:o}):await Kt({items:n.items,languageCode:n.languageCode,menuKey:"HEADER",supabase:o});return Bt(t),{...a,mutationExecuted:!0,mode:n.mode,success:!0}}async function ot(e,t){const n=Z.parse(e);if(!n.links?.length&&!n.copyright)throw new Error("update_footer requires links or copyright.");const o=C(t),r=A({action:"UPDATE FOOTER",context:t,payload:{input:n,tool:"update_footer"},preview:{copyrightUpdated:!!n.copyright,linkCount:n.links?.length||0,languageCode:n.languageCode,target:"footer"},subject:n.languageCode});if(r)return r;let a=null;if(n.links?.length&&(a=await Kt({items:n.links,languageCode:n.languageCode,menuKey:"FOOTER",supabase:o})),n.copyright){const{error:s}=await o.from("site_settings").upsert({key:"footer_copyright",value:n.copyright});if(s)throw new Error(`Failed to update footer copyright: ${_(s)}`)}return Bt(t),{copyrightUpdated:!!n.copyright,footerNavigation:a,mutationExecuted:!0,success:!0}}function Wt(e){return typeof e=="string"?e.toLowerCase():""}function zo(e,t){const n=t.map(Wt).join(" ");return e.reduce((o,r)=>o+(n.includes(r)?1:0),0)}function Ct(e,t){return(e.find(n=>t.some(o=>Wt(n).includes(o)))||e.find(n=>n.trim().length>0)||"No excerpt available.").slice(0,500)}async function Jt(e,t){const n=xe.parse(e),o=C(t),r=n.query.toLowerCase().split(/\s+/).map(l=>l.trim()).filter(Boolean),[a,s]=await Promise.all([o.from("posts").select("id, title, slug, excerpt, subtitle, meta_description, status, updated_at").eq("status","published").limit(100),o.from("pages").select("id, title, slug, meta_description, status, updated_at").eq("status","published").limit(100)]);if(a.error)throw new Error(`Failed to search documentation posts: ${_(a.error)}`);if(s.error)throw new Error(`Failed to search documentation pages: ${_(s.error)}`);const c=(a.data??[]).map(l=>({excerpt:Ct([l.excerpt,l.subtitle,l.meta_description,l.slug].filter(Boolean),r),source:"post",title:l.title,url:`/article/${l.slug}`})),u=(s.data??[]).map(l=>({excerpt:Ct([l.meta_description,l.slug].filter(Boolean),r),source:"page",title:l.title,url:l.slug==="home"?"/":`/${l.slug}`})),d=[...c,...u].map(l=>({...l,score:zo(r,[l.title,l.excerpt,l.url])})).filter(l=>l.score>0).sort((l,m)=>m.score-l.score).slice(0,n.limit).map(l=>({excerpt:l.excerpt,source:l.source,title:l.title,url:l.url}));return{query:n.query,results:d,success:!0}}async function Yt(e,t,n=_n){const o=xe.safeParse(e),r=o.success?o.data.query:"";return Ln(Jt(e,t),n,()=>({message:"Documentation search took too long to respond. Please try again or ask a more specific question.",query:r,results:[],success:!1,timedOut:!0}))}const So=["pending","trial","paid","shipped","cancelled","refunded","failed"],vo={awaiting:"pending",canceled:"cancelled",cancelled:"cancelled",complete:"paid",completed:"paid",failed:"failed",paid:"paid",payment_pending:"pending",pending:"pending",refund:"refunded",refunded:"refunded",refunds:"refunded",shipped:"shipped",trial:"trial",trials:"trial"};function Eo(e){return String(e??"unknown").trim().toLowerCase()||"unknown"}function zt(e){const t=Object.fromEntries(So.map(n=>[n,0]));for(const n of e){const o=Eo(n.status);t[o]=(t[o]??0)+1}return t}function $o(e){const n=e.toLowerCase().replace(/[^a-z0-9_]+/g," ").split(/\s+/).filter(Boolean);for(const o of n){const r=vo[o];if(r)return r}return null}function X(e){const t=Number(e);return Number.isFinite(t)?t:0}async function Xt(e,t){const n=Re.parse(e),o=C(t),r=new Date;let a=null,s=null;switch(n.timeRange){case"today":a=new Date(r.getFullYear(),r.getMonth(),r.getDate());break;case"this_month":a=new Date(r.getFullYear(),r.getMonth(),1);break;case"last_7_days":a=new Date(r.getTime()-10080*60*1e3);break;case"last_30_days":a=new Date(r.getTime()-720*60*60*1e3);break;case"last_month":a=new Date(r.getFullYear(),r.getMonth()-1,1),s=new Date(r.getFullYear(),r.getMonth(),0,23,59,59,999);break;case"last_90_days":a=new Date(r.getTime()-2160*60*60*1e3);break;case"all_time":a=null;break}const c=n.currency?.toUpperCase(),u=$o(n.query),d=o.from("orders").select("id, status, total, currency, created_at, paid_at");c&&d.eq("currency",c),a&&d.gte("created_at",a.toISOString()),s&&d.lte("created_at",s.toISOString());const m=n.reportType==="products"||n.reportType==="revenue"||n.reportType==="general"?o.from("order_items").select(`
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const z=require("ai"),hn=require("./ai-global-agent-db-tools.cjs.js"),yn=require("./ai-global-agent-custom-block-tools.cjs.js"),Pt=require("./editor-document-from-html.cjs.js");require("./zod-config.cjs.js");const i=require("zod"),G=["text","heading","image","button","posts_grid","video_embed","section","form","testimonial","product_grid","featured_product","cart","checkout","product_details"],_n=1e4,bn={arabic:"ar",chinese:"zh",dutch:"nl",english:"en",french:"fr",francaise:"fr",francais:"fr",german:"de",italian:"it",japanese:"ja",korean:"ko",portuguese:"pt",russian:"ru",spanish:"es"},Nt=i.z.string().trim().min(1).max(2048).refine(e=>e.startsWith("/")||e.startsWith("#")||e.startsWith("http://")||e.startsWith("https://")||e.startsWith("mailto:")||e.startsWith("tel:"),"URL must be a relative path, hash link, http(s) URL, mailto URL, or tel URL."),yt=i.z.strictObject({label:i.z.string().trim().min(1).max(120),target:i.z.enum(["_self","_blank"]).optional(),url:Nt}),qe=yt.extend({children:i.z.array(yt).max(20).optional()}),kn=i.z.strictObject({label:i.z.string().trim().min(1).max(120).optional(),url:Nt.optional()}).refine(e=>!!(e.label||e.url),{message:"Navigation item match requires label or url."}),Q=i.z.strictObject({items:i.z.array(qe).min(1).max(30),languageCode:i.z.string().trim().min(2).max(80).default("en").describe('Locale code or language name, for example "en", "fr", "English", or "French".'),match:kn.optional().describe('For mode "update", identifies the existing navigation item to update.'),mode:i.z.enum(["append","replace","update"]).default("append")}),Z=i.z.strictObject({copyright:i.z.record(i.z.string().trim().min(2).max(12),i.z.string().trim().min(1).max(500)).optional(),languageCode:i.z.string().trim().min(2).max(80).default("en").describe('Locale code or language name, for example "en", "fr", "English", or "French".'),links:i.z.array(qe).min(1).max(30).optional()}),xe=i.z.strictObject({limit:i.z.number().int().min(1).max(8).default(4),query:i.z.string().trim().min(2).max(300)}),Re=i.z.object({currency:i.z.string().trim().min(3).max(3).optional().describe("Optional currency code for currency-specific monetary reports (e.g., USD, CAD). Do not set this for plain order-status counts unless the user asks for a currency."),query:i.z.string().describe("The analytical question about orders, products, or revenue."),reportType:i.z.enum(["revenue","orders","products","general"]).optional().default("general").describe("The focus area of the statistical report."),timeRange:i.z.enum(["today","this_month","last_7_days","last_30_days","last_month","last_90_days","all_time"]).optional().default("all_time").describe("The time period for the report. Use all_time for current order-status counts unless the user names a specific period.")}),Me=i.z.strictObject({contentType:i.z.enum(["page","post","product"]),currentEditor:i.z.strictObject({blockId:i.z.union([i.z.number().int().positive(),i.z.string().trim().min(1).max(120)]).nullable().optional(),blockType:i.z.string().trim().min(1).max(80).nullable().optional(),field:i.z.string().trim().min(1).max(120).nullable().optional()}).optional(),entityId:i.z.union([i.z.number().int().positive(),i.z.string().trim().min(1).max(120)]),languageId:i.z.number().int().positive().nullable().optional(),slug:i.z.string().trim().min(1).max(300).nullable().optional(),title:i.z.string().trim().min(1).max(300).nullable().optional(),translationGroupId:i.z.string().trim().min(1).max(120).nullable().optional()}),De=i.z.strictObject({includeBlockContent:i.z.boolean().default(!1),includeBlocks:i.z.boolean().default(!0)}),ee=i.z.strictObject({fields:i.z.strictObject({description_json:i.z.unknown().optional(),excerpt:i.z.string().max(2e3).nullable().optional(),feature_image_id:i.z.string().trim().min(1).max(2048).nullable().optional(),label:i.z.string().max(120).nullable().optional(),meta_description:i.z.string().max(500).nullable().optional(),meta_title:i.z.string().max(160).nullable().optional(),published_at:i.z.string().max(80).nullable().optional(),short_description:i.z.string().max(2e3).nullable().optional(),slug:i.z.string().trim().min(1).max(300).optional(),status:i.z.enum(["draft","published","active","archived"]).optional(),subtitle:i.z.string().max(300).nullable().optional(),title:i.z.string().trim().min(1).max(300).optional()}).partial()}),te=i.z.strictObject({blockId:i.z.number().int().positive(),blockType:i.z.enum(G).optional(),content:i.z.record(i.z.string(),i.z.unknown())}),ne=i.z.strictObject({blockIndex:i.z.number().int().min(0),blockType:i.z.enum(G).optional(),columnIndex:i.z.number().int().min(0),content:i.z.record(i.z.string(),i.z.unknown()),parentBlockId:i.z.number().int().positive()}),wn=i.z.enum(["page","post","product"]),H=i.z.strictObject({contentType:wn.optional(),entityId:i.z.union([i.z.number().int().positive(),i.z.string().trim().min(1).max(120)]).optional(),slug:i.z.string().trim().min(1).max(300).optional(),title:i.z.string().trim().min(1).max(300).optional()}),oe=i.z.strictObject({blockType:i.z.enum(G),content:i.z.record(i.z.string(),i.z.unknown()),order:i.z.number().int().min(0).optional()}),re=H.extend({images:i.z.array(i.z.string().trim().min(1).max(2048)).min(1).max(12).describe("External https image URLs (imported into the media library automatically) and/or existing media library ids. The first entry is the feature image (pages/posts) or the main product image (products).")}),ie=H.extend({anchorBlockId:i.z.number().int().positive().optional(),anchorBlockType:i.z.enum(G).optional(),block:oe,position:i.z.enum(["before","after","start","end"]).default("end")}),ae=i.z.strictObject({blocks:i.z.array(oe).max(20).optional(),contactEmail:i.z.string().email().optional(),feature_image_id:i.z.string().trim().min(1).max(2048).nullable().optional(),languageCode:i.z.string().trim().min(2).max(80).optional(),meta_description:i.z.string().max(500).nullable().optional(),meta_title:i.z.string().max(160).nullable().optional(),slug:i.z.string().trim().min(1).max(300).optional(),status:i.z.enum(["draft","published","archived"]).default("draft"),title:i.z.string().trim().min(1).max(300),translationGroupId:i.z.string().trim().min(1).max(120).optional()}),se=i.z.strictObject({blocks:i.z.array(oe).max(20).optional(),excerpt:i.z.string().max(2e3).nullable().optional(),feature_image_id:i.z.string().trim().min(1).max(2048).nullable().optional(),label:i.z.string().max(120).nullable().optional(),languageCode:i.z.string().trim().min(2).max(80).optional(),meta_description:i.z.string().max(500).nullable().optional(),meta_title:i.z.string().max(160).nullable().optional(),published_at:i.z.string().max(80).nullable().optional(),slug:i.z.string().trim().min(1).max(300).optional(),status:i.z.enum(["draft","published","archived"]).default("draft"),subtitle:i.z.string().max(300).nullable().optional(),title:i.z.string().trim().min(1).max(300),translationGroupId:i.z.string().trim().min(1).max(120).optional()}),ce=i.z.strictObject({blocks:i.z.array(oe).max(20).optional().describe("Content blocks for the product description area, same block vocabulary as create_cms_page. Rendered on the public product page in place of the plain description."),description_html:i.z.string().max(6e4).optional().describe("The product body as an HTML fragment (headings, paragraphs, lists, bold/italic/links). Converted to the editor document automatically. Prefer this over description_json."),description_json:i.z.unknown().optional(),freemius_plan_id:i.z.string().optional(),freemius_product_id:i.z.string().optional(),images:i.z.array(i.z.string().trim().min(1).max(2048)).max(12).optional().describe("Product images, in order: the first becomes the main product image and the rest the gallery. Each entry is either an external https image URL (imported into the media library automatically) or an existing media library id."),is_taxable:i.z.boolean().default(!0),languageCode:i.z.string().trim().min(2).max(80).optional(),meta_description:i.z.string().max(500).nullable().optional(),meta_title:i.z.string().max(160).nullable().optional(),payment_provider:i.z.enum(["stripe","freemius"]).default("stripe"),price:i.z.number().min(0).default(0),prices:i.z.record(i.z.string(),i.z.number().min(0)).optional(),product_type:i.z.enum(["physical","digital"]).default("physical"),sale_price:i.z.number().min(0).nullable().optional(),sale_prices:i.z.record(i.z.string(),i.z.number().min(0).nullable()).optional(),short_description:i.z.string().max(2e3).nullable().optional(),sku:i.z.string().trim().min(1).max(120).optional(),slug:i.z.string().trim().min(1).max(300).optional(),status:i.z.enum(["draft","active","archived"]).default("draft"),stock:i.z.number().int().min(0).default(0),title:i.z.string().trim().min(1).max(300),trial_period_days:i.z.number().int().min(0).default(0),trial_requires_payment_method:i.z.boolean().default(!1),translationGroupId:i.z.string().trim().min(1).max(120).optional(),upc:i.z.string().max(120).nullable().optional()}),le=H.extend({currencyCode:i.z.string().trim().min(3).max(3).optional(),endsAt:i.z.string().max(80).nullable().optional(),field:i.z.string().trim().min(1).max(120),startsAt:i.z.string().max(80).nullable().optional(),value:i.z.unknown()}),Ge=H,ue=H,Ut=i.z.discriminatedUnion("tool",[i.z.strictObject({input:ae,tool:i.z.literal("create_cms_page")}),i.z.strictObject({input:se,tool:i.z.literal("create_cms_post")}),i.z.strictObject({input:ce,tool:i.z.literal("create_cms_product")}),i.z.strictObject({input:ue,tool:i.z.literal("delete_cms_item")}),i.z.strictObject({input:le,tool:i.z.literal("update_cms_item_field")}),i.z.strictObject({input:te,tool:i.z.literal("update_content_block")}),i.z.strictObject({input:ie,tool:i.z.literal("insert_content_block")}),i.z.strictObject({input:ee,tool:i.z.literal("update_current_cms_fields")}),i.z.strictObject({input:Z,tool:i.z.literal("update_footer")}),i.z.strictObject({input:Q,tool:i.z.literal("update_navigation_bar")}),i.z.strictObject({input:ne,tool:i.z.literal("update_section_column_block")}),i.z.strictObject({input:re,tool:i.z.literal("set_content_images")})]),In=i.z.union([ae.extend({tool:i.z.literal("create_cms_page")}).transform(({tool:e,...t})=>({input:t,tool:e})),se.extend({tool:i.z.literal("create_cms_post")}).transform(({tool:e,...t})=>({input:t,tool:e})),ce.extend({tool:i.z.literal("create_cms_product")}).transform(({tool:e,...t})=>({input:t,tool:e})),ue.extend({tool:i.z.literal("delete_cms_item")}).transform(({tool:e,...t})=>({input:t,tool:e})),le.extend({tool:i.z.literal("update_cms_item_field")}).transform(({tool:e,...t})=>({input:t,tool:e})),te.extend({tool:i.z.literal("update_content_block")}).transform(({tool:e,...t})=>({input:t,tool:e})),ie.extend({tool:i.z.literal("insert_content_block")}).transform(({tool:e,...t})=>({input:t,tool:e})),ee.extend({tool:i.z.literal("update_current_cms_fields")}).transform(({tool:e,...t})=>({input:t,tool:e})),Z.extend({tool:i.z.literal("update_footer")}).transform(({tool:e,...t})=>({input:t,tool:e})),Q.extend({tool:i.z.literal("update_navigation_bar")}).transform(({tool:e,...t})=>({input:t,tool:e})),ne.extend({tool:i.z.literal("update_section_column_block")}).transform(({tool:e,...t})=>({input:t,tool:e})),re.extend({tool:i.z.literal("set_content_images")}).transform(({tool:e,...t})=>({input:t,tool:e}))]),Tn=i.z.string().transform((e,t)=>{const n=vn(e);return n.success?n.action:(t.addIssue({code:"custom",message:n.message}),i.z.NEVER)}),xn=i.z.union([Ut,In,Tn]),Ke=i.z.strictObject({actions:i.z.array(xn).min(1).max(8),summary:i.z.string().trim().min(1).max(500).optional()});function Cn(e){const t=[];let n="",o=0,r=null,a=!1;for(const s of e){if(r){n+=s,a?a=!1:s==="\\"?a=!0:s===r&&(r=null);continue}if(s==='"'||s==="'"){r=s,n+=s;continue}if(s==="["||s==="{"||s==="("){o++,n+=s;continue}if(s==="]"||s==="}"||s===")"){o=Math.max(0,o-1),n+=s;continue}if(s===","&&o===0){n.trim()&&t.push(n.trim()),n="";continue}n+=s}return n.trim()&&t.push(n.trim()),t}function _t(e){let t="";for(let n=0;n<e.length;n++){const o=e[n];if(o!=="'"){t+=o;continue}let r="",a=!1;for(n++;n<e.length;n++){const s=e[n];if(a){r+=s,a=!1;continue}if(s==="\\"){a=!0;continue}if(s==="'")break;r+=s}t+=JSON.stringify(r)}return t.replace(/\bTrue\b/g,"true").replace(/\bFalse\b/g,"false").replace(/\bNone\b/g,"null")}function zn(e){const t=e.trim();return t.startsWith("'")&&t.endsWith("'")||t.startsWith('"')&&t.endsWith('"')||t.startsWith("[")||t.startsWith("{")?JSON.parse(_t(t)):/^-?\d+(?:\.\d+)?$/.test(t)?Number(t):t==="true"||t==="True"?!0:t==="false"||t==="False"?!1:t==="null"||t==="None"?null:t}function Sn(e){const t={};for(const n of Cn(e)){const o=n.indexOf("=");if(o<=0)throw new Error(`Expected key=value argument, received "${n}".`);const r=n.slice(0,o).trim();if(!/^[A-Za-z_][A-Za-z0-9_]*$/.test(r))throw new Error(`Invalid argument name "${r}".`);t[r]=zn(n.slice(o+1))}return t}function vn(e){const n=e.trim().match(/^([a-z_]+)\(([\s\S]*)\)$/);if(!n)return{message:'Action plan actions must be JSON objects like { "tool": "create_cms_page", "input": { ... } }, not freeform text.',success:!1};const o=n[1];let r;try{r=Sn(n[2])}catch(c){return{message:c instanceof Error?c.message:"Could not parse action-plan command arguments.",success:!1}}const a={input:r,tool:o},s=Ut.safeParse(a);return s.success?{action:s.data,success:!0}:{message:`Invalid action-plan command "${o}": ${s.error.issues.map(c=>c.message).join("; ")}`,success:!1}}function En(e){return e.normalize("NFD").replace(/[\u0300-\u036f]/g,"").toLowerCase().replace(/\s+/g," ").trim()}function fe(e,t){return t.some(n=>e.includes(n))}function $n(e){const t=En(e),n=fe(t,["add ","insert ","put ","create "]),o=fe(t,["title","heading","description","intro","copy","paragraph"]),r=t.includes("form")&&fe(t,["above","before"]),a=t.includes("contact page")||t.includes("contact pages")||t.includes("contact us")||t.includes("contactez-nous"),s=t.includes("english")&&fe(t,["french","francais","francaise"]);return!n||!o||!r||!a||!s?null:{actions:[{input:{anchorBlockType:"form",block:{blockType:"text",content:{html_content:"<h2>Let us help you move faster</h2><p>Have a question, project idea, or need help choosing the right next step? Send us a message and the NextBlock team will get back to you soon.</p>"}},contentType:"page",position:"before",slug:"contact-us"},tool:"insert_content_block"},{input:{anchorBlockType:"form",block:{blockType:"text",content:{html_content:"<h2>Parlons de votre projet</h2><p>Vous avez une question, une idee de projet ou besoin d'aide pour avancer? Envoyez-nous un message et l'equipe NextBlock vous repondra rapidement.</p>"}},contentType:"page",position:"before",slug:"contactez-nous"},tool:"insert_content_block"}],summary:"Add visible title and description copy above the forms on the English and French Contact pages."}}const An=i.z.enum(G),bt=i.z.object({direction:i.z.string().optional(),stops:i.z.array(i.z.object({color:i.z.string(),position:i.z.number()})),type:i.z.enum(["linear","radial"])}),Pn=i.z.object({gradient:bt.optional(),image:i.z.object({alt_text:i.z.string().optional(),blur_data_url:i.z.string().optional(),external_url:i.z.string().optional(),height:i.z.number().optional(),media_id:i.z.string().optional(),object_key:i.z.string().optional(),overlay:i.z.object({gradient:bt,type:i.z.literal("gradient")}).optional(),position:i.z.enum(["center","top","bottom","left","right"]),quality:i.z.number().nullable().optional(),size:i.z.enum(["cover","contain"]),width:i.z.number().optional()}).optional(),min_height:i.z.string().optional(),solid_color:i.z.string().optional(),theme:i.z.enum(["primary","secondary","muted","accent","destructive"]).optional(),type:i.z.enum(["none","theme","solid","gradient","image"])}),Nn=i.z.object({block_type:An,content:i.z.record(i.z.string(),i.z.any()),temp_id:i.z.string().optional()}),Un=i.z.object({background:Pn,column_blocks:i.z.array(i.z.array(Nn)),column_gap:i.z.enum(["none","sm","md","lg","xl"]),container_type:i.z.enum(["full-width","container","container-sm","container-lg","container-xl"]),padding:i.z.object({bottom:i.z.enum(["none","sm","md","lg","xl"]),top:i.z.enum(["none","sm","md","lg","xl"])}),responsive_columns:i.z.object({desktop:i.z.union([i.z.literal(1),i.z.literal(2),i.z.literal(3),i.z.literal(4)]),mobile:i.z.union([i.z.literal(1),i.z.literal(2)]),tablet:i.z.union([i.z.literal(1),i.z.literal(2),i.z.literal(3)])}),vertical_alignment:i.z.enum(["start","center","end","stretch"]).optional()}),Fn={button:i.z.object({position:i.z.enum(["left","center","right"]).optional(),size:i.z.enum(["default","sm","lg","full"]).optional(),text:i.z.string(),url:i.z.string(),variant:i.z.enum(["default","outline","secondary","ghost","link"]).optional()}),cart:i.z.object({}),checkout:i.z.object({}),featured_product:i.z.object({imagePosition:i.z.enum(["left","right"]).default("left"),productId:i.z.string().min(1),showBackground:i.z.boolean().default(!1)}),form:i.z.object({fields:i.z.array(i.z.object({field_type:i.z.enum(["text","email","textarea","select","radio","checkbox"]),is_required:i.z.boolean(),label:i.z.string(),options:i.z.array(i.z.object({label:i.z.string(),value:i.z.string()})).optional(),placeholder:i.z.string().optional(),temp_id:i.z.string()})),recipient_email:i.z.string().email(),submit_button_text:i.z.string(),success_message:i.z.string()}),heading:i.z.object({level:i.z.union([i.z.literal(1),i.z.literal(2),i.z.literal(3),i.z.literal(4),i.z.literal(5),i.z.literal(6)]),textAlign:i.z.enum(["left","center","right","justify"]).optional(),textColor:i.z.enum(["primary","secondary","accent","muted","destructive","background"]).optional(),text_content:i.z.string()}),image:i.z.object({alt_text:i.z.string().optional(),caption:i.z.string().optional(),external_url:i.z.string().nullable().optional(),height:i.z.number().nullable().optional(),media_id:i.z.string().nullable().optional(),object_key:i.z.string().nullable().optional(),width:i.z.number().nullable().optional()}),posts_grid:i.z.object({columns:i.z.number().min(1).max(6),postsPerPage:i.z.number().min(1).max(50),showPagination:i.z.boolean(),title:i.z.string().optional()}),product_details:i.z.object({}),product_grid:i.z.object({categoryId:i.z.string().optional(),categoryIds:i.z.array(i.z.string()).max(20).optional(),limit:i.z.number().min(0).max(48).default(6),productIds:i.z.array(i.z.string()).max(24).optional(),showPagination:i.z.boolean().default(!1),title:i.z.string().optional(),type:i.z.enum(["latest","category","manual"]).default("latest")}),section:Un,testimonial:i.z.object({author_name:i.z.string().min(1),author_title:i.z.string().optional(),image_url:i.z.string().url().optional().or(i.z.literal("")),quote:i.z.string().min(1)}),text:i.z.object({html_content:i.z.string()}),video_embed:i.z.object({autoplay:i.z.boolean().optional(),controls:i.z.boolean().optional(),title:i.z.string().optional(),url:i.z.string()})};function On(e){return G.includes(e)}function jn(e){return typeof e?.validateBlockContent=="function"?e.validateBlockContent:null}function Bn(e,t,n){const o=jn(n);if(o)return o(e,t);const r=Fn[e].safeParse(t);return r.success?{errors:[],isValid:!0,warnings:[]}:{errors:r.error.issues.map(a=>{const s=a.path.join(".");return s?`${s}: ${a.message}`:a.message}),isValid:!1,warnings:[]}}function kt(){return i.z.object({content:i.z.array(i.z.any()).optional(),type:i.z.literal("doc")})}function He(){try{const{revalidatePath:e}=require("next/cache");return e}catch{return null}}function C(e){if(!e?.supabase)throw new Error("A Supabase service client is required to execute Cortex AI global tools.");return e.supabase}function Ln(e,t,n){let o;const r=new Promise(a=>{o=setTimeout(()=>a(n()),t)});return Promise.race([e.finally(()=>{o&&clearTimeout(o)}),r])}function V(e){const t=Me.safeParse(e?.pageContext);if(!t.success)throw new Error("No current CMS page context is available. Open a page, post, or product edit screen before using this editing tool.");return t.data}function Ve(e){const t=typeof e.entityId=="number"?e.entityId:Number.parseInt(e.entityId,10);if(!Number.isInteger(t)||t<=0)throw new Error(`Current ${e.contentType} id must be a positive integer.`);return t}function Ft(e){const t=String(e.entityId||"").trim();if(!t)throw new Error(`Current ${e.contentType} id is missing.`);return t}function Ce(e){return e.contentType==="product"?Ft(e):Ve(e)}const qn=/^https?:\/\//i,Rn=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;async function de(e,t,n){if(typeof e!="string")return null;const o=e.trim();if(!o)return null;if(!qn.test(o)){if(Rn.test(o))return o;throw new Error(`"${o}" is not a usable image reference — provide an https:// image URL or a media library id.`)}const r=t?.importExternalImage;if(!r)throw new Error("I can only attach an image from a URL when media import is available here. Please pick an image from the media library instead.");const a=await r({altText:n,url:o});if("error"in a)throw new Error(`I could not import the image from that URL: ${a.error}`);return a.id}async function Ot(e,t,n){const o=[];for(let r=0;r<e.length;r+=1){const a=await de(e[r],t,`${n} image ${r+1}`);a&&o.push(a)}return o}async function Mn(e){const t=[...new Set(e.mediaIds)],{error:n}=await e.supabase.from("product_media").delete().eq("product_id",e.productId);if(n)throw new Error(`Could not clear the product's existing images: ${_(n)}`);if(t.length>0){const{error:o}=await e.supabase.from("product_media").insert(t.map((r,a)=>({media_id:r,product_id:e.productId,sort_order:a})));if(o)throw new Error(`Could not save the product images: ${_(o)}`)}return t}async function ze(e){if(!e.productId)return!1;const{data:t,error:n}=await e.supabase.from("product_drafts").select("id, blocks, meta").eq("product_id",e.productId).maybeSingle();if(n||!t)return!1;const o=e.patch({blocks:Array.isArray(t.blocks)?D(t.blocks):[],meta:E(t.meta)?D(t.meta):{}}),r={updated_at:new Date().toISOString()};if(o.blocks&&(r.blocks=o.blocks),o.meta&&(r.meta=o.meta),Object.keys(r).length===1)return!1;const{error:a}=await e.supabase.from("product_drafts").update(r).eq("id",t.id);if(a)throw new Error(`The product was updated, but its open draft could not be kept in sync: ${_(a)}. Publishing that draft would undo this change — publish or discard it in the product editor first.`);return!0}function jt(e){return typeof e=="string"?e.trim().replace(/^\/+|\/+$/g,""):""}function Dn(e,t){const n=jt(t??e.slug);return n?e.contentType==="page"?n==="home"?"/":`/${n}`:e.contentType==="post"?`/article/${n}`:`/product/${n}`:null}function Gn(e){const t=String(e.entityId);return e.contentType==="page"?`/cms/pages/${t}/edit`:e.contentType==="post"?`/cms/posts/${t}/edit`:`/cms/products/${t}/edit`}function N(e,t,n){const o=e?.revalidatePath??He();if(!o)return;o(Gn(t));const r=Dn(t,n);r&&o(r),t.contentType==="page"&&r!=="/"&&o("/"),t.contentType==="product"&&o("/cms/products")}function Bt(e){const t=e?.revalidatePath??He();t&&(t("/","layout"),t("/cms/navigation"))}function _(e){return e?typeof e=="object"&&"message"in e?String(e.message||"Unknown database error."):String(e):"Unknown database error."}async function Kn(){return Promise.resolve().then(()=>require("./ai-global-agent-ecommerce.cjs.js"))}function Pe(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(t=>Pe(t)).join(",")}]`:`{${Object.keys(e).filter(t=>t!=="temp_id").sort().map(t=>`${JSON.stringify(t)}:${Pe(e[t])}`).join(",")}}`}function Hn(e){let t=2166136261;const n=Pe(e);for(let o=0;o<n.length;o++)t^=n.charCodeAt(o),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}function Ne(e){return e.replace(/\s+/g," ").trim().toUpperCase()}function Vn(e,t,n){return`${Ne(`CONFIRM ${e} ${t}`)} #${Hn(n)}`}function Lt(e){return{confirmationPhrase:Vn(e.action,e.subject,e.payload),mutationExecuted:!1,preview:e.preview,requiresConfirmation:!0,success:!0}}function U(e,t){const n=e[t];return typeof n=="string"&&n.trim()?n.trim():null}function R(e,t){const n=Number(e[t]);return Number.isFinite(n)?n:null}function P(e,t,n=`${t}s`){return`${e} ${e===1?t:n}`}function Wn(e,t){const n=U(t,"summary");if(n)return n;const o=U(t,"title"),r=U(t,"slug"),a=U(t,"status"),s=U(t,"contentType"),c=U(t,"field"),u=U(t,"mode"),d=U(t,"languageCode"),l=R(t,"blockCount"),m=R(t,"itemCount"),h=R(t,"affectedCount");if(e==="create_cms_page"||e==="create_cms_post")return`Create ${a||"draft"} ${e==="create_cms_page"?"page":"post"} "${o||r||"Untitled"}"${r?` at slug "${r}"`:""}${l!==null?` with ${P(l,"content block")}`:""}.`;if(e==="create_cms_product"){const p=R(t,"imageCount"),g=R(t,"blockCount"),f=[p?P(p,"image"):null,g?P(g,"description block"):R(t,"descriptionLength")?"a full description":null].filter(Boolean);return`Create ${a||"draft"} product "${o||r||"Untitled"}"${r?` at slug "${r}"`:""}${f.length?` with ${f.join(" and ")}`:""}.`}if(e==="update_cms_item_field")return`Update ${c||"one field"} on the ${s||"CMS item"} "${o||r||"selected item"}".`;if(e==="update_navigation_bar")return`${u==="append"?"Add":u==="update"?"Update":"Replace"} ${m!==null?P(m,"navigation item"):"navigation items"} in the ${d||"selected"} header navigation.`;if(e==="update_footer"){const p=R(t,"linkCount");return`Update the ${d||"selected"} footer${p!==null?` with ${P(p,"link")}`:""}.`}return e==="update_content_block"?`Update the selected ${U(t,"blockType")||"content"} block.`:e==="insert_content_block"?`Insert ${U(t,"blockType")||"content"} block on the ${s||"CMS item"} "${o||r||"selected item"}".`:e==="update_section_column_block"?`Update the selected nested ${U(t,"nestedBlockType")||"section"} block.`:e==="delete_cms_item"||e==="prepare_delete_cms_item"?`Delete ${h!==null?P(h,s||"CMS item"):`the selected ${s||"CMS item"}`}${o||r?` for "${o||r}"`:""}.`:"Complete the requested CMS change."}function A(e){if(e.context?.skipConfirmation)return null;const t=Lt(e),n=Ne(e.context?.latestUserMessage||""),o=Ne(t.confirmationPhrase);return n.includes(o)?null:t}function We(e){const t=e?.actorUserId;if(!t)throw new Error("A confirmed CMS mutation requires an authenticated admin actor.");return t}function Je(){return globalThis.crypto?.randomUUID?.()||`id-${Date.now()}-${Math.random().toString(36).slice(2)}`}function L(e){return e.toLowerCase().trim().replace(/\s+/g,"-").replace(/[^a-z0-9-]/g,"").replace(/-+/g,"-").replace(/^-|-$/g,"").slice(0,300)}function Ye(e){return(e||"USD").trim().toUpperCase()}const Jn=new Set(["BIF","CLP","DJF","GNF","JPY","KMF","KRW","MGA","PYG","RWF","UGX","VND","VUV","XAF","XOF","XPF"]);function Yn(e){return Jn.has(Ye(e))?0:2}function qt(e,t){return Math.round(e*10**Yn(t))}function Xn(e,t){return!e||typeof e!="object"||Array.isArray(e)?{}:Object.entries(e).reduce((n,[o,r])=>{if(typeof r=="number"&&Number.isFinite(r)&&r>=0){const a=Ye(o||t);n[a]=qt(r,a)}return n},{})}function pe(e,t){if(!E(e))throw new Error(`${t} content must be a JSON object.`);return JSON.parse(JSON.stringify(e))}function D(e){return JSON.parse(JSON.stringify(e))}function E(e){return!!(e&&typeof e=="object"&&!Array.isArray(e))}function Ue(e,t){const n=D(e);for(const[o,r]of Object.entries(t))if(r!==void 0){if(E(r)&&E(n[o])){n[o]=Ue(n[o],r);continue}n[o]=D(r)}return n}function Rt(e,t){if(t.contentType==="product"){if(String(e.product_id??"")!==String(Ft(t)))throw new Error(`Block ${e.id} does not belong to the current product being edited.`);return}const n=Ve(t);if((t.contentType==="page"?Number(e.page_id):Number(e.post_id))!==n)throw new Error(`Block ${e.id} does not belong to the current ${t.contentType} being edited.`)}function be(e,t){const n=typeof e=="string"?e:"";if(!On(n))throw new Error(`${t} has unsupported block type "${n||"unknown"}".`);return n}function Mt(e,t,n){if(e&&e!==t)throw new Error(`${n} is a "${t}" block. Refusing to update it as "${e}".`)}function M(e,t,n,o){const r=Bn(e,t,o);if(!r.isValid)throw new Error(`${n} content is invalid for block type "${e}": ${r.errors.join("; ")}`)}function Dt(e){return e==="section"}function Qn(e){return typeof e.html_content=="string"?"text":typeof e.text=="string"&&typeof e.url=="string"?"button":typeof e.text_content=="string"?"heading":"media_id"in e||"object_key"in e||"external_url"in e?"image":typeof e.quote=="string"&&typeof e.author_name=="string"?"testimonial":typeof e.url=="string"&&("controls"in e||"autoplay"in e||"title"in e)?"video_embed":Array.isArray(e.fields)||typeof e.recipient_email=="string"?"form":"postsPerPage"in e||"showPagination"in e?"posts_grid":typeof e.productId=="string"?"featured_product":"limit"in e&&"type"in e?"product_grid":null}function ke(e){return`ai-${e}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}function Fe(e,t,n){if(!E(e))throw new Error(`${t} must be a JSON object.`);const o=e.block_type??e.blockType,r=be(o,t);if(Dt(r))throw new Error(`${t} cannot be a nested ${r} block.`);const a=Vt(r,pe(e.content,t),t,n),s=e.temp_id??e.tempId,c=typeof s=="string"&&s.trim()?s:ke(r);return{block_type:r,content:a,temp_id:c}}function Zn(e,t){const n=[];if("append_block"in e&&n.push(Fe(e.append_block,"Nested block to append",t)),"append_blocks"in e){const o=e.append_blocks;if(!Array.isArray(o))throw new Error("append_blocks must be an array of nested block objects.");o.forEach((r,a)=>{n.push(Fe(r,`Nested block to append ${a}`,t))})}return n}function eo(e,t){if("append_block"in e||"append_blocks"in e||"background"in e||"column_blocks"in e||"column_gap"in e||"container_type"in e||"padding"in e||"responsive_columns"in e||"vertical_alignment"in e)return null;const n=Qn(e);if(!n)return null;const o=pe(e,`Nested ${n} block`);return M(n,o,`Nested ${n} block`,t),{block_type:n,content:o,temp_id:ke(n)}}function to(e,t){const n=e.append_column_index??e.column_index;if(n===void 0)return 0;if(typeof n!="number"||!Number.isInteger(n)||n<0)throw new Error("append_column_index must be a non-negative integer.");if(t>0&&n>=t)throw new Error(`append_column_index ${n} is outside the existing ${t} column(s).`);return n}function no(e,t,n,o){if(!Dt(e))return Ue(t,n);const r={...n},a=Zn(r,o),s=eo(r,o);s&&a.push(s),delete r.append_block,delete r.append_blocks,delete r.append_column_index,delete r.column_index;const c=Ue(t,r);if(a.length>0){const u=Array.isArray(t.column_blocks)?D(t.column_blocks):[],d=to(n,u.length),l=u.length>0?u:[[]];for(;l.length<=d;)l.push([]);l[d]=[...l[d]||[],...a],c.column_blocks=l}return c}function oo(e,t){return{blockType:e.block_type,content:t?e.content:void 0,id:e.id,languageId:e.language_id,order:e.order,pageId:e.page_id,postId:e.post_id}}function K(e){return typeof e=="string"?e.trim().toLowerCase():""}function wt(e){return typeof e=="string"?e.trim().toLowerCase():""}function Gt(e){return e.reduce((t,n)=>t+1+(n.children?.length||0),0)}function _e(e){return typeof e=="string"?e.trim().toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g,""):""}async function W(e,t){const n=t.trim(),o=_e(n),r=bn[o],{data:a,error:s}=await e.from("languages").select("id, code, name, is_active");if(s)throw new Error(`Failed to load language "${t}": ${_(s)}`);const u=(Array.isArray(a)?a:[]).filter(l=>l.is_active!==!1),d=u.find(l=>{const m=_e(l.code),h=_e(l.name);return m===o||m===r||h===o});if(!d?.id||!d?.code){const l=u.map(m=>m.code).filter(Boolean).join(", ");throw new Error(`Language "${t}" was not found.${l?` Available languages: ${l}.`:""}`)}return{code:String(d.code),id:Number(d.id)}}async function Se(e,t){if(t)return W(e,t);const{data:n,error:o}=await e.from("languages").select("id, code, name, is_active, is_default");if(o)throw new Error(`Failed to load active languages: ${_(o)}`);const r=(Array.isArray(n)?n:[]).filter(s=>s.is_active!==!1),a=r.find(s=>s.is_default)||r.find(s=>_e(s.code)==="en")||r[0];if(!a?.id||!a?.code)throw new Error("No active CMS language is available for Cortex AI content creation.");return{code:String(a.code),id:Number(a.id)}}async function It(e){try{const{data:t,error:n}=await e.from("currencies").select("code, is_default, is_active").eq("is_active",!0);if(n)return"USD";const o=Array.isArray(t)?t:[],r=o.find(a=>a.is_default)||o[0];return Ye(r?.code||"USD")}catch{return"USD"}}async function ro(e){const t=e.contentType==="page"?"pages":e.contentType==="post"?"posts":"products";let n="id",o=e.entityId;if(o===void 0&&e.slug&&(n="slug",o=e.slug),o===void 0&&e.title&&(n="title",o=e.title),o===void 0)throw new Error(`A ${e.contentType} target requires an id, slug, title, or current edit context.`);const{data:r,error:a}=await e.supabase.from(t).select("*").eq(n,o);if(a)throw new Error(`Failed to resolve ${e.contentType}: ${_(a)}`);const s=Array.isArray(r)?r:r?[r]:[];if(s.length!==1)throw new Error(s.length===0?`No ${e.contentType} matched ${n} "${String(o)}".`:`Multiple ${e.contentType}s matched ${n} "${String(o)}"; use an exact id.`);return s[0]}async function me(e,t){const n=Me.safeParse(t?.pageContext).success?t?.pageContext:null,o=e.contentType||n?.contentType;if(!o)throw new Error("Target contentType is required when no current CMS edit context exists.");const r=e.entityId!==void 0||!!e.slug||!!e.title,a=e.entityId??(r?void 0:n?.entityId),s=e.slug??(r?void 0:n?.slug??void 0),c=e.title??(r?void 0:n?.title??void 0),u=await ro({contentType:o,entityId:a,slug:a===void 0&&s||void 0,supabase:C(t),title:a===void 0&&!s&&c||void 0});return{contentType:o,item:u}}async function we(e){const t=await ao({item:e.item,languageId:e.languageId,menuKey:e.menuKey,supabase:e.supabase}),n={label:e.item.label,language_id:e.languageId,menu_key:e.menuKey,order:e.order,page_id:t?.pageId??null,parent_id:e.parentId??null,...t?.navigationTranslationGroupId?{translation_group_id:t.navigationTranslationGroupId}:{},url:e.item.url},{data:o,error:r}=await e.supabase.from("navigation_items").insert(n).select("id").single();if(r)throw new Error(`Failed to insert ${e.menuKey} navigation item: ${_(r)}`);return Number(o.id)}function io(e){const t=e.trim();if(!t.startsWith("/")||t.startsWith("//"))return null;const n=t.split("?")[0]?.split("#")[0]||"",o=n==="/"?"home":n.replace(/^\/+|\/+$/g,"");return o&&!o.includes("/")?o:null}async function ao(e){const t=io(e.item.url);if(!t)return null;const{data:n,error:o}=await e.supabase.from("pages").select("id, slug, translation_group_id, language_id").eq("slug",t).eq("language_id",e.languageId);if(o)throw new Error(`Failed to resolve linked page for navigation item: ${_(o)}`);const r=Array.isArray(n)?n[0]:n;if(!r?.id)return null;let a=Je();if(r.translation_group_id){const{data:s,error:c}=await e.supabase.from("pages").select("id").eq("translation_group_id",r.translation_group_id);if(c)throw new Error(`Failed to inspect linked page translations for navigation item: ${_(c)}`);const u=new Set((Array.isArray(s)?s:[]).map(h=>String(h.id)).filter(Boolean)),{data:d,error:l}=await e.supabase.from("navigation_items").select("id, page_id, translation_group_id, menu_key").eq("menu_key",e.menuKey);if(l)throw new Error(`Failed to inspect related navigation translations: ${_(l)}`);const m=(Array.isArray(d)?d:[]).find(h=>h.translation_group_id&&u.has(String(h.page_id)));m?.translation_group_id&&(a=m.translation_group_id)}return{navigationTranslationGroupId:a,pageId:Number(r.id)}}async function Kt(e){const t=await W(e.supabase,e.languageCode),{data:n,error:o}=await e.supabase.from("navigation_items").select("id, parent_id").eq("menu_key",e.menuKey).eq("language_id",t.id);if(o)throw new Error(`Failed to inspect existing ${e.menuKey} navigation items: ${_(o)}`);const r=Array.isArray(n)?n:[],a=r.filter(d=>d.parent_id==null).length,s=Gt(e.items);Ht({existingItemCount:r.length,existingTopLevelCount:a,languageCode:t.code,menuKey:e.menuKey,replacementItemCount:s});const{error:c}=await e.supabase.from("navigation_items").delete().eq("menu_key",e.menuKey).eq("language_id",t.id);if(c)throw new Error(`Failed to clear ${e.menuKey} navigation items: ${_(c)}`);let u=0;for(const[d,l]of e.items.entries()){const m=await we({item:l,languageId:t.id,menuKey:e.menuKey,order:d,supabase:e.supabase});u++;for(const[h,p]of(l.children??[]).entries())await we({item:p,languageId:t.id,menuKey:e.menuKey,order:h,parentId:m,supabase:e.supabase}),u++}return{insertedCount:u,languageCode:t.code,menuKey:e.menuKey,skippedCount:0,updatedCount:0}}function Ht(e){if(!(e.existingItemCount===0||e.replacementItemCount>=e.existingItemCount))throw new Error(`Refusing destructive ${e.menuKey} navigation replacement for ${e.languageCode}: existing menu has ${e.existingItemCount} items (${e.existingTopLevelCount} top-level), but the replacement only contains ${e.replacementItemCount}. Use mode "update" for renaming or changing a single link, or provide the full menu.`)}async function so(e){const t=await W(e.supabase,e.languageCode),{data:n,error:o}=await e.supabase.from("navigation_items").select("id, parent_id").eq("menu_key",e.menuKey).eq("language_id",t.id);if(o)throw new Error(`Failed to inspect existing ${e.menuKey} navigation items: ${_(o)}`);const r=Array.isArray(n)?n:[];Ht({existingItemCount:r.length,existingTopLevelCount:r.filter(a=>a.parent_id==null).length,languageCode:t.code,menuKey:e.menuKey,replacementItemCount:Gt(e.items)})}async function co(e){if(e.items.length!==1)throw new Error('mode "update" requires exactly one navigation item.');const t=await W(e.supabase,e.languageCode),n=e.items[0],o=K(e.match?.url)||K(n.url),r=wt(e.match?.label),{data:a,error:s}=await e.supabase.from("navigation_items").select("id, label, url, parent_id, order").eq("menu_key",e.menuKey).eq("language_id",t.id);if(s)throw new Error(`Failed to load existing ${e.menuKey} navigation items: ${_(s)}`);const u=(Array.isArray(a)?a:[]).find(l=>{const m=K(l.url),h=wt(l.label);return!!(o&&m===o||r&&h===r)});if(!u?.id)throw new Error(`Could not find a ${e.menuKey} navigation item to update in ${t.code}. Use a matching label or url.`);const{error:d}=await e.supabase.from("navigation_items").update({label:n.label,url:n.url}).eq("id",u.id);if(d)throw new Error(`Failed to update ${e.menuKey} navigation item: ${_(d)}`);return{insertedCount:0,languageCode:t.code,menuKey:e.menuKey,skippedCount:0,updatedCount:1}}async function lo(e){const t=await W(e.supabase,e.languageCode),{data:n,error:o}=await e.supabase.from("navigation_items").select("id, url, parent_id, order").eq("menu_key",e.menuKey).eq("language_id",t.id);if(o)throw new Error(`Failed to load existing ${e.menuKey} navigation items: ${_(o)}`);let r=0,a=0;const s=Array.isArray(n)?n:[],c=new Set(s.map(l=>K(l.url)).filter(Boolean)),u=s.filter(l=>l.parent_id==null).map(l=>Number(l.order)).filter(Number.isFinite);let d=u.length>0?Math.max(...u)+1:s.length;for(const l of e.items){const m=K(l.url);if(m&&c.has(m)){a++;continue}const h=await we({item:l,languageId:t.id,menuKey:e.menuKey,order:d,supabase:e.supabase});r++,d++,m&&c.add(m);let p=0;for(const g of l.children??[]){const f=K(g.url);if(f&&c.has(f)){a++;continue}await we({item:g,languageId:t.id,menuKey:e.menuKey,order:p,parentId:h,supabase:e.supabase}),r++,p++,f&&c.add(f)}}return{insertedCount:r,languageCode:t.code,menuKey:e.menuKey,skippedCount:a,updatedCount:0}}function S(e){return typeof e=="string"&&e.trim()?e.trim():""}function uo(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function po(e){const t=S(e.field_type??e.fieldType??e.type??e.input_type).toLowerCase().replace(/\s+/g,"_"),n=S(e.label??e.name??e.placeholder).toLowerCase();return["email","textarea","select","radio","checkbox","text"].includes(t)?t:n.includes("email")?"email":n.includes("message")||n.includes("comment")||n.includes("details")?"textarea":"text"}function mo(e){return(Array.isArray(e)&&e.length>0?e:[{field_type:"text",is_required:!0,label:"Name",placeholder:"Your name"},{field_type:"email",is_required:!0,label:"Email",placeholder:"you@example.com"},{field_type:"textarea",is_required:!0,label:"Message",placeholder:"How can we help?"}]).map((n,o)=>{const r=E(n)?n:{},a=S(r.label??r.name)||(o===0?"Name":o===1?"Email":"Message"),s=po({...r,label:a}),c=r.is_required??r.isRequired??r.required;return{field_type:s,is_required:typeof c=="boolean"?c:!0,label:a,options:Array.isArray(r.options)?r.options:void 0,placeholder:S(r.placeholder)||void 0,temp_id:S(r.temp_id??r.tempId??r.id)||`field-${o+1}`}})}const go=new Set(["none","sm","md","lg","xl"]),Tt=new Set(["none","sm","md","lg","xl"]),fo=new Set(["full-width","container","container-sm","container-lg","container-xl"]),ho=new Set(["start","center","end","stretch"]),yo=new Set(["none","theme","solid","gradient","image"]),_o=new Set(["primary","secondary","muted","accent","destructive"]),bo=new Set(["center","top","bottom","left","right"]);function ko(e){return typeof e=="string"&&/^https?:\/\//i.test(e.trim())}function B(e,t,n){return typeof e=="string"&&t.has(e)?e:n}function wo(e){return Number.isFinite(e)?Math.min(4,Math.max(1,Math.round(e))):1}function Io(e){const t=[{color:"#1e3a8a",position:0},{color:"#3b82f6",position:100}];if(!E(e))return{direction:"to bottom right",stops:t,type:"linear"};const n=e.type==="radial"?"radial":"linear",o=Array.isArray(e.stops)&&e.stops.length>=2?e.stops:t;return{direction:typeof e.direction=="string"&&e.direction.trim()?e.direction:n==="radial"?"circle at center":"to bottom right",stops:o,type:n}}function To(e){if(!E(e))return{type:"none"};const t=B(e.type,yo,"none"),n=typeof e.min_height=="string"&&e.min_height.trim()?{min_height:e.min_height}:{};if(t==="theme")return{theme:B(e.theme,_o,"muted"),type:t,...n};if(t==="solid")return typeof e.solid_color=="string"&&e.solid_color.trim()?{solid_color:e.solid_color,type:t,...n}:{type:"none"};if(t==="gradient")return{gradient:Io(e.gradient),type:t,...n};if(t==="image"){const o=E(e.image)?e.image:null,r=o&&ko(o.external_url)?o.external_url.trim():null,a=!!(o&&typeof o.media_id=="string"&&o.media_id.trim()&&typeof o.object_key=="string"&&o.object_key.trim());return o&&(r||a)?{image:{...o,...r?{external_url:r}:{},position:B(o.position,bo,"center"),size:o.size==="contain"?"contain":"cover"},type:t,...n}:{type:"none"}}return{type:"none",...n}}function xo(e,t,n){const o=e.is_hero===!0;let r=Array.isArray(e.column_blocks)?e.column_blocks:[];r.length>0&&r.every(f=>E(f)&&!Array.isArray(f))&&(r=[r]);const a=r.map((f,k)=>(Array.isArray(f)?f:[]).map((w,b)=>Fe(w,`${t} column ${k} block ${b}`,n))),s=a.length>0?a:[[]],c=wo(s.length),u=E(e.responsive_columns)?e.responsive_columns:{},d=Number(u.tablet),l=Number(u.mobile),m=Number.isFinite(d)?Math.min(3,Math.max(1,Math.min(c,d))):Math.min(3,c),h=Number.isFinite(l)?Math.min(2,Math.max(1,l)):1,p=E(e.padding)?e.padding:{},g={...e,background:To(e.background),column_blocks:s,column_gap:B(e.column_gap,go,"lg"),container_type:B(e.container_type,fo,"container"),padding:{bottom:B(p.bottom,Tt,"xl"),top:B(p.top,Tt,"xl")},responsive_columns:{desktop:c,mobile:h,tablet:m},vertical_alignment:B(e.vertical_alignment,ho,o?"center":"start")};return g.slider===!0&&!(Array.isArray(g.slides)&&g.slides.length>0)&&(g.slider=!1),g}function Vt(e,t,n,o){if(e==="section"){const a=xo(t,n,o);return M(e,a,n,o),a}const r=D(t);if(e==="heading"&&(r.text_content=S(r.text_content)||S(r.text)||S(r.title)||S(r.heading)||"Untitled",r.level=typeof r.level=="number"?r.level:1),e==="text"){const a=S(r.html_content)||S(r.html)||S(r.content)||S(r.text);a&&(r.html_content=/<\/?[a-z][\s\S]*>/i.test(a)?a:`<p>${uo(a)}</p>`)}return e==="button"&&(r.text=S(r.text)||S(r.label)||S(r.title)||"Learn More",r.url=S(r.url)||S(r.href)||S(r.link)||"#"),e==="form"&&(r.fields=mo(r.fields),r.submit_button_text=S(r.submit_button_text??r.submitButtonText??r.button_text)||"Send Message",r.success_message=S(r.success_message??r.successMessage)||"Thanks for reaching out. We will reply as soon as possible."),M(e,r,n,o),r}function Ie(e,t,n){const o=Vt(e.blockType,pe(e.content,`Block ${t}`),`Block ${t}`,n);return{block_type:e.blockType,content:o,order:e.order??t}}function Co(e,t="Contact Us",n){return[Ie({blockType:"section",content:{is_hero:!0,background:{type:"none"},column_blocks:[[{block_type:"heading",content:{level:1,textAlign:"center",text_content:t},temp_id:ke("heading")},{block_type:"text",content:{html_content:"<p>Have a question, project, or support request? Send us a note and we will get back to you soon.</p>"},temp_id:ke("text")}]],column_gap:"lg",container_type:"container",padding:{bottom:"xl",top:"xl"},responsive_columns:{desktop:1,mobile:1,tablet:1},vertical_alignment:"center"}},0,n),Ie({blockType:"form",content:{fields:[{field_type:"text",is_required:!0,label:"Name",placeholder:"Your name",temp_id:"field-name"},{field_type:"email",is_required:!0,label:"Email",placeholder:"you@example.com",temp_id:"field-email"},{field_type:"textarea",is_required:!0,label:"Message",placeholder:"How can we help?",temp_id:"field-message"}],recipient_email:e,submit_button_text:"Send Message",success_message:"Thanks for reaching out. We will reply as soon as possible."}},1,n)]}function ve(e,t,n,o){return(!e||e.length===0)&&t?Co(t,n,o):(e||[]).map((r,a)=>Ie(r,a,o))}async function Xe(e){const t=e.contentType==="page"?"pages":e.contentType==="post"?"posts":"products",{data:n,error:o}=await e.supabase.from(t).select("id, title, slug, language_id").eq("slug",e.slug).eq("language_id",e.languageId);if(o)throw new Error(`Failed to check ${e.contentType} slug uniqueness: ${_(o)}`);const r=Array.isArray(n)?n:[];return r.length>0?{duplicate:!0,existingItem:r[0],mutationExecuted:!1,success:!1,message:`A ${e.contentType} with slug "${e.slug}" already exists for this language.`}:null}async function Qe(e){if(!e.suppliedTranslationGroupId)return{translationGroupId:void 0};const t=e.contentType==="page"?"pages":e.contentType==="post"?"posts":"products",{data:n,error:o}=await e.supabase.from(t).select("id, title, slug, language_id, translation_group_id").eq("translation_group_id",e.suppliedTranslationGroupId);if(o)throw new Error(`Failed to inspect ${e.contentType} translation group: ${_(o)}`);const r=Array.isArray(n)?n:[];if(r.length===0)return{result:{message:`The ${e.contentType} translation group "${e.suppliedTranslationGroupId}" was not found.`,mutationExecuted:!1,success:!1},translationGroupId:e.suppliedTranslationGroupId};const a=r.find(s=>Number(s.language_id)===e.languageId);return a?{result:{duplicateTranslation:!0,existingItem:a,message:`A ${e.contentType} translation already exists for ${e.languageCode} in this translation group.`,mutationExecuted:!1,success:!1},translationGroupId:e.suppliedTranslationGroupId}:{translationGroupId:e.suppliedTranslationGroupId}}async function Ze(e){if(e.blocks.length===0)return[];const t=e.blocks.map((r,a)=>({block_type:r.block_type,content:r.content,language_id:e.languageId,order:r.order??a,page_id:e.contentType==="page"?e.itemId:null,post_id:e.contentType==="post"?e.itemId:null,product_id:e.contentType==="product"?e.itemId:null})),{data:n,error:o}=await e.supabase.from("blocks").insert(t).select("*");if(o)throw new Error(`Failed to insert ${e.contentType} blocks: ${_(o)}`);return ge(e.blocks,e.supabase),Array.isArray(n)?n:[]}async function et(e){const t=e.contentType==="page"?"pages":e.contentType==="post"?"posts":"products";await e.supabase.from(t).delete().eq("id",e.itemId)}function tt(e,t){return e==="page"?`/cms/pages/${t}/edit`:e==="post"?`/cms/posts/${t}/edit`:`/cms/products/${t}/edit`}function xt(e){return e==="page"?"/cms/pages":e==="post"?"/cms/posts":"/cms/products"}async function nt(e,t){const n=Q.parse(e),o=C(t);n.mode==="replace"&&await so({items:n.items,languageCode:n.languageCode,menuKey:"HEADER",supabase:o});const r=A({action:"UPDATE NAVIGATION",context:t,payload:{input:n,tool:"update_navigation_bar"},preview:{itemCount:n.items.length,languageCode:n.languageCode,mode:n.mode,target:"header navigation"},subject:`${n.mode} header`});if(r)return r;const a=n.mode==="update"?await co({items:n.items,languageCode:n.languageCode,match:n.match,menuKey:"HEADER",supabase:o}):n.mode==="append"?await lo({items:n.items,languageCode:n.languageCode,menuKey:"HEADER",supabase:o}):await Kt({items:n.items,languageCode:n.languageCode,menuKey:"HEADER",supabase:o});return Bt(t),{...a,mutationExecuted:!0,mode:n.mode,success:!0}}async function ot(e,t){const n=Z.parse(e);if(!n.links?.length&&!n.copyright)throw new Error("update_footer requires links or copyright.");const o=C(t),r=A({action:"UPDATE FOOTER",context:t,payload:{input:n,tool:"update_footer"},preview:{copyrightUpdated:!!n.copyright,linkCount:n.links?.length||0,languageCode:n.languageCode,target:"footer"},subject:n.languageCode});if(r)return r;let a=null;if(n.links?.length&&(a=await Kt({items:n.links,languageCode:n.languageCode,menuKey:"FOOTER",supabase:o})),n.copyright){const{error:s}=await o.from("site_settings").upsert({key:"footer_copyright",value:n.copyright});if(s)throw new Error(`Failed to update footer copyright: ${_(s)}`)}return Bt(t),{copyrightUpdated:!!n.copyright,footerNavigation:a,mutationExecuted:!0,success:!0}}function Wt(e){return typeof e=="string"?e.toLowerCase():""}function zo(e,t){const n=t.map(Wt).join(" ");return e.reduce((o,r)=>o+(n.includes(r)?1:0),0)}function Ct(e,t){return(e.find(n=>t.some(o=>Wt(n).includes(o)))||e.find(n=>n.trim().length>0)||"No excerpt available.").slice(0,500)}async function Jt(e,t){const n=xe.parse(e),o=C(t),r=n.query.toLowerCase().split(/\s+/).map(l=>l.trim()).filter(Boolean),[a,s]=await Promise.all([o.from("posts").select("id, title, slug, excerpt, subtitle, meta_description, status, updated_at").eq("status","published").limit(100),o.from("pages").select("id, title, slug, meta_description, status, updated_at").eq("status","published").limit(100)]);if(a.error)throw new Error(`Failed to search documentation posts: ${_(a.error)}`);if(s.error)throw new Error(`Failed to search documentation pages: ${_(s.error)}`);const c=(a.data??[]).map(l=>({excerpt:Ct([l.excerpt,l.subtitle,l.meta_description,l.slug].filter(Boolean),r),source:"post",title:l.title,url:`/article/${l.slug}`})),u=(s.data??[]).map(l=>({excerpt:Ct([l.meta_description,l.slug].filter(Boolean),r),source:"page",title:l.title,url:l.slug==="home"?"/":`/${l.slug}`})),d=[...c,...u].map(l=>({...l,score:zo(r,[l.title,l.excerpt,l.url])})).filter(l=>l.score>0).sort((l,m)=>m.score-l.score).slice(0,n.limit).map(l=>({excerpt:l.excerpt,source:l.source,title:l.title,url:l.url}));return{query:n.query,results:d,success:!0}}async function Yt(e,t,n=_n){const o=xe.safeParse(e),r=o.success?o.data.query:"";return Ln(Jt(e,t),n,()=>({message:"Documentation search took too long to respond. Please try again or ask a more specific question.",query:r,results:[],success:!1,timedOut:!0}))}const So=["pending","trial","paid","shipped","cancelled","refunded","failed"],vo={awaiting:"pending",canceled:"cancelled",cancelled:"cancelled",complete:"paid",completed:"paid",failed:"failed",paid:"paid",payment_pending:"pending",pending:"pending",refund:"refunded",refunded:"refunded",refunds:"refunded",shipped:"shipped",trial:"trial",trials:"trial"};function Eo(e){return String(e??"unknown").trim().toLowerCase()||"unknown"}function zt(e){const t=Object.fromEntries(So.map(n=>[n,0]));for(const n of e){const o=Eo(n.status);t[o]=(t[o]??0)+1}return t}function $o(e){const n=e.toLowerCase().replace(/[^a-z0-9_]+/g," ").split(/\s+/).filter(Boolean);for(const o of n){const r=vo[o];if(r)return r}return null}function X(e){const t=Number(e);return Number.isFinite(t)?t:0}async function Xt(e,t){const n=Re.parse(e),o=C(t),r=new Date;let a=null,s=null;switch(n.timeRange){case"today":a=new Date(r.getFullYear(),r.getMonth(),r.getDate());break;case"this_month":a=new Date(r.getFullYear(),r.getMonth(),1);break;case"last_7_days":a=new Date(r.getTime()-10080*60*1e3);break;case"last_30_days":a=new Date(r.getTime()-720*60*60*1e3);break;case"last_month":a=new Date(r.getFullYear(),r.getMonth()-1,1),s=new Date(r.getFullYear(),r.getMonth(),0,23,59,59,999);break;case"last_90_days":a=new Date(r.getTime()-2160*60*60*1e3);break;case"all_time":a=null;break}const c=n.currency?.toUpperCase(),u=$o(n.query),d=o.from("orders").select("id, status, total, currency, created_at, paid_at");c&&d.eq("currency",c),a&&d.gte("created_at",a.toISOString()),s&&d.lte("created_at",s.toISOString());const m=n.reportType==="products"||n.reportType==="revenue"||n.reportType==="general"?o.from("order_items").select(`
|
|
2
2
|
quantity,
|
|
3
3
|
price_at_purchase,
|
|
4
4
|
products!inner (
|
|
@@ -484,9 +484,13 @@ const kn = i.enum(K), Ze = i.object({
|
|
|
484
484
|
product_details: i.object({}),
|
|
485
485
|
product_grid: i.object({
|
|
486
486
|
categoryId: i.string().optional(),
|
|
487
|
-
|
|
487
|
+
categoryIds: i.array(i.string()).max(20).optional(),
|
|
488
|
+
// 0 = unlimited (every match on one page).
|
|
489
|
+
limit: i.number().min(0).max(48).default(6),
|
|
490
|
+
productIds: i.array(i.string()).max(24).optional(),
|
|
491
|
+
showPagination: i.boolean().default(!1),
|
|
488
492
|
title: i.string().optional(),
|
|
489
|
-
type: i.enum(["latest", "category"]).default("latest")
|
|
493
|
+
type: i.enum(["latest", "category", "manual"]).default("latest")
|
|
490
494
|
}),
|
|
491
495
|
section: Tn,
|
|
492
496
|
testimonial: i.object({
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nextblock-cms/cortex",
|
|
3
|
-
"version": "0.13.
|
|
3
|
+
"version": "0.13.10",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -27,9 +27,9 @@
|
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"@ai-sdk/openai-compatible": "^2.0.42",
|
|
30
|
-
"@nextblock-cms/db": "^0.13.
|
|
31
|
-
"@nextblock-cms/ecommerce": "npm:@nextblock-cms/ecom@^0.13.
|
|
32
|
-
"@nextblock-cms/utils": "^0.13.
|
|
30
|
+
"@nextblock-cms/db": "^0.13.10",
|
|
31
|
+
"@nextblock-cms/ecommerce": "npm:@nextblock-cms/ecom@^0.13.10",
|
|
32
|
+
"@nextblock-cms/utils": "^0.13.10",
|
|
33
33
|
"ai": "^6.0.170",
|
|
34
34
|
"zod": "^4.3.6"
|
|
35
35
|
},
|