@smart-cloud/ai-kit-core 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs ADDED
@@ -0,0 +1,7 @@
1
+ "use strict";var W=Object.defineProperty;var Le=Object.getOwnPropertyDescriptor;var Se=Object.getOwnPropertyNames;var Re=Object.prototype.hasOwnProperty;var k=(e,t)=>()=>(e&&(t=e(e=0)),t);var I=(e,t)=>{for(var r in t)W(e,r,{get:t[r],enumerable:!0})},Te=(e,t,r,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Se(t))!Re.call(e,n)&&n!==r&&W(e,n,{get:()=>t[n],enumerable:!(a=Le(t,n))||a.enumerable});return e};var Oe=e=>Te(W({},"__esModule",{value:!0}),e);function L(){return globalThis.WpSuite?.plugins?.aiKit}async function N(e=8e3){let t=L();if(t?.status!=="available"){if(t?.status==="error")throw new Error("AiKit failed");await new Promise((r,a)=>{let n=()=>i(r),o=()=>i(()=>a(new Error("AiKit failed"))),i=l=>{window.removeEventListener("wpsuite:ai-kit:ready",n),window.removeEventListener("wpsuite:ai-kit:error",o),u&&clearTimeout(u),l()};window.addEventListener("wpsuite:ai-kit:ready",n,{once:!0}),window.addEventListener("wpsuite:ai-kit:error",o,{once:!0});let u=e?window.setTimeout(()=>i(()=>a(new Error("AiKit timeout"))),e):0})}}async function Y(e=1e4){await N(e);let r=L()?.features?.store;if(!r)throw new Error("AiKit store is not available");return r}var _=k(()=>{"use strict"});var ee,C,q,$,j,Be,Ke,Ee,Fe,Ie,te,B,re,ne,M=k(()=>{"use strict";ee=require("@smart-cloud/wpsuite-core"),C=require("@wordpress/data"),q=require("aws-amplify/utils");_();typeof WpSuite<"u"?$=WpSuite.siteSettings:$={};j=e=>{let t=e&&typeof e=="object"?e:{},r={};return typeof t.mode=="string"&&(r.mode=t.mode),typeof t.backendTransport=="string"&&(r.backendTransport=t.backendTransport),typeof t.backendApiName=="string"&&(r.backendApiName=t.backendApiName),typeof t.backendBaseUrl=="string"&&(r.backendBaseUrl=t.backendBaseUrl),typeof t.subscriptionType=="string"&&(r.subscriptionType=t.subscriptionType),r},Be=async()=>{let e=L();if(!e)throw new Error("AI-Kit plugin is not available");let t=null;return e.settings.customTranslationsUrl&&(t=await fetch(e.settings.customTranslationsUrl+(e.settings.customTranslationsUrl.includes("?")?"&":"?")+"t="+$.lastUpdate).then(r=>r.ok?r.text():null).then(r=>r?JSON.parse(r):null).catch(()=>null)),t??null},Ke=async()=>{let e=j(await(0,ee.getConfig)("aiKit")),t=await Be();return{config:e,language:void 0,direction:void 0,customTranslations:t}},Ee={setLanguage(e){return!e||e==="system"?q.I18n.setLanguage(""):q.I18n.setLanguage(e),{type:"SET_LANGUAGE",language:e}},setDirection(e){return{type:"SET_DIRECTION",direction:e}}},Fe={getConfig(e){return e.config},getCustomTranslations(e){return e.customTranslations},getLanguage(e){return e.language},getDirection(e){return e.direction},getState(e){return e}},Ie={},te=e=>(0,C.dispatch)(e),B=e=>(0,C.select)(e),re=async()=>{let e=await Ke(),t=(0,C.createReduxStore)("wpsuite/ai-kit",{reducer(r=e,a){switch(a.type){case"SET_LANGUAGE":return{...r,language:a.language};case"SET_DIRECTION":return{...r,direction:a.direction}}return r},actions:Ee,selectors:Fe,resolvers:Ie});return(0,C.register)(t),t},ne=(e,t,r)=>{let a;function n(){let i=B(e).getState(),u=t(i);if(u!==a){let l=a;a=u,r(a,l)}}let o=(0,C.subscribe)(n,e);return n(),o}});var h,G=k(()=>{"use strict";h=class extends Error{constructor(r,a,n){super(r);this.decision=a;this.status=n;this.name="AiBackendError"}}});var v,Me,De,ae=k(()=>{"use strict";v=require("react/jsx-runtime"),Me=e=>(0,v.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 48 48",width:"48",height:"48",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",...e,children:[(0,v.jsx)("path",{d:"M19 27H33"}),(0,v.jsx)("path",{d:"M19 33H33"}),(0,v.jsx)("path",{d:"M8 21L9.5 24L12.5 25.5L9.5 27L8 30L6.5 27L3.5 25.5L6.5 24Z"}),(0,v.jsx)("path",{d:"M36 4L38 8L42 10L38 12L36 16L34 12L30 10L34 8Z"}),(0,v.jsx)("path",{d:"M16 10V40H36V22"}),(0,v.jsx)("path",{d:"M16 10H22"}),(0,v.jsx)("path",{d:"M22 10V23H36"}),(0,v.jsx)("path",{d:"M22 10L36 22"})]}),De=e=>(0,v.jsxs)("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 48 48",width:"48",height:"48",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",...e,children:[(0,v.jsx)("path",{d:"M42 38L34 30H10C7.79086 30 6 28.2091 6 26V8C6 5.79086 7.79086 4 10 4H38C40.2091 4 42 5.79086 42 8V38Z"}),(0,v.jsx)("rect",{x:"14",y:"13",width:"6",height:"6",rx:"1"}),(0,v.jsx)("rect",{x:"28",y:"13",width:"6",height:"6",rx:"1"}),(0,v.jsx)("path",{d:"M16 24H32"})]})});var de={};I(de,{MIN_CHROME_VERSION:()=>ue,checkOnDeviceAvailability:()=>ce,decideCapability:()=>U});async function ie(){let t=await Ue?.plugins?.aiKit?.features.store;return B(t).getConfig()??{}}function se(e){let t=e.backendApiName?.trim()||void 0,r=e.backendBaseUrl?.trim()||void 0;return{transport:e.backendTransport??(r?"fetch":t?"gatey":void 0),backendApiName:t,backendBaseUrl:r}}function ze(e){if(e.mode)return e.mode;let{transport:t}=se(e);return t?"backend-fallback":"local-only"}async function We(){let e=await ie(),{transport:t,backendApiName:r,backendBaseUrl:a}=se(e);if(!t)return{available:!1,reason:"No backend configured"};if(t==="fetch")return a?{available:!0,transport:t,baseUrl:a,reason:"Custom fetch backend"}:{available:!1,reason:"backendBaseUrl is missing"};if(!r)return{available:!1,reason:"backendApiName is missing"};let n=globalThis.WpSuite?.plugins?.gatey;return!n?.availability||await n.availability()!=="available"?{available:!1,reason:"Gatey is not available"}:{available:!0,transport:t,apiName:r,reason:"Gatey backend"}}function S(e){return typeof globalThis[e]<"u"}function le(e){if(!e)return;let t=Number.parseInt(String(e).split(".")[0]??"",10);return Number.isFinite(t)?t:void 0}function D(e,t){return e?.find(r=>r.brand===t)?.version}async function Ne(){let e=navigator?.userAgentData;if(e){try{let r=(await e.getHighEntropyValues?.(["fullVersionList"]))?.fullVersionList;if(Array.isArray(r)&&r.length>0)return r}catch{}if(Array.isArray(e.brands)&&e.brands.length>0)return e.brands}}function _e(e){let t=e.match(/\b(?:Chrome|Chromium)\/(\d{2,3})\b/i);return t?.[1]?le(t[1]):void 0}function qe(){return!!navigator?.brave}async function $e(e){if(typeof navigator>"u")return{allowed:!1,reason:"no-navigator"};if(typeof globalThis.isSecureContext=="boolean"&&!globalThis.isSecureContext)return{allowed:!1,reason:"not-secure-context"};let t=navigator.userAgent??"",r=await Ne(),a=D(r,"Microsoft Edge")??D(r,"Microsoft Edge WebView2"),n=D(r,"Google Chrome")??D(r,"Chromium"),o=!!a||/\bEdg\//i.test(t)||/\bEdgiOS\//i.test(t),i=/\bOPR\//i.test(t),u=/\bVivaldi\//i.test(t),l=/\bSamsungBrowser\//i.test(t),s=/\bFirefox\//i.test(t),d=!/\bChrome\//i.test(t)&&/\bSafari\//i.test(t)&&!/\bChromium\//i.test(t),g=qe()||/\bBrave\//i.test(t);if(o||i||u||l||s||d||g)return{allowed:!1,reason:o?"edge":g?"brave":s?"firefox":d?"safari":i?"opera":u?"vivaldi":l?"samsung":"unsupported-browser"};let y=le(n)??_e(t),p=ue[e];return p?y?y<p?{allowed:!1,reason:`chrome-too-old-${y}-lt-${p}`,chromeMajor:y}:{allowed:!0,reason:"ok",chromeMajor:y}:{allowed:!1,reason:"unknown-chrome-version"}:{allowed:!1,reason:"no-min-version",chromeMajor:y}}async function ce(e,t){try{let r=await $e(e),a=`browser-gate:${r.reason}${r.chromeMajor?` (chrome ${r.chromeMajor})`:""}`;if(!r.allowed)return{available:!1,status:"unavailable",reason:a};switch(e){case"writer":{if(!S("Writer")||!Writer?.availability)return{available:!1,status:"api-not-present",reason:a};let n=await Writer.availability(t);return{available:n!=="unavailable",status:n,reason:a}}case"rewriter":{if(!S("Rewriter")||!Rewriter?.availability)return{available:!1,status:"api-not-present",reason:a};let n=await Rewriter.availability(t);return{available:n!=="unavailable",status:n,reason:a}}case"summarizer":{if(!S("Summarizer")||!Summarizer?.availability)return{available:!1,status:"api-not-present",reason:a};let n=await Summarizer.availability(t);return{available:n!=="unavailable",status:n,reason:a}}case"proofreader":{if(!S("Proofreader")||!Proofreader?.availability)return{available:!1,status:"api-not-present",reason:a};let n=await Proofreader.availability(t);return{available:n!=="unavailable",status:n,reason:a}}case"language-detector":{if(!S("LanguageDetector")||!LanguageDetector?.availability)return{available:!1,status:"api-not-present",reason:a};let n=await LanguageDetector.availability(t);return{available:n!=="unavailable",status:n,reason:a}}case"translator":{if(!S("Translator")||!Translator?.availability)return{available:!1,status:"api-not-present",reason:a};let n=t;if(!n?.sourceLanguage||!n?.targetLanguage)return{available:!1,status:"error",reason:a,error:new Error("Translator.availability requires sourceLanguage/targetLanguage")};let o=await Translator.availability({...n,sourceLanguage:n.sourceLanguage==="auto"?"en":n.sourceLanguage,targetLanguage:n.sourceLanguage==="auto"||n.sourceLanguage===n.targetLanguage?"hu":n.targetLanguage});return{available:o!=="unavailable",status:o,reason:a}}case"prompt":{if(!S("LanguageModel")||!LanguageModel?.availability)return{available:!1,status:"api-not-present",reason:a};let n=await LanguageModel.availability(t);return{available:n!=="unavailable",status:n,reason:a}}default:return{available:!1,status:"unknown-feature",reason:a}}}catch(r){return{available:!1,status:"error",reason:"exception in availability()",error:r}}}async function U(e,t,r){let a=await ie(),n=r||ze(a),o=await We(),i=await ce(e,t),u=i.available,l=o.available,s={feature:e,mode:n,onDeviceAvailable:u,onDeviceStatus:i.status,onDeviceReason:i.reason,backendAvailable:l,backendTransport:o.transport,backendApiName:o.apiName,backendBaseUrl:o.baseUrl,backendReason:o.reason};return n==="local-only"?u?{...s,source:"on-device",reason:`local-only: on-device available (${i.reason??i.status})`}:{...s,source:"none",reason:`local-only: on-device unavailable (${i.reason??i.status})`}:n==="backend-only"?l?{...s,source:"backend",reason:`backend-only: backend available (${o.reason??"n/a"})`}:{...s,source:"none",reason:`backend-only: backend unavailable (${o.reason??"n/a"})`}:u?{...s,source:"on-device",reason:`backend-fallback: using on-device (${i.reason??i.status})`}:l?{...s,source:"backend",reason:`backend-fallback: using backend (${o.reason??"n/a"}; on-device: ${i.reason??i.status})`}:{...s,source:"none",reason:`No on-device AI or backend available (on-device: ${i.reason??i.status}; backend: ${o.reason??"n/a"})`}}var oe,Ue,ue,H=k(()=>{"use strict";oe=require("@smart-cloud/wpsuite-core");M();Ue=(0,oe.getWpSuite)();ue={summarizer:138,translator:138,"language-detector":138,writer:137,rewriter:137,proofreader:141,prompt:138}});var pe={};I(pe,{dispatchBackend:()=>V,withRecaptchaHeaders:()=>K});function je(){return globalThis.WpSuite?.plugins?.aiKit?.settings??{}}async function Ge(e){if(e!=="frontend")return;let t=je();if(!t?.reCaptchaSiteKey)return;let{execute:r}=await(0,ge.getRecaptcha)(t?.useRecaptchaEnterprise||!1);if(typeof r=="function")try{let n=await r(t.reCaptchaSiteKey,{action:"generate"});return typeof n=="string"&&n?n:void 0}catch{return}}async function K(e,t){if(e!=="frontend"||t["X-Recaptcha-Token"]||t["x-recaptcha-token"])return t;let r=await Ge(e);return r?{...t,"X-Recaptcha-Token":r}:t}function O(e,t){try{e?.onStatus?.(t)}catch{}}function He(e){return typeof e=="object"&&e!==null&&(Object.getPrototypeOf(e)===Object.prototype||Object.getPrototypeOf(e)===null)}function Xe(e,t){if(!He(t))return t;let r=Ve[e];if(!r)return t;let a={};for(let n of r)n in t&&(a[n]=t[n]);return a}function Qe(e,t){return(e==="admin"?Je:Ze)[t]}async function V(e,t,r,a,n={}){let o=Qe(t,r),i=Xe(r,a);if(!o)throw new h(`No backend path configured for "${r}" (${t}).`,e);if(e.backendTransport==="fetch"){if(!e.backendBaseUrl)throw new h("backendTransport=fetch but backendBaseUrl is missing.",e);return Ye(e.backendBaseUrl,o,i,n,e,r,t)}if(!e.backendApiName)throw new h("backendTransport=gatey but backendApiName is missing.",e);return et(e.backendApiName,o,i,n,e,r,t)}async function Ye(e,t,r,a,n,o,i){let u=`${e.replace(/\/+$/,"")}${t}`,l={"content-type":"application/json",...a.headers??{}},s=await K(i,l),d=a.query&&Object.keys(a.query).length>0?"?"+new URLSearchParams(Object.entries(a.query).map(([p,w])=>[p,String(w)])).toString():"";O(a,{feature:o,context:i,step:"backend:request",source:"backend"}),O(a,{feature:o,context:i,step:"backend:waiting",source:"backend"});let g=await fetch(u+d,{method:"POST",headers:s,body:JSON.stringify(r??{}),signal:a.signal,credentials:"omit"});if(O(a,{feature:o,context:i,step:"backend:response",source:"backend"}),!g.ok){let p=`HTTP ${g.status}`;try{let w=await g.text();w&&(p=`${p}: ${w.substring(0,400)}`)}catch{}throw new h(`Fetch backend call failed: ${p}`,n,g.status)}return(g.headers.get("content-type")||"").includes("application/json")?await g.json():await g.text()}async function et(e,t,r,a,n,o,i){let l=globalThis.WpSuite?.plugins?.gatey;if(!l?.cognito?.post)throw new h("Gatey backend selected, but Gatey.cognito.post is not available.",n);let s=await K(i,{...a.headers??{}});O(a,{feature:o,context:i,step:"backend:request",source:"backend"}),O(a,{feature:o,context:i,step:"backend:waiting",source:"backend"});let d=l.cognito.post({apiName:e,path:t,options:{body:r,headers:s}});a?.signal?.addEventListener?.("abort",()=>{d.cancel()});let g=await d.response.then(y=>y.body.json());return O(a,{feature:o,context:i,step:"backend:response",source:"backend"}),g}var ge,Ve,Je,Ze,X=k(()=>{"use strict";ge=require("@smart-cloud/wpsuite-core");G();Ve={prompt:["text","context","responseConstraint","sessionId","images","imageUrls","rejected","knowledgeBaseId","disableKB","enableRerank","kb_filters"],writer:["text","outputLanguage","instruction","context","tone","format","length","knowledgeBaseId","disableKB"],rewriter:["text","outputLanguage","instruction","context","tone","format","length"],summarizer:["text","outputLanguage","instruction","context","type","format","length"],translator:["text","sourceLanguage","targetLanguage"],"language-detector":["text","maxCandidates"],proofreader:["text","expectedInputLanguages"]};Je={prompt:"/admin/prompt",writer:"/admin/write",rewriter:"/admin/rewrite",summarizer:"/admin/summarize",translator:"/admin/translate","language-detector":"/admin/detect-language",proofreader:"/admin/proofread"},Ze={prompt:"/frontend/prompt",writer:"/frontend/write",rewriter:"/frontend/rewrite",summarizer:"/frontend/summarize",translator:"/frontend/translate","language-detector":"/frontend/detect-language",proofreader:"/frontend/proofread"}});var Pe={};I(Pe,{detectLanguage:()=>pt,getPromptOptions:()=>he,getProofreadOptions:()=>ve,getRewriteOptions:()=>we,getSummarizeOptions:()=>Ae,getTranslateOptions:()=>Ce,getWriteOptions:()=>ye,prompt:()=>kt,proofread:()=>dt,rewrite:()=>ct,summarize:()=>gt,translate:()=>F,write:()=>lt});function P(){return(fe?.plugins?.aiKit?.settings??{}).defaultOutputLanguage??"en"}function E(e){let t=["en","ja","es"],r=e.toLowerCase();return t.some(a=>r===a.toLowerCase())}function c(e,t,r,a){try{r?.onStatus?.({feature:e,context:t,...a})}catch{}}function z(){return fe?.plugins?.aiKit?.settings?.sharedContext??void 0}function R(e){return e?.context??"admin"}function be(e){let t=e;return{knowledgeBaseId:typeof t.knowledgeBaseId=="string"?t.knowledgeBaseId:void 0,disableKB:typeof t.disableKB=="boolean"?t.disableKB:void 0}}function tt(e){return typeof e=="string"?e:e.map(t=>`${t.role.toUpperCase()}: ${t.content}`).join(`
2
+
3
+ `)}async function rt(e,t,r,a){let n=be(e),o=await Pt(e.images,r,t,a);return{text:tt(e.messages),images:o?.images,imageUrls:o?.imageUrls,context:e.sharedContext,responseConstraint:e.responseConstraint,...n}}function nt(e){let t=be(e);return{text:e.prompt,outputLanguage:e.outputLanguage,instruction:e.context?.trim()?e.context.trim():void 0,context:e.sharedContext,tone:e.tone,format:e.format,length:e.length,...t}}function at(e){return{text:e.text,outputLanguage:e.outputLanguage,instruction:e.context?.trim()?e.context.trim():void 0,context:e.sharedContext,tone:e.tone,format:e.format,length:e.length}}function ot(e){return{text:e.text,outputLanguage:e.outputLanguage,instruction:e.context?.trim()?e.context.trim():void 0,context:e.sharedContext,type:e.type,format:e.format,length:e.length}}function it(e,t,r){return{text:e,sourceLanguage:t,targetLanguage:r}}function st(e,t){let r=t;return{text:e,maxCandidates:typeof r?.maxCandidates=="number"?r.maxCandidates:void 0}}function ut(e){return{text:e.text,expectedInputLanguages:e.expectedInputLanguages}}async function T(e,t,r,a,n,o,i){c(r,e,i,{step:"decide",message:"Deciding capability"});let u=await U(r,a,t);if(c(r,e,i,{step:"decide",source:u.source,message:`Using ${u.source}`}),u.source==="on-device")try{c(r,e,i,{step:"on-device:init",source:"on-device"});let l=await n();return c(r,e,i,{step:"done",source:"on-device"}),l}catch(l){console.error(`Error in on-device ${r}:`,l),c(r,e,i,{step:"error",source:"on-device",message:l.message}),i?.signal?.throwIfAborted()}if(u.mode!=="local-only"&&u.backendAvailable){c(r,e,i,{step:"backend:request",source:"backend"});let l=typeof o=="function"?await o(u):o,s=await V(u,e,r,l,i);return c(r,e,i,{step:"done",source:"backend"}),s}throw new Error(`No capability for "${r}" (${e}). Reason: ${u.reason}`)}function mt(e){let t=Array.isArray(e.images)&&e.images.length>0,r=e.images??[],a=t?r.map(o=>({type:"image",value:o})):[],n;if(typeof e.messages=="string")n=t?[{role:"user",content:[{type:"text",value:e.messages},...a]}]:e.messages;else{let o=e.messages.filter(i=>i.role!=="system").map(i=>({role:i.role==="assistant"?"assistant":"user",content:i.content}));if(t){let i=-1;for(let u=o.length-1;u>=0;u--)if(o[u].role==="user"){i=u;break}if(i===-1)o.push({role:"user",content:[{type:"text",value:""},...a]});else{let u=String(o[i].content??"");o[i]={...o[i],content:[{type:"text",value:u},...a]}}}n=o}return n}function bt(e){return typeof Blob<"u"&&e instanceof Blob}function yt(e){let t=(e??"").toLowerCase();return t.includes("png")?"png":t.includes("webp")?"webp":t.includes("gif")?"gif":t.includes("bmp")?"bmp":"jpg"}function wt(e){let t=(e??"").toLowerCase();return t.includes("png")?"png":t.includes("webp")?"webp":t.includes("gif")?"gif":"jpeg"}async function vt(e){return new Promise((t,r)=>{let a=new FileReader;a.onerror=()=>r(a.error??new Error("FileReader error")),a.onload=()=>t(String(a.result??"")),a.readAsDataURL(e)})}async function At(e){let t=await vt(e),r=t.indexOf(",");return r>=0?t.substring(r+1):t}async function Ct(e,t,r,a,n,o){let i=t==="admin"?"/admin/generate-upload-url":"/frontend/generate-upload-url",u={...o?.headers??{}},l=await K(t,u);if(e.backendTransport==="fetch"){if(!e.backendBaseUrl)throw new Error("backendBaseUrl missing for fetch transport");let p=new URLSearchParams({fileName:r,contentType:a,contentLength:String(n)}).toString(),w=`${e.backendBaseUrl.replace(/\/+$/,"")}${i}?${p}`,A=await fetch(w,{method:"GET",headers:l,signal:o?.signal,credentials:"omit"});if(!A.ok){let Q=await A.text().catch(()=>"");throw new Error(`generate-upload-url failed (fetch): HTTP ${A.status}${Q?": "+Q.substring(0,200):""}`)}let x=await A.json();if(!x?.uploadUrl||!x?.imageKey)throw new Error("generate-upload-url response missing uploadUrl/imageKey");return{uploadUrl:x.uploadUrl,imageKey:x.imageKey}}if(!e.backendApiName)throw new Error("backendApiName missing for gatey transport");let s=globalThis.WpSuite?.plugins?.gatey,d={fileName:r,contentType:a,contentLength:n};if(s?.cognito?.get){let p=await s.cognito.get({apiName:e.backendApiName,path:i,options:{queryParams:Object.keys(d).reduce((A,x)=>(A[x]=String(d[x]),A),{}),headers:l}});o?.signal?.addEventListener?.("abort",()=>{p.cancel()});let w=await p.response.then(A=>A.body.json());if(!w?.uploadUrl||!w?.imageKey)throw new Error("generate-upload-url (gatey get) response missing uploadUrl/imageKey");return{uploadUrl:w.uploadUrl,imageKey:w.imageKey}}if(!s?.cognito?.post)throw new Error("Gatey.cognito.post is not available");let g=s.cognito.post({apiName:e.backendApiName,path:i,options:{body:d,headers:l}});o?.signal?.addEventListener?.("abort",()=>{g.cancel()});let y=await g.response.then(p=>p.body.json());if(!y?.uploadUrl||!y?.imageKey)throw new Error("generate-upload-url (gatey post) response missing uploadUrl/imageKey");return{uploadUrl:y.uploadUrl,imageKey:y.imageKey}}async function ht(e,t,r,a){let n=await fetch(e,{method:"PUT",headers:{"Content-Type":r||"application/octet-stream"},body:t,signal:a?.signal});if(!n.ok){let o=await n.text().catch(()=>"");throw new Error(`S3 upload failed: HTTP ${n.status}${o?": "+o.substring(0,200):""}`)}}async function Pt(e,t,r,a){if(!e||e.length===0)return;let n=[];for(let s of e){if(!bt(s))throw new Error("Backend multimodal prompting currently supports only Blob/File inputs for images.");n.push(s)}let o=n.reduce((s,d)=>s+(d.size||0),0);if(Math.ceil(o*1.37+2048*n.length)<=ft){c("prompt",r,a,{step:"backend:request",source:"backend",message:"Inlining images as base64"});let s=[];for(let d of n)s.push({format:wt(d.type),data:await At(d)});return{images:s}}c("prompt",r,a,{step:"backend:request",source:"backend",message:"Uploading images via signed URL"});let l=[];for(let s=0;s<n.length;s++){let d=n[s],g=d.type||"application/octet-stream",y=d.name||`image_${s}.${yt(g)}`;c("prompt",r,a,{step:"backend:request",source:"backend",message:"Requesting signed URL"});let{uploadUrl:p,imageKey:w}=await Ct(t,r,y,g,d.size||0,a);c("prompt",r,a,{step:"backend:waiting",source:"backend",message:"Uploading"}),await ht(p,d,g,a),l.push(w)}return{imageUrls:l}}var me,fe,ye,lt,we,ct,ve,dt,Ae,gt,pt,Ce,F,ft,he,kt,ke=k(()=>{"use strict";me=require("@smart-cloud/wpsuite-core");X();H();xe();fe=(0,me.getWpSuite)();ye=e=>{let t=e.outputLanguage?e.outputLanguage:P(),r={tone:e.tone,format:e.format,length:e.length,outputLanguage:t};return Promise.resolve(r)},lt=async(e,t)=>{let r=R(t),a=e.sharedContext??z(),n=e.outputLanguage?e.outputLanguage:P(),o=n,i=!1;E(n)||(i=!0,n="en");let u=ye({...e,outputLanguage:n});return T(r,t?.modeOverride,"writer",u,async()=>{if(typeof Writer>"u")throw new Error("Writer API not available in this browser.");c("writer",r,t,{step:"on-device:init",source:"on-device",message:"Creating Writer session"});let l=await Writer.create({...u,sharedContext:a,monitor(s){s.addEventListener("downloadprogress",d=>{let g=d.loaded;c("writer",r,t,{step:"on-device:download",source:"on-device",progress:g,loaded:g})})}});c("writer",r,t,{step:"on-device:ready",source:"on-device"});try{c("writer",r,t,{step:"on-device:run",source:"on-device",message:"Generating text"});let s=await l.write(e.prompt,{context:e.context,signal:t?.signal});return i?{result:(await F({text:s,sourceLanguage:n,targetLanguage:o})).result}:{result:s}}finally{try{l.destroy()}catch(s){console.error("Error destroying writer:",s)}}},nt({...e,sharedContext:a,outputLanguage:o}),t)},we=e=>{let t=e.outputLanguage?e.outputLanguage:P(),r={tone:e.tone,format:e.format,length:e.length,outputLanguage:t};return Promise.resolve(r)},ct=async(e,t)=>{let r=R(t),a=e.sharedContext??z(),n=e.outputLanguage?e.outputLanguage:P(),o=n,i=!1;E(n)||(i=!0,n="en");let u=we({...e,outputLanguage:n});return T(r,t?.modeOverride,"rewriter",u,async()=>{if(typeof Rewriter>"u")throw new Error("Rewriter API not available in this browser.");c("rewriter",r,t,{step:"on-device:init",source:"on-device",message:"Creating Rewriter session"});let l=await Rewriter.create({...u,sharedContext:a,monitor(s){s.addEventListener("downloadprogress",d=>{let g=d.loaded;c("rewriter",r,t,{step:"on-device:download",source:"on-device",progress:g,loaded:g})})}});c("rewriter",r,t,{step:"on-device:ready",source:"on-device"});try{c("rewriter",r,t,{step:"on-device:run",source:"on-device",message:"Rewriting text"});let s=await l.rewrite(e.text,{context:e.context,signal:t?.signal});return i?{result:(await F({text:s,sourceLanguage:n,targetLanguage:o})).result}:{result:s}}finally{try{l.destroy()}catch(s){console.error("Error destroying rewriter:",s)}}},at({...e,sharedContext:a,outputLanguage:o}),t)},ve=()=>Promise.resolve({includeCorrectionTypes:!0,includeCorrectionExplanations:!0}),dt=async(e,t)=>{let r=R(t),a=await ve();return T(r,t?.modeOverride,"proofreader",a,async()=>{if(typeof Proofreader>"u")throw new Error("Proofreader API not available in this browser.");c("proofreader",r,t,{step:"on-device:init",source:"on-device",message:"Creating Proofreader session"});let n=await Proofreader.create({...a,monitor(o){o.addEventListener("downloadprogress",i=>{let u=i.loaded;c("proofreader",r,t,{step:"on-device:download",source:"on-device",progress:u,loaded:u})})}});c("proofreader",r,t,{step:"on-device:ready",source:"on-device"});try{return c("proofreader",r,t,{step:"on-device:run",source:"on-device",message:"Proofreading"}),{result:await n.proofread(e.text,{signal:t?.signal})}}finally{try{n.destroy()}catch(o){console.error("Error destroying proofreader:",o)}}},ut(e),t)},Ae=e=>{let t=e.outputLanguage?e.outputLanguage:P(),r={type:e.type,format:e.format,length:e.length,outputLanguage:t};return Promise.resolve(r)},gt=async(e,t)=>{let r=R(t),a=e.sharedContext??z(),n=e.outputLanguage?e.outputLanguage:P(),o=n,i=!1;E(n)||(i=!0,n="en");let u=await Ae({...e,outputLanguage:n});return T(r,t?.modeOverride,"summarizer",u,async()=>{if(typeof Summarizer>"u")throw new Error("Summarizer API not available in this browser.");c("summarizer",r,t,{step:"on-device:init",source:"on-device",message:"Creating Summarizer session"});let l=await Summarizer.create({...u,sharedContext:a,monitor(s){s.addEventListener("downloadprogress",d=>{let g=d.loaded;c("summarizer",r,t,{step:"on-device:download",source:"on-device",progress:g,loaded:g})})}});c("summarizer",r,t,{step:"on-device:ready",source:"on-device"});try{c("summarizer",r,t,{step:"on-device:run",source:"on-device",message:"Summarizing"});let s=await l.summarize(e.text,{context:e.context,signal:t?.signal});return i?{result:(await F({text:s,sourceLanguage:n,targetLanguage:o})).result}:{result:s}}finally{try{l.destroy()}catch(s){console.error("Error destroying summarizer:",s)}}},ot({...e,sharedContext:a,outputLanguage:o}),t)},pt=async(e,t)=>{let r=R(t);return T(r,t?.modeOverride,"language-detector",void 0,async()=>{if(typeof LanguageDetector>"u")throw new Error("LanguageDetector API not available in this browser.");c("language-detector",r,t,{step:"on-device:init",source:"on-device",message:"Creating LanguageDetector session"});let a=await LanguageDetector.create({monitor(n){n.addEventListener("downloadprogress",o=>{let i=o.loaded;c("language-detector",r,t,{step:"on-device:download",source:"on-device",progress:i,loaded:i})})}});c("language-detector",r,t,{step:"on-device:ready",source:"on-device"});try{return c("language-detector",r,t,{step:"on-device:run",source:"on-device",message:"Detecting language"}),{result:{candidates:(await a.detect(e.text,{signal:t?.signal})).filter(o=>J.find(i=>i.value===o.detectedLanguage))}}}finally{try{a.destroy()}catch(n){console.error("Error destroying language detector:",n)}}},st(e.text,t),t)},Ce=e=>{let t={sourceLanguage:e.sourceLanguage??"auto",targetLanguage:e.targetLanguage??P()??"en"};return Promise.resolve(t)},F=async(e,t)=>{let r=R(t),a=await Ce({...e});return T(r,t?.modeOverride,"translator",a,async()=>{if(typeof Translator>"u")throw new Error("Translator API not available in this browser.");c("translator",r,t,{step:"on-device:init",source:"on-device",message:"Creating Translator session"});let n=await Translator.create({...a,monitor(o){o.addEventListener("downloadprogress",i=>{let u=i.loaded;c("translator",r,t,{step:"on-device:download",source:"on-device",progress:u,loaded:u})})}});c("translator",r,t,{step:"on-device:ready",source:"on-device"});try{c("translator",r,t,{step:"on-device:run",source:"on-device",message:"Translating"});let o=[];return e.text.split(`
4
+ `).forEach(u=>o.push(n.translate(u.trim()))),{result:(await Promise.all(o)).join(`
5
+ `)}}finally{try{n.destroy()}catch(o){console.error("Error destroying translator:",o)}}},it(e.text,e.sourceLanguage,e.targetLanguage),t)};ft=4*1024*1024;he=async e=>{let t=e.outputLanguage?e.outputLanguage:P();return E(t)||(t="en"),{topK:e.topK,temperature:e.temperature,expectedInputs:[{type:"text"},{type:"image"}],expectedOutputs:[{type:"text",languages:[t]}]}},kt=async(e,t)=>{let r=R(t),a=e.sharedContext??z(),n=e.outputLanguage?e.outputLanguage:P(),o=n,i=!1;E(n)||(i=!0,n="en");let u=await he({...e,outputLanguage:n}),l=await U("prompt",u,t?.modeOverride);return T(r,t?.modeOverride,"prompt",u,async()=>{if(typeof LanguageModel>"u")throw new Error("LanguageModel API not available in this browser.");c("prompt",r,t,{step:"on-device:init",source:"on-device",message:"Creating LanguageModel session"});let s=[];if(typeof e.messages!="string"){for(let p of e.messages)p.role==="system"&&p.content.trim()&&s.push(p.content.trim());a&&a.trim()&&s.push("SHARED CONTEXT: "+a.trim())}let d=s.length>0?s.join(`
6
+
7
+ `):void 0,g=d?[{role:"system",content:d}]:void 0,y=await LanguageModel.create({...u,initialPrompts:g,monitor(p){p.addEventListener("downloadprogress",w=>{let A=w.loaded;c("prompt",r,t,{step:"on-device:download",source:"on-device",progress:A,loaded:A})})}});c("prompt",r,t,{step:"on-device:ready",source:"on-device"});try{c("prompt",r,t,{step:"on-device:run",source:"on-device",message:"Generating text"});let p=await y.prompt(mt(e),{signal:t?.signal,responseConstraint:e.responseConstraint});return i?{result:(await F({text:p,sourceLanguage:n,targetLanguage:o})).result}:{result:p}}finally{try{y.destroy()}catch(p){console.error("Error destroying LanguageModel:",p)}}},await rt({...e,sharedContext:a},r,l,t),t)}});var $t={};I($t,{AiKitChatbotIcon:()=>De,AiKitFeatureIcon:()=>Me,BackendError:()=>h,LANGUAGE_OPTIONS:()=>J,TEXT_DOMAIN:()=>m.TEXT_DOMAIN,checkOnDeviceAvailability:()=>St,decideCapability:()=>Lt,detectLanguage:()=>Wt,dispatchBackend:()=>Tt,getAiKitPlugin:()=>L,getMinChromeVersions:()=>xt,getPromptOptions:()=>Nt,getProofreadOptions:()=>Ft,getRewriteOptions:()=>Kt,getStore:()=>Y,getStoreDispatch:()=>te,getStoreSelect:()=>B,getSummarizeOptions:()=>Mt,getTranslateOptions:()=>Ut,getWriteOptions:()=>Ot,initializeAiKit:()=>qt,observeStore:()=>ne,prompt:()=>_t,proofread:()=>It,rewrite:()=>Et,sanitizeAiKitConfig:()=>j,summarize:()=>Dt,translate:()=>zt,waitForAiKitReady:()=>N,write:()=>Bt});module.exports=Oe($t);var m,f,J,Z,xt,Lt,St,Rt,Tt,b,Ot,Bt,Kt,Et,Ft,It,Mt,Dt,Ut,zt,Wt,Nt,_t,qt,xe=k(()=>{m=require("@smart-cloud/wpsuite-core"),f=require("@wordpress/i18n");_();M();M();G();ae();J=[{label:(0,f.__)("Arabic",m.TEXT_DOMAIN),value:"ar"},{label:(0,f.__)("Chinese",m.TEXT_DOMAIN),value:"zh"},{label:(0,f.__)("Dutch",m.TEXT_DOMAIN),value:"nl"},{label:(0,f.__)("English",m.TEXT_DOMAIN),value:"en"},{label:(0,f.__)("French",m.TEXT_DOMAIN),value:"fr"},{label:(0,f.__)("German",m.TEXT_DOMAIN),value:"de"},{label:(0,f.__)("Hebrew",m.TEXT_DOMAIN),value:"he"},{label:(0,f.__)("Hindi",m.TEXT_DOMAIN),value:"hi"},{label:(0,f.__)("Hungarian",m.TEXT_DOMAIN),value:"hu"},{label:(0,f.__)("Indonesian",m.TEXT_DOMAIN),value:"id"},{label:(0,f.__)("Italian",m.TEXT_DOMAIN),value:"it"},{label:(0,f.__)("Japanese",m.TEXT_DOMAIN),value:"ja"},{label:(0,f.__)("Korean",m.TEXT_DOMAIN),value:"ko"},{label:(0,f.__)("Norwegian",m.TEXT_DOMAIN),value:"no"},{label:(0,f.__)("Polish",m.TEXT_DOMAIN),value:"pl"},{label:(0,f.__)("Portuguese",m.TEXT_DOMAIN),value:"pt"},{label:(0,f.__)("Russian",m.TEXT_DOMAIN),value:"ru"},{label:(0,f.__)("Spanish",m.TEXT_DOMAIN),value:"es"},{label:(0,f.__)("Swedish",m.TEXT_DOMAIN),value:"sv"},{label:(0,f.__)("Thai",m.TEXT_DOMAIN),value:"th"},{label:(0,f.__)("Turkish",m.TEXT_DOMAIN),value:"tr"},{label:(0,f.__)("Ukrainian",m.TEXT_DOMAIN),value:"uk"}],Z=Promise.resolve().then(()=>(H(),de)),xt=async()=>(await Z).MIN_CHROME_VERSION,Lt=async(...e)=>(await Z).decideCapability(...e),St=async(...e)=>(await Z).checkOnDeviceAvailability(...e),Rt=Promise.resolve().then(()=>(X(),pe)),Tt=async(...e)=>(await Rt).dispatchBackend(...e),b=Promise.resolve().then(()=>(ke(),Pe)),Ot=async(...e)=>(await b).getWriteOptions(...e),Bt=async(...e)=>(await b).write(...e),Kt=async(...e)=>(await b).getRewriteOptions(...e),Et=async(...e)=>(await b).rewrite(...e),Ft=async(...e)=>(await b).getProofreadOptions(...e),It=async(...e)=>(await b).proofread(...e),Mt=async(...e)=>(await b).getSummarizeOptions(...e),Dt=async(...e)=>(await b).summarize(...e),Ut=async(...e)=>(await b).getTranslateOptions(...e),zt=async(...e)=>(await b).translate(...e),Wt=async(...e)=>(await b).detectLanguage(...e),Nt=async(...e)=>(await b).getPromptOptions(...e),_t=async(...e)=>(await b).prompt(...e),qt=e=>{let t=globalThis.WpSuite,r=L();if(!r)throw console.error("AiKit plugin is not available"),new Error("AiKit plugin is not available");(0,m.attachDefaultPluginRuntime)(r),r.status=r.status??"initializing";let a=re();return r.features={store:a,renderFeature:async n=>await e({...n,store:await a}),write:async(...n)=>{let o=await b,i=n[1]||{};return n[1]={context:"frontend",...i},o.write(...n)},rewrite:async(...n)=>{let o=await b,i=n[1]||{};return n[1]={context:"frontend",...i},o.rewrite(...n)},proofread:async(...n)=>{let o=await b,i=n[1]||{};return n[1]={context:"frontend",...i},o.proofread(...n)},summarize:async(...n)=>{let o=await b,i=n[1]||{};return n[1]={context:"frontend",...i},o.summarize(...n)},translate:async(...n)=>{let o=await b,i=n[1]||{};return n[1]={context:"frontend",...i},o.translate(...n)},detectLanguage:async(...n)=>{let o=await b,i=n[1]||{};return n[1]={context:"frontend",...i},o.detectLanguage(...n)},prompt:async(...n)=>{let o=await b,i=n[1]||{};return n[1]={context:"frontend",...i},o.prompt(...n)}},a.then(()=>{r.status="available",t?.events?.emit("wpsuite:ai-kit:ready",{key:r.key,version:r.version})}).catch(n=>{r.status="error",console.error("AiKit plugin failed to initialize:",n),t?.events?.emit("wpsuite:ai-kit:error",{key:r.key,error:String(n)})}),r}});xe();0&&(module.exports={AiKitChatbotIcon,AiKitFeatureIcon,BackendError,LANGUAGE_OPTIONS,TEXT_DOMAIN,checkOnDeviceAvailability,decideCapability,detectLanguage,dispatchBackend,getAiKitPlugin,getMinChromeVersions,getPromptOptions,getProofreadOptions,getRewriteOptions,getStore,getStoreDispatch,getStoreSelect,getSummarizeOptions,getTranslateOptions,getWriteOptions,initializeAiKit,observeStore,prompt,proofread,rewrite,sanitizeAiKitConfig,summarize,translate,waitForAiKitReady,write});
@@ -0,0 +1,384 @@
1
+ import { SubscriptionType, WpSuitePluginBase } from '@smart-cloud/wpsuite-core';
2
+ export { TEXT_DOMAIN } from '@smart-cloud/wpsuite-core';
3
+ import { StoreDescriptor } from '@wordpress/data';
4
+
5
+ interface AiKitConfig {
6
+ mode?: AiModePreference;
7
+ backendTransport?: BackendTransport;
8
+ backendApiName?: string;
9
+ backendBaseUrl?: string;
10
+ subscriptionType?: SubscriptionType;
11
+ }
12
+ /**
13
+ * Ensures we only keep runtime keys that are part of AiKitConfig.
14
+ *
15
+ * Defensive: upstream getConfig("ai-kit") or persisted site.settings may include
16
+ * additional keys, but the admin UI and core should only operate on AiKitConfig.
17
+ */
18
+ declare const sanitizeAiKitConfig: (input: unknown) => AiKitConfig;
19
+ declare const actions: {
20
+ setLanguage(language: string | undefined | null): {
21
+ type: string;
22
+ language: string | null | undefined;
23
+ };
24
+ setDirection(direction: "ltr" | "rtl" | "auto" | undefined | null): {
25
+ type: string;
26
+ direction: "ltr" | "rtl" | "auto" | null | undefined;
27
+ };
28
+ };
29
+ interface CustomTranslations {
30
+ [key: string]: Record<string, string>;
31
+ }
32
+ interface State {
33
+ config: AiKitConfig | null;
34
+ language: string | undefined | null;
35
+ direction: "ltr" | "rtl" | "auto" | undefined | null;
36
+ customTranslations: CustomTranslations | null;
37
+ }
38
+ type Store = StoreDescriptor;
39
+ type StoreSelectors = {
40
+ getConfig(): AiKitConfig | null;
41
+ getCustomTranslations(): CustomTranslations | null;
42
+ getLanguage(): string | undefined | null;
43
+ getDirection(): "ltr" | "rtl" | "auto" | undefined | null;
44
+ getState(): State;
45
+ };
46
+ type StoreActions = typeof actions;
47
+ declare const getStoreDispatch: (store: Store) => StoreActions;
48
+ declare const getStoreSelect: (store: Store) => StoreSelectors;
49
+ declare const observeStore: (observableStore: Store, selector: (state: State) => boolean | number | string | null | undefined, onChange: (nextValue: boolean | number | string | null | undefined, previousValue: boolean | number | string | null | undefined) => void) => () => void;
50
+
51
+ type ContextKind = "admin" | "frontend";
52
+ type AiModePreference = "local-only" | "backend-fallback" | "backend-only";
53
+ type BuiltInAiFeature = "prompt" | "summarizer" | "writer" | "rewriter" | "proofreader" | "language-detector" | "translator";
54
+ type CapabilitySource = "on-device" | "backend" | "none";
55
+ type BackendTransport = "gatey" | "fetch";
56
+ interface AiKit {
57
+ features: AiKitFeatures;
58
+ settings: AiKitSettings;
59
+ nonce: string;
60
+ restUrl: string;
61
+ view: "settings" | "diagnostics";
62
+ }
63
+ interface AiKitFeatures {
64
+ readonly store: Promise<Store>;
65
+ readonly write: Features["write"];
66
+ readonly rewrite: Features["rewrite"];
67
+ readonly proofread: Features["proofread"];
68
+ readonly summarize: Features["summarize"];
69
+ readonly translate: Features["translate"];
70
+ readonly detectLanguage: Features["detectLanguage"];
71
+ readonly prompt: Features["prompt"];
72
+ readonly renderFeature: (args: AiFeatureArgs) => Promise<AiWorkerHandle>;
73
+ }
74
+ interface AiKitSettings {
75
+ /**
76
+ * Context injected into supported Chrome APIs (Writer/Rewriter/Summarizer) and/or backend.
77
+ */
78
+ sharedContext?: string;
79
+ /**
80
+ * Optional language configuration used to resolve default input/output languages.
81
+ * Keep this lightweight: most users will rely on defaults.
82
+ */
83
+ defaultOutputLanguage?: AiKitLanguageCode;
84
+ /** Optional URL to custom translations JSON file. */
85
+ customTranslationsUrl?: string;
86
+ /**
87
+ * Optional reCAPTCHA Enterprise configuration.
88
+ * Only applied for FRONTEND backend calls ("/frontend/*").
89
+ */
90
+ reCaptchaSiteKey?: string;
91
+ useRecaptchaNet?: boolean;
92
+ useRecaptchaEnterprise?: boolean;
93
+ /** Whether to show "Powered by WPSuite AI-Kit" branding in UIs. */
94
+ enablePoweredBy?: boolean;
95
+ }
96
+ interface DeviceAvailability {
97
+ available: boolean;
98
+ status?: Availability | "api-not-present" | "unknown-feature" | "error";
99
+ reason?: string;
100
+ error?: Error;
101
+ }
102
+ interface CapabilityDecision {
103
+ feature: BuiltInAiFeature;
104
+ source: CapabilitySource;
105
+ mode: AiModePreference;
106
+ onDeviceAvailable: boolean;
107
+ onDeviceStatus?: DeviceAvailability["status"];
108
+ onDeviceReason?: DeviceAvailability["reason"];
109
+ backendAvailable: boolean;
110
+ backendTransport?: BackendTransport;
111
+ backendApiName?: string;
112
+ backendBaseUrl?: string;
113
+ backendReason?: string;
114
+ reason: string;
115
+ }
116
+ interface BackendCallOptions {
117
+ signal?: AbortSignal;
118
+ headers?: Record<string, string>;
119
+ query?: Record<string, string | number | boolean>;
120
+ /**
121
+ * Optional status callback for progress / UI feedback.
122
+ */
123
+ onStatus?: (event: AiKitStatusEvent) => void;
124
+ }
125
+ type AiKitLanguageCode = "ar" | "en" | "zh" | "nl" | "fr" | "de" | "he" | "hi" | "hu" | "id" | "it" | "ja" | "ko" | "no" | "pl" | "pt" | "ru" | "es" | "sv" | "th" | "tr" | "uk";
126
+ type AiKitLanguageRef = "site" | "admin" | "content" | AiKitLanguageCode;
127
+ type AiKitLanguageProfile = "singleSite" | "englishAdminSingleFrontend" | "multilingual" | "custom";
128
+ type OnDeviceUnsupportedLanguageStrategy = "prefer-backend" | "pivot-translate";
129
+ type AiKitStatusStep = "decide" | "on-device:init" | "on-device:download" | "on-device:ready" | "on-device:run" | "backend:request" | "backend:waiting" | "backend:response" | "done" | "error";
130
+ interface AiKitStatusEvent {
131
+ feature: BuiltInAiFeature;
132
+ context: ContextKind;
133
+ step: AiKitStatusStep;
134
+ /** Where the work is happening. */
135
+ source?: CapabilitySource;
136
+ /** 0..1 for progress events (e.g. download). */
137
+ progress?: number;
138
+ loaded?: number;
139
+ total?: number;
140
+ message?: string;
141
+ }
142
+ declare class BackendError extends Error {
143
+ readonly decision?: CapabilityDecision | undefined;
144
+ readonly status?: number | undefined;
145
+ constructor(message: string, decision?: CapabilityDecision | undefined, status?: number | undefined);
146
+ }
147
+ type AiWorkerHandle = {
148
+ container: HTMLDivElement;
149
+ close: () => void;
150
+ unmount: () => void;
151
+ };
152
+ type AiFeatureArgs = AiFeatureProps & {
153
+ target?: string | HTMLElement;
154
+ };
155
+ type AiFeatureMode = "proofread" | "translate" | "write" | "rewrite" | "summarize" | "generatePostMetadata" | "generateImageMetadata";
156
+ type AiWorkerProps = {
157
+ store: Store;
158
+ variation?: "default" | "modal";
159
+ language?: string;
160
+ showOpenButton?: boolean;
161
+ openButtonTitle?: string;
162
+ openButtonIcon?: string;
163
+ showOpenButtonTitle?: boolean;
164
+ showOpenButtonIcon?: boolean;
165
+ direction?: "ltr" | "rtl" | "auto";
166
+ colorMode?: "light" | "dark" | "auto";
167
+ colors?: Record<string, string>;
168
+ primaryColor?: string;
169
+ primaryShade?: {
170
+ light?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
171
+ dark?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
172
+ };
173
+ className?: string;
174
+ styleText?: string;
175
+ title?: string;
176
+ onClose: () => void;
177
+ };
178
+ type AiFeatureProps = AiWorkerProps & {
179
+ mode: AiFeatureMode;
180
+ context?: ContextKind;
181
+ modeOverride?: AiModePreference;
182
+ autoRun?: boolean;
183
+ editable?: boolean;
184
+ acceptButtonTitle?: string;
185
+ showRegenerateOnBackendButton?: boolean;
186
+ optionsDisplay?: "collapse" | "horizontal" | "vertical";
187
+ default?: {
188
+ getText?: () => string;
189
+ text?: string;
190
+ image?: Blob;
191
+ instructions?: string;
192
+ inputLanguage?: AiKitLanguageCode | "auto";
193
+ outputLanguage?: AiKitLanguageCode | "auto";
194
+ tone?: WriterTone | RewriterTone;
195
+ length?: WriterLength | RewriterLength | SummarizerLength;
196
+ type?: SummarizerType;
197
+ outputFormat?: "plain-text" | "markdown" | "html";
198
+ };
199
+ allowOverride?: {
200
+ text?: boolean;
201
+ instructions?: boolean;
202
+ tone?: boolean;
203
+ length?: boolean;
204
+ type?: boolean;
205
+ outputLanguage?: boolean;
206
+ outputFormat?: boolean;
207
+ };
208
+ onAccept?: (result: unknown) => void;
209
+ };
210
+ interface SummarizeArgs {
211
+ text: string;
212
+ context?: string;
213
+ sharedContext?: string;
214
+ type?: SummarizerType;
215
+ format?: SummarizerFormat;
216
+ length?: SummarizerLength;
217
+ outputLanguage?: AiKitLanguageCode;
218
+ }
219
+ interface SummarizeResult {
220
+ result: string;
221
+ }
222
+ interface WriteArgs {
223
+ prompt: string;
224
+ context?: string;
225
+ sharedContext?: string;
226
+ tone?: WriterTone;
227
+ format?: WriterFormat;
228
+ length?: WriterLength;
229
+ outputLanguage?: AiKitLanguageCode;
230
+ }
231
+ interface WriteResult {
232
+ result: string;
233
+ }
234
+ interface RewriteArgs {
235
+ text: string;
236
+ context?: string;
237
+ sharedContext?: string;
238
+ tone?: RewriterTone;
239
+ format?: RewriterFormat;
240
+ length?: RewriterLength;
241
+ outputLanguage?: AiKitLanguageCode;
242
+ }
243
+ interface RewriteResult {
244
+ result: string;
245
+ }
246
+ interface ProofreadArgs {
247
+ text: string;
248
+ expectedInputLanguages?: AiKitLanguageCode[];
249
+ includeCorrectionTypes?: boolean;
250
+ includeCorrectionExplanations?: boolean;
251
+ correctionExplanationLanguage?: AiKitLanguageCode;
252
+ }
253
+ /**
254
+ * ProofreadResult is provided by dom-chromium-ai:
255
+ * interface ProofreadResult { correctedInput: string; corrections: ProofreadCorrection[] }
256
+ */
257
+ interface ProofreadOutput {
258
+ result: ProofreadResult;
259
+ }
260
+ interface DetectLanguageArgs {
261
+ text: string;
262
+ }
263
+ interface DetectLanguageOutput {
264
+ result: {
265
+ candidates: LanguageDetectionResult[];
266
+ };
267
+ }
268
+ interface TranslateArgs {
269
+ text: string;
270
+ sourceLanguage: AiKitLanguageCode;
271
+ targetLanguage: AiKitLanguageCode;
272
+ }
273
+ interface TranslateResult {
274
+ result: string;
275
+ }
276
+ type PromptMessages = string | Array<{
277
+ role: "system" | "user" | "assistant";
278
+ content: string;
279
+ }>;
280
+ /**
281
+ * Visual inputs supported by Chrome Prompt API multimodal prompting.
282
+ * Note: For backend uploads we only handle Blob/File inputs.
283
+ */
284
+ type PromptImageInput = Blob | File | HTMLImageElement | SVGImageElement | HTMLVideoElement | HTMLCanvasElement | OffscreenCanvas | ImageBitmap | VideoFrame | ImageData;
285
+ interface PromptArgs {
286
+ messages: PromptMessages;
287
+ sharedContext?: string;
288
+ outputLanguage?: AiKitLanguageCode;
289
+ /**
290
+ * Optional multimodal images.
291
+ * - On-device: passed as { type: "image", value: ... } parts.
292
+ * - Backend: only Blob/File inputs are handled (inline data URLs or signed upload).
293
+ */
294
+ images?: PromptImageInput[];
295
+ /**
296
+ * Optional response constraint schema.
297
+ */
298
+ responseConstraint?: {
299
+ type: "object";
300
+ properties: Record<string, unknown>;
301
+ required: string[];
302
+ additionalProperties: boolean;
303
+ };
304
+ /**
305
+ * Optional on-device tuning:
306
+ */
307
+ topK?: number;
308
+ temperature?: number;
309
+ }
310
+ interface PromptResult {
311
+ result: string;
312
+ /** Optional language metadata (best-effort). */
313
+ language?: {
314
+ requestedOutputLanguage?: AiKitLanguageCode;
315
+ modelOutputLanguage?: AiKitLanguageCode;
316
+ translated?: boolean;
317
+ strategy?: OnDeviceUnsupportedLanguageStrategy;
318
+ };
319
+ }
320
+ type AnyCreateCoreOptions = LanguageModelCreateCoreOptions | SummarizerCreateCoreOptions | WriterCreateCoreOptions | RewriterCreateCoreOptions | ProofreaderCreateCoreOptions | LanguageDetectorCreateCoreOptions | TranslatorCreateCoreOptions;
321
+ interface Capabilities {
322
+ MIN_CHROME_VERSION?: Partial<Record<BuiltInAiFeature, number>>;
323
+ checkOnDeviceAvailability: (feature: BuiltInAiFeature, availabilityOptions?: AnyCreateCoreOptions) => Promise<DeviceAvailability>;
324
+ decideCapability: (feature: BuiltInAiFeature, availabilityOptions?: AnyCreateCoreOptions, modeOverride?: AiModePreference) => Promise<CapabilityDecision>;
325
+ willUseOnDevice: (feature: BuiltInAiFeature, availabilityOptions?: AnyCreateCoreOptions) => Promise<boolean>;
326
+ willUseBackend: (feature: BuiltInAiFeature, availabilityOptions?: AnyCreateCoreOptions) => Promise<boolean>;
327
+ }
328
+ interface Backend<TResponse> {
329
+ dispatchBackend: (decision: CapabilityDecision, context: ContextKind, feature: BuiltInAiFeature, requestBody: unknown, options: BackendCallOptions) => Promise<TResponse>;
330
+ }
331
+ type FeatureOptions = BackendCallOptions & {
332
+ context?: ContextKind;
333
+ modeOverride?: AiModePreference;
334
+ };
335
+ interface Features {
336
+ getWriteOptions: (args: Partial<WriteArgs>) => Promise<WriterCreateCoreOptions>;
337
+ write: (args: WriteArgs, options?: FeatureOptions) => Promise<WriteResult>;
338
+ getRewriteOptions: (args: Partial<RewriteArgs>) => Promise<RewriterCreateCoreOptions>;
339
+ rewrite: (args: RewriteArgs, options?: FeatureOptions) => Promise<RewriteResult>;
340
+ getProofreadOptions: () => Promise<ProofreaderCreateCoreOptions>;
341
+ proofread: (args: ProofreadArgs, options?: FeatureOptions) => Promise<ProofreadOutput>;
342
+ getSummarizeOptions: (args: Partial<SummarizeArgs>) => Promise<SummarizerCreateCoreOptions>;
343
+ summarize: (args: SummarizeArgs, options?: FeatureOptions) => Promise<SummarizeResult>;
344
+ getTranslateOptions: (args: Partial<TranslateArgs>) => Promise<TranslatorCreateCoreOptions>;
345
+ translate: (args: TranslateArgs, options?: FeatureOptions) => Promise<TranslateResult>;
346
+ detectLanguage: (args: DetectLanguageArgs, options?: FeatureOptions) => Promise<DetectLanguageOutput>;
347
+ getPromptOptions: (args: Partial<PromptArgs>) => Promise<LanguageModelCreateCoreOptions>;
348
+ prompt: (args: PromptArgs, options?: FeatureOptions) => Promise<PromptResult>;
349
+ }
350
+
351
+ type AiKitReadyEvent = "wpsuite:ai-kit:ready";
352
+ type AiKitErrorEvent = "wpsuite:ai-kit:error";
353
+ type AiKitPlugin = WpSuitePluginBase & AiKit;
354
+ declare function getAiKitPlugin(): AiKitPlugin;
355
+ declare function waitForAiKitReady(timeoutMs?: number): Promise<void>;
356
+ declare function getStore(timeoutMs?: number): Promise<Store>;
357
+
358
+ declare const AiKitFeatureIcon: React.FC<React.SVGProps<SVGSVGElement>>;
359
+ declare const AiKitChatbotIcon: React.FC<React.SVGProps<SVGSVGElement>>;
360
+
361
+ declare const LANGUAGE_OPTIONS: {
362
+ label: string;
363
+ value: AiKitLanguageCode;
364
+ }[];
365
+ declare const getMinChromeVersions: () => Promise<Partial<Record<BuiltInAiFeature, number>> | undefined>;
366
+ declare const decideCapability: (...args: Parameters<Capabilities["decideCapability"]>) => Promise<CapabilityDecision>;
367
+ declare const checkOnDeviceAvailability: (...args: Parameters<Capabilities["checkOnDeviceAvailability"]>) => Promise<DeviceAvailability>;
368
+ declare const dispatchBackend: (...args: Parameters<Backend<unknown>["dispatchBackend"]>) => Promise<unknown>;
369
+ declare const getWriteOptions: (...args: Parameters<Features["getWriteOptions"]>) => Promise<WriterCreateCoreOptions>;
370
+ declare const write: (...args: Parameters<Features["write"]>) => Promise<WriteResult>;
371
+ declare const getRewriteOptions: (...args: Parameters<Features["getRewriteOptions"]>) => Promise<RewriterCreateCoreOptions>;
372
+ declare const rewrite: (...args: Parameters<Features["rewrite"]>) => Promise<RewriteResult>;
373
+ declare const getProofreadOptions: (...args: Parameters<Features["getProofreadOptions"]>) => Promise<ProofreaderCreateCoreOptions>;
374
+ declare const proofread: (...args: Parameters<Features["proofread"]>) => Promise<ProofreadOutput>;
375
+ declare const getSummarizeOptions: (...args: Parameters<Features["getSummarizeOptions"]>) => Promise<SummarizerCreateCoreOptions>;
376
+ declare const summarize: (...args: Parameters<Features["summarize"]>) => Promise<SummarizeResult>;
377
+ declare const getTranslateOptions: (...args: Parameters<Features["getTranslateOptions"]>) => Promise<TranslatorCreateCoreOptions>;
378
+ declare const translate: (...args: Parameters<Features["translate"]>) => Promise<TranslateResult>;
379
+ declare const detectLanguage: (...args: Parameters<Features["detectLanguage"]>) => Promise<DetectLanguageOutput>;
380
+ declare const getPromptOptions: (...args: Parameters<Features["getPromptOptions"]>) => Promise<LanguageModelCreateCoreOptions>;
381
+ declare const prompt: (...args: Parameters<Features["prompt"]>) => Promise<PromptResult>;
382
+ declare const initializeAiKit: (renderFeature: (args: AiFeatureArgs) => Promise<AiWorkerHandle>) => AiKitPlugin;
383
+
384
+ export { type AiFeatureArgs, type AiFeatureMode, type AiFeatureProps, type AiKit, AiKitChatbotIcon, type AiKitConfig, type AiKitErrorEvent, AiKitFeatureIcon, type AiKitFeatures, type AiKitLanguageCode, type AiKitLanguageProfile, type AiKitLanguageRef, type AiKitPlugin, type AiKitReadyEvent, type AiKitSettings, type AiKitStatusEvent, type AiKitStatusStep, type AiModePreference, type AiWorkerHandle, type AiWorkerProps, type AnyCreateCoreOptions, type Backend, type BackendCallOptions, BackendError, type BackendTransport, type BuiltInAiFeature, type Capabilities, type CapabilityDecision, type CapabilitySource, type ContextKind, type CustomTranslations, type DetectLanguageArgs, type DetectLanguageOutput, type DeviceAvailability, type FeatureOptions, type Features, LANGUAGE_OPTIONS, type OnDeviceUnsupportedLanguageStrategy, type PromptArgs, type PromptImageInput, type PromptMessages, type PromptResult, type ProofreadArgs, type ProofreadOutput, type RewriteArgs, type RewriteResult, type State, type Store, type SummarizeArgs, type SummarizeResult, type TranslateArgs, type TranslateResult, type WriteArgs, type WriteResult, checkOnDeviceAvailability, decideCapability, detectLanguage, dispatchBackend, getAiKitPlugin, getMinChromeVersions, getPromptOptions, getProofreadOptions, getRewriteOptions, getStore, getStoreDispatch, getStoreSelect, getSummarizeOptions, getTranslateOptions, getWriteOptions, initializeAiKit, observeStore, prompt, proofread, rewrite, sanitizeAiKitConfig, summarize, translate, waitForAiKitReady, write };
@@ -0,0 +1,384 @@
1
+ import { SubscriptionType, WpSuitePluginBase } from '@smart-cloud/wpsuite-core';
2
+ export { TEXT_DOMAIN } from '@smart-cloud/wpsuite-core';
3
+ import { StoreDescriptor } from '@wordpress/data';
4
+
5
+ interface AiKitConfig {
6
+ mode?: AiModePreference;
7
+ backendTransport?: BackendTransport;
8
+ backendApiName?: string;
9
+ backendBaseUrl?: string;
10
+ subscriptionType?: SubscriptionType;
11
+ }
12
+ /**
13
+ * Ensures we only keep runtime keys that are part of AiKitConfig.
14
+ *
15
+ * Defensive: upstream getConfig("ai-kit") or persisted site.settings may include
16
+ * additional keys, but the admin UI and core should only operate on AiKitConfig.
17
+ */
18
+ declare const sanitizeAiKitConfig: (input: unknown) => AiKitConfig;
19
+ declare const actions: {
20
+ setLanguage(language: string | undefined | null): {
21
+ type: string;
22
+ language: string | null | undefined;
23
+ };
24
+ setDirection(direction: "ltr" | "rtl" | "auto" | undefined | null): {
25
+ type: string;
26
+ direction: "ltr" | "rtl" | "auto" | null | undefined;
27
+ };
28
+ };
29
+ interface CustomTranslations {
30
+ [key: string]: Record<string, string>;
31
+ }
32
+ interface State {
33
+ config: AiKitConfig | null;
34
+ language: string | undefined | null;
35
+ direction: "ltr" | "rtl" | "auto" | undefined | null;
36
+ customTranslations: CustomTranslations | null;
37
+ }
38
+ type Store = StoreDescriptor;
39
+ type StoreSelectors = {
40
+ getConfig(): AiKitConfig | null;
41
+ getCustomTranslations(): CustomTranslations | null;
42
+ getLanguage(): string | undefined | null;
43
+ getDirection(): "ltr" | "rtl" | "auto" | undefined | null;
44
+ getState(): State;
45
+ };
46
+ type StoreActions = typeof actions;
47
+ declare const getStoreDispatch: (store: Store) => StoreActions;
48
+ declare const getStoreSelect: (store: Store) => StoreSelectors;
49
+ declare const observeStore: (observableStore: Store, selector: (state: State) => boolean | number | string | null | undefined, onChange: (nextValue: boolean | number | string | null | undefined, previousValue: boolean | number | string | null | undefined) => void) => () => void;
50
+
51
+ type ContextKind = "admin" | "frontend";
52
+ type AiModePreference = "local-only" | "backend-fallback" | "backend-only";
53
+ type BuiltInAiFeature = "prompt" | "summarizer" | "writer" | "rewriter" | "proofreader" | "language-detector" | "translator";
54
+ type CapabilitySource = "on-device" | "backend" | "none";
55
+ type BackendTransport = "gatey" | "fetch";
56
+ interface AiKit {
57
+ features: AiKitFeatures;
58
+ settings: AiKitSettings;
59
+ nonce: string;
60
+ restUrl: string;
61
+ view: "settings" | "diagnostics";
62
+ }
63
+ interface AiKitFeatures {
64
+ readonly store: Promise<Store>;
65
+ readonly write: Features["write"];
66
+ readonly rewrite: Features["rewrite"];
67
+ readonly proofread: Features["proofread"];
68
+ readonly summarize: Features["summarize"];
69
+ readonly translate: Features["translate"];
70
+ readonly detectLanguage: Features["detectLanguage"];
71
+ readonly prompt: Features["prompt"];
72
+ readonly renderFeature: (args: AiFeatureArgs) => Promise<AiWorkerHandle>;
73
+ }
74
+ interface AiKitSettings {
75
+ /**
76
+ * Context injected into supported Chrome APIs (Writer/Rewriter/Summarizer) and/or backend.
77
+ */
78
+ sharedContext?: string;
79
+ /**
80
+ * Optional language configuration used to resolve default input/output languages.
81
+ * Keep this lightweight: most users will rely on defaults.
82
+ */
83
+ defaultOutputLanguage?: AiKitLanguageCode;
84
+ /** Optional URL to custom translations JSON file. */
85
+ customTranslationsUrl?: string;
86
+ /**
87
+ * Optional reCAPTCHA Enterprise configuration.
88
+ * Only applied for FRONTEND backend calls ("/frontend/*").
89
+ */
90
+ reCaptchaSiteKey?: string;
91
+ useRecaptchaNet?: boolean;
92
+ useRecaptchaEnterprise?: boolean;
93
+ /** Whether to show "Powered by WPSuite AI-Kit" branding in UIs. */
94
+ enablePoweredBy?: boolean;
95
+ }
96
+ interface DeviceAvailability {
97
+ available: boolean;
98
+ status?: Availability | "api-not-present" | "unknown-feature" | "error";
99
+ reason?: string;
100
+ error?: Error;
101
+ }
102
+ interface CapabilityDecision {
103
+ feature: BuiltInAiFeature;
104
+ source: CapabilitySource;
105
+ mode: AiModePreference;
106
+ onDeviceAvailable: boolean;
107
+ onDeviceStatus?: DeviceAvailability["status"];
108
+ onDeviceReason?: DeviceAvailability["reason"];
109
+ backendAvailable: boolean;
110
+ backendTransport?: BackendTransport;
111
+ backendApiName?: string;
112
+ backendBaseUrl?: string;
113
+ backendReason?: string;
114
+ reason: string;
115
+ }
116
+ interface BackendCallOptions {
117
+ signal?: AbortSignal;
118
+ headers?: Record<string, string>;
119
+ query?: Record<string, string | number | boolean>;
120
+ /**
121
+ * Optional status callback for progress / UI feedback.
122
+ */
123
+ onStatus?: (event: AiKitStatusEvent) => void;
124
+ }
125
+ type AiKitLanguageCode = "ar" | "en" | "zh" | "nl" | "fr" | "de" | "he" | "hi" | "hu" | "id" | "it" | "ja" | "ko" | "no" | "pl" | "pt" | "ru" | "es" | "sv" | "th" | "tr" | "uk";
126
+ type AiKitLanguageRef = "site" | "admin" | "content" | AiKitLanguageCode;
127
+ type AiKitLanguageProfile = "singleSite" | "englishAdminSingleFrontend" | "multilingual" | "custom";
128
+ type OnDeviceUnsupportedLanguageStrategy = "prefer-backend" | "pivot-translate";
129
+ type AiKitStatusStep = "decide" | "on-device:init" | "on-device:download" | "on-device:ready" | "on-device:run" | "backend:request" | "backend:waiting" | "backend:response" | "done" | "error";
130
+ interface AiKitStatusEvent {
131
+ feature: BuiltInAiFeature;
132
+ context: ContextKind;
133
+ step: AiKitStatusStep;
134
+ /** Where the work is happening. */
135
+ source?: CapabilitySource;
136
+ /** 0..1 for progress events (e.g. download). */
137
+ progress?: number;
138
+ loaded?: number;
139
+ total?: number;
140
+ message?: string;
141
+ }
142
+ declare class BackendError extends Error {
143
+ readonly decision?: CapabilityDecision | undefined;
144
+ readonly status?: number | undefined;
145
+ constructor(message: string, decision?: CapabilityDecision | undefined, status?: number | undefined);
146
+ }
147
+ type AiWorkerHandle = {
148
+ container: HTMLDivElement;
149
+ close: () => void;
150
+ unmount: () => void;
151
+ };
152
+ type AiFeatureArgs = AiFeatureProps & {
153
+ target?: string | HTMLElement;
154
+ };
155
+ type AiFeatureMode = "proofread" | "translate" | "write" | "rewrite" | "summarize" | "generatePostMetadata" | "generateImageMetadata";
156
+ type AiWorkerProps = {
157
+ store: Store;
158
+ variation?: "default" | "modal";
159
+ language?: string;
160
+ showOpenButton?: boolean;
161
+ openButtonTitle?: string;
162
+ openButtonIcon?: string;
163
+ showOpenButtonTitle?: boolean;
164
+ showOpenButtonIcon?: boolean;
165
+ direction?: "ltr" | "rtl" | "auto";
166
+ colorMode?: "light" | "dark" | "auto";
167
+ colors?: Record<string, string>;
168
+ primaryColor?: string;
169
+ primaryShade?: {
170
+ light?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
171
+ dark?: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
172
+ };
173
+ className?: string;
174
+ styleText?: string;
175
+ title?: string;
176
+ onClose: () => void;
177
+ };
178
+ type AiFeatureProps = AiWorkerProps & {
179
+ mode: AiFeatureMode;
180
+ context?: ContextKind;
181
+ modeOverride?: AiModePreference;
182
+ autoRun?: boolean;
183
+ editable?: boolean;
184
+ acceptButtonTitle?: string;
185
+ showRegenerateOnBackendButton?: boolean;
186
+ optionsDisplay?: "collapse" | "horizontal" | "vertical";
187
+ default?: {
188
+ getText?: () => string;
189
+ text?: string;
190
+ image?: Blob;
191
+ instructions?: string;
192
+ inputLanguage?: AiKitLanguageCode | "auto";
193
+ outputLanguage?: AiKitLanguageCode | "auto";
194
+ tone?: WriterTone | RewriterTone;
195
+ length?: WriterLength | RewriterLength | SummarizerLength;
196
+ type?: SummarizerType;
197
+ outputFormat?: "plain-text" | "markdown" | "html";
198
+ };
199
+ allowOverride?: {
200
+ text?: boolean;
201
+ instructions?: boolean;
202
+ tone?: boolean;
203
+ length?: boolean;
204
+ type?: boolean;
205
+ outputLanguage?: boolean;
206
+ outputFormat?: boolean;
207
+ };
208
+ onAccept?: (result: unknown) => void;
209
+ };
210
+ interface SummarizeArgs {
211
+ text: string;
212
+ context?: string;
213
+ sharedContext?: string;
214
+ type?: SummarizerType;
215
+ format?: SummarizerFormat;
216
+ length?: SummarizerLength;
217
+ outputLanguage?: AiKitLanguageCode;
218
+ }
219
+ interface SummarizeResult {
220
+ result: string;
221
+ }
222
+ interface WriteArgs {
223
+ prompt: string;
224
+ context?: string;
225
+ sharedContext?: string;
226
+ tone?: WriterTone;
227
+ format?: WriterFormat;
228
+ length?: WriterLength;
229
+ outputLanguage?: AiKitLanguageCode;
230
+ }
231
+ interface WriteResult {
232
+ result: string;
233
+ }
234
+ interface RewriteArgs {
235
+ text: string;
236
+ context?: string;
237
+ sharedContext?: string;
238
+ tone?: RewriterTone;
239
+ format?: RewriterFormat;
240
+ length?: RewriterLength;
241
+ outputLanguage?: AiKitLanguageCode;
242
+ }
243
+ interface RewriteResult {
244
+ result: string;
245
+ }
246
+ interface ProofreadArgs {
247
+ text: string;
248
+ expectedInputLanguages?: AiKitLanguageCode[];
249
+ includeCorrectionTypes?: boolean;
250
+ includeCorrectionExplanations?: boolean;
251
+ correctionExplanationLanguage?: AiKitLanguageCode;
252
+ }
253
+ /**
254
+ * ProofreadResult is provided by dom-chromium-ai:
255
+ * interface ProofreadResult { correctedInput: string; corrections: ProofreadCorrection[] }
256
+ */
257
+ interface ProofreadOutput {
258
+ result: ProofreadResult;
259
+ }
260
+ interface DetectLanguageArgs {
261
+ text: string;
262
+ }
263
+ interface DetectLanguageOutput {
264
+ result: {
265
+ candidates: LanguageDetectionResult[];
266
+ };
267
+ }
268
+ interface TranslateArgs {
269
+ text: string;
270
+ sourceLanguage: AiKitLanguageCode;
271
+ targetLanguage: AiKitLanguageCode;
272
+ }
273
+ interface TranslateResult {
274
+ result: string;
275
+ }
276
+ type PromptMessages = string | Array<{
277
+ role: "system" | "user" | "assistant";
278
+ content: string;
279
+ }>;
280
+ /**
281
+ * Visual inputs supported by Chrome Prompt API multimodal prompting.
282
+ * Note: For backend uploads we only handle Blob/File inputs.
283
+ */
284
+ type PromptImageInput = Blob | File | HTMLImageElement | SVGImageElement | HTMLVideoElement | HTMLCanvasElement | OffscreenCanvas | ImageBitmap | VideoFrame | ImageData;
285
+ interface PromptArgs {
286
+ messages: PromptMessages;
287
+ sharedContext?: string;
288
+ outputLanguage?: AiKitLanguageCode;
289
+ /**
290
+ * Optional multimodal images.
291
+ * - On-device: passed as { type: "image", value: ... } parts.
292
+ * - Backend: only Blob/File inputs are handled (inline data URLs or signed upload).
293
+ */
294
+ images?: PromptImageInput[];
295
+ /**
296
+ * Optional response constraint schema.
297
+ */
298
+ responseConstraint?: {
299
+ type: "object";
300
+ properties: Record<string, unknown>;
301
+ required: string[];
302
+ additionalProperties: boolean;
303
+ };
304
+ /**
305
+ * Optional on-device tuning:
306
+ */
307
+ topK?: number;
308
+ temperature?: number;
309
+ }
310
+ interface PromptResult {
311
+ result: string;
312
+ /** Optional language metadata (best-effort). */
313
+ language?: {
314
+ requestedOutputLanguage?: AiKitLanguageCode;
315
+ modelOutputLanguage?: AiKitLanguageCode;
316
+ translated?: boolean;
317
+ strategy?: OnDeviceUnsupportedLanguageStrategy;
318
+ };
319
+ }
320
+ type AnyCreateCoreOptions = LanguageModelCreateCoreOptions | SummarizerCreateCoreOptions | WriterCreateCoreOptions | RewriterCreateCoreOptions | ProofreaderCreateCoreOptions | LanguageDetectorCreateCoreOptions | TranslatorCreateCoreOptions;
321
+ interface Capabilities {
322
+ MIN_CHROME_VERSION?: Partial<Record<BuiltInAiFeature, number>>;
323
+ checkOnDeviceAvailability: (feature: BuiltInAiFeature, availabilityOptions?: AnyCreateCoreOptions) => Promise<DeviceAvailability>;
324
+ decideCapability: (feature: BuiltInAiFeature, availabilityOptions?: AnyCreateCoreOptions, modeOverride?: AiModePreference) => Promise<CapabilityDecision>;
325
+ willUseOnDevice: (feature: BuiltInAiFeature, availabilityOptions?: AnyCreateCoreOptions) => Promise<boolean>;
326
+ willUseBackend: (feature: BuiltInAiFeature, availabilityOptions?: AnyCreateCoreOptions) => Promise<boolean>;
327
+ }
328
+ interface Backend<TResponse> {
329
+ dispatchBackend: (decision: CapabilityDecision, context: ContextKind, feature: BuiltInAiFeature, requestBody: unknown, options: BackendCallOptions) => Promise<TResponse>;
330
+ }
331
+ type FeatureOptions = BackendCallOptions & {
332
+ context?: ContextKind;
333
+ modeOverride?: AiModePreference;
334
+ };
335
+ interface Features {
336
+ getWriteOptions: (args: Partial<WriteArgs>) => Promise<WriterCreateCoreOptions>;
337
+ write: (args: WriteArgs, options?: FeatureOptions) => Promise<WriteResult>;
338
+ getRewriteOptions: (args: Partial<RewriteArgs>) => Promise<RewriterCreateCoreOptions>;
339
+ rewrite: (args: RewriteArgs, options?: FeatureOptions) => Promise<RewriteResult>;
340
+ getProofreadOptions: () => Promise<ProofreaderCreateCoreOptions>;
341
+ proofread: (args: ProofreadArgs, options?: FeatureOptions) => Promise<ProofreadOutput>;
342
+ getSummarizeOptions: (args: Partial<SummarizeArgs>) => Promise<SummarizerCreateCoreOptions>;
343
+ summarize: (args: SummarizeArgs, options?: FeatureOptions) => Promise<SummarizeResult>;
344
+ getTranslateOptions: (args: Partial<TranslateArgs>) => Promise<TranslatorCreateCoreOptions>;
345
+ translate: (args: TranslateArgs, options?: FeatureOptions) => Promise<TranslateResult>;
346
+ detectLanguage: (args: DetectLanguageArgs, options?: FeatureOptions) => Promise<DetectLanguageOutput>;
347
+ getPromptOptions: (args: Partial<PromptArgs>) => Promise<LanguageModelCreateCoreOptions>;
348
+ prompt: (args: PromptArgs, options?: FeatureOptions) => Promise<PromptResult>;
349
+ }
350
+
351
+ type AiKitReadyEvent = "wpsuite:ai-kit:ready";
352
+ type AiKitErrorEvent = "wpsuite:ai-kit:error";
353
+ type AiKitPlugin = WpSuitePluginBase & AiKit;
354
+ declare function getAiKitPlugin(): AiKitPlugin;
355
+ declare function waitForAiKitReady(timeoutMs?: number): Promise<void>;
356
+ declare function getStore(timeoutMs?: number): Promise<Store>;
357
+
358
+ declare const AiKitFeatureIcon: React.FC<React.SVGProps<SVGSVGElement>>;
359
+ declare const AiKitChatbotIcon: React.FC<React.SVGProps<SVGSVGElement>>;
360
+
361
+ declare const LANGUAGE_OPTIONS: {
362
+ label: string;
363
+ value: AiKitLanguageCode;
364
+ }[];
365
+ declare const getMinChromeVersions: () => Promise<Partial<Record<BuiltInAiFeature, number>> | undefined>;
366
+ declare const decideCapability: (...args: Parameters<Capabilities["decideCapability"]>) => Promise<CapabilityDecision>;
367
+ declare const checkOnDeviceAvailability: (...args: Parameters<Capabilities["checkOnDeviceAvailability"]>) => Promise<DeviceAvailability>;
368
+ declare const dispatchBackend: (...args: Parameters<Backend<unknown>["dispatchBackend"]>) => Promise<unknown>;
369
+ declare const getWriteOptions: (...args: Parameters<Features["getWriteOptions"]>) => Promise<WriterCreateCoreOptions>;
370
+ declare const write: (...args: Parameters<Features["write"]>) => Promise<WriteResult>;
371
+ declare const getRewriteOptions: (...args: Parameters<Features["getRewriteOptions"]>) => Promise<RewriterCreateCoreOptions>;
372
+ declare const rewrite: (...args: Parameters<Features["rewrite"]>) => Promise<RewriteResult>;
373
+ declare const getProofreadOptions: (...args: Parameters<Features["getProofreadOptions"]>) => Promise<ProofreaderCreateCoreOptions>;
374
+ declare const proofread: (...args: Parameters<Features["proofread"]>) => Promise<ProofreadOutput>;
375
+ declare const getSummarizeOptions: (...args: Parameters<Features["getSummarizeOptions"]>) => Promise<SummarizerCreateCoreOptions>;
376
+ declare const summarize: (...args: Parameters<Features["summarize"]>) => Promise<SummarizeResult>;
377
+ declare const getTranslateOptions: (...args: Parameters<Features["getTranslateOptions"]>) => Promise<TranslatorCreateCoreOptions>;
378
+ declare const translate: (...args: Parameters<Features["translate"]>) => Promise<TranslateResult>;
379
+ declare const detectLanguage: (...args: Parameters<Features["detectLanguage"]>) => Promise<DetectLanguageOutput>;
380
+ declare const getPromptOptions: (...args: Parameters<Features["getPromptOptions"]>) => Promise<LanguageModelCreateCoreOptions>;
381
+ declare const prompt: (...args: Parameters<Features["prompt"]>) => Promise<PromptResult>;
382
+ declare const initializeAiKit: (renderFeature: (args: AiFeatureArgs) => Promise<AiWorkerHandle>) => AiKitPlugin;
383
+
384
+ export { type AiFeatureArgs, type AiFeatureMode, type AiFeatureProps, type AiKit, AiKitChatbotIcon, type AiKitConfig, type AiKitErrorEvent, AiKitFeatureIcon, type AiKitFeatures, type AiKitLanguageCode, type AiKitLanguageProfile, type AiKitLanguageRef, type AiKitPlugin, type AiKitReadyEvent, type AiKitSettings, type AiKitStatusEvent, type AiKitStatusStep, type AiModePreference, type AiWorkerHandle, type AiWorkerProps, type AnyCreateCoreOptions, type Backend, type BackendCallOptions, BackendError, type BackendTransport, type BuiltInAiFeature, type Capabilities, type CapabilityDecision, type CapabilitySource, type ContextKind, type CustomTranslations, type DetectLanguageArgs, type DetectLanguageOutput, type DeviceAvailability, type FeatureOptions, type Features, LANGUAGE_OPTIONS, type OnDeviceUnsupportedLanguageStrategy, type PromptArgs, type PromptImageInput, type PromptMessages, type PromptResult, type ProofreadArgs, type ProofreadOutput, type RewriteArgs, type RewriteResult, type State, type Store, type SummarizeArgs, type SummarizeResult, type TranslateArgs, type TranslateResult, type WriteArgs, type WriteResult, checkOnDeviceAvailability, decideCapability, detectLanguage, dispatchBackend, getAiKitPlugin, getMinChromeVersions, getPromptOptions, getProofreadOptions, getRewriteOptions, getStore, getStoreDispatch, getStoreSelect, getSummarizeOptions, getTranslateOptions, getWriteOptions, initializeAiKit, observeStore, prompt, proofread, rewrite, sanitizeAiKitConfig, summarize, translate, waitForAiKitReady, write };
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ var we=Object.defineProperty;var h=(e,t)=>()=>(e&&(t=e(e=0)),t);var U=(e,t)=>{for(var r in t)we(e,r,{get:t[r],enumerable:!0})};function R(){return globalThis.WpSuite?.plugins?.aiKit}async function H(e=8e3){let t=R();if(t?.status!=="available"){if(t?.status==="error")throw new Error("AiKit failed");await new Promise((r,a)=>{let n=()=>i(r),o=()=>i(()=>a(new Error("AiKit failed"))),i=l=>{window.removeEventListener("wpsuite:ai-kit:ready",n),window.removeEventListener("wpsuite:ai-kit:error",o),u&&clearTimeout(u),l()};window.addEventListener("wpsuite:ai-kit:ready",n,{once:!0}),window.addEventListener("wpsuite:ai-kit:error",o,{once:!0});let u=e?window.setTimeout(()=>i(()=>a(new Error("AiKit timeout"))),e):0})}}async function ve(e=1e4){await H(e);let r=R()?.features?.store;if(!r)throw new Error("AiKit store is not available");return r}var z=h(()=>{"use strict"});import{getConfig as Ae}from"@smart-cloud/wpsuite-core";import{createReduxStore as Ce,dispatch as he,register as Pe,select as ke,subscribe as xe}from"@wordpress/data";import{I18n as V}from"aws-amplify/utils";var W,X,Le,Se,Re,Te,Oe,Be,E,J,Ke,F=h(()=>{"use strict";z();typeof WpSuite<"u"?W=WpSuite.siteSettings:W={};X=e=>{let t=e&&typeof e=="object"?e:{},r={};return typeof t.mode=="string"&&(r.mode=t.mode),typeof t.backendTransport=="string"&&(r.backendTransport=t.backendTransport),typeof t.backendApiName=="string"&&(r.backendApiName=t.backendApiName),typeof t.backendBaseUrl=="string"&&(r.backendBaseUrl=t.backendBaseUrl),typeof t.subscriptionType=="string"&&(r.subscriptionType=t.subscriptionType),r},Le=async()=>{let e=R();if(!e)throw new Error("AI-Kit plugin is not available");let t=null;return e.settings.customTranslationsUrl&&(t=await fetch(e.settings.customTranslationsUrl+(e.settings.customTranslationsUrl.includes("?")?"&":"?")+"t="+W.lastUpdate).then(r=>r.ok?r.text():null).then(r=>r?JSON.parse(r):null).catch(()=>null)),t??null},Se=async()=>{let e=X(await Ae("aiKit")),t=await Le();return{config:e,language:void 0,direction:void 0,customTranslations:t}},Re={setLanguage(e){return!e||e==="system"?V.setLanguage(""):V.setLanguage(e),{type:"SET_LANGUAGE",language:e}},setDirection(e){return{type:"SET_DIRECTION",direction:e}}},Te={getConfig(e){return e.config},getCustomTranslations(e){return e.customTranslations},getLanguage(e){return e.language},getDirection(e){return e.direction},getState(e){return e}},Oe={},Be=e=>he(e),E=e=>ke(e),J=async()=>{let e=await Se(),t=Ce("wpsuite/ai-kit",{reducer(r=e,a){switch(a.type){case"SET_LANGUAGE":return{...r,language:a.language};case"SET_DIRECTION":return{...r,direction:a.direction}}return r},actions:Re,selectors:Te,resolvers:Oe});return Pe(t),t},Ke=(e,t,r)=>{let a;function n(){let i=E(e).getState(),u=t(i);if(u!==a){let l=a;a=u,r(a,l)}}let o=xe(n,e);return n(),o}});var P,N=h(()=>{"use strict";P=class extends Error{constructor(r,a,n){super(r);this.decision=a;this.status=n;this.name="AiBackendError"}}});import{jsx as A,jsxs as Z}from"react/jsx-runtime";var Ft,It,Q=h(()=>{"use strict";Ft=e=>Z("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 48 48",width:"48",height:"48",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",...e,children:[A("path",{d:"M19 27H33"}),A("path",{d:"M19 33H33"}),A("path",{d:"M8 21L9.5 24L12.5 25.5L9.5 27L8 30L6.5 27L3.5 25.5L6.5 24Z"}),A("path",{d:"M36 4L38 8L42 10L38 12L36 16L34 12L30 10L34 8Z"}),A("path",{d:"M16 10V40H36V22"}),A("path",{d:"M16 10H22"}),A("path",{d:"M22 10V23H36"}),A("path",{d:"M22 10L36 22"})]}),It=e=>Z("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 48 48",width:"48",height:"48",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round",...e,children:[A("path",{d:"M42 38L34 30H10C7.79086 30 6 28.2091 6 26V8C6 5.79086 7.79086 4 10 4H38C40.2091 4 42 5.79086 42 8V38Z"}),A("rect",{x:"14",y:"13",width:"6",height:"6",rx:"1"}),A("rect",{x:"28",y:"13",width:"6",height:"6",rx:"1"}),A("path",{d:"M16 24H32"})]})});var ae={};U(ae,{MIN_CHROME_VERSION:()=>te,checkOnDeviceAvailability:()=>ne,decideCapability:()=>M});import{getWpSuite as Ee}from"@smart-cloud/wpsuite-core";async function Y(){let t=await Fe?.plugins?.aiKit?.features.store;return E(t).getConfig()??{}}function ee(e){let t=e.backendApiName?.trim()||void 0,r=e.backendBaseUrl?.trim()||void 0;return{transport:e.backendTransport??(r?"fetch":t?"gatey":void 0),backendApiName:t,backendBaseUrl:r}}function Ie(e){if(e.mode)return e.mode;let{transport:t}=ee(e);return t?"backend-fallback":"local-only"}async function Me(){let e=await Y(),{transport:t,backendApiName:r,backendBaseUrl:a}=ee(e);if(!t)return{available:!1,reason:"No backend configured"};if(t==="fetch")return a?{available:!0,transport:t,baseUrl:a,reason:"Custom fetch backend"}:{available:!1,reason:"backendBaseUrl is missing"};if(!r)return{available:!1,reason:"backendApiName is missing"};let n=globalThis.WpSuite?.plugins?.gatey;return!n?.availability||await n.availability()!=="available"?{available:!1,reason:"Gatey is not available"}:{available:!0,transport:t,apiName:r,reason:"Gatey backend"}}function x(e){return typeof globalThis[e]<"u"}function re(e){if(!e)return;let t=Number.parseInt(String(e).split(".")[0]??"",10);return Number.isFinite(t)?t:void 0}function I(e,t){return e?.find(r=>r.brand===t)?.version}async function De(){let e=navigator?.userAgentData;if(e){try{let r=(await e.getHighEntropyValues?.(["fullVersionList"]))?.fullVersionList;if(Array.isArray(r)&&r.length>0)return r}catch{}if(Array.isArray(e.brands)&&e.brands.length>0)return e.brands}}function Ue(e){let t=e.match(/\b(?:Chrome|Chromium)\/(\d{2,3})\b/i);return t?.[1]?re(t[1]):void 0}function ze(){return!!navigator?.brave}async function We(e){if(typeof navigator>"u")return{allowed:!1,reason:"no-navigator"};if(typeof globalThis.isSecureContext=="boolean"&&!globalThis.isSecureContext)return{allowed:!1,reason:"not-secure-context"};let t=navigator.userAgent??"",r=await De(),a=I(r,"Microsoft Edge")??I(r,"Microsoft Edge WebView2"),n=I(r,"Google Chrome")??I(r,"Chromium"),o=!!a||/\bEdg\//i.test(t)||/\bEdgiOS\//i.test(t),i=/\bOPR\//i.test(t),u=/\bVivaldi\//i.test(t),l=/\bSamsungBrowser\//i.test(t),s=/\bFirefox\//i.test(t),d=!/\bChrome\//i.test(t)&&/\bSafari\//i.test(t)&&!/\bChromium\//i.test(t),g=ze()||/\bBrave\//i.test(t);if(o||i||u||l||s||d||g)return{allowed:!1,reason:o?"edge":g?"brave":s?"firefox":d?"safari":i?"opera":u?"vivaldi":l?"samsung":"unsupported-browser"};let y=re(n)??Ue(t),p=te[e];return p?y?y<p?{allowed:!1,reason:`chrome-too-old-${y}-lt-${p}`,chromeMajor:y}:{allowed:!0,reason:"ok",chromeMajor:y}:{allowed:!1,reason:"unknown-chrome-version"}:{allowed:!1,reason:"no-min-version",chromeMajor:y}}async function ne(e,t){try{let r=await We(e),a=`browser-gate:${r.reason}${r.chromeMajor?` (chrome ${r.chromeMajor})`:""}`;if(!r.allowed)return{available:!1,status:"unavailable",reason:a};switch(e){case"writer":{if(!x("Writer")||!Writer?.availability)return{available:!1,status:"api-not-present",reason:a};let n=await Writer.availability(t);return{available:n!=="unavailable",status:n,reason:a}}case"rewriter":{if(!x("Rewriter")||!Rewriter?.availability)return{available:!1,status:"api-not-present",reason:a};let n=await Rewriter.availability(t);return{available:n!=="unavailable",status:n,reason:a}}case"summarizer":{if(!x("Summarizer")||!Summarizer?.availability)return{available:!1,status:"api-not-present",reason:a};let n=await Summarizer.availability(t);return{available:n!=="unavailable",status:n,reason:a}}case"proofreader":{if(!x("Proofreader")||!Proofreader?.availability)return{available:!1,status:"api-not-present",reason:a};let n=await Proofreader.availability(t);return{available:n!=="unavailable",status:n,reason:a}}case"language-detector":{if(!x("LanguageDetector")||!LanguageDetector?.availability)return{available:!1,status:"api-not-present",reason:a};let n=await LanguageDetector.availability(t);return{available:n!=="unavailable",status:n,reason:a}}case"translator":{if(!x("Translator")||!Translator?.availability)return{available:!1,status:"api-not-present",reason:a};let n=t;if(!n?.sourceLanguage||!n?.targetLanguage)return{available:!1,status:"error",reason:a,error:new Error("Translator.availability requires sourceLanguage/targetLanguage")};let o=await Translator.availability({...n,sourceLanguage:n.sourceLanguage==="auto"?"en":n.sourceLanguage,targetLanguage:n.sourceLanguage==="auto"||n.sourceLanguage===n.targetLanguage?"hu":n.targetLanguage});return{available:o!=="unavailable",status:o,reason:a}}case"prompt":{if(!x("LanguageModel")||!LanguageModel?.availability)return{available:!1,status:"api-not-present",reason:a};let n=await LanguageModel.availability(t);return{available:n!=="unavailable",status:n,reason:a}}default:return{available:!1,status:"unknown-feature",reason:a}}}catch(r){return{available:!1,status:"error",reason:"exception in availability()",error:r}}}async function M(e,t,r){let a=await Y(),n=r||Ie(a),o=await Me(),i=await ne(e,t),u=i.available,l=o.available,s={feature:e,mode:n,onDeviceAvailable:u,onDeviceStatus:i.status,onDeviceReason:i.reason,backendAvailable:l,backendTransport:o.transport,backendApiName:o.apiName,backendBaseUrl:o.baseUrl,backendReason:o.reason};return n==="local-only"?u?{...s,source:"on-device",reason:`local-only: on-device available (${i.reason??i.status})`}:{...s,source:"none",reason:`local-only: on-device unavailable (${i.reason??i.status})`}:n==="backend-only"?l?{...s,source:"backend",reason:`backend-only: backend available (${o.reason??"n/a"})`}:{...s,source:"none",reason:`backend-only: backend unavailable (${o.reason??"n/a"})`}:u?{...s,source:"on-device",reason:`backend-fallback: using on-device (${i.reason??i.status})`}:l?{...s,source:"backend",reason:`backend-fallback: using backend (${o.reason??"n/a"}; on-device: ${i.reason??i.status})`}:{...s,source:"none",reason:`No on-device AI or backend available (on-device: ${i.reason??i.status}; backend: ${o.reason??"n/a"})`}}var Fe,te,_=h(()=>{"use strict";F();Fe=Ee();te={summarizer:138,translator:138,"language-detector":138,writer:137,rewriter:137,proofreader:141,prompt:138}});var oe={};U(oe,{dispatchBackend:()=>q,withRecaptchaHeaders:()=>O});import{getRecaptcha as Ne}from"@smart-cloud/wpsuite-core";function _e(){return globalThis.WpSuite?.plugins?.aiKit?.settings??{}}async function qe(e){if(e!=="frontend")return;let t=_e();if(!t?.reCaptchaSiteKey)return;let{execute:r}=await Ne(t?.useRecaptchaEnterprise||!1);if(typeof r=="function")try{let n=await r(t.reCaptchaSiteKey,{action:"generate"});return typeof n=="string"&&n?n:void 0}catch{return}}async function O(e,t){if(e!=="frontend"||t["X-Recaptcha-Token"]||t["x-recaptcha-token"])return t;let r=await qe(e);return r?{...t,"X-Recaptcha-Token":r}:t}function T(e,t){try{e?.onStatus?.(t)}catch{}}function $e(e){return typeof e=="object"&&e!==null&&(Object.getPrototypeOf(e)===Object.prototype||Object.getPrototypeOf(e)===null)}function Ge(e,t){if(!$e(t))return t;let r=je[e];if(!r)return t;let a={};for(let n of r)n in t&&(a[n]=t[n]);return a}function Xe(e,t){return(e==="admin"?He:Ve)[t]}async function q(e,t,r,a,n={}){let o=Xe(t,r),i=Ge(r,a);if(!o)throw new P(`No backend path configured for "${r}" (${t}).`,e);if(e.backendTransport==="fetch"){if(!e.backendBaseUrl)throw new P("backendTransport=fetch but backendBaseUrl is missing.",e);return Je(e.backendBaseUrl,o,i,n,e,r,t)}if(!e.backendApiName)throw new P("backendTransport=gatey but backendApiName is missing.",e);return Ze(e.backendApiName,o,i,n,e,r,t)}async function Je(e,t,r,a,n,o,i){let u=`${e.replace(/\/+$/,"")}${t}`,l={"content-type":"application/json",...a.headers??{}},s=await O(i,l),d=a.query&&Object.keys(a.query).length>0?"?"+new URLSearchParams(Object.entries(a.query).map(([p,w])=>[p,String(w)])).toString():"";T(a,{feature:o,context:i,step:"backend:request",source:"backend"}),T(a,{feature:o,context:i,step:"backend:waiting",source:"backend"});let g=await fetch(u+d,{method:"POST",headers:s,body:JSON.stringify(r??{}),signal:a.signal,credentials:"omit"});if(T(a,{feature:o,context:i,step:"backend:response",source:"backend"}),!g.ok){let p=`HTTP ${g.status}`;try{let w=await g.text();w&&(p=`${p}: ${w.substring(0,400)}`)}catch{}throw new P(`Fetch backend call failed: ${p}`,n,g.status)}return(g.headers.get("content-type")||"").includes("application/json")?await g.json():await g.text()}async function Ze(e,t,r,a,n,o,i){let l=globalThis.WpSuite?.plugins?.gatey;if(!l?.cognito?.post)throw new P("Gatey backend selected, but Gatey.cognito.post is not available.",n);let s=await O(i,{...a.headers??{}});T(a,{feature:o,context:i,step:"backend:request",source:"backend"}),T(a,{feature:o,context:i,step:"backend:waiting",source:"backend"});let d=l.cognito.post({apiName:e,path:t,options:{body:r,headers:s}});a?.signal?.addEventListener?.("abort",()=>{d.cancel()});let g=await d.response.then(y=>y.body.json());return T(a,{feature:o,context:i,step:"backend:response",source:"backend"}),g}var je,He,Ve,$=h(()=>{"use strict";N();je={prompt:["text","context","responseConstraint","sessionId","images","imageUrls","rejected","knowledgeBaseId","disableKB","enableRerank","kb_filters"],writer:["text","outputLanguage","instruction","context","tone","format","length","knowledgeBaseId","disableKB"],rewriter:["text","outputLanguage","instruction","context","tone","format","length"],summarizer:["text","outputLanguage","instruction","context","type","format","length"],translator:["text","sourceLanguage","targetLanguage"],"language-detector":["text","maxCandidates"],proofreader:["text","expectedInputLanguages"]};He={prompt:"/admin/prompt",writer:"/admin/write",rewriter:"/admin/rewrite",summarizer:"/admin/summarize",translator:"/admin/translate","language-detector":"/admin/detect-language",proofreader:"/admin/proofread"},Ve={prompt:"/frontend/prompt",writer:"/frontend/write",rewriter:"/frontend/rewrite",summarizer:"/frontend/summarize",translator:"/frontend/translate","language-detector":"/frontend/detect-language",proofreader:"/frontend/proofread"}});var me={};U(me,{detectLanguage:()=>dt,getPromptOptions:()=>pe,getProofreadOptions:()=>ce,getRewriteOptions:()=>le,getSummarizeOptions:()=>de,getTranslateOptions:()=>ge,getWriteOptions:()=>ue,prompt:()=>ht,proofread:()=>lt,rewrite:()=>ut,summarize:()=>ct,translate:()=>K,write:()=>st});import{getWpSuite as Qe}from"@smart-cloud/wpsuite-core";function C(){return(ie?.plugins?.aiKit?.settings??{}).defaultOutputLanguage??"en"}function B(e){let t=["en","ja","es"],r=e.toLowerCase();return t.some(a=>r===a.toLowerCase())}function c(e,t,r,a){try{r?.onStatus?.({feature:e,context:t,...a})}catch{}}function D(){return ie?.plugins?.aiKit?.settings?.sharedContext??void 0}function L(e){return e?.context??"admin"}function se(e){let t=e;return{knowledgeBaseId:typeof t.knowledgeBaseId=="string"?t.knowledgeBaseId:void 0,disableKB:typeof t.disableKB=="boolean"?t.disableKB:void 0}}function Ye(e){return typeof e=="string"?e:e.map(t=>`${t.role.toUpperCase()}: ${t.content}`).join(`
2
+
3
+ `)}async function et(e,t,r,a){let n=se(e),o=await Ct(e.images,r,t,a);return{text:Ye(e.messages),images:o?.images,imageUrls:o?.imageUrls,context:e.sharedContext,responseConstraint:e.responseConstraint,...n}}function tt(e){let t=se(e);return{text:e.prompt,outputLanguage:e.outputLanguage,instruction:e.context?.trim()?e.context.trim():void 0,context:e.sharedContext,tone:e.tone,format:e.format,length:e.length,...t}}function rt(e){return{text:e.text,outputLanguage:e.outputLanguage,instruction:e.context?.trim()?e.context.trim():void 0,context:e.sharedContext,tone:e.tone,format:e.format,length:e.length}}function nt(e){return{text:e.text,outputLanguage:e.outputLanguage,instruction:e.context?.trim()?e.context.trim():void 0,context:e.sharedContext,type:e.type,format:e.format,length:e.length}}function at(e,t,r){return{text:e,sourceLanguage:t,targetLanguage:r}}function ot(e,t){let r=t;return{text:e,maxCandidates:typeof r?.maxCandidates=="number"?r.maxCandidates:void 0}}function it(e){return{text:e.text,expectedInputLanguages:e.expectedInputLanguages}}async function S(e,t,r,a,n,o,i){c(r,e,i,{step:"decide",message:"Deciding capability"});let u=await M(r,a,t);if(c(r,e,i,{step:"decide",source:u.source,message:`Using ${u.source}`}),u.source==="on-device")try{c(r,e,i,{step:"on-device:init",source:"on-device"});let l=await n();return c(r,e,i,{step:"done",source:"on-device"}),l}catch(l){console.error(`Error in on-device ${r}:`,l),c(r,e,i,{step:"error",source:"on-device",message:l.message}),i?.signal?.throwIfAborted()}if(u.mode!=="local-only"&&u.backendAvailable){c(r,e,i,{step:"backend:request",source:"backend"});let l=typeof o=="function"?await o(u):o,s=await q(u,e,r,l,i);return c(r,e,i,{step:"done",source:"backend"}),s}throw new Error(`No capability for "${r}" (${e}). Reason: ${u.reason}`)}function gt(e){let t=Array.isArray(e.images)&&e.images.length>0,r=e.images??[],a=t?r.map(o=>({type:"image",value:o})):[],n;if(typeof e.messages=="string")n=t?[{role:"user",content:[{type:"text",value:e.messages},...a]}]:e.messages;else{let o=e.messages.filter(i=>i.role!=="system").map(i=>({role:i.role==="assistant"?"assistant":"user",content:i.content}));if(t){let i=-1;for(let u=o.length-1;u>=0;u--)if(o[u].role==="user"){i=u;break}if(i===-1)o.push({role:"user",content:[{type:"text",value:""},...a]});else{let u=String(o[i].content??"");o[i]={...o[i],content:[{type:"text",value:u},...a]}}}n=o}return n}function mt(e){return typeof Blob<"u"&&e instanceof Blob}function ft(e){let t=(e??"").toLowerCase();return t.includes("png")?"png":t.includes("webp")?"webp":t.includes("gif")?"gif":t.includes("bmp")?"bmp":"jpg"}function bt(e){let t=(e??"").toLowerCase();return t.includes("png")?"png":t.includes("webp")?"webp":t.includes("gif")?"gif":"jpeg"}async function yt(e){return new Promise((t,r)=>{let a=new FileReader;a.onerror=()=>r(a.error??new Error("FileReader error")),a.onload=()=>t(String(a.result??"")),a.readAsDataURL(e)})}async function wt(e){let t=await yt(e),r=t.indexOf(",");return r>=0?t.substring(r+1):t}async function vt(e,t,r,a,n,o){let i=t==="admin"?"/admin/generate-upload-url":"/frontend/generate-upload-url",u={...o?.headers??{}},l=await O(t,u);if(e.backendTransport==="fetch"){if(!e.backendBaseUrl)throw new Error("backendBaseUrl missing for fetch transport");let p=new URLSearchParams({fileName:r,contentType:a,contentLength:String(n)}).toString(),w=`${e.backendBaseUrl.replace(/\/+$/,"")}${i}?${p}`,v=await fetch(w,{method:"GET",headers:l,signal:o?.signal,credentials:"omit"});if(!v.ok){let G=await v.text().catch(()=>"");throw new Error(`generate-upload-url failed (fetch): HTTP ${v.status}${G?": "+G.substring(0,200):""}`)}let k=await v.json();if(!k?.uploadUrl||!k?.imageKey)throw new Error("generate-upload-url response missing uploadUrl/imageKey");return{uploadUrl:k.uploadUrl,imageKey:k.imageKey}}if(!e.backendApiName)throw new Error("backendApiName missing for gatey transport");let s=globalThis.WpSuite?.plugins?.gatey,d={fileName:r,contentType:a,contentLength:n};if(s?.cognito?.get){let p=await s.cognito.get({apiName:e.backendApiName,path:i,options:{queryParams:Object.keys(d).reduce((v,k)=>(v[k]=String(d[k]),v),{}),headers:l}});o?.signal?.addEventListener?.("abort",()=>{p.cancel()});let w=await p.response.then(v=>v.body.json());if(!w?.uploadUrl||!w?.imageKey)throw new Error("generate-upload-url (gatey get) response missing uploadUrl/imageKey");return{uploadUrl:w.uploadUrl,imageKey:w.imageKey}}if(!s?.cognito?.post)throw new Error("Gatey.cognito.post is not available");let g=s.cognito.post({apiName:e.backendApiName,path:i,options:{body:d,headers:l}});o?.signal?.addEventListener?.("abort",()=>{g.cancel()});let y=await g.response.then(p=>p.body.json());if(!y?.uploadUrl||!y?.imageKey)throw new Error("generate-upload-url (gatey post) response missing uploadUrl/imageKey");return{uploadUrl:y.uploadUrl,imageKey:y.imageKey}}async function At(e,t,r,a){let n=await fetch(e,{method:"PUT",headers:{"Content-Type":r||"application/octet-stream"},body:t,signal:a?.signal});if(!n.ok){let o=await n.text().catch(()=>"");throw new Error(`S3 upload failed: HTTP ${n.status}${o?": "+o.substring(0,200):""}`)}}async function Ct(e,t,r,a){if(!e||e.length===0)return;let n=[];for(let s of e){if(!mt(s))throw new Error("Backend multimodal prompting currently supports only Blob/File inputs for images.");n.push(s)}let o=n.reduce((s,d)=>s+(d.size||0),0);if(Math.ceil(o*1.37+2048*n.length)<=pt){c("prompt",r,a,{step:"backend:request",source:"backend",message:"Inlining images as base64"});let s=[];for(let d of n)s.push({format:bt(d.type),data:await wt(d)});return{images:s}}c("prompt",r,a,{step:"backend:request",source:"backend",message:"Uploading images via signed URL"});let l=[];for(let s=0;s<n.length;s++){let d=n[s],g=d.type||"application/octet-stream",y=d.name||`image_${s}.${ft(g)}`;c("prompt",r,a,{step:"backend:request",source:"backend",message:"Requesting signed URL"});let{uploadUrl:p,imageKey:w}=await vt(t,r,y,g,d.size||0,a);c("prompt",r,a,{step:"backend:waiting",source:"backend",message:"Uploading"}),await At(p,d,g,a),l.push(w)}return{imageUrls:l}}var ie,ue,st,le,ut,ce,lt,de,ct,dt,ge,K,pt,pe,ht,fe=h(()=>{"use strict";$();_();ye();ie=Qe();ue=e=>{let t=e.outputLanguage?e.outputLanguage:C(),r={tone:e.tone,format:e.format,length:e.length,outputLanguage:t};return Promise.resolve(r)},st=async(e,t)=>{let r=L(t),a=e.sharedContext??D(),n=e.outputLanguage?e.outputLanguage:C(),o=n,i=!1;B(n)||(i=!0,n="en");let u=ue({...e,outputLanguage:n});return S(r,t?.modeOverride,"writer",u,async()=>{if(typeof Writer>"u")throw new Error("Writer API not available in this browser.");c("writer",r,t,{step:"on-device:init",source:"on-device",message:"Creating Writer session"});let l=await Writer.create({...u,sharedContext:a,monitor(s){s.addEventListener("downloadprogress",d=>{let g=d.loaded;c("writer",r,t,{step:"on-device:download",source:"on-device",progress:g,loaded:g})})}});c("writer",r,t,{step:"on-device:ready",source:"on-device"});try{c("writer",r,t,{step:"on-device:run",source:"on-device",message:"Generating text"});let s=await l.write(e.prompt,{context:e.context,signal:t?.signal});return i?{result:(await K({text:s,sourceLanguage:n,targetLanguage:o})).result}:{result:s}}finally{try{l.destroy()}catch(s){console.error("Error destroying writer:",s)}}},tt({...e,sharedContext:a,outputLanguage:o}),t)},le=e=>{let t=e.outputLanguage?e.outputLanguage:C(),r={tone:e.tone,format:e.format,length:e.length,outputLanguage:t};return Promise.resolve(r)},ut=async(e,t)=>{let r=L(t),a=e.sharedContext??D(),n=e.outputLanguage?e.outputLanguage:C(),o=n,i=!1;B(n)||(i=!0,n="en");let u=le({...e,outputLanguage:n});return S(r,t?.modeOverride,"rewriter",u,async()=>{if(typeof Rewriter>"u")throw new Error("Rewriter API not available in this browser.");c("rewriter",r,t,{step:"on-device:init",source:"on-device",message:"Creating Rewriter session"});let l=await Rewriter.create({...u,sharedContext:a,monitor(s){s.addEventListener("downloadprogress",d=>{let g=d.loaded;c("rewriter",r,t,{step:"on-device:download",source:"on-device",progress:g,loaded:g})})}});c("rewriter",r,t,{step:"on-device:ready",source:"on-device"});try{c("rewriter",r,t,{step:"on-device:run",source:"on-device",message:"Rewriting text"});let s=await l.rewrite(e.text,{context:e.context,signal:t?.signal});return i?{result:(await K({text:s,sourceLanguage:n,targetLanguage:o})).result}:{result:s}}finally{try{l.destroy()}catch(s){console.error("Error destroying rewriter:",s)}}},rt({...e,sharedContext:a,outputLanguage:o}),t)},ce=()=>Promise.resolve({includeCorrectionTypes:!0,includeCorrectionExplanations:!0}),lt=async(e,t)=>{let r=L(t),a=await ce();return S(r,t?.modeOverride,"proofreader",a,async()=>{if(typeof Proofreader>"u")throw new Error("Proofreader API not available in this browser.");c("proofreader",r,t,{step:"on-device:init",source:"on-device",message:"Creating Proofreader session"});let n=await Proofreader.create({...a,monitor(o){o.addEventListener("downloadprogress",i=>{let u=i.loaded;c("proofreader",r,t,{step:"on-device:download",source:"on-device",progress:u,loaded:u})})}});c("proofreader",r,t,{step:"on-device:ready",source:"on-device"});try{return c("proofreader",r,t,{step:"on-device:run",source:"on-device",message:"Proofreading"}),{result:await n.proofread(e.text,{signal:t?.signal})}}finally{try{n.destroy()}catch(o){console.error("Error destroying proofreader:",o)}}},it(e),t)},de=e=>{let t=e.outputLanguage?e.outputLanguage:C(),r={type:e.type,format:e.format,length:e.length,outputLanguage:t};return Promise.resolve(r)},ct=async(e,t)=>{let r=L(t),a=e.sharedContext??D(),n=e.outputLanguage?e.outputLanguage:C(),o=n,i=!1;B(n)||(i=!0,n="en");let u=await de({...e,outputLanguage:n});return S(r,t?.modeOverride,"summarizer",u,async()=>{if(typeof Summarizer>"u")throw new Error("Summarizer API not available in this browser.");c("summarizer",r,t,{step:"on-device:init",source:"on-device",message:"Creating Summarizer session"});let l=await Summarizer.create({...u,sharedContext:a,monitor(s){s.addEventListener("downloadprogress",d=>{let g=d.loaded;c("summarizer",r,t,{step:"on-device:download",source:"on-device",progress:g,loaded:g})})}});c("summarizer",r,t,{step:"on-device:ready",source:"on-device"});try{c("summarizer",r,t,{step:"on-device:run",source:"on-device",message:"Summarizing"});let s=await l.summarize(e.text,{context:e.context,signal:t?.signal});return i?{result:(await K({text:s,sourceLanguage:n,targetLanguage:o})).result}:{result:s}}finally{try{l.destroy()}catch(s){console.error("Error destroying summarizer:",s)}}},nt({...e,sharedContext:a,outputLanguage:o}),t)},dt=async(e,t)=>{let r=L(t);return S(r,t?.modeOverride,"language-detector",void 0,async()=>{if(typeof LanguageDetector>"u")throw new Error("LanguageDetector API not available in this browser.");c("language-detector",r,t,{step:"on-device:init",source:"on-device",message:"Creating LanguageDetector session"});let a=await LanguageDetector.create({monitor(n){n.addEventListener("downloadprogress",o=>{let i=o.loaded;c("language-detector",r,t,{step:"on-device:download",source:"on-device",progress:i,loaded:i})})}});c("language-detector",r,t,{step:"on-device:ready",source:"on-device"});try{return c("language-detector",r,t,{step:"on-device:run",source:"on-device",message:"Detecting language"}),{result:{candidates:(await a.detect(e.text,{signal:t?.signal})).filter(o=>be.find(i=>i.value===o.detectedLanguage))}}}finally{try{a.destroy()}catch(n){console.error("Error destroying language detector:",n)}}},ot(e.text,t),t)},ge=e=>{let t={sourceLanguage:e.sourceLanguage??"auto",targetLanguage:e.targetLanguage??C()??"en"};return Promise.resolve(t)},K=async(e,t)=>{let r=L(t),a=await ge({...e});return S(r,t?.modeOverride,"translator",a,async()=>{if(typeof Translator>"u")throw new Error("Translator API not available in this browser.");c("translator",r,t,{step:"on-device:init",source:"on-device",message:"Creating Translator session"});let n=await Translator.create({...a,monitor(o){o.addEventListener("downloadprogress",i=>{let u=i.loaded;c("translator",r,t,{step:"on-device:download",source:"on-device",progress:u,loaded:u})})}});c("translator",r,t,{step:"on-device:ready",source:"on-device"});try{c("translator",r,t,{step:"on-device:run",source:"on-device",message:"Translating"});let o=[];return e.text.split(`
4
+ `).forEach(u=>o.push(n.translate(u.trim()))),{result:(await Promise.all(o)).join(`
5
+ `)}}finally{try{n.destroy()}catch(o){console.error("Error destroying translator:",o)}}},at(e.text,e.sourceLanguage,e.targetLanguage),t)};pt=4*1024*1024;pe=async e=>{let t=e.outputLanguage?e.outputLanguage:C();return B(t)||(t="en"),{topK:e.topK,temperature:e.temperature,expectedInputs:[{type:"text"},{type:"image"}],expectedOutputs:[{type:"text",languages:[t]}]}},ht=async(e,t)=>{let r=L(t),a=e.sharedContext??D(),n=e.outputLanguage?e.outputLanguage:C(),o=n,i=!1;B(n)||(i=!0,n="en");let u=await pe({...e,outputLanguage:n}),l=await M("prompt",u,t?.modeOverride);return S(r,t?.modeOverride,"prompt",u,async()=>{if(typeof LanguageModel>"u")throw new Error("LanguageModel API not available in this browser.");c("prompt",r,t,{step:"on-device:init",source:"on-device",message:"Creating LanguageModel session"});let s=[];if(typeof e.messages!="string"){for(let p of e.messages)p.role==="system"&&p.content.trim()&&s.push(p.content.trim());a&&a.trim()&&s.push("SHARED CONTEXT: "+a.trim())}let d=s.length>0?s.join(`
6
+
7
+ `):void 0,g=d?[{role:"system",content:d}]:void 0,y=await LanguageModel.create({...u,initialPrompts:g,monitor(p){p.addEventListener("downloadprogress",w=>{let v=w.loaded;c("prompt",r,t,{step:"on-device:download",source:"on-device",progress:v,loaded:v})})}});c("prompt",r,t,{step:"on-device:ready",source:"on-device"});try{c("prompt",r,t,{step:"on-device:run",source:"on-device",message:"Generating text"});let p=await y.prompt(gt(e),{signal:t?.signal,responseConstraint:e.responseConstraint});return i?{result:(await K({text:p,sourceLanguage:n,targetLanguage:o})).result}:{result:p}}finally{try{y.destroy()}catch(p){console.error("Error destroying LanguageModel:",p)}}},await et({...e,sharedContext:a},r,l,t),t)}});import{attachDefaultPluginRuntime as Pt,TEXT_DOMAIN as m}from"@smart-cloud/wpsuite-core";import{__ as f}from"@wordpress/i18n";var be,j,Jt,Zt,Qt,kt,Yt,b,er,tr,rr,nr,ar,or,ir,sr,ur,lr,cr,dr,gr,pr,ye=h(()=>{z();F();F();N();Q();be=[{label:f("Arabic",m),value:"ar"},{label:f("Chinese",m),value:"zh"},{label:f("Dutch",m),value:"nl"},{label:f("English",m),value:"en"},{label:f("French",m),value:"fr"},{label:f("German",m),value:"de"},{label:f("Hebrew",m),value:"he"},{label:f("Hindi",m),value:"hi"},{label:f("Hungarian",m),value:"hu"},{label:f("Indonesian",m),value:"id"},{label:f("Italian",m),value:"it"},{label:f("Japanese",m),value:"ja"},{label:f("Korean",m),value:"ko"},{label:f("Norwegian",m),value:"no"},{label:f("Polish",m),value:"pl"},{label:f("Portuguese",m),value:"pt"},{label:f("Russian",m),value:"ru"},{label:f("Spanish",m),value:"es"},{label:f("Swedish",m),value:"sv"},{label:f("Thai",m),value:"th"},{label:f("Turkish",m),value:"tr"},{label:f("Ukrainian",m),value:"uk"}],j=Promise.resolve().then(()=>(_(),ae)),Jt=async()=>(await j).MIN_CHROME_VERSION,Zt=async(...e)=>(await j).decideCapability(...e),Qt=async(...e)=>(await j).checkOnDeviceAvailability(...e),kt=Promise.resolve().then(()=>($(),oe)),Yt=async(...e)=>(await kt).dispatchBackend(...e),b=Promise.resolve().then(()=>(fe(),me)),er=async(...e)=>(await b).getWriteOptions(...e),tr=async(...e)=>(await b).write(...e),rr=async(...e)=>(await b).getRewriteOptions(...e),nr=async(...e)=>(await b).rewrite(...e),ar=async(...e)=>(await b).getProofreadOptions(...e),or=async(...e)=>(await b).proofread(...e),ir=async(...e)=>(await b).getSummarizeOptions(...e),sr=async(...e)=>(await b).summarize(...e),ur=async(...e)=>(await b).getTranslateOptions(...e),lr=async(...e)=>(await b).translate(...e),cr=async(...e)=>(await b).detectLanguage(...e),dr=async(...e)=>(await b).getPromptOptions(...e),gr=async(...e)=>(await b).prompt(...e),pr=e=>{let t=globalThis.WpSuite,r=R();if(!r)throw console.error("AiKit plugin is not available"),new Error("AiKit plugin is not available");Pt(r),r.status=r.status??"initializing";let a=J();return r.features={store:a,renderFeature:async n=>await e({...n,store:await a}),write:async(...n)=>{let o=await b,i=n[1]||{};return n[1]={context:"frontend",...i},o.write(...n)},rewrite:async(...n)=>{let o=await b,i=n[1]||{};return n[1]={context:"frontend",...i},o.rewrite(...n)},proofread:async(...n)=>{let o=await b,i=n[1]||{};return n[1]={context:"frontend",...i},o.proofread(...n)},summarize:async(...n)=>{let o=await b,i=n[1]||{};return n[1]={context:"frontend",...i},o.summarize(...n)},translate:async(...n)=>{let o=await b,i=n[1]||{};return n[1]={context:"frontend",...i},o.translate(...n)},detectLanguage:async(...n)=>{let o=await b,i=n[1]||{};return n[1]={context:"frontend",...i},o.detectLanguage(...n)},prompt:async(...n)=>{let o=await b,i=n[1]||{};return n[1]={context:"frontend",...i},o.prompt(...n)}},a.then(()=>{r.status="available",t?.events?.emit("wpsuite:ai-kit:ready",{key:r.key,version:r.version})}).catch(n=>{r.status="error",console.error("AiKit plugin failed to initialize:",n),t?.events?.emit("wpsuite:ai-kit:error",{key:r.key,error:String(n)})}),r}});ye();export{It as AiKitChatbotIcon,Ft as AiKitFeatureIcon,P as BackendError,be as LANGUAGE_OPTIONS,m as TEXT_DOMAIN,Qt as checkOnDeviceAvailability,Zt as decideCapability,cr as detectLanguage,Yt as dispatchBackend,R as getAiKitPlugin,Jt as getMinChromeVersions,dr as getPromptOptions,ar as getProofreadOptions,rr as getRewriteOptions,ve as getStore,Be as getStoreDispatch,E as getStoreSelect,ir as getSummarizeOptions,ur as getTranslateOptions,er as getWriteOptions,pr as initializeAiKit,Ke as observeStore,gr as prompt,or as proofread,nr as rewrite,X as sanitizeAiKitConfig,sr as summarize,lr as translate,H as waitForAiKitReady,tr as write};
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@smart-cloud/ai-kit-core",
3
+ "version": "1.0.0",
4
+ "description": "AI Kit Core Package",
5
+ "author": "Smart Cloud Solutions Inc.",
6
+ "license": "MIT",
7
+ "main": "./dist/index.cjs",
8
+ "module": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "type": "module",
11
+ "files": [
12
+ "dist"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsup --minify",
16
+ "lint": "eslint 'src/**/*.ts' --report-unused-disable-directives --max-warnings 0",
17
+ "test": "echo \"Error: no test specified\" && exit 1",
18
+ "publish": "WPSUITE_PREMIUM=true tsup --minify && npm publish --access=public"
19
+ },
20
+ "publishConfig": {
21
+ "registry": "https://registry.npmjs.org/",
22
+ "scope": "@smart-cloud/ai-kit-core"
23
+ },
24
+ "dependencies": {
25
+ "@smart-cloud/gatey-core": "^2.0.11",
26
+ "@smart-cloud/wpsuite-core": "^2.0.5",
27
+ "aws-amplify": "^6.15.9"
28
+ },
29
+ "peerDependencies": {
30
+ "@wordpress/data": "^10.37.0",
31
+ "@wordpress/i18n": "^6.10.0",
32
+ "react": "^18.3.1"
33
+ },
34
+ "devDependencies": {
35
+ "@eslint/js": "^9.39.2",
36
+ "@types/dom-chromium-ai": "^0.0.13",
37
+ "@types/node": "^25.0.6",
38
+ "@typescript-eslint/eslint-plugin": "^8.52.0",
39
+ "@typescript-eslint/parser": "^8.52.0",
40
+ "@wordpress/data": "^10.37.0",
41
+ "@wordpress/i18n": "^6.10.0",
42
+ "eslint": "^9.39.2",
43
+ "globals": "^17.0.0",
44
+ "react": "^18.3.1",
45
+ "tsup": "^8.5.1",
46
+ "typescript": "^5.9.3",
47
+ "typescript-eslint": "^8.52.0"
48
+ }
49
+ }