@nextblock-cms/cortex 0.14.3 → 0.14.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/ai-global-agent-db-tools.cjs.js +1 -1
- package/lib/ai-global-agent-db-tools.d.ts +8 -8
- package/lib/ai-global-agent-db-tools.es.js +24 -11
- package/lib/ai-global-agent-tools.cjs.js +2 -2
- package/lib/ai-global-agent-tools.d.ts +116 -97
- package/lib/ai-global-agent-tools.es.js +1223 -1181
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const v=require("ai");require("./zod-config.cjs.js");const n=require("zod"),G=100,W=20,k=100,z=20,R="[REDACTED]",g="cortex_ai_openrouter_api_key",j={blocks:{columns:["id","page_id","post_id","language_id","block_type","content","order","created_at","updated_at"],description:"CMS page/post content blocks.",primaryKey:["id"]},coupon_freemius_mappings:{columns:["id","coupon_id","product_id","freemius_product_id","freemius_coupon_id","freemius_coupon_code","sync_status","sync_error","remote_payload","last_synced_at","created_at","updated_at"],description:"Freemius coupon sync mappings.",primaryKey:["id"]},coupon_products:{columns:["coupon_id","product_id","created_at"],description:"Coupon product allow-list rows.",primaryKey:["coupon_id","product_id"]},coupon_redemptions:{columns:["id","coupon_id","order_id","coupon_code","provider","discount_total","user_id","customer_email","metadata","redeemed_at"],description:"Coupon redemption records.",primaryKey:["id"]},coupons:{columns:["id","code","name","internal_note","provider_scope","discount_type","discount_amount","is_active","starts_at","ends_at","redemption_limit","redemptions_count","freemius_sync_status","freemius_sync_error","created_at","updated_at"],description:"Commerce coupons.",primaryKey:["id"]},cortex_ai_db_mutation_audit:{columns:["id","actor_user_id","tool_name","action_name","target_tables","operation_summary","payload_hash","payload","preview","status","error_message","created_at"],description:"Read-only Cortex AI database mutation audit trail.",primaryKey:["id"],readOnly:!0},currencies:{columns:["id","code","symbol","exchange_rate","is_default","is_active","rounding_mode","rounding_increment","rounding_charm_amount","auto_update_exchange_rate","exchange_rate_updated_at","exchange_rate_source","auto_sync_product_prices","created_at","updated_at"],description:"Storefront currencies and FX settings.",primaryKey:["id"]},freemius_plans:{columns:["id","product_id","name","title","created_at","updated_at"],description:"Freemius plan metadata.",primaryKey:["id"]},freemius_pricing:{columns:["id","plan_id","api_monthly_price","api_annual_price","api_lifetime_price","override_monthly_price","override_annual_price","override_lifetime_price","license_quota","is_active","created_at","updated_at"],description:"Freemius pricing metadata.",primaryKey:["id"]},inventory_items:{columns:["sku","quantity","created_at","updated_at"],description:"Source-of-truth inventory by SKU.",primaryKey:["sku"]},languages:{columns:["id","code","name","is_default","is_active","created_at","updated_at"],description:"CMS languages/locales.",primaryKey:["id"]},logos:{columns:["id","name","media_id","created_at"],description:"Brand logos.",primaryKey:["id"]},media:{columns:["id","uploader_id","file_name","object_key","file_type","size_bytes","description","width","height","blur_data_url","variants","file_path","folder","created_at","updated_at"],description:"Media metadata for uploaded assets.",primaryKey:["id"]},navigation_items:{columns:["id","language_id","menu_key","label","url","parent_id","order","page_id","translation_group_id","created_at","updated_at"],description:"CMS navigation tree items.",primaryKey:["id"]},order_items:{columns:["id","order_id","product_id","variant_id","quantity","price_at_purchase"],description:"Commerce order line items.",primaryKey:["id"]},orders:{columns:["id","user_id","status","total","stripe_session_id","payment_intent_id","customer_details","provider","freemius_product_id","freemius_plan_id","freemius_license_id","freemius_subscription_id","freemius_trial_id","freemius_user_id","freemius_trial_ends_at","freemius_last_event_type","freemius_last_synced_at","currency","subtotal","shipping_total","tax_total","tax_details","exchange_rate_at_purchase","inventory_deducted_at","invoice_number","paid_at","created_at","coupon_id","coupon_code","discount_total","discount_details"],description:"Commerce orders.",primaryKey:["id"]},package_activations:{columns:["id","license_key","instance_name","package_id","status","meta","last_validated_at","created_at"],description:"NextBlock package activations.",primaryKey:["id"]},page_revisions:{columns:["id","page_id","author_id","version","revision_type","content","created_at"],description:"Page revision history.",primaryKey:["id"]},pages:{columns:["id","language_id","author_id","title","slug","status","meta_title","meta_description","feature_image_id","version","translation_group_id","created_at","updated_at"],description:"CMS pages.",primaryKey:["id"]},post_revisions:{columns:["id","post_id","author_id","version","revision_type","content","created_at"],description:"Post revision history.",primaryKey:["id"]},posts:{columns:["id","language_id","author_id","title","slug","label","excerpt","subtitle","status","published_at","meta_title","meta_description","feature_image_id","version","translation_group_id","created_at","updated_at"],description:"CMS posts/articles.",primaryKey:["id"]},product_attribute_terms:{columns:["id","attribute_id","value","slug","sort_order","value_translations","created_at","updated_at"],description:"Product attribute terms.",primaryKey:["id"]},product_attributes:{columns:["id","name","slug","name_translations","created_at","updated_at"],description:"Product attribute definitions.",primaryKey:["id"]},product_media:{columns:["product_id","media_id","sort_order"],description:"Product media join rows.",primaryKey:["product_id","media_id"]},product_variants:{columns:["id","product_id","sku","price_adjustment","price","prices","sale_price","sale_prices","stock_quantity","upc","main_media_id","created_at","updated_at"],description:"Sellable product variants.",primaryKey:["id"]},products:{columns:["id","language_id","translation_group_id","sku","title","slug","product_type","payment_provider","price","prices","sale_price","sale_prices","stock","status","meta_title","meta_description","short_description","description_json","metadata","freemius_plan_id","freemius_product_id","trial_period_days","trial_requires_payment_method","upc","is_taxable","created_at","updated_at"],description:"Product catalog records.",primaryKey:["id"]},profiles:{columns:["id","updated_at","full_name","avatar_url","website","phone","role"],description:"Read-only user profiles. Never mutate through Cortex AI.",primaryKey:["id"],readOnly:!0},shipping_zone_locations:{columns:["id","zone_id","country_code","state_code","postal_code","created_at"],description:"Shipping zone location match rules.",primaryKey:["id"]},shipping_zone_methods:{columns:["id","zone_id","method_type","cost_amount","cost_currency","min_order_amount","name","name_translations","currency_pricing_mode","cost_amounts","min_order_amounts","created_at","updated_at"],description:"Shipping methods/rates.",primaryKey:["id"]},shipping_zones:{columns:["id","name","priority_order","created_at","updated_at"],description:"Shipping zones.",primaryKey:["id"]},site_settings:{columns:["key","value"],description:"Global site settings. Cortex AI API-key setting row is protected.",primaryKey:["key"]},tax_rates:{columns:["id","country_code","state_code","tax_name","tax_rate","created_at","updated_at"],description:"Manual tax rates.",primaryKey:["id"]},translations:{columns:["key","translations","created_at","updated_at"],description:"Shared translation strings.",primaryKey:["key"]},user_addresses:{columns:["id","user_id","address_type","is_default","recipient_name","company_name","line1","line2","city","state","postal_code","country_code","created_at","updated_at"],description:"Read-only user addresses. Never mutate through Cortex AI.",primaryKey:["id"],readOnly:!0},variant_attribute_mapping:{columns:["variant_id","attribute_term_id"],description:"Variant to attribute-term join rows.",primaryKey:["variant_id","attribute_term_id"]}},Y=n.z.enum(["eq","neq","gt","gte","lt","lte","ilike","in","is"]),N=n.z.strictObject({column:n.z.string().trim().min(1).max(120),operator:Y.default("eq"),value:n.z.unknown()}),H=n.z.strictObject({ascending:n.z.boolean().default(!0),column:n.z.string().trim().min(1).max(120)}),O=n.z.strictObject({includeReadOnly:n.z.boolean().default(!0),table:n.z.string().trim().min(1).max(120).optional()}),T=n.z.strictObject({columns:n.z.array(n.z.string().trim().min(1).max(120)).min(1).max(40).optional(),filters:n.z.array(N).max(12).default([]),limit:n.z.number().int().min(1).max(G).default(W),offset:n.z.number().int().min(0).max(1e4).default(0),orderBy:H.optional(),table:n.z.string().trim().min(1).max(120)}),S=n.z.strictObject({filters:n.z.array(N).max(12).optional(),operation:n.z.enum(["delete","insert","update","upsert"]),rows:n.z.array(n.z.record(n.z.string(),n.z.unknown())).min(1).max(z).optional(),summary:n.z.string().trim().min(1).max(500).optional(),table:n.z.string().trim().min(1).max(120),values:n.z.record(n.z.string(),n.z.unknown()).optional()}),D=n.z.strictObject({actions:n.z.array(S).min(1).max(8),summary:n.z.string().trim().min(1).max(500).optional()});function E(e){if(!e?.supabase)throw new Error("Cortex AI database tools require a Supabase client.");return e.supabase}function f(e){return e?typeof e=="object"&&"message"in e?String(e.message||"Unknown database error."):String(e):"Unknown database error."}function K(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(t=>K(t)).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${K(e[t])}`).join(",")}}`}function L(e){let t=2166136261;const a=K(e);for(let r=0;r<a.length;r++)t^=a.charCodeAt(r),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}function I(e){return e.replace(/\s+/g," ").trim().toUpperCase()}function Z(e,t,a){return`${I(`CONFIRM ${e} ${t}`)} #${L(a)}`}function ee(e){return{confirmationPhrase:Z(e.action,e.subject,e.payload),mutationExecuted:!1,preview:e.preview,requiresConfirmation:!0,success:!0}}function q(e){if(e.context?.skipConfirmation)return null;const t=ee(e),a=I(e.context?.latestUserMessage||""),r=I(t.confirmationPhrase);return a&&!a.includes(r)?{...t,message:"The database target changed or the confirmation did not match. Please review and confirm again."}:a.includes(r)?null:t}function te(e){return Object.prototype.hasOwnProperty.call(j,e)}function M(e){const t=e.trim();if(t.includes(".")||t.toLowerCase().startsWith("auth"))throw new Error("Cortex AI cannot access auth schema tables.");if(!te(t))throw new Error(`Table "${t}" is not available to Cortex AI database tools.`);return t}function _(e){return j[e]}function w(e){return/(?:password|token|secret|api[_-]?key|private[_-]?key|credential)/i.test(e)}function b(e,t){if(!_(e).columns.includes(t))throw new Error(`Column "${t}" is not available on table "${e}".`);if(w(t))throw new Error(`Column "${t}" is protected and cannot be used through Cortex AI.`)}function $(e,t="payload"){if(Array.isArray(e)){e.forEach((a,r)=>$(a,`${t}[${r}]`));return}if(!(!e||typeof e!="object"))for(const[a,r]of Object.entries(e)){if(w(a))throw new Error(`Protected field "${t}.${a}" cannot be written through Cortex AI.`);$(r,`${t}.${a}`)}}function h(e){if(Array.isArray(e))return e.map(a=>h(a));if(!e||typeof e!="object")return e;const t={};for(const[a,r]of Object.entries(e))t[a]=w(a)?R:h(r);return t}function ae(e){return e.map(t=>t&&typeof t=="object"&&!Array.isArray(t)&&t.key===g?{key:g,value:R}:h(t))}function re(e,t){if(e!=="site_settings")return;if(JSON.stringify(t).toLowerCase().includes(g))throw new Error("The Cortex AI OpenRouter API key site setting is protected.")}function ie(e,t){switch(t.operator){case"eq":return e.eq(t.column,t.value);case"neq":return e.neq(t.column,t.value);case"gt":return e.gt(t.column,t.value);case"gte":return e.gte(t.column,t.value);case"lt":return e.lt(t.column,t.value);case"lte":return e.lte(t.column,t.value);case"ilike":if(typeof t.value!="string")throw new Error(`Filter "${t.column}" with ilike requires a string value.`);return e.ilike(t.column,t.value);case"in":if(!Array.isArray(t.value))throw new Error(`Filter "${t.column}" with in requires an array value.`);return e.in(t.column,t.value);case"is":return e.is(t.column,t.value)}}function x(e,t,a){let r=t;for(const o of a)b(e,o.column),r=ie(r,o);return e==="site_settings"&&(r=r.neq("key",g)),r}function oe(e,t){const a=_(e),r=t?.length?t:a.columns.filter(o=>!w(o));return r.forEach(o=>b(e,o)),r.join(",")}function F(e,t){return t.map(a=>`${a}=${String(e[a]??"")}`).join("|")}async function U(e,t,a){const r=_(t);let o=e.from(t).select(r.primaryKey.join(",")).limit(k+1);o=x(t,o,a);const{data:i,error:s}=await o;if(s)throw new Error(`Failed to preview database mutation: ${f(s)}`);const d=Array.isArray(i)?i:[];if(d.length>k)throw new Error(`Refusing to mutate more than ${k} rows.`);return d}function B(e){const t=M(e.table),a=_(t),r=e.operation;if(a.readOnly)throw new Error(`Table "${t}" is read-only for Cortex AI.`);if(re(t,e),(r==="update"||r==="delete")&&(!e.filters||e.filters.length===0))throw new Error(`${r} operations require at least one filter.`);if((r==="insert"||r==="upsert")&&(!e.rows||e.rows.length===0))throw new Error(`${r} operations require rows.`);if(r==="update"&&(!e.values||Object.keys(e.values).length===0))throw new Error("update operations require values.");if(e.rows&&e.rows.length>z)throw new Error(`Refusing to mutate more than ${z} input rows.`);const o=e.rows??(e.values?[e.values]:[]);for(const i of o){$(i);for(const s of Object.keys(i))b(t,s)}for(const i of e.filters??[])b(t,i.column);return t}function X(e){const{input:t,table:a,targetRows:r}=e,o=_(a),i=r.map(m=>F(m,o.primaryKey)).sort(),s=t.rows?.length??0,d=t.operation==="insert"||t.operation==="upsert"?s:r.length,l=t.summary||`${t.operation} ${d} ${d===1?"row":"rows"} in ${a}.`;return{affectedCount:d,operation:t.operation,sampleTargetIds:i.slice(0,10),summary:l,table:a,targetIds:i}}async function A(e){const t=e.context?.actorUserId;if(!t)return{auditError:"Missing actor user id.",auditLogged:!1};try{const{error:a}=await E(e.context).from("cortex_ai_db_mutation_audit").insert({action_name:e.toolName,actor_user_id:t,error_message:e.errorMessage??null,operation_summary:e.summary,payload:h(e.input),payload_hash:L(e.input),preview:h(e.preview),status:e.status,target_tables:e.targetTables,tool_name:e.toolName});return a?{auditError:f(a),auditLogged:!1}:{auditLogged:!0}}catch(a){return{auditError:f(a),auditLogged:!1}}}async function ne(e,t,a){const o=_(t).primaryKey.join(",");let i;e.operation==="insert"?i=a.from(t).insert(e.rows).select(o):e.operation==="upsert"?i=a.from(t).upsert(e.rows).select(o):e.operation==="update"?(i=a.from(t).update(e.values),i=x(t,i,e.filters??[]),i=i.select(o)):(i=a.from(t).delete(),i=x(t,i,e.filters??[]),i=i.select(o));const{data:s,error:d}=await i;if(d)throw new Error(f(d));return Array.isArray(s)?s:[]}async function V(e){const t=O.parse(e),r=(t.table?[M(t.table)]:Object.keys(j)).filter(o=>t.includeReadOnly||!_(o).readOnly).map(o=>{const i=_(o);return{columns:i.columns.filter(s=>!w(s)),description:i.description,primaryKey:i.primaryKey,readOnly:!!i.readOnly,table:o}});return{safetyNotes:["Use read_database_records for reads and execute_database_mutation/action_plan for writes.","No auth schema access, no arbitrary SQL, no password/secret/API-key fields.","profiles, user_addresses, and cortex_ai_db_mutation_audit are read-only.",`site_settings.${g} is protected.`],success:!0,tables:r}}async function J(e,t){const a=T.parse(e),r=M(a.table),o=oe(r,a.columns);let i=E(t).from(r).select(o).range(a.offset,a.offset+a.limit-1);i=x(r,i,a.filters),a.orderBy&&(b(r,a.orderBy.column),i=i.order(a.orderBy.column,{ascending:a.orderBy.ascending}));const{data:s,error:d}=await i;if(d)throw new Error(`Failed to read database records: ${f(d)}`);const l=Array.isArray(s)?s:[];return{columns:o.split(","),limit:a.limit,offset:a.offset,rows:ae(l),success:!0,table:r}}async function P(e,t){const a=S.parse(e),r=B(a),o=E(t),i=a.operation==="update"||a.operation==="delete"?await U(o,r,a.filters??[]):[],s=X({input:a,table:r,targetRows:i}),d={input:a,targetIds:s.targetIds},l=q({action:`DATABASE ${a.operation}`,context:t,payload:d,preview:s,subject:r});if(l)return l;try{const m=await ne(a,r,o),p=t?.skipAudit?{auditLogged:!1}:await A({context:t,input:d,preview:s,status:"success",summary:String(s.summary),targetTables:[r],toolName:"execute_database_mutation"});return{affectedCount:m.length||s.affectedCount,auditLogged:p.auditLogged,...p.auditError?{auditError:p.auditError}:{},mutationExecuted:!0,operation:a.operation,sampleTargetIds:m.map(c=>F(c,_(r).primaryKey)).slice(0,10),success:!0,summary:s.summary,table:r}}catch(m){const p=f(m),c=t?.skipAudit?{auditLogged:!1}:await A({context:t,errorMessage:p,input:d,preview:s,status:"failure",summary:String(s.summary),targetTables:[r],toolName:"execute_database_mutation"});return{auditLogged:c.auditLogged,...c.auditError?{auditError:c.auditError}:{},message:`Database mutation failed: ${p}`,mutationExecuted:!1,operation:a.operation,success:!1,table:r}}}async function Q(e,t){const a=D.parse(e),r=[];for(const c of a.actions){const y=B(c),u=c.operation==="update"||c.operation==="delete"?await U(E(t),y,c.filters??[]):[];r.push({input:c,preview:X({input:c,table:y,targetRows:u}),table:y})}const o=r.map(({preview:c})=>String(c.summary)),i={actionCount:r.length,actionSummaries:o,summary:a.summary||`Run ${r.length} confirmed database actions.`,tables:Array.from(new Set(r.map(c=>c.table)))},s=r.map(({input:c,preview:y,table:u})=>({input:c,table:u,targetIds:y.targetIds})),d=q({action:"DATABASE ACTION PLAN",context:t,payload:s,preview:i,subject:`${r.length} actions`});if(d)return d;const l=[];let m=!1;for(const[c,y]of r.entries()){const u=await P(y.input,{...t,skipAudit:!0,skipConfirmation:!0});if(l.push(u),u&&typeof u=="object"&&u.mutationExecuted===!0&&(m=!0),!u||typeof u!="object"||u.success===!1){const C=await A({context:t,errorMessage:u&&typeof u=="object"&&typeof u.message=="string"?u.message:`Database action ${c+1} failed.`,input:s,preview:i,status:"failure",summary:String(i.summary),targetTables:i.tables,toolName:"execute_database_action_plan"});return{actionCount:r.length,auditLogged:C.auditLogged,...C.auditError?{auditError:C.auditError}:{},failedActionIndex:c,message:u&&typeof u=="object"&&typeof u.message=="string"?u.message:`Database action ${c+1} failed.`,mutationExecuted:m,results:l,success:!1}}}const p=await A({context:t,input:s,preview:i,status:"success",summary:String(i.summary),targetTables:i.tables,toolName:"execute_database_action_plan"});return{actionCount:r.length,auditLogged:p.auditLogged,...p.auditError?{auditError:p.auditError}:{},mutationExecuted:m,results:l,success:!0,summary:a.summary??null}}function se(e){return{describe_database_schema:v.tool({description:"Describe the public database tables Cortex AI can read or mutate, including read-only tables, primary keys, and writable columns. Use before broad database tasks when unsure about schema.",execute:t=>V(t),inputSchema:O,strict:!0}),execute_database_action_plan:v.tool({description:"Execute up to 8 typed database mutations as one confirmed plan. Mutating: first returns one combined confirmation preview and Confirm button; after confirmation, runs each action in order and stops on the first failure.",execute:t=>Q(t,e),inputSchema:D,strict:!0}),execute_database_mutation:v.tool({description:"Run one typed insert, update, upsert, or delete against an allowed public database table. Mutating: always previews affected rows and requires exact user confirmation before execution. Does not support arbitrary SQL.",execute:t=>P(t,e),inputSchema:S,strict:!0}),read_database_records:v.tool({description:"Read records from an allowed public database table with validated columns, filters, ordering, limit, and offset. Read-only and redacts protected secret-like values.",execute:t=>J(t,e),inputSchema:T,strict:!0})}}exports.createCortexDatabaseAgentTools=se;exports.describeDatabaseSchemaInputSchema=O;exports.executeDatabaseActionPlan=Q;exports.executeDatabaseActionPlanInputSchema=D;exports.executeDatabaseMutation=P;exports.executeDatabaseMutationInputSchema=S;exports.executeDescribeDatabaseSchema=V;exports.executeReadDatabaseRecords=J;exports.readDatabaseRecordsInputSchema=T;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const v=require("ai");require("./zod-config.cjs.js");const n=require("zod"),G=100,W=20,k=100,z=20,R="[REDACTED]",g="cortex_ai_openrouter_api_key",$={blocks:{columns:["id","page_id","post_id","language_id","block_type","content","order","created_at","updated_at"],description:"CMS page/post content blocks.",primaryKey:["id"]},coupon_freemius_mappings:{columns:["id","coupon_id","product_id","freemius_product_id","freemius_coupon_id","freemius_coupon_code","sync_status","sync_error","remote_payload","last_synced_at","created_at","updated_at"],description:"Freemius coupon sync mappings.",primaryKey:["id"]},coupon_products:{columns:["coupon_id","product_id","created_at"],description:"Coupon product allow-list rows.",primaryKey:["coupon_id","product_id"]},coupon_redemptions:{columns:["id","coupon_id","order_id","coupon_code","provider","discount_total","user_id","customer_email","metadata","redeemed_at"],description:"Coupon redemption records.",primaryKey:["id"]},coupons:{columns:["id","code","name","internal_note","provider_scope","discount_type","discount_amount","is_active","starts_at","ends_at","redemption_limit","redemptions_count","freemius_sync_status","freemius_sync_error","created_at","updated_at"],description:"Commerce coupons.",primaryKey:["id"]},cortex_ai_db_mutation_audit:{columns:["id","actor_user_id","tool_name","action_name","target_tables","operation_summary","payload_hash","payload","preview","status","error_message","created_at"],description:"Read-only Cortex AI database mutation audit trail.",primaryKey:["id"],readOnly:!0},currencies:{columns:["id","code","symbol","exchange_rate","is_default","is_active","rounding_mode","rounding_increment","rounding_charm_amount","auto_update_exchange_rate","exchange_rate_updated_at","exchange_rate_source","auto_sync_product_prices","created_at","updated_at"],description:"Storefront currencies and FX settings.",primaryKey:["id"]},freemius_plans:{columns:["id","product_id","name","title","created_at","updated_at"],description:"Freemius plan metadata.",primaryKey:["id"]},freemius_pricing:{columns:["id","plan_id","api_monthly_price","api_annual_price","api_lifetime_price","override_monthly_price","override_annual_price","override_lifetime_price","license_quota","is_active","created_at","updated_at"],description:"Freemius pricing metadata.",primaryKey:["id"]},inventory_items:{columns:["sku","quantity","created_at","updated_at"],description:"Source-of-truth inventory by SKU.",primaryKey:["sku"]},languages:{columns:["id","code","name","is_default","is_active","created_at","updated_at"],description:"CMS languages/locales.",primaryKey:["id"]},logos:{columns:["id","name","media_id","created_at"],description:"Brand logos.",primaryKey:["id"]},media:{columns:["id","uploader_id","file_name","object_key","file_type","size_bytes","description","width","height","blur_data_url","variants","file_path","folder","created_at","updated_at"],description:"Media metadata for uploaded assets.",primaryKey:["id"]},navigation_items:{columns:["id","language_id","menu_key","label","url","parent_id","order","page_id","translation_group_id","created_at","updated_at"],description:"CMS navigation tree items.",primaryKey:["id"]},order_items:{columns:["id","order_id","product_id","variant_id","quantity","price_at_purchase"],description:"Commerce order line items.",primaryKey:["id"]},orders:{columns:["id","user_id","status","total","stripe_session_id","payment_intent_id","customer_details","provider","freemius_product_id","freemius_plan_id","freemius_license_id","freemius_subscription_id","freemius_trial_id","freemius_user_id","freemius_trial_ends_at","freemius_last_event_type","freemius_last_synced_at","currency","subtotal","shipping_total","tax_total","tax_details","exchange_rate_at_purchase","inventory_deducted_at","invoice_number","paid_at","created_at","coupon_id","coupon_code","discount_total","discount_details"],description:"Commerce orders.",primaryKey:["id"]},package_activations:{columns:["id","license_key","instance_name","package_id","status","meta","last_validated_at","created_at"],description:"NextBlock package activations.",primaryKey:["id"]},page_revisions:{columns:["id","page_id","author_id","version","revision_type","content","created_at"],description:"Page revision history.",primaryKey:["id"],readOnly:!0},pages:{columns:["id","language_id","author_id","title","slug","status","meta_title","meta_description","feature_image_id","version","translation_group_id","created_at","updated_at"],description:"CMS pages.",primaryKey:["id"]},post_revisions:{columns:["id","post_id","author_id","version","revision_type","content","created_at"],description:"Post revision history.",primaryKey:["id"],readOnly:!0},product_revisions:{columns:["id","product_id","author_id","version","revision_type","content","created_at"],description:"Product revision history.",primaryKey:["id"],readOnly:!0},posts:{columns:["id","language_id","author_id","title","slug","label","excerpt","subtitle","status","published_at","meta_title","meta_description","feature_image_id","version","translation_group_id","created_at","updated_at"],description:"CMS posts/articles.",primaryKey:["id"]},product_attribute_terms:{columns:["id","attribute_id","value","slug","sort_order","value_translations","created_at","updated_at"],description:"Product attribute terms.",primaryKey:["id"]},product_attributes:{columns:["id","name","slug","name_translations","created_at","updated_at"],description:"Product attribute definitions.",primaryKey:["id"]},product_media:{columns:["product_id","media_id","sort_order"],description:"Product media join rows.",primaryKey:["product_id","media_id"]},product_variants:{columns:["id","product_id","sku","price_adjustment","price","prices","sale_price","sale_prices","stock_quantity","upc","main_media_id","created_at","updated_at"],description:"Sellable product variants.",primaryKey:["id"]},products:{columns:["id","language_id","translation_group_id","sku","title","slug","product_type","payment_provider","price","prices","sale_price","sale_prices","stock","status","meta_title","meta_description","short_description","description_json","metadata","freemius_plan_id","freemius_product_id","trial_period_days","trial_requires_payment_method","upc","is_taxable","created_at","updated_at"],description:"Product catalog records.",primaryKey:["id"]},profiles:{columns:["id","updated_at","full_name","avatar_url","website","phone","role"],description:"Read-only user profiles. Never mutate through Cortex AI.",primaryKey:["id"],readOnly:!0},shipping_zone_locations:{columns:["id","zone_id","country_code","state_code","postal_code","created_at"],description:"Shipping zone location match rules.",primaryKey:["id"]},shipping_zone_methods:{columns:["id","zone_id","method_type","cost_amount","cost_currency","min_order_amount","name","name_translations","currency_pricing_mode","cost_amounts","min_order_amounts","created_at","updated_at"],description:"Shipping methods/rates.",primaryKey:["id"]},shipping_zones:{columns:["id","name","priority_order","created_at","updated_at"],description:"Shipping zones.",primaryKey:["id"]},site_settings:{columns:["key","value"],description:"Global site settings. Cortex AI API-key setting row is protected.",primaryKey:["key"]},tax_rates:{columns:["id","country_code","state_code","tax_name","tax_rate","created_at","updated_at"],description:"Manual tax rates.",primaryKey:["id"]},translations:{columns:["key","translations","created_at","updated_at"],description:"Shared translation strings.",primaryKey:["key"]},user_addresses:{columns:["id","user_id","address_type","is_default","recipient_name","company_name","line1","line2","city","state","postal_code","country_code","created_at","updated_at"],description:"Read-only user addresses. Never mutate through Cortex AI.",primaryKey:["id"],readOnly:!0},variant_attribute_mapping:{columns:["variant_id","attribute_term_id"],description:"Variant to attribute-term join rows.",primaryKey:["variant_id","attribute_term_id"]}},Y=n.z.enum(["eq","neq","gt","gte","lt","lte","ilike","in","is"]),N=n.z.strictObject({column:n.z.string().trim().min(1).max(120),operator:Y.default("eq"),value:n.z.unknown()}),H=n.z.strictObject({ascending:n.z.boolean().default(!0),column:n.z.string().trim().min(1).max(120)}),j=n.z.strictObject({includeReadOnly:n.z.boolean().default(!0),table:n.z.string().trim().min(1).max(120).optional()}),T=n.z.strictObject({columns:n.z.array(n.z.string().trim().min(1).max(120)).min(1).max(40).optional(),filters:n.z.array(N).max(12).default([]),limit:n.z.number().int().min(1).max(G).default(W),offset:n.z.number().int().min(0).max(1e4).default(0),orderBy:H.optional(),table:n.z.string().trim().min(1).max(120)}),S=n.z.strictObject({filters:n.z.array(N).max(12).optional(),operation:n.z.enum(["delete","insert","update","upsert"]),rows:n.z.array(n.z.record(n.z.string(),n.z.unknown())).min(1).max(z).optional(),summary:n.z.string().trim().min(1).max(500).optional(),table:n.z.string().trim().min(1).max(120),values:n.z.record(n.z.string(),n.z.unknown()).optional()}),D=n.z.strictObject({actions:n.z.array(S).min(1).max(8),summary:n.z.string().trim().min(1).max(500).optional()});function E(e){if(!e?.supabase)throw new Error("Cortex AI database tools require a Supabase client.");return e.supabase}function f(e){return e?typeof e=="object"&&"message"in e?String(e.message||"Unknown database error."):String(e):"Unknown database error."}function K(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(t=>K(t)).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${K(e[t])}`).join(",")}}`}function L(e){let t=2166136261;const r=K(e);for(let a=0;a<r.length;a++)t^=r.charCodeAt(a),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}function I(e){return e.replace(/\s+/g," ").trim().toUpperCase()}function Z(e,t,r){return`${I(`CONFIRM ${e} ${t}`)} #${L(r)}`}function ee(e){return{confirmationPhrase:Z(e.action,e.subject,e.payload),mutationExecuted:!1,preview:e.preview,requiresConfirmation:!0,success:!0}}function q(e){if(e.context?.skipConfirmation)return null;const t=ee(e),r=I(e.context?.latestUserMessage||""),a=I(t.confirmationPhrase);return r&&!r.includes(a)?{...t,message:"The database target changed or the confirmation did not match. Please review and confirm again."}:r.includes(a)?null:t}function te(e){return Object.prototype.hasOwnProperty.call($,e)}function M(e){const t=e.trim();if(t.includes(".")||t.toLowerCase().startsWith("auth"))throw new Error("Cortex AI cannot access auth schema tables.");if(!te(t))throw new Error(`Table "${t}" is not available to Cortex AI database tools.`);return t}function _(e){return $[e]}function w(e){return/(?:password|token|secret|api[_-]?key|private[_-]?key|credential)/i.test(e)}function b(e,t){if(!_(e).columns.includes(t))throw new Error(`Column "${t}" is not available on table "${e}".`);if(w(t))throw new Error(`Column "${t}" is protected and cannot be used through Cortex AI.`)}function O(e,t="payload"){if(Array.isArray(e)){e.forEach((r,a)=>O(r,`${t}[${a}]`));return}if(!(!e||typeof e!="object"))for(const[r,a]of Object.entries(e)){if(w(r))throw new Error(`Protected field "${t}.${r}" cannot be written through Cortex AI.`);O(a,`${t}.${r}`)}}function h(e){if(Array.isArray(e))return e.map(r=>h(r));if(!e||typeof e!="object")return e;const t={};for(const[r,a]of Object.entries(e))t[r]=w(r)?R:h(a);return t}function re(e){return e.map(t=>t&&typeof t=="object"&&!Array.isArray(t)&&t.key===g?{key:g,value:R}:h(t))}function ae(e,t){if(e!=="site_settings")return;if(JSON.stringify(t).toLowerCase().includes(g))throw new Error("The Cortex AI OpenRouter API key site setting is protected.")}function ie(e,t){switch(t.operator){case"eq":return e.eq(t.column,t.value);case"neq":return e.neq(t.column,t.value);case"gt":return e.gt(t.column,t.value);case"gte":return e.gte(t.column,t.value);case"lt":return e.lt(t.column,t.value);case"lte":return e.lte(t.column,t.value);case"ilike":if(typeof t.value!="string")throw new Error(`Filter "${t.column}" with ilike requires a string value.`);return e.ilike(t.column,t.value);case"in":if(!Array.isArray(t.value))throw new Error(`Filter "${t.column}" with in requires an array value.`);return e.in(t.column,t.value);case"is":return e.is(t.column,t.value)}}function x(e,t,r){let a=t;for(const o of r)b(e,o.column),a=ie(a,o);return e==="site_settings"&&(a=a.neq("key",g)),a}function oe(e,t){const r=_(e),a=t?.length?t:r.columns.filter(o=>!w(o));return a.forEach(o=>b(e,o)),a.join(",")}function F(e,t){return t.map(r=>`${r}=${String(e[r]??"")}`).join("|")}async function U(e,t,r){const a=_(t);let o=e.from(t).select(a.primaryKey.join(",")).limit(k+1);o=x(t,o,r);const{data:i,error:s}=await o;if(s)throw new Error(`Failed to preview database mutation: ${f(s)}`);const d=Array.isArray(i)?i:[];if(d.length>k)throw new Error(`Refusing to mutate more than ${k} rows.`);return d}function B(e){const t=M(e.table),r=_(t),a=e.operation;if(r.readOnly)throw new Error(`Table "${t}" is read-only for Cortex AI.`);if(ae(t,e),(a==="update"||a==="delete")&&(!e.filters||e.filters.length===0))throw new Error(`${a} operations require at least one filter.`);if((a==="insert"||a==="upsert")&&(!e.rows||e.rows.length===0))throw new Error(`${a} operations require rows.`);if(a==="update"&&(!e.values||Object.keys(e.values).length===0))throw new Error("update operations require values.");if(e.rows&&e.rows.length>z)throw new Error(`Refusing to mutate more than ${z} input rows.`);const o=e.rows??(e.values?[e.values]:[]);for(const i of o){O(i);for(const s of Object.keys(i))b(t,s)}for(const i of e.filters??[])b(t,i.column);return t}function X(e){const{input:t,table:r,targetRows:a}=e,o=_(r),i=a.map(m=>F(m,o.primaryKey)).sort(),s=t.rows?.length??0,d=t.operation==="insert"||t.operation==="upsert"?s:a.length,l=t.summary||`${t.operation} ${d} ${d===1?"row":"rows"} in ${r}.`;return{affectedCount:d,operation:t.operation,sampleTargetIds:i.slice(0,10),summary:l,table:r,targetIds:i}}async function A(e){const t=e.context?.actorUserId;if(!t)return{auditError:"Missing actor user id.",auditLogged:!1};try{const{error:r}=await E(e.context).from("cortex_ai_db_mutation_audit").insert({action_name:e.toolName,actor_user_id:t,error_message:e.errorMessage??null,operation_summary:e.summary,payload:h(e.input),payload_hash:L(e.input),preview:h(e.preview),status:e.status,target_tables:e.targetTables,tool_name:e.toolName});return r?{auditError:f(r),auditLogged:!1}:{auditLogged:!0}}catch(r){return{auditError:f(r),auditLogged:!1}}}async function ne(e,t,r){const o=_(t).primaryKey.join(",");let i;e.operation==="insert"?i=r.from(t).insert(e.rows).select(o):e.operation==="upsert"?i=r.from(t).upsert(e.rows).select(o):e.operation==="update"?(i=r.from(t).update(e.values),i=x(t,i,e.filters??[]),i=i.select(o)):(i=r.from(t).delete(),i=x(t,i,e.filters??[]),i=i.select(o));const{data:s,error:d}=await i;if(d)throw new Error(f(d));return Array.isArray(s)?s:[]}async function V(e){const t=j.parse(e),a=(t.table?[M(t.table)]:Object.keys($)).filter(o=>t.includeReadOnly||!_(o).readOnly).map(o=>{const i=_(o);return{columns:i.columns.filter(s=>!w(s)),description:i.description,primaryKey:i.primaryKey,readOnly:!!i.readOnly,table:o}});return{safetyNotes:["Use read_database_records for reads and execute_database_mutation/action_plan for writes.","No auth schema access, no arbitrary SQL, no password/secret/API-key fields.","profiles, user_addresses, and cortex_ai_db_mutation_audit are read-only.",`site_settings.${g} is protected.`],success:!0,tables:a}}async function J(e,t){const r=T.parse(e),a=M(r.table),o=oe(a,r.columns);let i=E(t).from(a).select(o).range(r.offset,r.offset+r.limit-1);i=x(a,i,r.filters),r.orderBy&&(b(a,r.orderBy.column),i=i.order(r.orderBy.column,{ascending:r.orderBy.ascending}));const{data:s,error:d}=await i;if(d)throw new Error(`Failed to read database records: ${f(d)}`);const l=Array.isArray(s)?s:[];return{columns:o.split(","),limit:r.limit,offset:r.offset,rows:re(l),success:!0,table:a}}async function P(e,t){const r=S.parse(e),a=B(r),o=E(t),i=r.operation==="update"||r.operation==="delete"?await U(o,a,r.filters??[]):[],s=X({input:r,table:a,targetRows:i}),d={input:r,targetIds:s.targetIds},l=q({action:`DATABASE ${r.operation}`,context:t,payload:d,preview:s,subject:a});if(l)return l;try{const m=await ne(r,a,o),p=t?.skipAudit?{auditLogged:!1}:await A({context:t,input:d,preview:s,status:"success",summary:String(s.summary),targetTables:[a],toolName:"execute_database_mutation"});return{affectedCount:m.length||s.affectedCount,auditLogged:p.auditLogged,...p.auditError?{auditError:p.auditError}:{},mutationExecuted:!0,operation:r.operation,sampleTargetIds:m.map(c=>F(c,_(a).primaryKey)).slice(0,10),success:!0,summary:s.summary,table:a}}catch(m){const p=f(m),c=t?.skipAudit?{auditLogged:!1}:await A({context:t,errorMessage:p,input:d,preview:s,status:"failure",summary:String(s.summary),targetTables:[a],toolName:"execute_database_mutation"});return{auditLogged:c.auditLogged,...c.auditError?{auditError:c.auditError}:{},message:`Database mutation failed: ${p}`,mutationExecuted:!1,operation:r.operation,success:!1,table:a}}}async function Q(e,t){const r=D.parse(e),a=[];for(const c of r.actions){const y=B(c),u=c.operation==="update"||c.operation==="delete"?await U(E(t),y,c.filters??[]):[];a.push({input:c,preview:X({input:c,table:y,targetRows:u}),table:y})}const o=a.map(({preview:c})=>String(c.summary)),i={actionCount:a.length,actionSummaries:o,summary:r.summary||`Run ${a.length} confirmed database actions.`,tables:Array.from(new Set(a.map(c=>c.table)))},s=a.map(({input:c,preview:y,table:u})=>({input:c,table:u,targetIds:y.targetIds})),d=q({action:"DATABASE ACTION PLAN",context:t,payload:s,preview:i,subject:`${a.length} actions`});if(d)return d;const l=[];let m=!1;for(const[c,y]of a.entries()){const u=await P(y.input,{...t,skipAudit:!0,skipConfirmation:!0});if(l.push(u),u&&typeof u=="object"&&u.mutationExecuted===!0&&(m=!0),!u||typeof u!="object"||u.success===!1){const C=await A({context:t,errorMessage:u&&typeof u=="object"&&typeof u.message=="string"?u.message:`Database action ${c+1} failed.`,input:s,preview:i,status:"failure",summary:String(i.summary),targetTables:i.tables,toolName:"execute_database_action_plan"});return{actionCount:a.length,auditLogged:C.auditLogged,...C.auditError?{auditError:C.auditError}:{},failedActionIndex:c,message:u&&typeof u=="object"&&typeof u.message=="string"?u.message:`Database action ${c+1} failed.`,mutationExecuted:m,results:l,success:!1}}}const p=await A({context:t,input:s,preview:i,status:"success",summary:String(i.summary),targetTables:i.tables,toolName:"execute_database_action_plan"});return{actionCount:a.length,auditLogged:p.auditLogged,...p.auditError?{auditError:p.auditError}:{},mutationExecuted:m,results:l,success:!0,summary:r.summary??null}}function se(e){return{describe_database_schema:v.tool({description:"Describe the public database tables Cortex AI can read or mutate, including read-only tables, primary keys, and writable columns. Use before broad database tasks when unsure about schema.",execute:t=>V(t),inputSchema:j,strict:!0}),execute_database_action_plan:v.tool({description:"Execute up to 8 typed database mutations as one confirmed plan. Mutating: first returns one combined confirmation preview and Confirm button; after confirmation, runs each action in order and stops on the first failure.",execute:t=>Q(t,e),inputSchema:D,strict:!0}),execute_database_mutation:v.tool({description:"Run one typed insert, update, upsert, or delete against an allowed public database table. Mutating: always previews affected rows and requires exact user confirmation before execution. Does not support arbitrary SQL.",execute:t=>P(t,e),inputSchema:S,strict:!0}),read_database_records:v.tool({description:"Read records from an allowed public database table with validated columns, filters, ordering, limit, and offset. Read-only and redacts protected secret-like values.",execute:t=>J(t,e),inputSchema:T,strict:!0})}}exports.createCortexDatabaseAgentTools=se;exports.describeDatabaseSchemaInputSchema=j;exports.executeDatabaseActionPlan=Q;exports.executeDatabaseActionPlanInputSchema=D;exports.executeDatabaseMutation=P;exports.executeDatabaseMutationInputSchema=S;exports.executeDescribeDatabaseSchema=V;exports.executeReadDatabaseRecords=J;exports.readDatabaseRecordsInputSchema=T;
|
|
@@ -105,7 +105,7 @@ export declare function executeDescribeDatabaseSchema(input: z.input<typeof desc
|
|
|
105
105
|
description: string;
|
|
106
106
|
primaryKey: readonly string[];
|
|
107
107
|
readOnly: boolean;
|
|
108
|
-
table: "site_settings" | "languages" | "pages" | "posts" | "products" | "profiles" | "coupons" | "orders" | "freemius_plans" | "media" | "navigation_items" | "product_variants" | "product_attributes" | "shipping_zones" | "product_attribute_terms" | "blocks" | "cortex_ai_db_mutation_audit" | "coupon_freemius_mappings" | "coupon_products" | "coupon_redemptions" | "currencies" | "freemius_pricing" | "inventory_items" | "logos" | "order_items" | "package_activations" | "page_revisions" | "post_revisions" | "product_media" | "shipping_zone_locations" | "shipping_zone_methods" | "tax_rates" | "translations" | "user_addresses" | "variant_attribute_mapping";
|
|
108
|
+
table: "site_settings" | "languages" | "pages" | "posts" | "products" | "profiles" | "coupons" | "orders" | "freemius_plans" | "media" | "navigation_items" | "product_variants" | "product_attributes" | "shipping_zones" | "product_attribute_terms" | "blocks" | "cortex_ai_db_mutation_audit" | "coupon_freemius_mappings" | "coupon_products" | "coupon_redemptions" | "currencies" | "freemius_pricing" | "inventory_items" | "logos" | "order_items" | "package_activations" | "page_revisions" | "post_revisions" | "product_media" | "shipping_zone_locations" | "shipping_zone_methods" | "tax_rates" | "translations" | "user_addresses" | "variant_attribute_mapping" | "product_revisions";
|
|
109
109
|
}[];
|
|
110
110
|
}>;
|
|
111
111
|
export declare function executeReadDatabaseRecords(input: z.input<typeof readDatabaseRecordsInputSchema>, context?: ToolExecutionContext): Promise<{
|
|
@@ -114,7 +114,7 @@ export declare function executeReadDatabaseRecords(input: z.input<typeof readDat
|
|
|
114
114
|
offset: number;
|
|
115
115
|
rows: unknown[];
|
|
116
116
|
success: boolean;
|
|
117
|
-
table: "site_settings" | "languages" | "pages" | "posts" | "products" | "profiles" | "coupons" | "orders" | "freemius_plans" | "media" | "navigation_items" | "product_variants" | "product_attributes" | "shipping_zones" | "product_attribute_terms" | "blocks" | "cortex_ai_db_mutation_audit" | "coupon_freemius_mappings" | "coupon_products" | "coupon_redemptions" | "currencies" | "freemius_pricing" | "inventory_items" | "logos" | "order_items" | "package_activations" | "page_revisions" | "post_revisions" | "product_media" | "shipping_zone_locations" | "shipping_zone_methods" | "tax_rates" | "translations" | "user_addresses" | "variant_attribute_mapping";
|
|
117
|
+
table: "site_settings" | "languages" | "pages" | "posts" | "products" | "profiles" | "coupons" | "orders" | "freemius_plans" | "media" | "navigation_items" | "product_variants" | "product_attributes" | "shipping_zones" | "product_attribute_terms" | "blocks" | "cortex_ai_db_mutation_audit" | "coupon_freemius_mappings" | "coupon_products" | "coupon_redemptions" | "currencies" | "freemius_pricing" | "inventory_items" | "logos" | "order_items" | "package_activations" | "page_revisions" | "post_revisions" | "product_media" | "shipping_zone_locations" | "shipping_zone_methods" | "tax_rates" | "translations" | "user_addresses" | "variant_attribute_mapping" | "product_revisions";
|
|
118
118
|
}>;
|
|
119
119
|
export declare function executeDatabaseMutation(input: ExecuteDatabaseMutationInput, context?: ToolExecutionContext): Promise<{
|
|
120
120
|
confirmationPhrase: string;
|
|
@@ -128,7 +128,7 @@ export declare function executeDatabaseMutation(input: ExecuteDatabaseMutationIn
|
|
|
128
128
|
sampleTargetIds: string[];
|
|
129
129
|
success: boolean;
|
|
130
130
|
summary: string;
|
|
131
|
-
table: "site_settings" | "languages" | "pages" | "posts" | "products" | "profiles" | "coupons" | "orders" | "freemius_plans" | "media" | "navigation_items" | "product_variants" | "product_attributes" | "shipping_zones" | "product_attribute_terms" | "blocks" | "cortex_ai_db_mutation_audit" | "coupon_freemius_mappings" | "coupon_products" | "coupon_redemptions" | "currencies" | "freemius_pricing" | "inventory_items" | "logos" | "order_items" | "package_activations" | "page_revisions" | "post_revisions" | "product_media" | "shipping_zone_locations" | "shipping_zone_methods" | "tax_rates" | "translations" | "user_addresses" | "variant_attribute_mapping";
|
|
131
|
+
table: "site_settings" | "languages" | "pages" | "posts" | "products" | "profiles" | "coupons" | "orders" | "freemius_plans" | "media" | "navigation_items" | "product_variants" | "product_attributes" | "shipping_zones" | "product_attribute_terms" | "blocks" | "cortex_ai_db_mutation_audit" | "coupon_freemius_mappings" | "coupon_products" | "coupon_redemptions" | "currencies" | "freemius_pricing" | "inventory_items" | "logos" | "order_items" | "package_activations" | "page_revisions" | "post_revisions" | "product_media" | "shipping_zone_locations" | "shipping_zone_methods" | "tax_rates" | "translations" | "user_addresses" | "variant_attribute_mapping" | "product_revisions";
|
|
132
132
|
auditError?: string | undefined;
|
|
133
133
|
affectedCount: number;
|
|
134
134
|
auditLogged: boolean;
|
|
@@ -137,7 +137,7 @@ export declare function executeDatabaseMutation(input: ExecuteDatabaseMutationIn
|
|
|
137
137
|
mutationExecuted: boolean;
|
|
138
138
|
operation: "delete" | "update" | "insert" | "upsert";
|
|
139
139
|
success: boolean;
|
|
140
|
-
table: "site_settings" | "languages" | "pages" | "posts" | "products" | "profiles" | "coupons" | "orders" | "freemius_plans" | "media" | "navigation_items" | "product_variants" | "product_attributes" | "shipping_zones" | "product_attribute_terms" | "blocks" | "cortex_ai_db_mutation_audit" | "coupon_freemius_mappings" | "coupon_products" | "coupon_redemptions" | "currencies" | "freemius_pricing" | "inventory_items" | "logos" | "order_items" | "package_activations" | "page_revisions" | "post_revisions" | "product_media" | "shipping_zone_locations" | "shipping_zone_methods" | "tax_rates" | "translations" | "user_addresses" | "variant_attribute_mapping";
|
|
140
|
+
table: "site_settings" | "languages" | "pages" | "posts" | "products" | "profiles" | "coupons" | "orders" | "freemius_plans" | "media" | "navigation_items" | "product_variants" | "product_attributes" | "shipping_zones" | "product_attribute_terms" | "blocks" | "cortex_ai_db_mutation_audit" | "coupon_freemius_mappings" | "coupon_products" | "coupon_redemptions" | "currencies" | "freemius_pricing" | "inventory_items" | "logos" | "order_items" | "package_activations" | "page_revisions" | "post_revisions" | "product_media" | "shipping_zone_locations" | "shipping_zone_methods" | "tax_rates" | "translations" | "user_addresses" | "variant_attribute_mapping" | "product_revisions";
|
|
141
141
|
auditError?: string | undefined;
|
|
142
142
|
auditLogged: boolean;
|
|
143
143
|
}>;
|
|
@@ -177,7 +177,7 @@ export declare function createCortexDatabaseAgentTools(context?: ToolExecutionCo
|
|
|
177
177
|
description: string;
|
|
178
178
|
primaryKey: readonly string[];
|
|
179
179
|
readOnly: boolean;
|
|
180
|
-
table: "site_settings" | "languages" | "pages" | "posts" | "products" | "profiles" | "coupons" | "orders" | "freemius_plans" | "media" | "navigation_items" | "product_variants" | "product_attributes" | "shipping_zones" | "product_attribute_terms" | "blocks" | "cortex_ai_db_mutation_audit" | "coupon_freemius_mappings" | "coupon_products" | "coupon_redemptions" | "currencies" | "freemius_pricing" | "inventory_items" | "logos" | "order_items" | "package_activations" | "page_revisions" | "post_revisions" | "product_media" | "shipping_zone_locations" | "shipping_zone_methods" | "tax_rates" | "translations" | "user_addresses" | "variant_attribute_mapping";
|
|
180
|
+
table: "site_settings" | "languages" | "pages" | "posts" | "products" | "profiles" | "coupons" | "orders" | "freemius_plans" | "media" | "navigation_items" | "product_variants" | "product_attributes" | "shipping_zones" | "product_attribute_terms" | "blocks" | "cortex_ai_db_mutation_audit" | "coupon_freemius_mappings" | "coupon_products" | "coupon_redemptions" | "currencies" | "freemius_pricing" | "inventory_items" | "logos" | "order_items" | "package_activations" | "page_revisions" | "post_revisions" | "product_media" | "shipping_zone_locations" | "shipping_zone_methods" | "tax_rates" | "translations" | "user_addresses" | "variant_attribute_mapping" | "product_revisions";
|
|
181
181
|
}[];
|
|
182
182
|
}>;
|
|
183
183
|
execute_database_action_plan: import('ai').Tool<{
|
|
@@ -241,7 +241,7 @@ export declare function createCortexDatabaseAgentTools(context?: ToolExecutionCo
|
|
|
241
241
|
sampleTargetIds: string[];
|
|
242
242
|
success: boolean;
|
|
243
243
|
summary: string;
|
|
244
|
-
table: "site_settings" | "languages" | "pages" | "posts" | "products" | "profiles" | "coupons" | "orders" | "freemius_plans" | "media" | "navigation_items" | "product_variants" | "product_attributes" | "shipping_zones" | "product_attribute_terms" | "blocks" | "cortex_ai_db_mutation_audit" | "coupon_freemius_mappings" | "coupon_products" | "coupon_redemptions" | "currencies" | "freemius_pricing" | "inventory_items" | "logos" | "order_items" | "package_activations" | "page_revisions" | "post_revisions" | "product_media" | "shipping_zone_locations" | "shipping_zone_methods" | "tax_rates" | "translations" | "user_addresses" | "variant_attribute_mapping";
|
|
244
|
+
table: "site_settings" | "languages" | "pages" | "posts" | "products" | "profiles" | "coupons" | "orders" | "freemius_plans" | "media" | "navigation_items" | "product_variants" | "product_attributes" | "shipping_zones" | "product_attribute_terms" | "blocks" | "cortex_ai_db_mutation_audit" | "coupon_freemius_mappings" | "coupon_products" | "coupon_redemptions" | "currencies" | "freemius_pricing" | "inventory_items" | "logos" | "order_items" | "package_activations" | "page_revisions" | "post_revisions" | "product_media" | "shipping_zone_locations" | "shipping_zone_methods" | "tax_rates" | "translations" | "user_addresses" | "variant_attribute_mapping" | "product_revisions";
|
|
245
245
|
auditError?: string | undefined;
|
|
246
246
|
affectedCount: number;
|
|
247
247
|
auditLogged: boolean;
|
|
@@ -250,7 +250,7 @@ export declare function createCortexDatabaseAgentTools(context?: ToolExecutionCo
|
|
|
250
250
|
mutationExecuted: boolean;
|
|
251
251
|
operation: "delete" | "update" | "insert" | "upsert";
|
|
252
252
|
success: boolean;
|
|
253
|
-
table: "site_settings" | "languages" | "pages" | "posts" | "products" | "profiles" | "coupons" | "orders" | "freemius_plans" | "media" | "navigation_items" | "product_variants" | "product_attributes" | "shipping_zones" | "product_attribute_terms" | "blocks" | "cortex_ai_db_mutation_audit" | "coupon_freemius_mappings" | "coupon_products" | "coupon_redemptions" | "currencies" | "freemius_pricing" | "inventory_items" | "logos" | "order_items" | "package_activations" | "page_revisions" | "post_revisions" | "product_media" | "shipping_zone_locations" | "shipping_zone_methods" | "tax_rates" | "translations" | "user_addresses" | "variant_attribute_mapping";
|
|
253
|
+
table: "site_settings" | "languages" | "pages" | "posts" | "products" | "profiles" | "coupons" | "orders" | "freemius_plans" | "media" | "navigation_items" | "product_variants" | "product_attributes" | "shipping_zones" | "product_attribute_terms" | "blocks" | "cortex_ai_db_mutation_audit" | "coupon_freemius_mappings" | "coupon_products" | "coupon_redemptions" | "currencies" | "freemius_pricing" | "inventory_items" | "logos" | "order_items" | "package_activations" | "page_revisions" | "post_revisions" | "product_media" | "shipping_zone_locations" | "shipping_zone_methods" | "tax_rates" | "translations" | "user_addresses" | "variant_attribute_mapping" | "product_revisions";
|
|
254
254
|
auditError?: string | undefined;
|
|
255
255
|
auditLogged: boolean;
|
|
256
256
|
}>;
|
|
@@ -274,7 +274,7 @@ export declare function createCortexDatabaseAgentTools(context?: ToolExecutionCo
|
|
|
274
274
|
offset: number;
|
|
275
275
|
rows: unknown[];
|
|
276
276
|
success: boolean;
|
|
277
|
-
table: "site_settings" | "languages" | "pages" | "posts" | "products" | "profiles" | "coupons" | "orders" | "freemius_plans" | "media" | "navigation_items" | "product_variants" | "product_attributes" | "shipping_zones" | "product_attribute_terms" | "blocks" | "cortex_ai_db_mutation_audit" | "coupon_freemius_mappings" | "coupon_products" | "coupon_redemptions" | "currencies" | "freemius_pricing" | "inventory_items" | "logos" | "order_items" | "package_activations" | "page_revisions" | "post_revisions" | "product_media" | "shipping_zone_locations" | "shipping_zone_methods" | "tax_rates" | "translations" | "user_addresses" | "variant_attribute_mapping";
|
|
277
|
+
table: "site_settings" | "languages" | "pages" | "posts" | "products" | "profiles" | "coupons" | "orders" | "freemius_plans" | "media" | "navigation_items" | "product_variants" | "product_attributes" | "shipping_zones" | "product_attribute_terms" | "blocks" | "cortex_ai_db_mutation_audit" | "coupon_freemius_mappings" | "coupon_products" | "coupon_redemptions" | "currencies" | "freemius_pricing" | "inventory_items" | "logos" | "order_items" | "package_activations" | "page_revisions" | "post_revisions" | "product_media" | "shipping_zone_locations" | "shipping_zone_methods" | "tax_rates" | "translations" | "user_addresses" | "variant_attribute_mapping" | "product_revisions";
|
|
278
278
|
}>;
|
|
279
279
|
};
|
|
280
280
|
export {};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { tool as v } from "ai";
|
|
2
2
|
import "./zod-config.es.js";
|
|
3
3
|
import { z as n } from "zod";
|
|
4
|
-
const V = 100, J = 20, C = 100, k = 20, M = "[REDACTED]", g = "cortex_ai_openrouter_api_key",
|
|
4
|
+
const V = 100, J = 20, C = 100, k = 20, M = "[REDACTED]", g = "cortex_ai_openrouter_api_key", O = {
|
|
5
5
|
blocks: {
|
|
6
6
|
columns: ["id", "page_id", "post_id", "language_id", "block_type", "content", "order", "created_at", "updated_at"],
|
|
7
7
|
description: "CMS page/post content blocks.",
|
|
@@ -234,7 +234,11 @@ const V = 100, J = 20, C = 100, k = 20, M = "[REDACTED]", g = "cortex_ai_openrou
|
|
|
234
234
|
page_revisions: {
|
|
235
235
|
columns: ["id", "page_id", "author_id", "version", "revision_type", "content", "created_at"],
|
|
236
236
|
description: "Page revision history.",
|
|
237
|
-
primaryKey: ["id"]
|
|
237
|
+
primaryKey: ["id"],
|
|
238
|
+
// Revision history is an audit trail. The agent may read it, but letting it rewrite or
|
|
239
|
+
// delete rows would let it erase the record of its own edits — and hand-written rows
|
|
240
|
+
// would corrupt the snapshot/diff chain the restore path replays.
|
|
241
|
+
readOnly: !0
|
|
238
242
|
},
|
|
239
243
|
pages: {
|
|
240
244
|
columns: [
|
|
@@ -258,7 +262,16 @@ const V = 100, J = 20, C = 100, k = 20, M = "[REDACTED]", g = "cortex_ai_openrou
|
|
|
258
262
|
post_revisions: {
|
|
259
263
|
columns: ["id", "post_id", "author_id", "version", "revision_type", "content", "created_at"],
|
|
260
264
|
description: "Post revision history.",
|
|
261
|
-
primaryKey: ["id"]
|
|
265
|
+
primaryKey: ["id"],
|
|
266
|
+
// See page_revisions.
|
|
267
|
+
readOnly: !0
|
|
268
|
+
},
|
|
269
|
+
product_revisions: {
|
|
270
|
+
columns: ["id", "product_id", "author_id", "version", "revision_type", "content", "created_at"],
|
|
271
|
+
description: "Product revision history.",
|
|
272
|
+
primaryKey: ["id"],
|
|
273
|
+
// See page_revisions.
|
|
274
|
+
readOnly: !0
|
|
262
275
|
},
|
|
263
276
|
posts: {
|
|
264
277
|
columns: [
|
|
@@ -443,7 +456,7 @@ const V = 100, J = 20, C = 100, k = 20, M = "[REDACTED]", g = "cortex_ai_openrou
|
|
|
443
456
|
offset: n.number().int().min(0).max(1e4).default(0),
|
|
444
457
|
orderBy: G.optional(),
|
|
445
458
|
table: n.string().trim().min(1).max(120)
|
|
446
|
-
}),
|
|
459
|
+
}), j = n.strictObject({
|
|
447
460
|
filters: n.array(P).max(12).optional(),
|
|
448
461
|
operation: n.enum(["delete", "insert", "update", "upsert"]),
|
|
449
462
|
rows: n.array(n.record(n.string(), n.unknown())).min(1).max(k).optional(),
|
|
@@ -451,7 +464,7 @@ const V = 100, J = 20, C = 100, k = 20, M = "[REDACTED]", g = "cortex_ai_openrou
|
|
|
451
464
|
table: n.string().trim().min(1).max(120),
|
|
452
465
|
values: n.record(n.string(), n.unknown()).optional()
|
|
453
466
|
}), N = n.strictObject({
|
|
454
|
-
actions: n.array(
|
|
467
|
+
actions: n.array(j).min(1).max(8),
|
|
455
468
|
summary: n.string().trim().min(1).max(500).optional()
|
|
456
469
|
});
|
|
457
470
|
function E(e) {
|
|
@@ -497,7 +510,7 @@ function q(e) {
|
|
|
497
510
|
} : r.includes(a) ? null : t;
|
|
498
511
|
}
|
|
499
512
|
function H(e) {
|
|
500
|
-
return Object.prototype.hasOwnProperty.call(
|
|
513
|
+
return Object.prototype.hasOwnProperty.call(O, e);
|
|
501
514
|
}
|
|
502
515
|
function T(e) {
|
|
503
516
|
const t = e.trim();
|
|
@@ -508,7 +521,7 @@ function T(e) {
|
|
|
508
521
|
return t;
|
|
509
522
|
}
|
|
510
523
|
function _(e) {
|
|
511
|
-
return
|
|
524
|
+
return O[e];
|
|
512
525
|
}
|
|
513
526
|
function w(e) {
|
|
514
527
|
return /(?:password|token|secret|api[_-]?key|private[_-]?key|credential)/i.test(e);
|
|
@@ -666,7 +679,7 @@ async function ae(e, t, r) {
|
|
|
666
679
|
return Array.isArray(s) ? s : [];
|
|
667
680
|
}
|
|
668
681
|
async function ie(e) {
|
|
669
|
-
const t = R.parse(e), a = (t.table ? [T(t.table)] : Object.keys(
|
|
682
|
+
const t = R.parse(e), a = (t.table ? [T(t.table)] : Object.keys(O)).filter((o) => t.includeReadOnly || !_(o).readOnly).map((o) => {
|
|
670
683
|
const i = _(o);
|
|
671
684
|
return {
|
|
672
685
|
columns: i.columns.filter((s) => !w(s)),
|
|
@@ -705,7 +718,7 @@ async function oe(e, t) {
|
|
|
705
718
|
};
|
|
706
719
|
}
|
|
707
720
|
async function X(e, t) {
|
|
708
|
-
const r =
|
|
721
|
+
const r = j.parse(e), a = U(r), o = E(t), i = r.operation === "update" || r.operation === "delete" ? await F(o, a, r.filters ?? []) : [], s = B({ input: r, table: a, targetRows: i }), d = {
|
|
709
722
|
input: r,
|
|
710
723
|
targetIds: s.targetIds
|
|
711
724
|
}, l = q({
|
|
@@ -855,7 +868,7 @@ function ue(e) {
|
|
|
855
868
|
execute_database_mutation: v({
|
|
856
869
|
description: "Run one typed insert, update, upsert, or delete against an allowed public database table. Mutating: always previews affected rows and requires exact user confirmation before execution. Does not support arbitrary SQL.",
|
|
857
870
|
execute: (t) => X(t, e),
|
|
858
|
-
inputSchema:
|
|
871
|
+
inputSchema: j,
|
|
859
872
|
strict: !0
|
|
860
873
|
}),
|
|
861
874
|
read_database_records: v({
|
|
@@ -872,7 +885,7 @@ export {
|
|
|
872
885
|
ne as executeDatabaseActionPlan,
|
|
873
886
|
N as executeDatabaseActionPlanInputSchema,
|
|
874
887
|
X as executeDatabaseMutation,
|
|
875
|
-
|
|
888
|
+
j as executeDatabaseMutationInputSchema,
|
|
876
889
|
ie as executeDescribeDatabaseSchema,
|
|
877
890
|
oe as executeReadDatabaseRecords,
|
|
878
891
|
D as readDatabaseRecordsInputSchema
|