@rushdb/javascript-sdk 3.2.0 → 3.3.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.
@@ -1,6 +1,6 @@
1
- var k=class e{makeRequest(t,{headers:r,method:n,protocol:s,requestData:a,timeout:i}){throw new Error("makeRequest not implemented.")}static makeTimeoutError(){let t=new TypeError(e.TIMEOUT_ERROR_CODE);return t.code=e.TIMEOUT_ERROR_CODE,t}};k.CONNECTION_CLOSED_ERROR_CODES=["ECONNRESET","EPIPE"];k.TIMEOUT_ERROR_CODE="ETIMEDOUT";var W=class{constructor(t,r){this._statusCode=t,this._headers=r}getStatusCode(){return this._statusCode}getHeaders(){return this._headers}getRawResponse(){throw new Error("getRawResponse not implemented.")}toStream(t){throw new Error("toStream not implemented.")}toJSON(){throw new Error("toJSON not implemented.")}},oe=class{constructor(t){this._res=t}getStatusCode(){throw new Error("getStatusCode not implemented.")}getHeaders(){throw new Error("getHeaders not implemented.")}getRawResponse(){throw new Error("getRawResponse not implemented.")}toStream(t){throw new Error("toStream not implemented.")}toJSON(){throw new Error("toJSON not implemented.")}};import*as ce from"http";import*as de from"https";var ot="string",it="datetime",ct="boolean",dt="number",be=[ot,it,ct,dt];var Ie=ce.default||ce,Pe=de.default||de,pt=new Ie.Agent({keepAlive:!0}),lt=new Pe.Agent({keepAlive:!0}),Y=class extends k{constructor(t){super(),this._agent=t}makeRequest(t,{headers:r,method:n,protocol:s,requestData:a,timeout:i}){let o=new URL(t),c=s==="http"||o.protocol==="http:",p=this._agent;return p||(p=c?pt:lt),new Promise((h,d)=>{let l=(c?Ie:Pe).request({agent:p,ciphers:"DEFAULT:!aNULL:!eNULL:!LOW:!EXPORT:!SSLv2:!MD5",headers:r,host:o.hostname,method:n,path:o.pathname+o.search,port:o.port});l.setTimeout(i??8e4,()=>{l.destroy(k.makeTimeoutError())}),l.on("response",u=>{h(new ie(u))}),l.on("error",u=>{d(u)}),l.once("socket",u=>{let E=a?JSON.stringify(a):"";u.connecting?u.once(c?"connect":"secureConnect",()=>{l.write(E),l.end()}):(l.write(E),l.end())})})}},ie=class extends W{constructor(t){super(t.statusCode,t.headers||{}),this._res=t}getRawResponse(){return this._res}toStream(t){return this._res.once("end",()=>t()),this._res}toJSON(){return new Promise((t,r)=>{let n="";this._res.setEncoding("utf8"),this._res.on("data",s=>{n+=s}),this._res.once("end",()=>{try{t(JSON.parse(n))}catch(s){r(s)}})})}};var w=e=>typeof e=="object"&&Array.isArray(e)&&e!==null,x=e=>e!==null&&Object.prototype.toString.call(e)==="[object Object]",j=e=>x(e)&&Object.keys(e).length===0,pe=e=>typeof e=="number"||typeof e=="string"||typeof e=="boolean"||e===null;function ht(e,t){let r={...e};return t.forEach(n=>{delete r[n]}),r}var U=e=>x(e)?ht(e,["__label","__id","__proptypes"]):e,B=e=>w(e)?e.map(B):x(e)?Object.fromEntries(Object.entries(e).filter(([t,r])=>r!==void 0).map(([t,r])=>[t,B(r)])):e,le=e=>w(e)?e.every(pe):pe(e),M=e=>x(e)&&Object.values(e).every(le),ut=e=>x(e)||w(e)&&!e.every(pe),Ee=e=>{if(w(e)||!x(e))return!0;let t=Object.values(e);return t.length===0?!0:t.some(r=>!ut(r))},A=e=>typeof e=="string",b=e=>{if(typeof e=="string"){if(e.toLowerCase()==="true")return!0;if(e.toLowerCase()==="false")return!1}return w(e)&&e.length===0||x(e)&&Object.keys(e).length===0?!1:!!e};var he=["httpClient","timeout","host","port","protocol","url","logger","options","direct","engineUrl","scope"];var $=class e extends Error{constructor(t,r){super(`Record with label "${t}" and properties ${JSON.stringify(r)} already exists`),this.name="UniquenessError",Object.setPrototypeOf(this,e.prototype)}},O=class e extends Error{constructor(t){super(t),this.name="EmptyTarget",Object.setPrototypeOf(this,e.prototype)}},J=class e extends Error{constructor(t,r){super(`Expected a unique result but found ${t} matches for the provided SearchQuery: ${JSON.stringify(r)}. Ensure your search parameters uniquely identify a single result.`),this.name="NonUniqueResultError",Object.setPrototypeOf(this,e.prototype)}},V=class e extends Error{constructor(r,n){super(`${r} requires RushDB Cloud: ${n}. It is not available in direct mode.`);this.method=r;this.reason=n;this.code="CLOUD_ONLY";this.name="CloudOnlyError",Object.setPrototypeOf(this,e.prototype)}},H=class e extends Error{constructor(r){super(r);this.code="DIRECT_MODE_UNSUPPORTED";this.name="DirectModeError",Object.setPrototypeOf(this,e.prototype)}};var G=async(e,t)=>{let r=Object.entries(e).map(async([a,i])=>i.default&&typeof i.default<"u"&&typeof t[a]>"u"?{key:a,value:typeof i.default=="function"?await i.default():i.default}:{key:a,value:void 0});return{...(await Promise.all(r)).reduce((a,{key:i,value:o})=>(o!==void 0&&(a[i]=o),a),{}),...t}},ue=(e,t)=>Object.entries(t).filter(([r])=>e[r]?.unique).reduce((r,[n,s])=>(n in e&&(r[n]=s),r),{}),Oe=(e,t,r)=>{let n={},s=Object.entries(t).filter(([,a])=>a.unique).reduce((a,[i])=>(a[i]=!0,a),{});return e.forEach(a=>{Object.entries(a).forEach(([i,o])=>{if(i in s)if(n[i]){if(n[i].includes(o))throw new $(r,{[i]:o});n[i]=[...n[i],o]}else n[i]=[o]})}),n},Ae=e=>{if(!e)return{};if(!x(e))throw new Error("Config must be an object");if(Object.keys(e).filter(r=>!he.includes(r)).length>0)throw new Error(`Config object may only contain the following: ${he.join(", ")}`);return e};function qe(e,t,r){if(!Number.isInteger(t)){if(r!==void 0)return r;throw new Error(`${e} must be an integer`)}return t}function me(e){let t=e.split("-"),r=t[0]+t[1].slice(0,4);return parseInt(r,16)}function ke(e){return new Date(me(e))}var R=class{constructor(t={}){this.data=t}get exists(){return b(this.data.__id)&&b(this.data.__label)}get id(){if(!b(this.data.__id))throw new Error("DBRecordInstance: Unable to access 'id'. The Record's `data.__id` is missing or incorrect.");return this.data.__id}get label(){if(!b(this.data.__label))throw new Error("DBRecordInstance: Unable to access 'label'. The Record's `data.__label` is missing or incorrect.");return this.data.__label}get proptypes(){if(!b(this.data.__proptypes))throw new Error("DBRecordInstance: Unable to access 'proptypes'. The Record's `data.__proptypes` is missing or incorrect.");return this.data.__proptypes}get date(){try{return ke(this.id)}catch{throw new Error("DBRecordInstance: Unable to access 'date'. The Record's `data.__id` is missing or incorrect.")}}get timestamp(){try{return me(this.id)}catch{throw new Error("DBRecordInstance: Unable to access 'timestamp'. The Record's `data.__id` is missing or invalid.")}}get score(){return this.data.__score}async delete(t){if(!b(this.data))throw new Error("DBRecordInstance: Unable to delete Record. The Record data is undefined.");return await f.getInstance().records.deleteById(this.id,t)}async update(t,r){if(!b(this.data))throw new Error("DBRecordInstance: Unable to update Record. The Record data is undefined.");return f.getInstance().records.update({label:this.label,target:this.id,data:t},r)}async set(t,r){if(!b(this.data))throw new Error("DBRecordInstance: Unable to set. The Record data is undefined.");return f.getInstance().records.set({label:this.label,target:this.id,data:t},r)}async attach(t,r,n){if(!b(this.data))throw new Error("DBRecordInstance: Unable to attach Record. The Record data is undefined.");return f.getInstance().records.attach({source:this.id,target:t,options:r},n)}async detach(t,r,n){if(!b(this.data))throw new Error("DBRecordInstance: Unable to detach Record. The Record data is undefined.");return f.getInstance().records.detach({source:this.id,target:t,options:r},n)}},I=class{constructor(t=[],r=0,n,s){this.data=t,this.total=r,this.searchQuery=n,this.warnings=s}async deleteAll(t){let r=this.data.map(s=>s.id);return r.length?await f.getInstance().records.deleteById(r,t):{success:!0}}async next(t){if(this.sql){let{skip:o,limit:c}=this.sqlPage??{skip:0,limit:100},p={skip:o+c,limit:c},h=await f.getInstance().ai.runSql(this.sql,p);return t?.preserveData?(this.data=[...this.data,...h.data],this.total=h.total,this.sqlPage=p,this):(h.name=this.name,h)}if(!this.searchQuery)throw new Error("DBRecordsArrayInstance: Cannot paginate \u2014 no searchQuery was provided.");let r=this.searchQuery.skip??0,n=this.searchQuery.limit??100,s={...this.searchQuery,skip:r+n},i=await f.getInstance().records.find(s,void 0);return t?.preserveData?(this.data=[...this.data,...i.data],this.total=i.total,this.searchQuery=s,this):i}exportCsv(){if(!this.data.length)return"";let t=new Set(["__id","__label","__proptypes"]),r=Object.keys(this.data[0].data).filter(a=>!t.has(a)),n=a=>{let i=a==null?"":String(a);return i.includes(",")||i.includes('"')||i.includes(`
1
+ var $=class e{makeRequest(t,{headers:r,method:n,protocol:s,requestData:a,timeout:i}){throw new Error("makeRequest not implemented.")}static makeTimeoutError(){let t=new TypeError(e.TIMEOUT_ERROR_CODE);return t.code=e.TIMEOUT_ERROR_CODE,t}};$.CONNECTION_CLOSED_ERROR_CODES=["ECONNRESET","EPIPE"];$.TIMEOUT_ERROR_CODE="ETIMEDOUT";var Y=class{constructor(t,r){this._statusCode=t,this._headers=r}getStatusCode(){return this._statusCode}getHeaders(){return this._headers}getRawResponse(){throw new Error("getRawResponse not implemented.")}toStream(t){throw new Error("toStream not implemented.")}toJSON(){throw new Error("toJSON not implemented.")}},oe=class{constructor(t){this._res=t}getStatusCode(){throw new Error("getStatusCode not implemented.")}getHeaders(){throw new Error("getHeaders not implemented.")}getRawResponse(){throw new Error("getRawResponse not implemented.")}toStream(t){throw new Error("toStream not implemented.")}toJSON(){throw new Error("toJSON not implemented.")}};import*as ce from"http";import*as de from"https";var ot="string",it="datetime",ct="boolean",dt="number",be=[ot,it,ct,dt];var Ie=ce.default||ce,Pe=de.default||de,pt=new Ie.Agent({keepAlive:!0}),lt=new Pe.Agent({keepAlive:!0}),J=class extends ${constructor(t){super(),this._agent=t}makeRequest(t,{headers:r,method:n,protocol:s,requestData:a,timeout:i}){let o=new URL(t),c=s==="http"||o.protocol==="http:",p=this._agent;return p||(p=c?pt:lt),new Promise((h,d)=>{let l=(c?Ie:Pe).request({agent:p,ciphers:"DEFAULT:!aNULL:!eNULL:!LOW:!EXPORT:!SSLv2:!MD5",headers:r,host:o.hostname,method:n,path:o.pathname+o.search,port:o.port});l.setTimeout(i??8e4,()=>{l.destroy($.makeTimeoutError())}),l.on("response",m=>{h(new ie(m))}),l.on("error",m=>{d(m)}),l.once("socket",m=>{let E=a?JSON.stringify(a):"";m.connecting?m.once(c?"connect":"secureConnect",()=>{l.write(E),l.end()}):(l.write(E),l.end())})})}},ie=class extends Y{constructor(t){super(t.statusCode,t.headers||{}),this._res=t}getRawResponse(){return this._res}toStream(t){return this._res.once("end",()=>t()),this._res}toJSON(){return new Promise((t,r)=>{let n="";this._res.setEncoding("utf8"),this._res.on("data",s=>{n+=s}),this._res.once("end",()=>{try{t(JSON.parse(n))}catch(s){r(s)}})})}};var w=e=>typeof e=="object"&&Array.isArray(e)&&e!==null,x=e=>e!==null&&Object.prototype.toString.call(e)==="[object Object]",j=e=>x(e)&&Object.keys(e).length===0,pe=e=>typeof e=="number"||typeof e=="string"||typeof e=="boolean"||e===null;function ht(e,t){let r={...e};return t.forEach(n=>{delete r[n]}),r}var U=e=>x(e)?ht(e,["__label","__id","__proptypes"]):e,B=e=>w(e)?e.map(B):x(e)?Object.fromEntries(Object.entries(e).filter(([t,r])=>r!==void 0).map(([t,r])=>[t,B(r)])):e,le=e=>w(e)?e.every(pe):pe(e),M=e=>x(e)&&Object.values(e).every(le),ut=e=>x(e)||w(e)&&!e.every(pe),Ee=e=>{if(w(e)||!x(e))return!0;let t=Object.values(e);return t.length===0?!0:t.some(r=>!ut(r))},A=e=>typeof e=="string",b=e=>{if(typeof e=="string"){if(e.toLowerCase()==="true")return!0;if(e.toLowerCase()==="false")return!1}return w(e)&&e.length===0||x(e)&&Object.keys(e).length===0?!1:!!e};var he=["httpClient","timeout","host","port","protocol","url","logger","options","direct","engineUrl","scope"];var _=class e extends Error{constructor(t,r){super(`Record with label "${t}" and properties ${JSON.stringify(r)} already exists`),this.name="UniquenessError",Object.setPrototypeOf(this,e.prototype)}},O=class e extends Error{constructor(t){super(t),this.name="EmptyTarget",Object.setPrototypeOf(this,e.prototype)}},G=class e extends Error{constructor(t,r){super(`Expected a unique result but found ${t} matches for the provided SearchQuery: ${JSON.stringify(r)}. Ensure your search parameters uniquely identify a single result.`),this.name="NonUniqueResultError",Object.setPrototypeOf(this,e.prototype)}},V=class e extends Error{constructor(r,n){super(`${r} requires RushDB Cloud: ${n}. It is not available in direct mode.`);this.method=r;this.reason=n;this.code="CLOUD_ONLY";this.name="CloudOnlyError",Object.setPrototypeOf(this,e.prototype)}},H=class e extends Error{constructor(r){super(r);this.code="DIRECT_MODE_UNSUPPORTED";this.name="DirectModeError",Object.setPrototypeOf(this,e.prototype)}};var z=async(e,t)=>{let r=Object.entries(e).map(async([a,i])=>i.default&&typeof i.default<"u"&&typeof t[a]>"u"?{key:a,value:typeof i.default=="function"?await i.default():i.default}:{key:a,value:void 0});return{...(await Promise.all(r)).reduce((a,{key:i,value:o})=>(o!==void 0&&(a[i]=o),a),{}),...t}},ue=(e,t)=>Object.entries(t).filter(([r])=>e[r]?.unique).reduce((r,[n,s])=>(n in e&&(r[n]=s),r),{}),Oe=(e,t,r)=>{let n={},s=Object.entries(t).filter(([,a])=>a.unique).reduce((a,[i])=>(a[i]=!0,a),{});return e.forEach(a=>{Object.entries(a).forEach(([i,o])=>{if(i in s)if(n[i]){if(n[i].includes(o))throw new _(r,{[i]:o});n[i]=[...n[i],o]}else n[i]=[o]})}),n},Ae=e=>{if(!e)return{};if(!x(e))throw new Error("Config must be an object");if(Object.keys(e).filter(r=>!he.includes(r)).length>0)throw new Error(`Config object may only contain the following: ${he.join(", ")}`);return e};function qe(e,t,r){if(!Number.isInteger(t)){if(r!==void 0)return r;throw new Error(`${e} must be an integer`)}return t}function me(e){let t=e.split("-"),r=t[0]+t[1].slice(0,4);return parseInt(r,16)}function ke(e){return new Date(me(e))}var R=class{constructor(t={}){this.data=t}get exists(){return b(this.data.__id)&&b(this.data.__label)}get id(){if(!b(this.data.__id))throw new Error("DBRecordInstance: Unable to access 'id'. The Record's `data.__id` is missing or incorrect.");return this.data.__id}get label(){if(!b(this.data.__label))throw new Error("DBRecordInstance: Unable to access 'label'. The Record's `data.__label` is missing or incorrect.");return this.data.__label}get proptypes(){if(!b(this.data.__proptypes))throw new Error("DBRecordInstance: Unable to access 'proptypes'. The Record's `data.__proptypes` is missing or incorrect.");return this.data.__proptypes}get date(){try{return ke(this.id)}catch{throw new Error("DBRecordInstance: Unable to access 'date'. The Record's `data.__id` is missing or incorrect.")}}get timestamp(){try{return me(this.id)}catch{throw new Error("DBRecordInstance: Unable to access 'timestamp'. The Record's `data.__id` is missing or invalid.")}}get score(){return this.data.__score}async delete(t){if(!b(this.data))throw new Error("DBRecordInstance: Unable to delete Record. The Record data is undefined.");return await f.getInstance().records.deleteById(this.id,t)}async update(t,r){if(!b(this.data))throw new Error("DBRecordInstance: Unable to update Record. The Record data is undefined.");return f.getInstance().records.update({label:this.label,target:this.id,data:t},r)}async set(t,r){if(!b(this.data))throw new Error("DBRecordInstance: Unable to set. The Record data is undefined.");return f.getInstance().records.set({label:this.label,target:this.id,data:t},r)}async attach(t,r,n){if(!b(this.data))throw new Error("DBRecordInstance: Unable to attach Record. The Record data is undefined.");return f.getInstance().records.attach({source:this.id,target:t,options:r},n)}async detach(t,r,n){if(!b(this.data))throw new Error("DBRecordInstance: Unable to detach Record. The Record data is undefined.");return f.getInstance().records.detach({source:this.id,target:t,options:r},n)}},I=class{constructor(t=[],r=0,n,s){this.data=t,this.total=r,this.searchQuery=n,this.warnings=s}async deleteAll(t){let r=this.data.map(s=>s.id);return r.length?await f.getInstance().records.deleteById(r,t):{success:!0}}async next(t){if(this.sql){let{skip:o,limit:c}=this.sqlPage??{skip:0,limit:100},p={skip:o+c,limit:c},h=await f.getInstance().ai.runSql(this.sql,p);return t?.preserveData?(this.data=[...this.data,...h.data],this.total=h.total,this.sqlPage=p,this):(h.name=this.name,h)}if(!this.searchQuery)throw new Error("DBRecordsArrayInstance: Cannot paginate \u2014 no searchQuery was provided.");let r=this.searchQuery.skip??0,n=this.searchQuery.limit??100,s={...this.searchQuery,skip:r+n},i=await f.getInstance().records.find(s,void 0);return t?.preserveData?(this.data=[...this.data,...i.data],this.total=i.total,this.searchQuery=s,this):i}exportCsv(){if(!this.data.length)return"";let t=new Set(["__id","__label","__proptypes"]),r=Object.keys(this.data[0].data).filter(a=>!t.has(a)),n=a=>{let i=a==null?"":String(a);return i.includes(",")||i.includes('"')||i.includes(`
2
2
  `)?`"${i.replace(/"/g,'""')}"`:i},s=this.data.map(a=>r.map(i=>n(a.data[i])).join(","));return[r.join(","),...s].join(`
3
- `)}async setProperties(t,r){let s=f.getInstance();for(let a=0;a<this.data.length;a+=100){let i=this.data.slice(a,a+100);await Promise.all(i.map(o=>s.records.update({target:o.id,label:o.data.__label,data:t},r)))}}};var z=class{constructor(t){this.baseUrl=t.engineUrl.replace(/\/$/,""),this.token=t.token,this.httpClient=t.httpClient,this.scope=t.scope}async execute(t){let r={protocolVersion:1,...this.scope?{context:{scope:this.scope}}:{},operation:t},n={"Content-Type":"application/json",Authorization:`Bearer ${this.token}`};this.scope&&(n["X-RushDB-Tenant"]=this.scope);let s=await this.httpClient.makeRequest(`${this.baseUrl}/protocol/v1/execute`,{method:"POST",headers:n,requestData:r}),a=s.getStatusCode(),i=await s.toJSON().catch(()=>{});if(a>=400||i?.error||!i?.response){let o=i?.error?.message??"engine request failed",c=new Error(`${a} ${o}`);throw c.status=a,c.body=i,c}return i.response}};var X={"ai.search":"natural-language search turns the prompt into a SQL statement with an LLM","ai.runSql":"Smart search SQL runs on the platform, which loads the full records the statement selects","ai.getJoinCandidates":"join suggestions are computed by the platform (its heuristics over the engine's value overlap)","relationships.patterns.list":"relationship-pattern suggestions are produced and stored by the platform","relationships.patterns.analyze":"relationship-pattern suggestions are produced and stored by the platform","relationships.patterns.approve":"relationship-pattern suggestions are produced and stored by the platform","relationships.patterns.ignore":"relationship-pattern suggestions are produced and stored by the platform","relationships.patterns.delete":"relationship-pattern suggestions are produced and stored by the platform","settings.get":"project settings belong to the platform"},Z={"records.vectorSearch":"a text `query` is embedded with the managed embedding model; in direct mode pass `queryVector`","ai.indexes.create":"a managed index is filled by the managed embedding model; in direct mode create an external index (`external: true`) and supply vectors"},mt=e=>Object.prototype.hasOwnProperty.call(X,e);var ge=async(e,t,r)=>{let[n,s]=await Promise.all([e.execute({kind:"describe",describe:{kind:"schema",query:{labels:[],predicate:{},offset:0}}}),e.execute({kind:"describe",describe:{kind:"vectorIndexes"}})]),a=n.schema??{labels:[],properties:[],relationships:[]},i=new Map;for(let d of a.properties??[]){let l=d.label??"";if(!l)continue;let u={id:String(d.id),name:String(d.name),type:String(d.type??"string"),recordsCount:Number(d.recordsCount??0),isArray:d.isArray??void 0};if(u.type==="boolean")u.values=["true","false"];else if(u.type==="string"){let at=(d.sampleValues??[]).filter(Te=>Te!=null).map(String);u.values=[...new Set(at)].slice(0,10)}d.min!==void 0&&d.min!==null&&(u.min=u.type==="number"?Number(d.min):String(d.min)),d.max!==void 0&&d.max!==null&&(u.max=u.type==="number"?Number(d.max):String(d.max));let E=i.get(l)??[];E.push(u),i.set(l,E)}let o=(a.labels??[]).map(d=>({label:d.name,count:Number(d.recordsCount??0),properties:i.get(d.name)??[],relationships:[]})),c=new Map(o.map(d=>[d.label,d])),p=(d,l)=>{let u=c.get(d);u&&!u.relationships.some(E=>E.direction===l.direction&&E.label===l.label&&E.type===l.type)&&u.relationships.push(l)};for(let d of a.relationships??[]){let l=d.properties?.length?d.properties:void 0;p(d.sourceLabel,{label:d.targetLabel,type:d.type,direction:"out",count:d.count,properties:l}),d.sourceLabel!==d.targetLabel&&p(d.targetLabel,{label:d.sourceLabel,type:d.type,direction:"in",count:d.count,properties:l})}let h=new Map;for(let d of(s.indexes??[]).map(r)){let l=`${d.label}|${d.propertyName}`,u=h.get(l)??[];u.push({id:String(d.id??""),name:String(d.name??""),sourceType:String(d.sourceType??"external"),similarityFunction:String(d.similarityFunction??"cosine"),dimensions:Number(d.dimensions??0),status:String(d.status??"pending"),modelKey:String(d.modelKey??"")}),h.set(l,u)}for(let d of o){d.relationships.sort((l,u)=>`${l.direction}|${l.label}|${l.type}`.localeCompare(`${u.direction}|${u.label}|${u.type}`));for(let l of d.properties){let u=h.get(`${d.label}|${l.name}`);u?.length&&(l.vectorIndexes=u)}}return o.sort((d,l)=>l.count-d.count),t?.length?o.filter(d=>t.includes(d.label)):o},$e=e=>{let t=o=>String(o).replace(/\|/g,"\\|").replace(/`/g,"\\`"),s=o=>o.length>48?o.slice(0,48)+"\u2026":o,a=o=>{let c=(o.type||"").toLowerCase();if(c==="number"||c==="datetime")return o.min!==void 0&&o.max!==void 0?`\`${o.min}\`..\`${o.max}\``:"\u2014";if(Array.isArray(o.values)&&o.values.length>0){let p=o.values.slice(0,5),h=o.values.length>5?` (+${o.values.length-5} more)`:"";return p.map(d=>`\`${t(s(String(d)))}\``).join(", ")+h}return"\u2014"},i=`# Graph Schema
3
+ `)}async setProperties(t,r){let s=f.getInstance();for(let a=0;a<this.data.length;a+=100){let i=this.data.slice(a,a+100);await Promise.all(i.map(o=>s.records.update({target:o.id,label:o.data.__label,data:t},r)))}}};var X=class{constructor(t){this.baseUrl=t.engineUrl.replace(/\/$/,""),this.token=t.token,this.httpClient=t.httpClient,this.scope=t.scope}async execute(t){let r={protocolVersion:1,...this.scope?{context:{scope:this.scope}}:{},operation:t},n={"Content-Type":"application/json",Authorization:`Bearer ${this.token}`};this.scope&&(n["X-RushDB-Tenant"]=this.scope);let s=await this.httpClient.makeRequest(`${this.baseUrl}/protocol/v1/execute`,{method:"POST",headers:n,requestData:r}),a=s.getStatusCode(),i=await s.toJSON().catch(()=>{});if(a>=400||i?.error||!i?.response){let o=i?.error?.message??"engine request failed",c=new Error(`${a} ${o}`);throw c.status=a,c.body=i,c}return i.response}};var Z={"ai.search":"natural-language search turns the prompt into a SQL statement with an LLM","ai.runSql":"Smart search SQL runs on the platform, which loads the full records the statement selects","ai.getJoinCandidates":"join suggestions are computed by the platform (its heuristics over the engine's value overlap)","relationships.patterns.list":"relationship-pattern suggestions are produced and stored by the platform","relationships.patterns.analyze":"relationship-pattern suggestions are produced and stored by the platform","relationships.patterns.approve":"relationship-pattern suggestions are produced and stored by the platform","relationships.patterns.ignore":"relationship-pattern suggestions are produced and stored by the platform","relationships.patterns.delete":"relationship-pattern suggestions are produced and stored by the platform","settings.get":"project settings belong to the platform"},ee={"records.vectorSearch":"a text `query` is embedded with the managed embedding model; in direct mode pass `queryVector`","ai.indexes.create":"a managed index is filled by the managed embedding model; in direct mode create an external index (`external: true`) and supply vectors"},mt=e=>Object.prototype.hasOwnProperty.call(Z,e);var ge=async(e,t,r)=>{let[n,s]=await Promise.all([e.execute({kind:"describe",describe:{kind:"schema",query:{labels:[],predicate:{},offset:0}}}),e.execute({kind:"describe",describe:{kind:"vectorIndexes"}})]),a=n.schema??{labels:[],properties:[],relationships:[]},i=new Map;for(let d of a.properties??[]){let l=d.label??"";if(!l)continue;let m={id:String(d.id),name:String(d.name),type:String(d.type??"string"),recordsCount:Number(d.recordsCount??0),isArray:d.isArray??void 0};if(m.type==="boolean")m.values=["true","false"];else if(m.type==="string"){let at=(d.sampleValues??[]).filter(Te=>Te!=null).map(String);m.values=[...new Set(at)].slice(0,10)}d.min!==void 0&&d.min!==null&&(m.min=m.type==="number"?Number(d.min):String(d.min)),d.max!==void 0&&d.max!==null&&(m.max=m.type==="number"?Number(d.max):String(d.max));let E=i.get(l)??[];E.push(m),i.set(l,E)}let o=(a.labels??[]).map(d=>({label:d.name,count:Number(d.recordsCount??0),properties:i.get(d.name)??[],relationships:[]})),c=new Map(o.map(d=>[d.label,d])),p=(d,l)=>{let m=c.get(d);m&&!m.relationships.some(E=>E.direction===l.direction&&E.label===l.label&&E.type===l.type)&&m.relationships.push(l)};for(let d of a.relationships??[]){let l=d.properties?.length?d.properties:void 0;p(d.sourceLabel,{label:d.targetLabel,type:d.type,direction:"out",count:d.count,properties:l}),d.sourceLabel!==d.targetLabel&&p(d.targetLabel,{label:d.sourceLabel,type:d.type,direction:"in",count:d.count,properties:l})}let h=new Map;for(let d of(s.indexes??[]).map(r)){let l=`${d.label}|${d.propertyName}`,m=h.get(l)??[];m.push({id:String(d.id??""),name:String(d.name??""),sourceType:String(d.sourceType??"external"),similarityFunction:String(d.similarityFunction??"cosine"),dimensions:Number(d.dimensions??0),status:String(d.status??"pending"),modelKey:String(d.modelKey??"")}),h.set(l,m)}for(let d of o){d.relationships.sort((l,m)=>`${l.direction}|${l.label}|${l.type}`.localeCompare(`${m.direction}|${m.label}|${m.type}`));for(let l of d.properties){let m=h.get(`${d.label}|${l.name}`);m?.length&&(l.vectorIndexes=m)}}return o.sort((d,l)=>l.count-d.count),t?.length?o.filter(d=>t.includes(d.label)):o},$e=e=>{let t=o=>String(o).replace(/\|/g,"\\|").replace(/`/g,"\\`"),s=o=>o.length>48?o.slice(0,48)+"\u2026":o,a=o=>{let c=(o.type||"").toLowerCase();if(c==="number"||c==="datetime")return o.min!==void 0&&o.max!==void 0?`\`${o.min}\`..\`${o.max}\``:"\u2014";if(Array.isArray(o.values)&&o.values.length>0){let p=o.values.slice(0,5),h=o.values.length>5?` (+${o.values.length-5} more)`:"";return p.map(d=>`\`${t(s(String(d)))}\``).join(", ")+h}return"\u2014"},i=`# Graph Schema
4
4
 
5
5
  ## Labels
6
6
 
@@ -22,6 +22,6 @@ var k=class e{makeRequest(t,{headers:r,method:n,protocol:s,requestData:a,timeout
22
22
 
23
23
  `,i+=`| Traversal | Count | Edge Properties |
24
24
  |-----------|------:|-----------------|
25
- `;for(let p of o.relationships){let h=p.properties?.length?p.properties.map(u=>`\`${t(u.name)}:${t(u.type)}\``).join(", "):"\u2014",d=p.direction==="out"?`(${o.label})-[:${p.type}]->(${p.label})`:`(${o.label})<-[:${p.type}]-(${p.label})`,l=typeof p.count=="number"?String(p.count):"\u2014";i+=`| \`${t(d)}\` | ${l} | ${h} |
25
+ `;for(let p of o.relationships){let h=p.properties?.length?p.properties.map(m=>`\`${t(m.name)}:${t(m.type)}\``).join(", "):"\u2014",d=p.direction==="out"?`(${o.label})-[:${p.type}]->(${p.label})`:`(${o.label})<-[:${p.type}]-(${p.label})`,l=typeof p.count=="number"?String(p.count):"\u2014";i+=`| \`${t(d)}\` | ${l} | ${h} |
26
26
  `}i+=`
27
- `}}return i.trim()};var g=(e,t={})=>({success:!0,data:e,...t}),D=(e,t)=>{let r=new Error(`${e} ${t}`);return r.status=e,r.body={statusCode:e,message:t},r},q=e=>async()=>{throw new V(e,X[e])},_=(e,t)=>{if(e)throw new H(`${t} inside a transaction is not supported in direct mode: the engine stages record creates, updates, deletes, links and imports. Run it outside the transaction.`)},Me="__RUSHDB__RELATION__DEFAULT__",v=(e,t,r)=>e.execute({kind:"transaction",transaction:{kind:"stage",transactionId:t,mutation:r}}),fe=async(e,t,r)=>{let{record:n}=await v(e,t,{kind:"getRecord",record:{id:r}});return{...n?.properties??{},__id:r,__label:n?.__label,__proptypes:{}}},Ve=(e,t)=>{e&&Array.isArray(t)&&t.length>0&&_(e,"A write with inline vectors")},ne=e=>{if(!e)return e;let t={...e.properties??{}};return t.__id=e.id,t.__label=e.label,t.__proptypes=e.propertyTypes??{},e.score!==void 0&&(t.__score=e.score),t},se=e=>(e??[]).map(t=>ne(t)),Se=e=>e.data&&typeof e.data=="object"&&!Array.isArray(e.data)?e.data:Array.isArray(e.properties)?Object.fromEntries(e.properties.map(t=>[t.name,t.value])):e.properties&&typeof e.properties=="object"?e.properties:{},gt=e=>e==null||typeof e=="object"&&!Array.isArray(e)&&Object.keys(e).length===0?"desc":typeof e!="object"||Array.isArray(e)?e:Object.fromEntries(Object.entries(e).map(([t,r])=>[t==="__id"?"id":t,r])),N=(e={})=>{let t=e.pagination??{},r={labels:e.labels??[],predicate:e.where??{},select:e.select,order:gt(e.orderBy),offset:e.skip??t.skip??0,limit:e.limit??t.limit};return Array.isArray(e.groupBy)&&e.groupBy.length>0&&(r.groupBy=e.groupBy),r},te=e=>e==null||typeof e=="object"&&!Array.isArray(e)&&Object.keys(e).length===0,xe=async(e,t)=>(await e.execute({kind:"query",query:{kind:"record",id:t}})).record,Ne=async(e,t)=>{let r=await e.execute({kind:"query",query:{kind:"records",query:N(t)}});return r.kind==="rows"?{data:r.rows??[],total:r.total??0}:{data:se(r.records),total:r.total??0}},Q=async e=>(await e.execute({kind:"describe",describe:{kind:"vectorIndexes"}})).indexes??[],Re=async e=>(await e.execute({kind:"describe",describe:{kind:"indexes"}})).indexes??[],K=e=>{let t=Number(e.dimensions??0);return{id:e.name,name:e.name,label:e.label,propertyName:e.property,vectorPropertyName:`_emb_external_${e.similarity}_${t}`,similarityFunction:e.similarity,dimensions:t,sourceType:"external",status:e.status}},Qe=e=>({name:e.name,label:e.label,property:e.property,consistency:e.consistency??"eventual",status:e.state,pending:e.pending??0}),we=async e=>(await Re(e)).filter(t=>t.kind==="text").map(Qe),Fe=64,He=e=>e.join(".").slice(0,Fe).replace(/[.:-]+$/,""),re=e=>e.replace(/[^A-Za-z0-9_-]/g,"-"),ye=(e,t)=>{if(!t.has(e))return e;for(let r=2;;r++){let n=`-${r}`,s=e.slice(0,Fe-n.length)+n;if(!t.has(s))return s}},_e=({label:e,property:t})=>He([re(e),t==="*"?"all":re(t),"text"]),yt=(e,t,r)=>He([re(e.label),re(e.propertyName),"external",String(t),r]).replace(/^emb__/,"emb_"),ae=async(e,t,r,n)=>{if(!Array.isArray(t)||t.length===0)return[];let s=n??await Q(e);return t.map(a=>{if(typeof a?.index=="string")return a;if(!r)throw D(422,"inline vectors require a record label to select their index");let i=Array.isArray(a.vector)?a.vector.length:void 0,o=s.filter(c=>c.label===r&&c.property===a.propertyName&&(a.similarityFunction===void 0||c.similarity===a.similarityFunction)&&(i===void 0||Number(c.dimensions)===i));if(o.length!==1)throw D(o.length===0?404:422,o.length===0?`No vector index matches label "${r}", property "${a.propertyName}"`:`${o.length} vector indexes match label "${r}", property "${a.propertyName}"; name one with \`index\``);return{...a,index:o[0].name}})},ft=async(e,t,r)=>{let n=Array.isArray(t)?t:[t],s=o=>Array.isArray(o?.$vectors)&&o.$vectors.length>0;if(!n.some(s))return t;let a=await Q(e),i=await Promise.all(n.map(async o=>s(o)?{...o,$vectors:await ae(e,o.$vectors,r,a)}:o));return Array.isArray(t)?i:i[0]},St=()=>{let e=new Uint8Array(16);if(typeof globalThis.crypto?.getRandomValues=="function")globalThis.crypto.getRandomValues(e);else for(let n=0;n<16;n++)e[n]=Math.floor(Math.random()*256);let t=Date.now();for(let n=0;n<6;n++)e[n]=Math.floor(t/2**(8*(5-n)))&255;e[6]=e[6]&15|112,e[8]=e[8]&63|128;let r=Array.from(e,n=>n.toString(16).padStart(2,"0")).join("");return`${r.slice(0,8)}-${r.slice(8,12)}-${r.slice(12,16)}-${r.slice(16,20)}-${r.slice(20)}`},Rt=async({body:e,engine:t,txId:r})=>{let n=!!e.options?.mergeStrategy||Array.isArray(e.options?.mergeBy),s=Se(e);if(r){n&&_(r,"An upsert"),Ve(r,e.vectors);let o=St();return await v(t,r,{kind:"createRecord",label:e.label,id:o,properties:s,options:e.options??{}}),g(await fe(t,r,o))}let a=n?{...e.options,mergeBy:e.options?.mergeBy??[]}:e.options??{},i=await t.execute({kind:"mutate",mutation:{kind:"putRecord",mode:"create",label:e.label,properties:s,vectors:await ae(t,e.vectors,e.label),options:a}});return g(ne(i.record))},Ce=e=>async({body:t,params:[r],engine:n,txId:s})=>{let a=typeof t.label=="string"&&t.label?t.label:void 0;if(s){if(Ve(s,t.vectors),a){let c=await fe(n,s,r);c.__label&&c.__label!==a&&await v(n,s,{kind:"retypeRecord",record:{id:r},fromLabel:c.__label,toLabel:a})}return await v(n,s,{kind:"updateRecord",record:{id:r},properties:Se(t),replace:e==="replace"}),g(await fe(n,s,r))}let i=a;if(a||t.vectors?.length){let c=await xe(n,r);a&&c?.label&&c.label!==a&&await n.execute({kind:"mutate",mutation:{kind:"retypeRecord",id:r,fromLabel:c.label,toLabel:a}}),i=a??c?.label}let o=await n.execute({kind:"mutate",mutation:{kind:"putRecord",mode:e,id:r,properties:Se(t),vectors:await ae(n,t.vectors,i),options:t.options??{}}});return g(ne(o.record))},wt=async(e,t,r)=>{if(!t)return r;let n;try{n=(await xe(e,t))?.label}catch(i){if(i?.status===404)return;throw i}let s={[n]:{$id:t}},a=r.where;return{...r,where:te(a)?s:{$and:[a,s]}}},Be=async({body:e,params:[t],engine:r})=>{let n=await wt(r,t,e);if(!n)return g([],{total:0});let{data:s,total:a}=await Ne(r,n);return g(s,{total:a})},ve=(e,t,r)=>t?v(e,t,{kind:"ingest",ingest:r}):e.execute({kind:"ingest",ingest:r}),Le=(e,t)=>t&&e.records?.length?g(se(e.records)):g({message:"Records have been successfully imported",count:Number(e.count??0)}),xt=["delimiter","header","skipEmptyLines","dynamicTyping","quoteChar","escapeChar","newline"],je=e=>({relationType:e.type??Me,direction:String(e.direction??"").toLowerCase()==="in"?"in":"out",allowCartesian:e.manyToMany??!1,properties:e.properties??{},source:{label:e.source?.label,property:e.source?.key,predicate:e.source?.where??{}},target:{label:e.target?.label,property:e.target?.key,predicate:e.target?.where??{}}}),ee=e=>Array.isArray(e)?e:[e],Tt=e=>{let t=new Map;for(let r of e){let n=t.get(r.id);if(n){n.recordsCount+=Number(r.recordsCount??0),n.isArray||=r.isArray===!0;continue}t.set(r.id,{id:r.id,name:r.name,type:r.type,recordsCount:Number(r.recordsCount??0),isArray:r.isArray===!0})}return Array.from(t.values(),({isArray:r,...n})=>({...n,metadata:JSON.stringify({cardinality:r?"OrderedMany":"Single",nullability:"Nullable"})}))},Ke=async(e,t={})=>{let r=await e.execute({kind:"describe",describe:{kind:"properties",query:N(t),...te(t.where)?{detail:"catalog"}:{}}});return Tt(r.properties??[])},Ue=async(e,t)=>{let r=(await Ke(e)).find(n=>n.name===t||n.id===t);return r&&{...r,id:r.id??r.name}},We=async(e,t,r)=>{if(typeof t.query!="string"||t.query.trim()==="")throw D(422,"text.query is required");let n=await we(e),s;if(t.index!==void 0){if(s=n.find(a=>a.name===t.index),!s)throw D(404,`No text index named "${t.index}"`)}else{let a=r[0];if(!a)throw D(422,"Name a text index with `index`, or give `labels`");let i=n.filter(o=>o.label===a&&o.status==="ready"&&(t.property===void 0||o.property===t.property));if(i.length===0)throw D(404,`No ready text index on label "${a}"`);if(i.length>1)throw D(422,`Label "${a}" has several text indexes (${i.map(o=>o.name).join(", ")}); name one with \`index\``);s=i[0]}return{index:s.name,label:s.label,query:t.query,allTerms:t.allTerms??!1,phrase:t.phrase??!1}},bt=async({body:e,engine:t})=>{let r=e.queryVector??[];if(r.length===0)throw new V("records.vectorSearch",Z["records.vectorSearch"]);let n=await Q(t),s;if(typeof e.index=="string"){if(s=n.find(d=>d.name===e.index),!s)throw D(404,`No vector index named "${e.index}"`)}else{let d=(e.labels??[])[0],l=n.filter(u=>u.label===d&&u.property===e.propertyName&&(e.similarityFunction===void 0||u.similarity===e.similarityFunction)&&Number(u.dimensions)===(e.dimensions??r.length));if(l.length!==1)throw D(l.length===0?404:422,l.length===0?`No vector index matches label "${d}", property "${e.propertyName}"`:`${l.length} vector indexes match label "${d}", property "${e.propertyName}"; name one with \`index\``);s=l[0]}let a=e.labels?.length?e.labels:[s.label],i={property:s.property,vector:r,similarity:s.similarity??"cosine",index:s.name,mode:e.mode,ef:e.ef,scoreThreshold:e.scoreThreshold},o=e.text?await We(t,{...e.text,query:e.text.query??e.query},a):void 0,c=o?{kind:"hybrid",query:{labels:a,predicate:e.where??{},vector:{...i,weight:e.weight,prefetchLimit:e.prefetchLimit},text:{index:o.index,query:o.query,allTerms:o.allTerms,phrase:o.phrase,weight:e.text.weight,prefetchLimit:e.text.prefetchLimit},fusion:e.fusion,rrfK:e.rrfK,offset:e.skip??0,limit:e.limit??10}}:{kind:"vector",query:{...i,labels:a,predicate:e.where??{},offset:e.skip??0,limit:e.limit??10}},p=await t.execute({kind:"query",query:c}),h=se(p.records);return g(h,{total:h.length,meta:{vectorSearch:p.vectorSearch,textSearch:p.textSearch,fusion:p.fusion}})},T="([^/]+)",Ye=[{method:"GET",pattern:new RegExp(`^/records/${T}$`),handle:async({params:[e],engine:t})=>g(ne(await xe(t,e)))},{method:"POST",pattern:/^\/records$/,handle:Rt},{method:"PATCH",pattern:new RegExp(`^/records/${T}$`),handle:Ce("merge")},{method:"PUT",pattern:new RegExp(`^/records/${T}$`),handle:Ce("replace")},{method:"DELETE",pattern:new RegExp(`^/records/${T}$`),handle:async({params:[e],engine:t,txId:r})=>(r?await v(t,r,{kind:"deleteRecord",record:{id:e}}):await t.execute({kind:"mutate",mutation:{kind:"deleteRecord",id:e}}),g({message:"Record deleted"}))},{method:"POST",pattern:/^\/records\/delete$/,handle:async({body:e,engine:t,txId:r})=>{_(r,"records.delete");let n=await t.execute({kind:"mutate",mutation:{kind:"deleteRecords",query:N(e)}});return g({message:`${n.affected??0} records deleted`})}},{method:"POST",pattern:/^\/records\/search$/,handle:Be},{method:"POST",pattern:new RegExp(`^/records/${T}/search$`),handle:Be},{method:"POST",pattern:/^\/records\/import\/json$/,handle:async({body:e,engine:t,txId:r})=>{let n=await ve(t,r,{kind:"documents",label:e.label,documents:await ft(t,e.data,e.label),options:e.options??{}});return Le(n,e.options?.returnResult)}},{method:"POST",pattern:/^\/records\/import\/csv$/,handle:async({body:e,engine:t,txId:r})=>{let n=e.vectors?.length?await Q(t):[],s=await Promise.all((e.vectors??[]).map(o=>ae(t,o,e.label,n))),a=Object.fromEntries(Object.entries(e.parseConfig??{}).filter(([o])=>xt.includes(o))),i=await ve(t,r,{kind:"csv",label:e.label,data:e.data??"",parseConfig:a,options:e.options??{},vectors:s});return Number(i.count??0)===0?g(!0):Le(i,e.options?.returnResult)}},{method:"POST",pattern:/^\/records\/export\/csv$/,handle:async({body:e,engine:t})=>{let r=await t.execute({kind:"query",query:{kind:"exportCsv",query:N({labels:e.labels,where:e.where,orderBy:e.orderBy,skip:typeof e.skip=="number"?e.skip:0,limit:typeof e.limit=="number"?e.limit:100})}});return g({fileContent:r.content,dateTime:new Date().toISOString()})}},{method:"POST",pattern:new RegExp(`^/relationships/${T}$`),handle:async({body:e,params:[t],engine:r,txId:n})=>{let s=e.type??Me,a=String(e.direction??"").toLowerCase()==="in";if(n)for(let i of ee(e.targetIds))await v(r,n,{kind:"createRelationship",relationType:s,source:{id:a?i:t},target:{id:a?t:i},properties:e.properties??{}});else await r.execute({kind:"mutate",mutation:{kind:"linkRecordsById",command:{relationType:s,direction:a?"in":"out",sourceIds:[t],targetIds:ee(e.targetIds),properties:e.properties??{}}}});return g({message:`Relations to Record ${t} have been successfully created`})}},{method:"PUT",pattern:new RegExp(`^/relationships/${T}$`),handle:async({body:e,params:[t],engine:r,txId:n})=>{_(n,"records.detach");let s=String(e.direction??"").toLowerCase();return await r.execute({kind:"mutate",mutation:{kind:"unlinkRecordsById",command:{relationTypes:ee(e.typeOrTypes).filter(Boolean),...s==="in"||s==="out"?{direction:s}:{},sourceIds:[t],targetIds:ee(e.targetIds)}}}),g({message:`Relations to Record ${t} have been successfully deleted`})}},{method:"POST",pattern:/^\/relationships\/create-many$/,handle:async({body:e,engine:t,txId:r})=>(_(r,"relationships.createMany"),await t.execute({kind:"mutate",mutation:{kind:"linkRecords",command:je(e)}}),g({message:"Relations have been successfully created"}))},{method:"POST",pattern:/^\/relationships\/delete-many$/,handle:async({body:e,engine:t,txId:r})=>(_(r,"relationships.deleteMany"),await t.execute({kind:"mutate",mutation:{kind:"unlinkRecords",command:je(e)}}),g({message:"Relations have been successfully deleted"}))},{method:"POST",pattern:/^\/relationships\/search$/,handle:async({body:e,engine:t})=>{let r=await t.execute({kind:"query",query:{kind:"relationships",query:{sourceLabels:e.source?.labels??[],targetLabels:e.target?.labels??[],relationType:e.where?.type,predicate:Object.fromEntries(Object.entries(e.where??{}).filter(([n])=>n!=="type")),sourcePredicate:te(e.source?.where)?void 0:e.source.where,targetPredicate:te(e.target?.where)?void 0:e.target.where,offset:e.skip??0,limit:e.limit}}});return g(r.relationships??[],{total:r.total??0})}},{method:"GET",pattern:/^\/relationships\/patterns$/,handle:q("relationships.patterns.list")},{method:"POST",pattern:/^\/relationships\/patterns\/analyze$/,handle:q("relationships.patterns.analyze")},{method:"POST",pattern:new RegExp(`^/relationships/patterns/${T}/approve$`),handle:q("relationships.patterns.approve")},{method:"POST",pattern:new RegExp(`^/relationships/patterns/${T}/ignore$`),handle:q("relationships.patterns.ignore")},{method:"DELETE",pattern:new RegExp(`^/relationships/patterns/${T}$`),handle:q("relationships.patterns.delete")},{method:"POST",pattern:/^\/properties\/search$/,handle:async({body:e,engine:t})=>g(await Ke(t,{labels:e.labels??[],where:e.where??{}}))},{method:"GET",pattern:new RegExp(`^/properties/${T}$`),handle:async({params:[e],engine:t})=>{let r=await Ue(t,e);if(!r)throw D(404,`property \`${e}\` does not exist`);return g(r)}},{method:"DELETE",pattern:new RegExp(`^/properties/${T}$`),handle:async({params:[e],engine:t,txId:r})=>{_(r,"properties.delete");let n=await Ue(t,e);if(!n)throw D(404,`property \`${e}\` does not exist`);return await t.execute({kind:"mutate",mutation:{kind:"deleteProperty",name:n.name}}),g({message:`Property (${e}) has been successfully deleted.`})}},{method:"POST",pattern:new RegExp(`^/properties/${T}/values$`),handle:async({body:e,params:[t],engine:r})=>{let n=!!e.query||!!e.limit,s=await r.execute({kind:"query",query:{kind:"propertyValues",property:t,query:N({labels:e.labels??[],where:e.where??{}}),...n?{mode:"topK",limit:e.limit??100}:{},...e.query?{search:{text:e.query,match:e.match??"contains",...e.domainOnMiss?{domainOnMiss:e.domainOnMiss}:{},...e.minSimilarity!==void 0?{minSimilarity:e.minSimilarity}:{}}}:{}}});return g({values:s.values??[],...s.counts?.length?{counts:s.counts}:{},...n&&s.distinctCount!==void 0?{distinctCount:s.distinctCount}:{},...s.searchMissed?{searchMissed:!0}:{}})}},{method:"POST",pattern:/^\/labels\/search$/,handle:async({body:e,engine:t})=>{let r=await t.execute({kind:"describe",describe:{kind:"labels",query:N(e)}}),n={};for(let s of r.labels??[])n[s]=(await Ne(t,{...e,labels:[s],skip:0,limit:1})).total;return g(n)}},{method:"POST",pattern:/^\/tx$/,handle:async({body:e,engine:t})=>{let r=await t.execute({kind:"transaction",transaction:{kind:"begin",ttlMs:e.ttl,autocommit:e.autocommit??!1}});return g({id:r.transactionId})}},{method:"GET",pattern:new RegExp(`^/tx/${T}$`),handle:async({params:[e]})=>g({id:e})},{method:"POST",pattern:new RegExp(`^/tx/${T}/commit$`),handle:async({params:[e],engine:t})=>{let r=await t.execute({kind:"transaction",transaction:{kind:"commit",transactionId:e}});if(r.status!=="committed")throw D(409,`Transaction commit failed: ${r.reason??r.status}`);return g({message:`Transaction (${e}) has been successfully committed.`})}},{method:"POST",pattern:new RegExp(`^/tx/${T}/rollback$`),handle:async({params:[e],engine:t})=>(await t.execute({kind:"transaction",transaction:{kind:"rollback",transactionId:e}}),g({message:`Transaction (${e}) has been rolled back.`}))},{method:"POST",pattern:/^\/query\/raw$/,handle:async({body:e,engine:t,txId:r})=>{_(r,"query.raw");let n=await t.execute({kind:"query",query:{kind:"statement",language:"cypher",statement:e.query,parameters:e.params??null}});return g({records:n.rows??[]})}},{method:"GET",pattern:/^\/text-indexes$/,handle:async({engine:e})=>g(await we(e))},{method:"POST",pattern:/^\/text-indexes$/,handle:async({body:e,engine:t})=>{let r=new Set((await Re(t)).map(s=>String(s.name)));if(e.name!==void 0&&r.has(e.name))throw D(409,`An index named "${e.name}" already exists`);let n=await t.execute({kind:"index",index:{kind:"create",definition:{name:e.name??ye(_e(e),r),label:e.label,property:e.property,kind:"text",consistency:e.consistency??"eventual"}}});return g(Qe(n.index))}},{method:"POST",pattern:/^\/text-indexes\/name-suggestion$/,handle:async({body:e,engine:t})=>{let r=new Set((await Re(t)).map(n=>String(n.name)));return g({name:ye(_e(e),r)})}},{method:"DELETE",pattern:new RegExp(`^/text-indexes/${T}$`),handle:async({params:[e],engine:t})=>{let r=decodeURIComponent(e);if(!(await we(t)).some(n=>n.name===r))throw D(404,`No text index named "${r}"`);return await t.execute({kind:"index",index:{kind:"drop",name:r}}),g({deleted:!0})}},{method:"POST",pattern:/^\/search\/text$/,handle:async({body:e,engine:t})=>{if(typeof e.query!="string"||e.query.trim()==="")throw D(422,"query is required");let r=await We(t,e,e.labels??[]),n=await t.execute({kind:"query",query:{kind:"hybrid",query:{labels:e.labels?.length?e.labels:[r.label],predicate:e.where??{},text:{index:r.index,query:r.query,allTerms:r.allTerms,phrase:r.phrase},offset:e.skip??0,limit:e.limit??10}}}),s=se(n.records);return g(s,{total:n.textSearch?.matches??s.length,meta:{textSearch:n.textSearch}})}},{method:"POST",pattern:/^\/ai\/schema$/,handle:async({body:e,engine:t})=>g(await ge(t,e.labels,K))},{method:"POST",pattern:/^\/ai\/schema\/md$/,handle:async({body:e,engine:t})=>g($e(await ge(t,e.labels,K)))},{method:"POST",pattern:/^\/ai\/sql-search$/,handle:q("ai.search")},{method:"POST",pattern:/^\/records\/sql-search$/,handle:q("ai.runSql")},{method:"POST",pattern:/^\/ai\/search$/,handle:bt},{method:"GET",pattern:/^\/ai\/indexes$/,handle:async({engine:e})=>g((await Q(e)).map(K))},{method:"POST",pattern:/^\/ai\/indexes$/,handle:async({body:e,engine:t})=>{if(e.sourceType!=="external")throw new V("ai.indexes.create",Z["ai.indexes.create"]);let r=Number(e.dimensions);if(!Number.isInteger(r)||r<1||r>4096)throw D(422,"dimensions must be an integer between 1 and 4096");let n=e.similarityFunction??"cosine",s=await Q(t),a=s.find(c=>c.label===e.label&&c.property===e.propertyName&&c.similarity===n&&Number(c.dimensions)===r);if(a)throw D(409,`An embedding index for label "${e.label}", property "${e.propertyName}", sourceType "external", similarityFunction "${n}", and dimensions ${r} already exists ("${a.name}")`);let i=new Set(s.map(c=>String(c.name)));if(e.name!==void 0&&i.has(e.name))throw D(409,`An embedding index named "${e.name}" already exists`);let o=await t.execute({kind:"index",index:{kind:"createVector",definition:{label:e.label,property:e.propertyName,dimensions:r,similarity:n,name:e.name??ye(yt(e,r,n),i)}}});return g(K(o.index))}},{method:"DELETE",pattern:new RegExp(`^/ai/indexes/${T}$`),handle:async({params:[e],engine:t})=>(await t.execute({kind:"index",index:{kind:"dropVector",name:decodeURIComponent(e)}}),g({deleted:!0,queued:!1}))},{method:"GET",pattern:new RegExp(`^/ai/indexes/${T}/stats$`),handle:async({params:[e],engine:t})=>{let r=await t.execute({kind:"describe",describe:{kind:"vectorIndex",name:decodeURIComponent(e)}});return g({...r.stats,index:K(r.stats?.index??{})})}},{method:"POST",pattern:new RegExp(`^/ai/indexes/${T}/vectors/upsert$`),handle:async({body:e,params:[t],engine:r})=>{let n=await r.execute({kind:"index",index:{kind:"upsertVectors",name:decodeURIComponent(t),items:e.items??[]}});return g({updated:n.updated,requested:n.requested})}},{method:"POST",pattern:/^\/ai\/values\/search$/,handle:async({body:e,engine:t})=>{let r=await t.execute({kind:"query",query:{kind:"searchValues",search:{text:e.text,match:e.match??"contains",...e.caseSensitive?{caseSensitive:!0}:{},...e.minSimilarity!==void 0?{minSimilarity:e.minSimilarity}:{}},...e.labels?.length?{labels:e.labels}:{},...e.limit?{limit:e.limit}:{}}});return g({matches:r.matches??[],total:r.total??0,...r.skipped?{skipped:r.skipped}:{}})}},{method:"POST",pattern:/^\/ai\/schema\/summary$/,handle:async({body:e,engine:t})=>{let r=await t.execute({kind:"describe",describe:{kind:"schemaSummary",...e.labels?.length?{labels:e.labels}:{},...e.fewValues!==void 0?{fewValues:e.fewValues}:{}}});return g(r.labels??[])}},{method:"POST",pattern:/^\/ai\/schema\/names$/,handle:async({body:e,engine:t})=>{let r=await t.execute({kind:"describe",describe:{kind:"names",text:e.text,...e.limit?{limit:e.limit}:{}}});return g(r.names??[])}},{method:"POST",pattern:/^\/ai\/schema\/join-candidates$/,handle:q("ai.getJoinCandidates")},{method:"GET",pattern:/^\/sdk\/settings$/,handle:q("settings.get")}],Yt=Ye.map(e=>`${e.method} ${e.pattern.source}`),Je=e=>async(t,{method:r="GET",headers:n,requestData:s})=>{let a=new URL(String(t),"http://direct"),i=Ye.filter(p=>p.method===r&&p.pattern.test(a.pathname)).sort((p,h)=>p.pattern.source.split("(").length-h.pattern.source.split("(").length)[0];if(!i)throw new H(`${r} ${a.pathname} has no direct-mode mapping`);let o=(i.pattern.exec(a.pathname)??[]).slice(1),c=n?.["x-transaction-id"];return await i.handle({body:s??{},params:o,query:a.searchParams,txId:c,engine:e})};var Dt={"Content-Type":"application/json"},Ge=({httpClient:e,token:t,url:r})=>async(n,{headers:s,...a})=>{let i=await e.makeRequest(`${r}${n}`,{credentials:"omit",headers:Object.assign({...Dt,...s},typeof t<"u"?{Authorization:`Bearer ${t}`}:{}),...a});if(i.getStatusCode()>=200&&i.getStatusCode()<300)return await i.toJSON();let o="",c;try{let h=await i.toJSON();c=h;let d=h?.message??h?.error;Array.isArray(d)?o=d.join("; "):typeof d=="string"&&(o=d)}catch{}let p=new Error(o?`${i.getStatusCode()} ${o}`:`${i.getStatusCode()}`);throw p.status=i.getStatusCode(),p.body=c,p};var C=class{constructor(t){this.id=t}async rollback(){return await f.getInstance().tx.rollback(this.id)}async commit(){return await f.getInstance().tx.commit(this.id)}};var ze="api.rushdb.com";var Xe="https",Ze="/api/v1";var S=e=>e?{"x-transaction-id":e}:void 0,Pt=e=>A(e)||e instanceof C,y=e=>Pt(e)?e instanceof C?e.id:e:void 0,et=e=>/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/.test(e),P=e=>{if(A(e)&&et(e))return e;if(e instanceof R&&e.data)return e.data.__id;if(x(e)&&"__id"in e&&et(e.__id))return e.__id},L=e=>!(!x(e)||x(e)&&"name"in e&&!A(e.name)||x(e)&&"type"in e&&(!A(e.type)||!be.includes(e.type))||!("value"in e)||!le(e.value)||"metadata"in e&&!A(e.metadata)||"valueSeparator"in e&&!A(e.valueSeparator)),tt=e=>{let t=Xe,r=ze,n=443,s=Ze;if("url"in e){let i=new URL(e.url);t=i.protocol.replace(":",""),r=i.hostname,n=parseInt(i.port||(t==="http"?"80":t==="https"?"443":""))}"host"in e&&"port"in e&&"protocol"in e&&(t=e.protocol.replace(":",""),r=e.host,n=e.port),s&&!s.startsWith("/")&&(s="/"+s);let a="";return t==="http"&&n===80||t==="https"&&n===443||(a=":"+n),`${t}://${r}${a}${s}`},m=(e=8)=>{let t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",r="";for(let n=0;n<e;n++){let s=Math.floor(Math.random()*t.length);r+=t[s]}return r};var F=class{constructor(t,r){this.records={attach:async({source:t,target:r,options:n},s)=>{let a=y(s),o=`/relationships/${P(t)}`,c={headers:Object.assign({},S(a)),method:"POST",requestData:{targetIds:this._extractTargetIds(r,"Attach"),...n?.type&&{type:n.type},...n?.direction&&{direction:n.direction},...n?.properties&&{properties:n.properties}}},p=typeof this.logger=="function"?m():"";this.logger?.({requestId:p,path:o,...c});let h=await this.fetcher(o,c);return this.logger?.({requestId:p,path:o,...c,responseData:h.data}),h},detach:async({source:t,target:r,options:n},s)=>{let a=y(s),o=`/relationships/${P(t)}`,c={headers:Object.assign({},S(a)),method:"PUT",requestData:{targetIds:this._extractTargetIds(r,"Detach"),...n?.typeOrTypes&&{typeOrTypes:n.typeOrTypes},...n?.direction&&{direction:n.direction}}},p=typeof this.logger=="function"?m():"";this.logger?.({requestId:p,path:o,...c});let h=await this.fetcher(o,c);return this.logger?.({requestId:p,path:o,...c,responseData:h.data}),h},create:async({label:t,data:r,options:n,vectors:s},a)=>{let i=y(a),o="/records",c={headers:Object.assign({},S(i)),method:"POST",requestData:{}},p=typeof this.logger=="function"?m():"",h=U(B(r));if(w(h)&&h.every(L))c.requestData={label:t,properties:h,options:n,...s?.length&&{vectors:s}};else if(M(h))c.requestData={label:t,data:h,options:n,...s?.length&&{vectors:s}};else throw x(h)?new Error("Provided data is not a flat object. Consider using the `importJson` method for nested objects or arrays of nested objects, or use `createMany` for arrays of flat objects."):new Error("Provided data is not valid.");this.logger?.({requestId:p,path:o,...c});let d=await this.fetcher(o,c);return this.logger?.({requestId:p,path:o,...c,responseData:d.data}),d?.success&&d?.data?new R(d.data):new R},createMany:async(t,r)=>{let n=w(t.data)?t.data:[t.data];if(!n.every(l=>M(l)))throw new Error("records.createMany supports only flat records (no nested objects/arrays). Use records.importJson for nested JSON.");let a=t.vectors?w(t.vectors[0])?t.vectors:[t.vectors]:void 0;if(a&&a.length>n.length)throw new Error(`records.createMany: vectors length (${a.length}) exceeds the number of data rows (${n.length}).`);let i=a?.length?n.map((l,u)=>a[u]?.length?{...l,$vectors:a[u]}:l):n,o=y(r),c="/records/import/json",p={headers:Object.assign({},S(o)),method:"POST",requestData:{label:t.label,data:i,options:t.options}},h=typeof this.logger=="function"?m():"";this.logger?.({requestId:h,path:c,...p});let d=await this.fetcher(c,p);if(this.logger?.({requestId:h,path:c,...p,responseData:d.data}),d?.success&&d?.data){let l=w(d.data)?d.data?.map(u=>new R(u)):[];return new I(l,d.total)}return new I([])},importJson:async(t,r)=>{let{data:n,options:s}=t,{label:a}=t,i=n;if(!a){let l=x(n)&&!w(n)?U(n):n;if(Ee(l))throw new Error("records.importJson: Missing `label`. Provide `label` for top-level arrays or objects with primitive top-level properties, or pass a container object whose top-level values are objects or arrays, e.g. { ITEM: [...], USER: [...] }.")}let o=y(r),c="/records/import/json",p={headers:Object.assign({},S(o)),method:"POST",requestData:{label:a,data:i,options:s}},h=typeof this.logger=="function"?m():"";this.logger?.({requestId:h,path:c,...p});let d=await this.fetcher(c,p);if(this.logger?.({requestId:h,path:c,...p,responseData:d.data}),d?.success&&d?.data){let l=w(d.data)?d.data?.map(u=>new R(u)):[];return new I(l,d.total)}return new I([])},importCsv:async(t,r)=>{let n=y(r),s="/records/import/csv",a={headers:Object.assign({},S(n)),method:"POST",requestData:t},i=typeof this.logger=="function"?m():"";this.logger?.({requestId:i,path:s,...a});let o=await this.fetcher(s,a);if(this.logger?.({requestId:i,path:s,...a,responseData:o.data}),o?.success&&o?.data){let c=w(o.data)?o.data.map(p=>new R(p)):[];return new I(c,o.total)}return new I([])},delete:async(t,r)=>{if(j(t.where)&&!this?.options?.allowForceDelete)throw new O("You must specify criteria to delete records. Empty criteria are not allowed. If this was intentional, use the Dashboard instead.");let n=y(r),s="/records/delete",a={headers:Object.assign({},S(n)),method:"POST",requestData:t??{}},i=typeof this.logger=="function"?m():"";this.logger?.({requestId:i,path:s,...a});let o=await this.fetcher(s,a);return this.logger?.({requestId:i,path:s,...a,responseData:o.data}),o},deleteById:async(t,r)=>{let n=y(r),s=w(t),a=s?"/records/delete":`/records/${t}`,i={headers:Object.assign({},S(n)),method:s?"POST":"DELETE",requestData:s?{limit:1e3,where:{$id:{$in:t}}}:void 0},o=typeof this.logger=="function"?m():"";this.logger?.({requestId:o,path:a,...i});let c=await this.fetcher(a,i);return this.logger?.({requestId:o,path:a,...i,responseData:c.data}),c},export:async(t,r)=>{let n=y(r),s="/records/export/csv",a={headers:Object.assign({},S(n)),method:"POST",requestData:t??{}},i=typeof this.logger=="function"?m():"";this.logger?.({requestId:i,path:s,...a});let o=await this.fetcher(s,a);return this.logger?.({requestId:i,path:s,...a,responseData:o.data}),o},find:async(t,r)=>{let{id:n,...s}=t,a=y(r),i=n?`/records/${n}/search`:"/records/search",o={headers:Object.assign({},S(a)),method:"POST",requestData:s??{}},c=typeof this.logger=="function"?m():"";this.logger?.({requestId:c,path:i,...o});let p=await this.fetcher(i,o);this.logger?.({requestId:c,path:i,...o,responseData:p.data});let h=p.data.map(d=>new R(d));return new I(h,p.total,t)},vectorSearch:async(t,r)=>{let n=y(r),s="/ai/search",a={method:"POST",headers:Object.assign({},S(n)),requestData:t},i=typeof this.logger=="function"?m():"";this.logger?.({requestId:i,path:s,...a});let o=await this.fetcher(s,a);this.logger?.({requestId:i,path:s,...a,responseData:o.data});let c=(o.data??[]).map(h=>new R(h)),p=new I(c,o.total??0);return p.vectorSearch=o.meta?.vectorSearch,p.textSearch=o.meta?.textSearch,p.fusion=o.meta?.fusion,p},textSearch:async(t,r)=>{let n=y(r),s="/search/text",a={method:"POST",headers:Object.assign({},S(n)),requestData:t},i=typeof this.logger=="function"?m():"";this.logger?.({requestId:i,path:s,...a});let o=await this.fetcher(s,a);this.logger?.({requestId:i,path:s,...a,responseData:o.data});let c=(o.data??[]).map(h=>new R(h)),p=new I(c,o.total??0);return p.textSearch=o.meta?.textSearch,p},findById:async(t,r)=>{let n=y(r),s=w(t)?"/records/search":`/records/${t}`,a={headers:Object.assign({},S(n)),method:w(t)?"POST":"GET",requestData:w(t)?{where:{$id:{$in:t}},limit:t.length}:void 0},i=typeof this.logger=="function"?m():"";this.logger?.({requestId:i,path:s,...a});let o=await this.fetcher(s,a);if(this.logger?.({requestId:i,path:s,...a,responseData:o.data}),w(t)){let c=o.data.map(p=>new R(p));return new I(c,o.total)}else return new R(o.data)},findOne:async(t,r)=>{let n=y(r),s="/records/search",a={headers:Object.assign({},S(n)),method:"POST",requestData:{...t,limit:1,skip:0}},i=typeof this.logger=="function"?m():"";this.logger?.({requestId:i,path:s,...a});let o=await this.fetcher(s,a);this.logger?.({requestId:i,path:s,...a,responseData:o.data});let[c]=o.data;return new R(c)},findUniq:async(t,r)=>{let n=y(r),s="/records/search",a={headers:Object.assign({},S(n)),method:"POST",requestData:{...t,limit:1,skip:0}},i=typeof this.logger=="function"?m():"";this.logger?.({requestId:i,path:s,...a});let o=await this.fetcher(s,a);if(this.logger?.({requestId:i,path:s,...a,responseData:o.data}),typeof o.total<"u"&&o.total>1)throw new J(o.total,t);let[c]=o.data;return new R(c)},set:async({target:t,label:r,data:n,options:s,vectors:a},i)=>{let o=y(i),p=`/records/${P(t)}`,h={headers:Object.assign({},S(o)),method:"PUT",requestData:{}},d=typeof this.logger=="function"?m():"",l=U(B(n));if(w(l)&&l.every(L))h.requestData={label:r,properties:l,...a?.length&&{vectors:a}};else if(M(l))h.requestData={label:r,data:l,options:s,...a?.length&&{vectors:a}};else throw x(l)?new Error("Provided data is not a flat object. Consider to use `importJson` method."):new Error("Provided data is not valid.");this.logger?.({requestId:d,path:p,...h});let u=await this.fetcher(p,h);return this.logger?.({requestId:d,path:p,...h,responseData:u.data}),u?.success&&u?.data?new R(u.data):new R},update:async({target:t,label:r,data:n,options:s},a)=>{let i=P(t),o=y(a),c=`/records/${i}`,p={headers:Object.assign({},S(o)),method:"PATCH",requestData:{}},h=typeof this.logger=="function"?m():"",d=U(B(n));if(w(d)&&d.every(L))p.requestData={label:r,properties:d};else if(M(d))p.requestData={label:r,data:d,options:s};else throw x(d)?new Error("Provided data is not a flat object. Consider to use `importJson` method."):new Error("Provided data is not valid.");this.logger?.({requestId:h,path:c,...p});let l=await this.fetcher(c,p);return this.logger?.({requestId:h,path:c,...p,responseData:l.data}),l?.success&&l?.data?new R(l.data):new R},upsert:async({label:t,data:r,options:n,vectors:s},a)=>{let i=y(a),o="/records",c={headers:Object.assign({},S(i)),method:"POST",requestData:{}},p=typeof this.logger=="function"?m():"",h=U(B(r)),d={...n,mergeBy:n?.mergeBy??[]};if(w(h)&&h.every(L))c.requestData={label:t,properties:h,options:d,...s?.length&&{vectors:s}};else if(M(h))c.requestData={label:t,data:h,options:d,...s?.length&&{vectors:s}};else throw x(h)?new Error("Provided data is not a flat object. Upsert supports flat objects or property drafts array."):new Error("Provided data is not valid.");this.logger?.({requestId:p,path:o,...c});let l=await this.fetcher(o,c);return this.logger?.({requestId:p,path:o,...c,responseData:l.data}),l?.success&&l?.data?new R(l.data):new R}};this.relationships={patterns:{list:async()=>{let t="/relationships/patterns",r={method:"GET",headers:{}},n=typeof this.logger=="function"?m():"";this.logger?.({requestId:n,path:t,...r});let s=await this.fetcher(t,r);return this.logger?.({requestId:n,path:t,...r,responseData:s.data}),s},analyze:async()=>{let t="/relationships/patterns/analyze",r={method:"POST",headers:{},requestData:{}},n=typeof this.logger=="function"?m():"";this.logger?.({requestId:n,path:t,...r});let s=await this.fetcher(t,r);return this.logger?.({requestId:n,path:t,...r,responseData:s.data}),s},approve:async t=>{let r=`/relationships/patterns/${encodeURIComponent(t)}/approve`,n={method:"POST",headers:{},requestData:{}},s=typeof this.logger=="function"?m():"";this.logger?.({requestId:s,path:r,...n});let a=await this.fetcher(r,n);return this.logger?.({requestId:s,path:r,...n,responseData:a.data}),a},ignore:async t=>{let r=`/relationships/patterns/${encodeURIComponent(t)}/ignore`,n={method:"POST",headers:{},requestData:{}},s=typeof this.logger=="function"?m():"";this.logger?.({requestId:s,path:r,...n});let a=await this.fetcher(r,n);return this.logger?.({requestId:s,path:r,...n,responseData:a.data}),a},delete:async(t,r)=>{let n=r?.deleteExisting?"?deleteExisting=true":"",s=`/relationships/patterns/${encodeURIComponent(t)}${n}`,a={method:"DELETE",headers:{}},i=typeof this.logger=="function"?m():"";this.logger?.({requestId:i,path:s,...a});let o=await this.fetcher(s,a);return this.logger?.({requestId:i,path:s,...a,responseData:o.data}),o}},createMany:async(t,r)=>{let n=y(r),s="/relationships/create-many",a={headers:Object.assign({},S(n)),method:"POST",requestData:t??{}},i=typeof this.logger=="function"?m():"";this.logger?.({requestId:i,path:s,...a});let o=await this.fetcher(s,a);return this.logger?.({requestId:i,path:s,...a,responseData:o.data}),o},deleteMany:async(t,r)=>{let n=y(r),s="/relationships/delete-many",a={headers:Object.assign({},S(n)),method:"POST",requestData:t??{}},i=typeof this.logger=="function"?m():"";this.logger?.({requestId:i,path:s,...a});let o=await this.fetcher(s,a);return this.logger?.({requestId:i,path:s,...a,responseData:o.data}),o},find:async(t={},r)=>{let n=y(r),s="/relationships/search",a={headers:Object.assign({},S(n)),method:"POST",requestData:t??{}},i=typeof this.logger=="function"?m():"";this.logger?.({requestId:i,path:s,...a});let o=await this.fetcher(s,a);return this.logger?.({requestId:i,path:s,...a,responseData:o.data}),o}};this.properties={delete:async(t,r)=>{let n=y(r),s=`/properties/${t}`,a={headers:Object.assign({},S(n)),method:"DELETE"},i=typeof this.logger=="function"?m():"";this.logger?.({requestId:i,path:s,...a});let o=await this.fetcher(s,a);return this.logger?.({requestId:i,path:s,...a,responseData:o.data}),o},find:async(t,r)=>{let n=y(r),s="/properties/search",a={headers:Object.assign({},S(n)),method:"POST",requestData:t??{}},i=typeof this.logger=="function"?m():"";this.logger?.({requestId:i,path:s,...a});let o=await this.fetcher(s,a);return this.logger?.({requestId:i,path:s,...a,responseData:o.data}),o},findById:async(t,r)=>{let n=y(r),s=`/properties/${t}`,a={headers:Object.assign({},S(n)),method:"GET"},i=typeof this.logger=="function"?m():"";this.logger?.({requestId:i,path:s,...a});let o=await this.fetcher(s,a);return this.logger?.({requestId:i,path:s,...a,responseData:o.data}),o},values:async(t,r,n)=>{let s=y(n),a=`/properties/${t}/values`,i={headers:Object.assign({},S(s)),method:"POST",requestData:r??{}},o=typeof this.logger=="function"?m():"";this.logger?.({requestId:o,path:a,...i});let c=await this.fetcher(a,i);return this.logger?.({requestId:o,path:a,...i,responseData:c.data}),c}};this.labels={find:async(t,r)=>{let n=y(r),s="/labels/search",a={headers:Object.assign({},S(n)),method:"POST",requestData:t??{}},i=typeof this.logger=="function"?m():"";this.logger?.({requestId:i,path:s,...a});let o=await this.fetcher(s,a);return this.logger?.({requestId:i,path:s,...a,responseData:o.data}),o}};this.tx={begin:async t=>{let r="/tx",n={method:"POST",requestData:x(t)?t:{}},s=typeof this.logger=="function"?m():"";this.logger?.({requestId:s,path:r,...n});let a=await this.fetcher(r,n);return this.logger?.({requestId:s,path:r,...n,responseData:a.data}),new C(a.data.id)},commit:async t=>{let n=`/tx/${y(t)}/commit`,s={method:"POST",requestData:{}},a=typeof this.logger=="function"?m():"";this.logger?.({requestId:a,path:n,...s});let i=await this.fetcher(n,s);return this.logger?.({requestId:a,path:n,...s,responseData:i.data}),i},get:async t=>{let n=`/tx/${y(t)}`,s={method:"GET"},a=typeof this.logger=="function"?m():"";this.logger?.({requestId:a,path:n,...s});let i=await this.fetcher(n,s);return this.logger?.({requestId:a,path:n,...s,responseData:i.data}),new C(i.data.id)},rollback:async t=>{let n=`/tx/${y(t)}/rollback`,s={method:"POST",requestData:{}},a=typeof this.logger=="function"?m():"";this.logger?.({requestId:a,path:n,...s});let i=await this.fetcher(n,s);return this.logger?.({requestId:a,path:n,...s,responseData:i.data}),i}};this.settings={get:async()=>{let t="/sdk/settings",r={method:"GET"},n=typeof this.logger=="function"?m():"";this.logger?.({requestId:n,path:t,...r});let s=await this.fetcher(t,r);return this.logger?.({requestId:n,path:t,...r,responseData:s.data}),s}};this.query={raw:async({query:t,params:r},n)=>{let s=y(n),a="/query/raw",i={headers:Object.assign({},S(s)),method:"POST",requestData:{query:t,params:r}},o=typeof this.logger=="function"?m():"";this.logger?.({requestId:o,path:a,...i});let c=await this.fetcher(a,i);return this.logger?.({requestId:o,path:a,...i,responseData:c.data}),c}};this.textIndexes={find:async()=>this.textIndexRequest("/text-indexes","GET"),create:async t=>this.textIndexRequest("/text-indexes","POST",t),suggestName:async t=>this.textIndexRequest("/text-indexes/name-suggestion","POST",t),delete:async t=>this.textIndexRequest(`/text-indexes/${encodeURIComponent(t)}`,"DELETE")};this.ai={searchValues:async t=>{let r="/ai/values/search",n={headers:{},method:"POST",requestData:t},s=typeof this.logger=="function"?m():"";this.logger?.({requestId:s,path:r,...n});let a=await this.fetcher(r,n);return this.logger?.({requestId:s,path:r,...n,responseData:a.data}),a},getSchemaSummary:async t=>{let r="/ai/schema/summary",n={headers:{},method:"POST",requestData:t??{}},s=typeof this.logger=="function"?m():"";this.logger?.({requestId:s,path:r,...n});let a=await this.fetcher(r,n);return this.logger?.({requestId:s,path:r,...n,responseData:a.data}),a},resolveNames:async t=>{let r="/ai/schema/names",n={headers:{},method:"POST",requestData:t},s=typeof this.logger=="function"?m():"";this.logger?.({requestId:s,path:r,...n});let a=await this.fetcher(r,n);return this.logger?.({requestId:s,path:r,...n,responseData:a.data}),a},getJoinCandidates:async t=>{let r="/ai/schema/join-candidates",n={headers:{},method:"POST",requestData:t??{}},s=typeof this.logger=="function"?m():"";this.logger?.({requestId:s,path:r,...n});let a=await this.fetcher(r,n);return this.logger?.({requestId:s,path:r,...n,responseData:a.data}),a},getSchema:async(t,r)=>{let n=y(r),s="/ai/schema",a={headers:Object.assign({},S(n)),method:"POST",requestData:t??{}},i=typeof this.logger=="function"?m():"";this.logger?.({requestId:i,path:s,...a});let o=await this.fetcher(s,a);return this.logger?.({requestId:i,path:s,...a,responseData:o.data}),o},getSchemaMarkdown:async(t,r)=>{let n=y(r),s="/ai/schema/md",a={headers:Object.assign({},S(n)),method:"POST",requestData:t??{}},i=typeof this.logger=="function"?m():"";this.logger?.({requestId:i,path:s,...a});let o=await this.fetcher(s,a);return this.logger?.({requestId:i,path:s,...a,responseData:o.data}),o},indexes:{find:async()=>{let t="/ai/indexes",r={method:"GET",headers:{}},n=typeof this.logger=="function"?m():"";this.logger?.({requestId:n,path:t,...r});let s=await this.fetcher(t,r);return this.logger?.({requestId:n,path:t,...r,responseData:s.data}),s},create:async t=>{let r="/ai/indexes",{external:n,...s}=t,a=n===!0?{...s,sourceType:"external"}:s,i={method:"POST",headers:{},requestData:a},o=typeof this.logger=="function"?m():"";this.logger?.({requestId:o,path:r,...i});let c=await this.fetcher(r,i);return this.logger?.({requestId:o,path:r,...i,responseData:c.data}),c},upsertVectors:async(t,r)=>{let n=`/ai/indexes/${t}/vectors/upsert`,s={method:"POST",headers:{},requestData:r},a=typeof this.logger=="function"?m():"";this.logger?.({requestId:a,path:n,...s});let i=await this.fetcher(n,s);return this.logger?.({requestId:a,path:n,...s,responseData:i.data}),i},delete:async t=>{let r=`/ai/indexes/${t}`,n={method:"DELETE",headers:{}},s=typeof this.logger=="function"?m():"";this.logger?.({requestId:s,path:r,...n});let a=await this.fetcher(r,n);return this.logger?.({requestId:s,path:r,...n,responseData:a.data}),a},stats:async t=>{let r=`/ai/indexes/${t}/stats`,n={method:"GET",headers:{}},s=typeof this.logger=="function"?m():"";this.logger?.({requestId:s,path:r,...n});let a=await this.fetcher(r,n);return this.logger?.({requestId:s,path:r,...n,responseData:a.data}),a}},search:async(t,r)=>{let n="/ai/sql-search",s={method:"POST",headers:{},requestData:{prompt:t}},a=typeof this.logger=="function"?m():"";this.logger?.({requestId:a,path:n,...s});let i=await this.fetcher(n,s);this.logger?.({requestId:a,path:n,...s,responseData:i.data});let o=await this.ai.runSql(i.data.sql,r);return o.name=i.data.name,o.warnings=i.data.warnings,o},runSql:async(t,r)=>{let n={skip:r?.skip??0,limit:r?.limit??100},s="/records/sql-search",a={method:"POST",headers:{},requestData:{sql:t,...n}},i=typeof this.logger=="function"?m():"";this.logger?.({requestId:i,path:s,...a});let o=await this.fetcher(s,a);this.logger?.({requestId:i,path:s,...a,responseData:o.data});let c=new I((o.data??[]).map(p=>new R(p)),o.total??0);return c.sql=t,c.sqlPage=n,c}};if(this.fetcher=null,r?.direct){if(!r.engineUrl)throw new Error("Direct mode requires `engineUrl`, the standalone engine base URL.");if(!r.httpClient)throw new Error("Direct mode requires an HTTP client; import the SDK from its Node or browser entry.");this.direct=new z({engineUrl:r.engineUrl,token:t??"",httpClient:r.httpClient,scope:r.scope}),this.fetcher=Je(this.direct)}else if(r?.httpClient){let n=tt(r);this.fetcher=Ge({httpClient:r.httpClient,token:t,url:n})}r?.options&&(this.options=r?.options),r?.logger&&(this.logger=r?.logger)}_extractTargetIds(t,r){if(t instanceof R){let n=P(t);if(!n)throw new O(`${r} error: Target id is empty`);return[n]}if(w(t)&&t.every(n=>n instanceof R)){let n=t.map(P).filter(b);if(!n.length)throw new O(`${r} error: Target ids are empty`);return n}if(t instanceof I){let n=t.data?.map(P).filter(b);if(!n?.length)throw new O(`${r} error: Target ids are empty`);return n}if(x(t)&&"__id"in t)return[t.__id];if(w(t)&&t.every(n=>x(n)&&"__id"in n)){let n=t.map(P).filter(b);if(!n.length)throw new O(`${r} error: Target ids are empty`);return n}return w(t)?t:A(t)?[t]:[]}async textIndexRequest(t,r,n){let s={method:r,headers:{},...n===void 0?{}:{requestData:n}},a=typeof this.logger=="function"?m():"";this.logger?.({requestId:a,path:t,...s});let i=await this.fetcher(t,s);return this.logger?.({requestId:a,path:t,...s,responseData:i.data}),i}};var rt,f=class e extends F{static{this.instance=null}static{this.state={initialized:!1,debug:!1,timeout:8e4}}constructor(t,r){let n=t??(typeof process<"u"?process.env?.RUSHDB_API_KEY:void 0),s=Ae(r);super(n,{...s,httpClient:s.httpClient??rt}),e.instance=this,this.initializeSync(n,s)}initializeSync(t,r){e.state={initialized:!0,debug:!1,timeout:qe("timeout",r?.timeout,8e4),token:t,direct:r?.direct===!0,engineUrl:r?.engineUrl}}static getInstance(){if(e.instance)return e.instance;throw new Error('RushDB not initialized. Please create a RushDB instance first: new RushDB("RUSHDB_API_KEY")')}static isInitialized(){return b(e.instance)}toDBRecordInstance(t){return new R(t)}},nt=e=>{rt=e};var st=class{constructor(t,r,n){this.label=t,this.schema=r,this.config=n??{}}getLabel(){return this.label}async toDBRecordInstance(t){try{return f.getInstance().toDBRecordInstance(t)}catch{throw new Error("No RushDB instance was provided during model initialization.")}}async find(t,r){let n=t??{};return f.getInstance().records.find({...n,labels:[this.label]},r)}async findOne(t,r){let n=t??{};return f.getInstance().records.findOne({...n,labels:[this.label]},r)}async findById(t,r){return this.findOne({where:{$id:t}},r)}async findUniq(t,r){let n=t??{};return f.getInstance().records.findUniq({...n,labels:[this.label]},r)}async create(t,r,n){let s=await G(this.schema,t),a=ue(this.schema,s),i=b(a),o=f.getInstance();if(i){let c=r??await o.tx.begin(),p=await this.find({where:a},c),h=typeof r<"u";if(!p?.data?.length){let l=await o.records.create({label:this.label,data:s},c);return h||await c.commit(),l}else switch(n?.onConflict??"throw"){case"upsert":{let u=p.data[0],E=await o.records.set({target:u.id,label:this.label,data:s},c);return h||await c.commit(),E}case"skip":return h||await c.commit(),null;default:throw h||await c.commit(),new $(this.label,a)}}return await o.records.create({label:this.label,data:s},r)}async attach({source:t,target:r,options:n},s){return await f.getInstance().records.attach({source:t,target:r,options:n},s)}async detach({source:t,target:r,options:n},s){return await f.getInstance().records.detach({source:t,target:r,options:n},s)}async validateTargetLabel(t,r){let n=P(t);if(!n)return;let a=await f.getInstance().records.findById(n,r);if(!a)throw new Error(`Record with id "${n}" not found.`);if(a.data.__label!==this.label)throw new TypeError(`Target record label "${a.data.__label}" does not match model label "${this.label}".`)}async handleSetOrUpdate(t,r,n,s){if(this.config.validateTargetLabel&&await this.validateTargetLabel(t,s),w(r)&&r.every(L))return await f.getInstance().records[n]({label:this.label,target:t,data:r},s);let a=f.getInstance(),i=await G(this.schema,r),o=ue(this.schema,i);if(!j(o)){let c=s??await a.tx.begin(),p=await this.find({where:o},c),h=typeof s<"u";if(!p?.data?.length||p.data.length===1&&p.data[0]?.id===P(t)){let l=await a.records[n]({target:t,label:this.label,data:i},c);return h||await c.commit(),l}else throw h||await c.commit(),new $(this.label,o)}return await a.records[n]({label:this.label,target:t,data:i},s)}async set(t,r,n){return await this.handleSetOrUpdate(t,r,"set",n)}async update(t,r,n){return await this.handleSetOrUpdate(t,r,"update",n)}async createMany(t,r){let n=f.getInstance(),s=typeof r<"u",a=r??await n.tx.begin();try{let i=await Promise.all(t.map(async p=>await G(this.schema,p))),o=Oe(i,this.schema,this.label);if(!j(o)){let p=Object.entries(o).map(([d,l])=>({[d]:{$in:l}}));if((await this.find({where:{$or:p}},a))?.data?.length)throw new $(this.label,Object.keys(o))}let c=await n.records.createMany({label:this.label,data:i},a);return s||await a.commit(),c}catch(i){throw s||await a.rollback(),i}}async delete(t,r){if(j(t.where))throw new O(`You must specify criteria to delete records of type '${this.label}'. Empty criteria are not allowed. If this was intentional, use the Dashboard instead.`);return await f.getInstance().records.delete({...t,labels:[this.label]},r)}async deleteById(t,r){return await f.getInstance().records.deleteById(t,r)}};nt(new Y);var $r=f;export{Z as CLOUD_ONLY_FORMS,X as CLOUD_ONLY_METHODS,V as CloudOnlyError,R as DBRecordInstance,I as DBRecordsArrayInstance,H as DirectModeError,O as EmptyTargetError,k as HttpClient,oe as HttpClientResponse,st as Model,J as NonUniqueResultError,F as RestAPI,f as RushDB,C as Transaction,$ as UniquenessError,$r as default,ke as idToDate,me as idToTimestamp,nt as initSDK,mt as isCloudOnlyMethod,G as mergeDefaultsWithPayload,Ae as parseConfig,ue as pickUniqFieldsFromRecord,Oe as pickUniqFieldsFromRecords,qe as validateInteger};
27
+ `}}return i.trim()};var g=(e,t={})=>({success:!0,data:e,...t}),D=(e,t)=>{let r=new Error(`${e} ${t}`);return r.status=e,r.body={statusCode:e,message:t},r},q=e=>async()=>{throw new V(e,Z[e])},k=(e,t)=>{if(e)throw new H(`${t} inside a transaction is not supported in direct mode: the engine stages record creates, updates, deletes, links and imports. Run it outside the transaction.`)},Me="__RUSHDB__RELATION__DEFAULT__",v=(e,t,r)=>e.execute({kind:"transaction",transaction:{kind:"stage",transactionId:t,mutation:r}}),fe=async(e,t,r)=>{let{record:n}=await v(e,t,{kind:"getRecord",record:{id:r}});return{...n?.properties??{},__id:r,__label:n?.__label,__proptypes:{}}},Ve=(e,t)=>{e&&Array.isArray(t)&&t.length>0&&k(e,"A write with inline vectors")},ne=e=>{if(!e)return e;let t={...e.properties??{}};return t.__id=e.id,t.__label=e.label,t.__proptypes=e.propertyTypes??{},e.score!==void 0&&(t.__score=e.score),t},se=e=>(e??[]).map(t=>ne(t)),Se=e=>e.data&&typeof e.data=="object"&&!Array.isArray(e.data)?e.data:Array.isArray(e.properties)?Object.fromEntries(e.properties.map(t=>[t.name,t.value])):e.properties&&typeof e.properties=="object"?e.properties:{},gt=e=>e==null||typeof e=="object"&&!Array.isArray(e)&&Object.keys(e).length===0?"desc":typeof e!="object"||Array.isArray(e)?e:Object.fromEntries(Object.entries(e).map(([t,r])=>[t==="__id"?"id":t,r])),N=(e={})=>{let t=e.pagination??{},r={labels:e.labels??[],predicate:e.where??{},select:e.select,order:gt(e.orderBy),offset:e.skip??t.skip??0,limit:e.limit??t.limit};return Array.isArray(e.groupBy)&&e.groupBy.length>0&&(r.groupBy=e.groupBy),r},te=e=>e==null||typeof e=="object"&&!Array.isArray(e)&&Object.keys(e).length===0,xe=async(e,t)=>(await e.execute({kind:"query",query:{kind:"record",id:t}})).record,Ne=async(e,t)=>{let r=await e.execute({kind:"query",query:{kind:"records",query:N(t)}});return r.kind==="rows"?{data:r.rows??[],total:r.total??0}:{data:se(r.records),total:r.total??0}},Q=async e=>(await e.execute({kind:"describe",describe:{kind:"vectorIndexes"}})).indexes??[],Re=async e=>(await e.execute({kind:"describe",describe:{kind:"indexes"}})).indexes??[],K=e=>{let t=Number(e.dimensions??0);return{id:e.name,name:e.name,label:e.label,propertyName:e.property,vectorPropertyName:`_emb_external_${e.similarity}_${t}`,similarityFunction:e.similarity,dimensions:t,sourceType:"external",status:e.status}},Qe=e=>({name:e.name,label:e.label,property:e.property,consistency:e.consistency??"eventual",status:e.state,pending:e.pending??0}),we=async e=>(await Re(e)).filter(t=>t.kind==="text").map(Qe),Fe=64,He=e=>e.join(".").slice(0,Fe).replace(/[.:-]+$/,""),re=e=>e.replace(/[^A-Za-z0-9_-]/g,"-"),ye=(e,t)=>{if(!t.has(e))return e;for(let r=2;;r++){let n=`-${r}`,s=e.slice(0,Fe-n.length)+n;if(!t.has(s))return s}},_e=({label:e,property:t})=>He([re(e),t==="*"?"all":re(t),"text"]),yt=(e,t,r)=>He([re(e.label),re(e.propertyName),"external",String(t),r]).replace(/^emb__/,"emb_"),ae=async(e,t,r,n)=>{if(!Array.isArray(t)||t.length===0)return[];let s=n??await Q(e);return t.map(a=>{if(typeof a?.index=="string")return a;if(!r)throw D(422,"inline vectors require a record label to select their index");let i=Array.isArray(a.vector)?a.vector.length:void 0,o=s.filter(c=>c.label===r&&c.property===a.propertyName&&(a.similarityFunction===void 0||c.similarity===a.similarityFunction)&&(i===void 0||Number(c.dimensions)===i));if(o.length!==1)throw D(o.length===0?404:422,o.length===0?`No vector index matches label "${r}", property "${a.propertyName}"`:`${o.length} vector indexes match label "${r}", property "${a.propertyName}"; name one with \`index\``);return{...a,index:o[0].name}})},ft=async(e,t,r)=>{let n=Array.isArray(t)?t:[t],s=o=>Array.isArray(o?.$vectors)&&o.$vectors.length>0;if(!n.some(s))return t;let a=await Q(e),i=await Promise.all(n.map(async o=>s(o)?{...o,$vectors:await ae(e,o.$vectors,r,a)}:o));return Array.isArray(t)?i:i[0]},St=()=>{let e=new Uint8Array(16);if(typeof globalThis.crypto?.getRandomValues=="function")globalThis.crypto.getRandomValues(e);else for(let n=0;n<16;n++)e[n]=Math.floor(Math.random()*256);let t=Date.now();for(let n=0;n<6;n++)e[n]=Math.floor(t/2**(8*(5-n)))&255;e[6]=e[6]&15|112,e[8]=e[8]&63|128;let r=Array.from(e,n=>n.toString(16).padStart(2,"0")).join("");return`${r.slice(0,8)}-${r.slice(8,12)}-${r.slice(12,16)}-${r.slice(16,20)}-${r.slice(20)}`},Rt=async({body:e,engine:t,txId:r})=>{let n=!!e.options?.mergeStrategy||Array.isArray(e.options?.mergeBy),s=Se(e);if(r){n&&k(r,"An upsert"),Ve(r,e.vectors);let o=St();return await v(t,r,{kind:"createRecord",label:e.label,id:o,properties:s,options:e.options??{}}),g(await fe(t,r,o))}let a=n?{...e.options,mergeBy:e.options?.mergeBy??[]}:e.options??{},i=await t.execute({kind:"mutate",mutation:{kind:"putRecord",mode:"create",label:e.label,properties:s,vectors:await ae(t,e.vectors,e.label),options:a}});return g(ne(i.record))},Ce=e=>async({body:t,params:[r],engine:n,txId:s})=>{let a=typeof t.label=="string"&&t.label?t.label:void 0;if(s){if(Ve(s,t.vectors),a){let c=await fe(n,s,r);c.__label&&c.__label!==a&&await v(n,s,{kind:"retypeRecord",record:{id:r},fromLabel:c.__label,toLabel:a})}return await v(n,s,{kind:"updateRecord",record:{id:r},properties:Se(t),replace:e==="replace"}),g(await fe(n,s,r))}let i=a;if(a||t.vectors?.length){let c=await xe(n,r);a&&c?.label&&c.label!==a&&await n.execute({kind:"mutate",mutation:{kind:"retypeRecord",id:r,fromLabel:c.label,toLabel:a}}),i=a??c?.label}let o=await n.execute({kind:"mutate",mutation:{kind:"putRecord",mode:e,id:r,properties:Se(t),vectors:await ae(n,t.vectors,i),options:t.options??{}}});return g(ne(o.record))},wt=async(e,t,r)=>{if(!t)return r;let n;try{n=(await xe(e,t))?.label}catch(i){if(i?.status===404)return;throw i}let s={[n]:{$id:t}},a=r.where;return{...r,where:te(a)?s:{$and:[a,s]}}},Be=async({body:e,params:[t],engine:r})=>{let n=await wt(r,t,e);if(!n)return g([],{total:0});let{data:s,total:a}=await Ne(r,n);return g(s,{total:a})},ve=(e,t,r)=>t?v(e,t,{kind:"ingest",ingest:r}):e.execute({kind:"ingest",ingest:r}),Le=(e,t)=>t&&e.records?.length?g(se(e.records)):g({message:"Records have been successfully imported",count:Number(e.count??0)}),xt=["delimiter","header","skipEmptyLines","dynamicTyping","quoteChar","escapeChar","newline"],je=e=>({relationType:e.type??Me,direction:String(e.direction??"").toLowerCase()==="in"?"in":"out",allowCartesian:e.manyToMany??!1,properties:e.properties??{},source:{label:e.source?.label,property:e.source?.key,predicate:e.source?.where??{}},target:{label:e.target?.label,property:e.target?.key,predicate:e.target?.where??{}}}),W=e=>Array.isArray(e)?e:[e],Tt=e=>{let t=new Map;for(let r of e){let n=t.get(r.id);if(n){n.recordsCount+=Number(r.recordsCount??0),n.isArray||=r.isArray===!0;continue}t.set(r.id,{id:r.id,name:r.name,type:r.type,recordsCount:Number(r.recordsCount??0),isArray:r.isArray===!0})}return Array.from(t.values(),({isArray:r,...n})=>({...n,metadata:JSON.stringify({cardinality:r?"OrderedMany":"Single",nullability:"Nullable"})}))},Ke=async(e,t={})=>{let r=await e.execute({kind:"describe",describe:{kind:"properties",query:N(t),...te(t.where)?{detail:"catalog"}:{}}});return Tt(r.properties??[])},Ue=async(e,t)=>{let r=(await Ke(e)).find(n=>n.name===t||n.id===t);return r&&{...r,id:r.id??r.name}},We=async(e,t,r)=>{if(typeof t.query!="string"||t.query.trim()==="")throw D(422,"text.query is required");let n=await we(e),s;if(t.index!==void 0){if(s=n.find(a=>a.name===t.index),!s)throw D(404,`No text index named "${t.index}"`)}else{let a=r[0];if(!a)throw D(422,"Name a text index with `index`, or give `labels`");let i=n.filter(o=>o.label===a&&o.status==="ready"&&(t.property===void 0||o.property===t.property));if(i.length===0)throw D(404,`No ready text index on label "${a}"`);if(i.length>1)throw D(422,`Label "${a}" has several text indexes (${i.map(o=>o.name).join(", ")}); name one with \`index\``);s=i[0]}return{index:s.name,label:s.label,query:t.query,allTerms:t.allTerms??!1,phrase:t.phrase??!1}},bt=async({body:e,engine:t})=>{let r=e.queryVector??[];if(r.length===0)throw new V("records.vectorSearch",ee["records.vectorSearch"]);let n=await Q(t),s;if(typeof e.index=="string"){if(s=n.find(d=>d.name===e.index),!s)throw D(404,`No vector index named "${e.index}"`)}else{let d=(e.labels??[])[0],l=n.filter(m=>m.label===d&&m.property===e.propertyName&&(e.similarityFunction===void 0||m.similarity===e.similarityFunction)&&Number(m.dimensions)===(e.dimensions??r.length));if(l.length!==1)throw D(l.length===0?404:422,l.length===0?`No vector index matches label "${d}", property "${e.propertyName}"`:`${l.length} vector indexes match label "${d}", property "${e.propertyName}"; name one with \`index\``);s=l[0]}let a=e.labels?.length?e.labels:[s.label],i={property:s.property,vector:r,similarity:s.similarity??"cosine",index:s.name,mode:e.mode,ef:e.ef,scoreThreshold:e.scoreThreshold},o=e.text?await We(t,{...e.text,query:e.text.query??e.query},a):void 0,c=o?{kind:"hybrid",query:{labels:a,predicate:e.where??{},vector:{...i,weight:e.weight,prefetchLimit:e.prefetchLimit},text:{index:o.index,query:o.query,allTerms:o.allTerms,phrase:o.phrase,weight:e.text.weight,prefetchLimit:e.text.prefetchLimit},fusion:e.fusion,rrfK:e.rrfK,offset:e.skip??0,limit:e.limit??10}}:{kind:"vector",query:{...i,labels:a,predicate:e.where??{},offset:e.skip??0,limit:e.limit??10}},p=await t.execute({kind:"query",query:c}),h=se(p.records);return g(h,{total:h.length,meta:{vectorSearch:p.vectorSearch,textSearch:p.textSearch,fusion:p.fusion}})},T="([^/]+)",Ye=[{method:"GET",pattern:new RegExp(`^/records/${T}$`),handle:async({params:[e],engine:t})=>g(ne(await xe(t,e)))},{method:"POST",pattern:/^\/records$/,handle:Rt},{method:"PATCH",pattern:new RegExp(`^/records/${T}$`),handle:Ce("merge")},{method:"PUT",pattern:new RegExp(`^/records/${T}$`),handle:Ce("replace")},{method:"DELETE",pattern:new RegExp(`^/records/${T}$`),handle:async({params:[e],engine:t,txId:r})=>(r?await v(t,r,{kind:"deleteRecord",record:{id:e}}):await t.execute({kind:"mutate",mutation:{kind:"deleteRecord",id:e}}),g({message:"Record deleted"}))},{method:"POST",pattern:/^\/records\/delete$/,handle:async({body:e,engine:t,txId:r})=>{k(r,"records.delete");let n=await t.execute({kind:"mutate",mutation:{kind:"deleteRecords",query:N(e)}});return g({message:`${n.affected??0} records deleted`})}},{method:"POST",pattern:/^\/records\/search$/,handle:Be},{method:"POST",pattern:new RegExp(`^/records/${T}/search$`),handle:Be},{method:"POST",pattern:/^\/records\/import\/json$/,handle:async({body:e,engine:t,txId:r})=>{let n=await ve(t,r,{kind:"documents",label:e.label,documents:await ft(t,e.data,e.label),options:e.options??{}});return Le(n,e.options?.returnResult)}},{method:"POST",pattern:/^\/records\/import\/csv$/,handle:async({body:e,engine:t,txId:r})=>{let n=e.vectors?.length?await Q(t):[],s=await Promise.all((e.vectors??[]).map(o=>ae(t,o,e.label,n))),a=Object.fromEntries(Object.entries(e.parseConfig??{}).filter(([o])=>xt.includes(o))),i=await ve(t,r,{kind:"csv",label:e.label,data:e.data??"",parseConfig:a,options:e.options??{},vectors:s});return Number(i.count??0)===0?g(!0):Le(i,e.options?.returnResult)}},{method:"POST",pattern:/^\/records\/export\/csv$/,handle:async({body:e,engine:t})=>{let r=await t.execute({kind:"query",query:{kind:"exportCsv",query:N({labels:e.labels,where:e.where,orderBy:e.orderBy,skip:typeof e.skip=="number"?e.skip:0,limit:typeof e.limit=="number"?e.limit:100})}});return g({fileContent:r.content,dateTime:new Date().toISOString()})}},{method:"POST",pattern:new RegExp(`^/relationships/${T}$`),handle:async({body:e,params:[t],engine:r,txId:n})=>{let s=e.type??Me,a=String(e.direction??"").toLowerCase()==="in";if(n)for(let i of W(e.targetIds))await v(r,n,{kind:"createRelationship",relationType:s,source:{id:a?i:t},target:{id:a?t:i},properties:e.properties??{}});else await r.execute({kind:"mutate",mutation:{kind:"linkRecordsById",command:{relationType:s,direction:a?"in":"out",sourceIds:[t],targetIds:W(e.targetIds),properties:e.properties??{}}}});return g({message:`Relations to Record ${t} have been successfully created`})}},{method:"PUT",pattern:new RegExp(`^/relationships/${T}$`),handle:async({body:e,params:[t],engine:r,txId:n})=>{k(n,"records.detach");let s=String(e.direction??"").toLowerCase();return await r.execute({kind:"mutate",mutation:{kind:"unlinkRecordsById",command:{relationTypes:W(e.typeOrTypes).filter(Boolean),...s==="in"||s==="out"?{direction:s}:{},sourceIds:[t],targetIds:W(e.targetIds)}}}),g({message:`Relations to Record ${t} have been successfully deleted`})}},{method:"PATCH",pattern:new RegExp(`^/relationships/${T}$`),handle:async({body:e,params:[t],engine:r,txId:n})=>{k(n,"relationships.update");let s=await r.execute({kind:"mutate",mutation:{kind:"updateRelationshipsById",command:{relationType:e.type,direction:String(e.direction??"").toLowerCase()==="in"?"in":"out",sourceIds:[t],targetIds:W(e.targetIds),set:e.set??{},unset:e.unset??[],...e.types&&Object.keys(e.types).length>0&&{types:e.types}}}}),a=Number(s?.affected??0);return g({message:`${a} relationship${a===1?"":"s"} of Record ${t} updated`,updated:a})}},{method:"POST",pattern:/^\/relationships\/create-many$/,handle:async({body:e,engine:t,txId:r})=>(k(r,"relationships.createMany"),await t.execute({kind:"mutate",mutation:{kind:"linkRecords",command:je(e)}}),g({message:"Relations have been successfully created"}))},{method:"POST",pattern:/^\/relationships\/delete-many$/,handle:async({body:e,engine:t,txId:r})=>(k(r,"relationships.deleteMany"),await t.execute({kind:"mutate",mutation:{kind:"unlinkRecords",command:je(e)}}),g({message:"Relations have been successfully deleted"}))},{method:"POST",pattern:/^\/relationships\/search$/,handle:async({body:e,engine:t})=>{let r=await t.execute({kind:"query",query:{kind:"relationships",query:{sourceLabels:e.source?.labels??[],targetLabels:e.target?.labels??[],relationType:e.where?.type,predicate:Object.fromEntries(Object.entries(e.where??{}).filter(([n])=>n!=="type")),sourcePredicate:te(e.source?.where)?void 0:e.source.where,targetPredicate:te(e.target?.where)?void 0:e.target.where,offset:e.skip??0,limit:e.limit}}});return g(r.relationships??[],{total:r.total??0})}},{method:"GET",pattern:/^\/relationships\/patterns$/,handle:q("relationships.patterns.list")},{method:"POST",pattern:/^\/relationships\/patterns\/analyze$/,handle:q("relationships.patterns.analyze")},{method:"POST",pattern:new RegExp(`^/relationships/patterns/${T}/approve$`),handle:q("relationships.patterns.approve")},{method:"POST",pattern:new RegExp(`^/relationships/patterns/${T}/ignore$`),handle:q("relationships.patterns.ignore")},{method:"DELETE",pattern:new RegExp(`^/relationships/patterns/${T}$`),handle:q("relationships.patterns.delete")},{method:"POST",pattern:/^\/properties\/search$/,handle:async({body:e,engine:t})=>g(await Ke(t,{labels:e.labels??[],where:e.where??{}}))},{method:"GET",pattern:new RegExp(`^/properties/${T}$`),handle:async({params:[e],engine:t})=>{let r=await Ue(t,e);if(!r)throw D(404,`property \`${e}\` does not exist`);return g(r)}},{method:"DELETE",pattern:new RegExp(`^/properties/${T}$`),handle:async({params:[e],engine:t,txId:r})=>{k(r,"properties.delete");let n=await Ue(t,e);if(!n)throw D(404,`property \`${e}\` does not exist`);return await t.execute({kind:"mutate",mutation:{kind:"deleteProperty",name:n.name}}),g({message:`Property (${e}) has been successfully deleted.`})}},{method:"POST",pattern:new RegExp(`^/properties/${T}/values$`),handle:async({body:e,params:[t],engine:r})=>{let n=!!e.query||!!e.limit,s=await r.execute({kind:"query",query:{kind:"propertyValues",property:t,query:N({labels:e.labels??[],where:e.where??{}}),...n?{mode:"topK",limit:e.limit??100}:{},...e.query?{search:{text:e.query,match:e.match??"contains",...e.domainOnMiss?{domainOnMiss:e.domainOnMiss}:{},...e.minSimilarity!==void 0?{minSimilarity:e.minSimilarity}:{}}}:{}}});return g({values:s.values??[],...s.counts?.length?{counts:s.counts}:{},...n&&s.distinctCount!==void 0?{distinctCount:s.distinctCount}:{},...s.searchMissed?{searchMissed:!0}:{}})}},{method:"POST",pattern:/^\/labels\/search$/,handle:async({body:e,engine:t})=>{let r=await t.execute({kind:"describe",describe:{kind:"labels",query:N(e)}}),n={};for(let s of r.labels??[])n[s]=(await Ne(t,{...e,labels:[s],skip:0,limit:1})).total;return g(n)}},{method:"POST",pattern:/^\/tx$/,handle:async({body:e,engine:t})=>{let r=await t.execute({kind:"transaction",transaction:{kind:"begin",ttlMs:e.ttl,autocommit:e.autocommit??!1}});return g({id:r.transactionId})}},{method:"GET",pattern:new RegExp(`^/tx/${T}$`),handle:async({params:[e]})=>g({id:e})},{method:"POST",pattern:new RegExp(`^/tx/${T}/commit$`),handle:async({params:[e],engine:t})=>{let r=await t.execute({kind:"transaction",transaction:{kind:"commit",transactionId:e}});if(r.status!=="committed")throw D(409,`Transaction commit failed: ${r.reason??r.status}`);return g({message:`Transaction (${e}) has been successfully committed.`})}},{method:"POST",pattern:new RegExp(`^/tx/${T}/rollback$`),handle:async({params:[e],engine:t})=>(await t.execute({kind:"transaction",transaction:{kind:"rollback",transactionId:e}}),g({message:`Transaction (${e}) has been rolled back.`}))},{method:"POST",pattern:/^\/query\/raw$/,handle:async({body:e,engine:t,txId:r})=>{k(r,"query.raw");let n=await t.execute({kind:"query",query:{kind:"statement",language:"cypher",statement:e.query,parameters:e.params??null}});return g({records:n.rows??[]})}},{method:"GET",pattern:/^\/text-indexes$/,handle:async({engine:e})=>g(await we(e))},{method:"POST",pattern:/^\/text-indexes$/,handle:async({body:e,engine:t})=>{let r=new Set((await Re(t)).map(s=>String(s.name)));if(e.name!==void 0&&r.has(e.name))throw D(409,`An index named "${e.name}" already exists`);let n=await t.execute({kind:"index",index:{kind:"create",definition:{name:e.name??ye(_e(e),r),label:e.label,property:e.property,kind:"text",consistency:e.consistency??"eventual"}}});return g(Qe(n.index))}},{method:"POST",pattern:/^\/text-indexes\/name-suggestion$/,handle:async({body:e,engine:t})=>{let r=new Set((await Re(t)).map(n=>String(n.name)));return g({name:ye(_e(e),r)})}},{method:"DELETE",pattern:new RegExp(`^/text-indexes/${T}$`),handle:async({params:[e],engine:t})=>{let r=decodeURIComponent(e);if(!(await we(t)).some(n=>n.name===r))throw D(404,`No text index named "${r}"`);return await t.execute({kind:"index",index:{kind:"drop",name:r}}),g({deleted:!0})}},{method:"POST",pattern:/^\/search\/text$/,handle:async({body:e,engine:t})=>{if(typeof e.query!="string"||e.query.trim()==="")throw D(422,"query is required");let r=await We(t,e,e.labels??[]),n=await t.execute({kind:"query",query:{kind:"hybrid",query:{labels:e.labels?.length?e.labels:[r.label],predicate:e.where??{},text:{index:r.index,query:r.query,allTerms:r.allTerms,phrase:r.phrase},offset:e.skip??0,limit:e.limit??10}}}),s=se(n.records);return g(s,{total:n.textSearch?.matches??s.length,meta:{textSearch:n.textSearch}})}},{method:"POST",pattern:/^\/ai\/schema$/,handle:async({body:e,engine:t})=>g(await ge(t,e.labels,K))},{method:"POST",pattern:/^\/ai\/schema\/md$/,handle:async({body:e,engine:t})=>g($e(await ge(t,e.labels,K)))},{method:"POST",pattern:/^\/ai\/sql-search$/,handle:q("ai.search")},{method:"POST",pattern:/^\/records\/sql-search$/,handle:q("ai.runSql")},{method:"POST",pattern:/^\/ai\/search$/,handle:bt},{method:"GET",pattern:/^\/ai\/indexes$/,handle:async({engine:e})=>g((await Q(e)).map(K))},{method:"POST",pattern:/^\/ai\/indexes$/,handle:async({body:e,engine:t})=>{if(e.sourceType!=="external")throw new V("ai.indexes.create",ee["ai.indexes.create"]);let r=Number(e.dimensions);if(!Number.isInteger(r)||r<1||r>4096)throw D(422,"dimensions must be an integer between 1 and 4096");let n=e.similarityFunction??"cosine",s=await Q(t),a=s.find(c=>c.label===e.label&&c.property===e.propertyName&&c.similarity===n&&Number(c.dimensions)===r);if(a)throw D(409,`An embedding index for label "${e.label}", property "${e.propertyName}", sourceType "external", similarityFunction "${n}", and dimensions ${r} already exists ("${a.name}")`);let i=new Set(s.map(c=>String(c.name)));if(e.name!==void 0&&i.has(e.name))throw D(409,`An embedding index named "${e.name}" already exists`);let o=await t.execute({kind:"index",index:{kind:"createVector",definition:{label:e.label,property:e.propertyName,dimensions:r,similarity:n,name:e.name??ye(yt(e,r,n),i)}}});return g(K(o.index))}},{method:"DELETE",pattern:new RegExp(`^/ai/indexes/${T}$`),handle:async({params:[e],engine:t})=>(await t.execute({kind:"index",index:{kind:"dropVector",name:decodeURIComponent(e)}}),g({deleted:!0,queued:!1}))},{method:"GET",pattern:new RegExp(`^/ai/indexes/${T}/stats$`),handle:async({params:[e],engine:t})=>{let r=await t.execute({kind:"describe",describe:{kind:"vectorIndex",name:decodeURIComponent(e)}});return g({...r.stats,index:K(r.stats?.index??{})})}},{method:"POST",pattern:new RegExp(`^/ai/indexes/${T}/vectors/upsert$`),handle:async({body:e,params:[t],engine:r})=>{let n=await r.execute({kind:"index",index:{kind:"upsertVectors",name:decodeURIComponent(t),items:e.items??[]}});return g({updated:n.updated,requested:n.requested})}},{method:"POST",pattern:/^\/ai\/values\/search$/,handle:async({body:e,engine:t})=>{let r=await t.execute({kind:"query",query:{kind:"searchValues",search:{text:e.text,match:e.match??"contains",...e.caseSensitive?{caseSensitive:!0}:{},...e.minSimilarity!==void 0?{minSimilarity:e.minSimilarity}:{}},...e.labels?.length?{labels:e.labels}:{},...e.limit?{limit:e.limit}:{}}});return g({matches:r.matches??[],total:r.total??0,...r.skipped?{skipped:r.skipped}:{}})}},{method:"POST",pattern:/^\/ai\/schema\/summary$/,handle:async({body:e,engine:t})=>{let r=await t.execute({kind:"describe",describe:{kind:"schemaSummary",...e.labels?.length?{labels:e.labels}:{},...e.fewValues!==void 0?{fewValues:e.fewValues}:{}}});return g(r.labels??[])}},{method:"POST",pattern:/^\/ai\/schema\/names$/,handle:async({body:e,engine:t})=>{let r=await t.execute({kind:"describe",describe:{kind:"names",text:e.text,...e.limit?{limit:e.limit}:{}}});return g(r.names??[])}},{method:"POST",pattern:/^\/ai\/schema\/join-candidates$/,handle:q("ai.getJoinCandidates")},{method:"GET",pattern:/^\/sdk\/settings$/,handle:q("settings.get")}],Yt=Ye.map(e=>`${e.method} ${e.pattern.source}`),Je=e=>async(t,{method:r="GET",headers:n,requestData:s})=>{let a=new URL(String(t),"http://direct"),i=Ye.filter(p=>p.method===r&&p.pattern.test(a.pathname)).sort((p,h)=>p.pattern.source.split("(").length-h.pattern.source.split("(").length)[0];if(!i)throw new H(`${r} ${a.pathname} has no direct-mode mapping`);let o=(i.pattern.exec(a.pathname)??[]).slice(1),c=n?.["x-transaction-id"];return await i.handle({body:s??{},params:o,query:a.searchParams,txId:c,engine:e})};var Dt={"Content-Type":"application/json"},Ge=({httpClient:e,token:t,url:r})=>async(n,{headers:s,...a})=>{let i=await e.makeRequest(`${r}${n}`,{credentials:"omit",headers:Object.assign({...Dt,...s},typeof t<"u"?{Authorization:`Bearer ${t}`}:{}),...a});if(i.getStatusCode()>=200&&i.getStatusCode()<300)return await i.toJSON();let o="",c;try{let h=await i.toJSON();c=h;let d=h?.message??h?.error;Array.isArray(d)?o=d.join("; "):typeof d=="string"&&(o=d)}catch{}let p=new Error(o?`${i.getStatusCode()} ${o}`:`${i.getStatusCode()}`);throw p.status=i.getStatusCode(),p.body=c,p};var C=class{constructor(t){this.id=t}async rollback(){return await f.getInstance().tx.rollback(this.id)}async commit(){return await f.getInstance().tx.commit(this.id)}};var ze="api.rushdb.com";var Xe="https",Ze="/api/v1";var S=e=>e?{"x-transaction-id":e}:void 0,Pt=e=>A(e)||e instanceof C,y=e=>Pt(e)?e instanceof C?e.id:e:void 0,et=e=>/^[0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}$/.test(e),P=e=>{if(A(e)&&et(e))return e;if(e instanceof R&&e.data)return e.data.__id;if(x(e)&&"__id"in e&&et(e.__id))return e.__id},L=e=>!(!x(e)||x(e)&&"name"in e&&!A(e.name)||x(e)&&"type"in e&&(!A(e.type)||!be.includes(e.type))||!("value"in e)||!le(e.value)||"metadata"in e&&!A(e.metadata)||"valueSeparator"in e&&!A(e.valueSeparator)),tt=e=>{let t=Xe,r=ze,n=443,s=Ze;if("url"in e){let i=new URL(e.url);t=i.protocol.replace(":",""),r=i.hostname,n=parseInt(i.port||(t==="http"?"80":t==="https"?"443":""))}"host"in e&&"port"in e&&"protocol"in e&&(t=e.protocol.replace(":",""),r=e.host,n=e.port),s&&!s.startsWith("/")&&(s="/"+s);let a="";return t==="http"&&n===80||t==="https"&&n===443||(a=":"+n),`${t}://${r}${a}${s}`},u=(e=8)=>{let t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",r="";for(let n=0;n<e;n++){let s=Math.floor(Math.random()*t.length);r+=t[s]}return r};var F=class{constructor(t,r){this.records={attach:async({source:t,target:r,options:n},s)=>{let a=y(s),o=`/relationships/${P(t)}`,c={headers:Object.assign({},S(a)),method:"POST",requestData:{targetIds:this._extractTargetIds(r,"Attach"),...n?.type&&{type:n.type},...n?.direction&&{direction:n.direction},...n?.properties&&{properties:n.properties}}},p=typeof this.logger=="function"?u():"";this.logger?.({requestId:p,path:o,...c});let h=await this.fetcher(o,c);return this.logger?.({requestId:p,path:o,...c,responseData:h.data}),h},detach:async({source:t,target:r,options:n},s)=>{let a=y(s),o=`/relationships/${P(t)}`,c={headers:Object.assign({},S(a)),method:"PUT",requestData:{targetIds:this._extractTargetIds(r,"Detach"),...n?.typeOrTypes&&{typeOrTypes:n.typeOrTypes},...n?.direction&&{direction:n.direction}}},p=typeof this.logger=="function"?u():"";this.logger?.({requestId:p,path:o,...c});let h=await this.fetcher(o,c);return this.logger?.({requestId:p,path:o,...c,responseData:h.data}),h},create:async({label:t,data:r,options:n,vectors:s},a)=>{let i=y(a),o="/records",c={headers:Object.assign({},S(i)),method:"POST",requestData:{}},p=typeof this.logger=="function"?u():"",h=U(B(r));if(w(h)&&h.every(L))c.requestData={label:t,properties:h,options:n,...s?.length&&{vectors:s}};else if(M(h))c.requestData={label:t,data:h,options:n,...s?.length&&{vectors:s}};else throw x(h)?new Error("Provided data is not a flat object. Consider using the `importJson` method for nested objects or arrays of nested objects, or use `createMany` for arrays of flat objects."):new Error("Provided data is not valid.");this.logger?.({requestId:p,path:o,...c});let d=await this.fetcher(o,c);return this.logger?.({requestId:p,path:o,...c,responseData:d.data}),d?.success&&d?.data?new R(d.data):new R},createMany:async(t,r)=>{let n=w(t.data)?t.data:[t.data];if(!n.every(l=>M(l)))throw new Error("records.createMany supports only flat records (no nested objects/arrays). Use records.importJson for nested JSON.");let a=t.vectors?w(t.vectors[0])?t.vectors:[t.vectors]:void 0;if(a&&a.length>n.length)throw new Error(`records.createMany: vectors length (${a.length}) exceeds the number of data rows (${n.length}).`);let i=a?.length?n.map((l,m)=>a[m]?.length?{...l,$vectors:a[m]}:l):n,o=y(r),c="/records/import/json",p={headers:Object.assign({},S(o)),method:"POST",requestData:{label:t.label,data:i,options:t.options}},h=typeof this.logger=="function"?u():"";this.logger?.({requestId:h,path:c,...p});let d=await this.fetcher(c,p);if(this.logger?.({requestId:h,path:c,...p,responseData:d.data}),d?.success&&d?.data){let l=w(d.data)?d.data?.map(m=>new R(m)):[];return new I(l,d.total)}return new I([])},importJson:async(t,r)=>{let{data:n,options:s}=t,{label:a}=t,i=n;if(!a){let l=x(n)&&!w(n)?U(n):n;if(Ee(l))throw new Error("records.importJson: Missing `label`. Provide `label` for top-level arrays or objects with primitive top-level properties, or pass a container object whose top-level values are objects or arrays, e.g. { ITEM: [...], USER: [...] }.")}let o=y(r),c="/records/import/json",p={headers:Object.assign({},S(o)),method:"POST",requestData:{label:a,data:i,options:s}},h=typeof this.logger=="function"?u():"";this.logger?.({requestId:h,path:c,...p});let d=await this.fetcher(c,p);if(this.logger?.({requestId:h,path:c,...p,responseData:d.data}),d?.success&&d?.data){let l=w(d.data)?d.data?.map(m=>new R(m)):[];return new I(l,d.total)}return new I([])},importCsv:async(t,r)=>{let n=y(r),s="/records/import/csv",a={headers:Object.assign({},S(n)),method:"POST",requestData:t},i=typeof this.logger=="function"?u():"";this.logger?.({requestId:i,path:s,...a});let o=await this.fetcher(s,a);if(this.logger?.({requestId:i,path:s,...a,responseData:o.data}),o?.success&&o?.data){let c=w(o.data)?o.data.map(p=>new R(p)):[];return new I(c,o.total)}return new I([])},delete:async(t,r)=>{if(j(t.where)&&!this?.options?.allowForceDelete)throw new O("You must specify criteria to delete records. Empty criteria are not allowed. If this was intentional, use the Dashboard instead.");let n=y(r),s="/records/delete",a={headers:Object.assign({},S(n)),method:"POST",requestData:t??{}},i=typeof this.logger=="function"?u():"";this.logger?.({requestId:i,path:s,...a});let o=await this.fetcher(s,a);return this.logger?.({requestId:i,path:s,...a,responseData:o.data}),o},deleteById:async(t,r)=>{let n=y(r),s=w(t),a=s?"/records/delete":`/records/${t}`,i={headers:Object.assign({},S(n)),method:s?"POST":"DELETE",requestData:s?{limit:1e3,where:{$id:{$in:t}}}:void 0},o=typeof this.logger=="function"?u():"";this.logger?.({requestId:o,path:a,...i});let c=await this.fetcher(a,i);return this.logger?.({requestId:o,path:a,...i,responseData:c.data}),c},export:async(t,r)=>{let n=y(r),s="/records/export/csv",a={headers:Object.assign({},S(n)),method:"POST",requestData:t??{}},i=typeof this.logger=="function"?u():"";this.logger?.({requestId:i,path:s,...a});let o=await this.fetcher(s,a);return this.logger?.({requestId:i,path:s,...a,responseData:o.data}),o},find:async(t,r)=>{let{id:n,...s}=t,a=y(r),i=n?`/records/${n}/search`:"/records/search",o={headers:Object.assign({},S(a)),method:"POST",requestData:s??{}},c=typeof this.logger=="function"?u():"";this.logger?.({requestId:c,path:i,...o});let p=await this.fetcher(i,o);this.logger?.({requestId:c,path:i,...o,responseData:p.data});let h=p.data.map(d=>new R(d));return new I(h,p.total,t)},vectorSearch:async(t,r)=>{let n=y(r),s="/ai/search",a={method:"POST",headers:Object.assign({},S(n)),requestData:t},i=typeof this.logger=="function"?u():"";this.logger?.({requestId:i,path:s,...a});let o=await this.fetcher(s,a);this.logger?.({requestId:i,path:s,...a,responseData:o.data});let c=(o.data??[]).map(h=>new R(h)),p=new I(c,o.total??0);return p.vectorSearch=o.meta?.vectorSearch,p.textSearch=o.meta?.textSearch,p.fusion=o.meta?.fusion,p},textSearch:async(t,r)=>{let n=y(r),s="/search/text",a={method:"POST",headers:Object.assign({},S(n)),requestData:t},i=typeof this.logger=="function"?u():"";this.logger?.({requestId:i,path:s,...a});let o=await this.fetcher(s,a);this.logger?.({requestId:i,path:s,...a,responseData:o.data});let c=(o.data??[]).map(h=>new R(h)),p=new I(c,o.total??0);return p.textSearch=o.meta?.textSearch,p},findById:async(t,r)=>{let n=y(r),s=w(t)?"/records/search":`/records/${t}`,a={headers:Object.assign({},S(n)),method:w(t)?"POST":"GET",requestData:w(t)?{where:{$id:{$in:t}},limit:t.length}:void 0},i=typeof this.logger=="function"?u():"";this.logger?.({requestId:i,path:s,...a});let o=await this.fetcher(s,a);if(this.logger?.({requestId:i,path:s,...a,responseData:o.data}),w(t)){let c=o.data.map(p=>new R(p));return new I(c,o.total)}else return new R(o.data)},findOne:async(t,r)=>{let n=y(r),s="/records/search",a={headers:Object.assign({},S(n)),method:"POST",requestData:{...t,limit:1,skip:0}},i=typeof this.logger=="function"?u():"";this.logger?.({requestId:i,path:s,...a});let o=await this.fetcher(s,a);this.logger?.({requestId:i,path:s,...a,responseData:o.data});let[c]=o.data;return new R(c)},findUniq:async(t,r)=>{let n=y(r),s="/records/search",a={headers:Object.assign({},S(n)),method:"POST",requestData:{...t,limit:1,skip:0}},i=typeof this.logger=="function"?u():"";this.logger?.({requestId:i,path:s,...a});let o=await this.fetcher(s,a);if(this.logger?.({requestId:i,path:s,...a,responseData:o.data}),typeof o.total<"u"&&o.total>1)throw new G(o.total,t);let[c]=o.data;return new R(c)},set:async({target:t,label:r,data:n,options:s,vectors:a},i)=>{let o=y(i),p=`/records/${P(t)}`,h={headers:Object.assign({},S(o)),method:"PUT",requestData:{}},d=typeof this.logger=="function"?u():"",l=U(B(n));if(w(l)&&l.every(L))h.requestData={label:r,properties:l,...a?.length&&{vectors:a}};else if(M(l))h.requestData={label:r,data:l,options:s,...a?.length&&{vectors:a}};else throw x(l)?new Error("Provided data is not a flat object. Consider to use `importJson` method."):new Error("Provided data is not valid.");this.logger?.({requestId:d,path:p,...h});let m=await this.fetcher(p,h);return this.logger?.({requestId:d,path:p,...h,responseData:m.data}),m?.success&&m?.data?new R(m.data):new R},update:async({target:t,label:r,data:n,options:s},a)=>{let i=P(t),o=y(a),c=`/records/${i}`,p={headers:Object.assign({},S(o)),method:"PATCH",requestData:{}},h=typeof this.logger=="function"?u():"",d=U(B(n));if(w(d)&&d.every(L))p.requestData={label:r,properties:d};else if(M(d))p.requestData={label:r,data:d,options:s};else throw x(d)?new Error("Provided data is not a flat object. Consider to use `importJson` method."):new Error("Provided data is not valid.");this.logger?.({requestId:h,path:c,...p});let l=await this.fetcher(c,p);return this.logger?.({requestId:h,path:c,...p,responseData:l.data}),l?.success&&l?.data?new R(l.data):new R},upsert:async({label:t,data:r,options:n,vectors:s},a)=>{let i=y(a),o="/records",c={headers:Object.assign({},S(i)),method:"POST",requestData:{}},p=typeof this.logger=="function"?u():"",h=U(B(r)),d={...n,mergeBy:n?.mergeBy??[]};if(w(h)&&h.every(L))c.requestData={label:t,properties:h,options:d,...s?.length&&{vectors:s}};else if(M(h))c.requestData={label:t,data:h,options:d,...s?.length&&{vectors:s}};else throw x(h)?new Error("Provided data is not a flat object. Upsert supports flat objects or property drafts array."):new Error("Provided data is not valid.");this.logger?.({requestId:p,path:o,...c});let l=await this.fetcher(o,c);return this.logger?.({requestId:p,path:o,...c,responseData:l.data}),l?.success&&l?.data?new R(l.data):new R}};this.relationships={patterns:{list:async()=>{let t="/relationships/patterns",r={method:"GET",headers:{}},n=typeof this.logger=="function"?u():"";this.logger?.({requestId:n,path:t,...r});let s=await this.fetcher(t,r);return this.logger?.({requestId:n,path:t,...r,responseData:s.data}),s},analyze:async()=>{let t="/relationships/patterns/analyze",r={method:"POST",headers:{},requestData:{}},n=typeof this.logger=="function"?u():"";this.logger?.({requestId:n,path:t,...r});let s=await this.fetcher(t,r);return this.logger?.({requestId:n,path:t,...r,responseData:s.data}),s},approve:async t=>{let r=`/relationships/patterns/${encodeURIComponent(t)}/approve`,n={method:"POST",headers:{},requestData:{}},s=typeof this.logger=="function"?u():"";this.logger?.({requestId:s,path:r,...n});let a=await this.fetcher(r,n);return this.logger?.({requestId:s,path:r,...n,responseData:a.data}),a},ignore:async t=>{let r=`/relationships/patterns/${encodeURIComponent(t)}/ignore`,n={method:"POST",headers:{},requestData:{}},s=typeof this.logger=="function"?u():"";this.logger?.({requestId:s,path:r,...n});let a=await this.fetcher(r,n);return this.logger?.({requestId:s,path:r,...n,responseData:a.data}),a},delete:async(t,r)=>{let n=r?.deleteExisting?"?deleteExisting=true":"",s=`/relationships/patterns/${encodeURIComponent(t)}${n}`,a={method:"DELETE",headers:{}},i=typeof this.logger=="function"?u():"";this.logger?.({requestId:i,path:s,...a});let o=await this.fetcher(s,a);return this.logger?.({requestId:i,path:s,...a,responseData:o.data}),o}},createMany:async(t,r)=>{let n=y(r),s="/relationships/create-many",a={headers:Object.assign({},S(n)),method:"POST",requestData:t??{}},i=typeof this.logger=="function"?u():"";this.logger?.({requestId:i,path:s,...a});let o=await this.fetcher(s,a);return this.logger?.({requestId:i,path:s,...a,responseData:o.data}),o},deleteMany:async(t,r)=>{let n=y(r),s="/relationships/delete-many",a={headers:Object.assign({},S(n)),method:"POST",requestData:t??{}},i=typeof this.logger=="function"?u():"";this.logger?.({requestId:i,path:s,...a});let o=await this.fetcher(s,a);return this.logger?.({requestId:i,path:s,...a,responseData:o.data}),o},update:async({source:t,target:r,type:n,direction:s,set:a,unset:i,types:o})=>{let p=`/relationships/${P(t)}`,h={headers:{},method:"PATCH",requestData:{targetIds:this._extractTargetIds(r,"Update"),type:n,...s&&{direction:s},...a&&{set:a},...i&&{unset:i},...o&&Object.keys(o).length>0&&{types:o}}},d=typeof this.logger=="function"?u():"";this.logger?.({requestId:d,path:p,...h});let l=await this.fetcher(p,h);return this.logger?.({requestId:d,path:p,...h,responseData:l.data}),l},find:async(t={},r)=>{let n=y(r),s="/relationships/search",a={headers:Object.assign({},S(n)),method:"POST",requestData:t??{}},i=typeof this.logger=="function"?u():"";this.logger?.({requestId:i,path:s,...a});let o=await this.fetcher(s,a);return this.logger?.({requestId:i,path:s,...a,responseData:o.data}),o}};this.properties={delete:async(t,r)=>{let n=y(r),s=`/properties/${t}`,a={headers:Object.assign({},S(n)),method:"DELETE"},i=typeof this.logger=="function"?u():"";this.logger?.({requestId:i,path:s,...a});let o=await this.fetcher(s,a);return this.logger?.({requestId:i,path:s,...a,responseData:o.data}),o},find:async(t,r)=>{let n=y(r),s="/properties/search",a={headers:Object.assign({},S(n)),method:"POST",requestData:t??{}},i=typeof this.logger=="function"?u():"";this.logger?.({requestId:i,path:s,...a});let o=await this.fetcher(s,a);return this.logger?.({requestId:i,path:s,...a,responseData:o.data}),o},findById:async(t,r)=>{let n=y(r),s=`/properties/${t}`,a={headers:Object.assign({},S(n)),method:"GET"},i=typeof this.logger=="function"?u():"";this.logger?.({requestId:i,path:s,...a});let o=await this.fetcher(s,a);return this.logger?.({requestId:i,path:s,...a,responseData:o.data}),o},values:async(t,r,n)=>{let s=y(n),a=`/properties/${t}/values`,i={headers:Object.assign({},S(s)),method:"POST",requestData:r??{}},o=typeof this.logger=="function"?u():"";this.logger?.({requestId:o,path:a,...i});let c=await this.fetcher(a,i);return this.logger?.({requestId:o,path:a,...i,responseData:c.data}),c}};this.labels={find:async(t,r)=>{let n=y(r),s="/labels/search",a={headers:Object.assign({},S(n)),method:"POST",requestData:t??{}},i=typeof this.logger=="function"?u():"";this.logger?.({requestId:i,path:s,...a});let o=await this.fetcher(s,a);return this.logger?.({requestId:i,path:s,...a,responseData:o.data}),o}};this.tx={begin:async t=>{let r="/tx",n={method:"POST",requestData:x(t)?t:{}},s=typeof this.logger=="function"?u():"";this.logger?.({requestId:s,path:r,...n});let a=await this.fetcher(r,n);return this.logger?.({requestId:s,path:r,...n,responseData:a.data}),new C(a.data.id)},commit:async t=>{let n=`/tx/${y(t)}/commit`,s={method:"POST",requestData:{}},a=typeof this.logger=="function"?u():"";this.logger?.({requestId:a,path:n,...s});let i=await this.fetcher(n,s);return this.logger?.({requestId:a,path:n,...s,responseData:i.data}),i},get:async t=>{let n=`/tx/${y(t)}`,s={method:"GET"},a=typeof this.logger=="function"?u():"";this.logger?.({requestId:a,path:n,...s});let i=await this.fetcher(n,s);return this.logger?.({requestId:a,path:n,...s,responseData:i.data}),new C(i.data.id)},rollback:async t=>{let n=`/tx/${y(t)}/rollback`,s={method:"POST",requestData:{}},a=typeof this.logger=="function"?u():"";this.logger?.({requestId:a,path:n,...s});let i=await this.fetcher(n,s);return this.logger?.({requestId:a,path:n,...s,responseData:i.data}),i}};this.settings={get:async()=>{let t="/sdk/settings",r={method:"GET"},n=typeof this.logger=="function"?u():"";this.logger?.({requestId:n,path:t,...r});let s=await this.fetcher(t,r);return this.logger?.({requestId:n,path:t,...r,responseData:s.data}),s}};this.query={raw:async({query:t,params:r},n)=>{let s=y(n),a="/query/raw",i={headers:Object.assign({},S(s)),method:"POST",requestData:{query:t,params:r}},o=typeof this.logger=="function"?u():"";this.logger?.({requestId:o,path:a,...i});let c=await this.fetcher(a,i);return this.logger?.({requestId:o,path:a,...i,responseData:c.data}),c}};this.textIndexes={find:async()=>this.textIndexRequest("/text-indexes","GET"),create:async t=>this.textIndexRequest("/text-indexes","POST",t),suggestName:async t=>this.textIndexRequest("/text-indexes/name-suggestion","POST",t),delete:async t=>this.textIndexRequest(`/text-indexes/${encodeURIComponent(t)}`,"DELETE")};this.ai={searchValues:async t=>{let r="/ai/values/search",n={headers:{},method:"POST",requestData:t},s=typeof this.logger=="function"?u():"";this.logger?.({requestId:s,path:r,...n});let a=await this.fetcher(r,n);return this.logger?.({requestId:s,path:r,...n,responseData:a.data}),a},getSchemaSummary:async t=>{let r="/ai/schema/summary",n={headers:{},method:"POST",requestData:t??{}},s=typeof this.logger=="function"?u():"";this.logger?.({requestId:s,path:r,...n});let a=await this.fetcher(r,n);return this.logger?.({requestId:s,path:r,...n,responseData:a.data}),a},resolveNames:async t=>{let r="/ai/schema/names",n={headers:{},method:"POST",requestData:t},s=typeof this.logger=="function"?u():"";this.logger?.({requestId:s,path:r,...n});let a=await this.fetcher(r,n);return this.logger?.({requestId:s,path:r,...n,responseData:a.data}),a},getJoinCandidates:async t=>{let r="/ai/schema/join-candidates",n={headers:{},method:"POST",requestData:t??{}},s=typeof this.logger=="function"?u():"";this.logger?.({requestId:s,path:r,...n});let a=await this.fetcher(r,n);return this.logger?.({requestId:s,path:r,...n,responseData:a.data}),a},getSchema:async(t,r)=>{let n=y(r),s="/ai/schema",a={headers:Object.assign({},S(n)),method:"POST",requestData:t??{}},i=typeof this.logger=="function"?u():"";this.logger?.({requestId:i,path:s,...a});let o=await this.fetcher(s,a);return this.logger?.({requestId:i,path:s,...a,responseData:o.data}),o},getSchemaMarkdown:async(t,r)=>{let n=y(r),s="/ai/schema/md",a={headers:Object.assign({},S(n)),method:"POST",requestData:t??{}},i=typeof this.logger=="function"?u():"";this.logger?.({requestId:i,path:s,...a});let o=await this.fetcher(s,a);return this.logger?.({requestId:i,path:s,...a,responseData:o.data}),o},indexes:{find:async()=>{let t="/ai/indexes",r={method:"GET",headers:{}},n=typeof this.logger=="function"?u():"";this.logger?.({requestId:n,path:t,...r});let s=await this.fetcher(t,r);return this.logger?.({requestId:n,path:t,...r,responseData:s.data}),s},create:async t=>{let r="/ai/indexes",{external:n,...s}=t,a=n===!0?{...s,sourceType:"external"}:s,i={method:"POST",headers:{},requestData:a},o=typeof this.logger=="function"?u():"";this.logger?.({requestId:o,path:r,...i});let c=await this.fetcher(r,i);return this.logger?.({requestId:o,path:r,...i,responseData:c.data}),c},upsertVectors:async(t,r)=>{let n=`/ai/indexes/${t}/vectors/upsert`,s={method:"POST",headers:{},requestData:r},a=typeof this.logger=="function"?u():"";this.logger?.({requestId:a,path:n,...s});let i=await this.fetcher(n,s);return this.logger?.({requestId:a,path:n,...s,responseData:i.data}),i},delete:async t=>{let r=`/ai/indexes/${t}`,n={method:"DELETE",headers:{}},s=typeof this.logger=="function"?u():"";this.logger?.({requestId:s,path:r,...n});let a=await this.fetcher(r,n);return this.logger?.({requestId:s,path:r,...n,responseData:a.data}),a},stats:async t=>{let r=`/ai/indexes/${t}/stats`,n={method:"GET",headers:{}},s=typeof this.logger=="function"?u():"";this.logger?.({requestId:s,path:r,...n});let a=await this.fetcher(r,n);return this.logger?.({requestId:s,path:r,...n,responseData:a.data}),a}},search:async(t,r)=>{let n="/ai/sql-search",s={method:"POST",headers:{},requestData:{prompt:t}},a=typeof this.logger=="function"?u():"";this.logger?.({requestId:a,path:n,...s});let i=await this.fetcher(n,s);this.logger?.({requestId:a,path:n,...s,responseData:i.data});let o=await this.ai.runSql(i.data.sql,r);return o.name=i.data.name,o.warnings=i.data.warnings,o},runSql:async(t,r)=>{let n={skip:r?.skip??0,limit:r?.limit??100},s="/records/sql-search",a={method:"POST",headers:{},requestData:{sql:t,...n}},i=typeof this.logger=="function"?u():"";this.logger?.({requestId:i,path:s,...a});let o=await this.fetcher(s,a);this.logger?.({requestId:i,path:s,...a,responseData:o.data});let c=new I((o.data??[]).map(p=>new R(p)),o.total??0);return c.sql=t,c.sqlPage=n,c}};if(this.fetcher=null,r?.direct){if(!r.engineUrl)throw new Error("Direct mode requires `engineUrl`, the standalone engine base URL.");if(!r.httpClient)throw new Error("Direct mode requires an HTTP client; import the SDK from its Node or browser entry.");this.direct=new X({engineUrl:r.engineUrl,token:t??"",httpClient:r.httpClient,scope:r.scope}),this.fetcher=Je(this.direct)}else if(r?.httpClient){let n=tt(r);this.fetcher=Ge({httpClient:r.httpClient,token:t,url:n})}r?.options&&(this.options=r?.options),r?.logger&&(this.logger=r?.logger)}_extractTargetIds(t,r){if(t instanceof R){let n=P(t);if(!n)throw new O(`${r} error: Target id is empty`);return[n]}if(w(t)&&t.every(n=>n instanceof R)){let n=t.map(P).filter(b);if(!n.length)throw new O(`${r} error: Target ids are empty`);return n}if(t instanceof I){let n=t.data?.map(P).filter(b);if(!n?.length)throw new O(`${r} error: Target ids are empty`);return n}if(x(t)&&"__id"in t)return[t.__id];if(w(t)&&t.every(n=>x(n)&&"__id"in n)){let n=t.map(P).filter(b);if(!n.length)throw new O(`${r} error: Target ids are empty`);return n}return w(t)?t:A(t)?[t]:[]}async textIndexRequest(t,r,n){let s={method:r,headers:{},...n===void 0?{}:{requestData:n}},a=typeof this.logger=="function"?u():"";this.logger?.({requestId:a,path:t,...s});let i=await this.fetcher(t,s);return this.logger?.({requestId:a,path:t,...s,responseData:i.data}),i}};var rt,f=class e extends F{static{this.instance=null}static{this.state={initialized:!1,debug:!1,timeout:8e4}}constructor(t,r){let n=t??(typeof process<"u"?process.env?.RUSHDB_API_KEY:void 0),s=Ae(r);super(n,{...s,httpClient:s.httpClient??rt}),e.instance=this,this.initializeSync(n,s)}initializeSync(t,r){e.state={initialized:!0,debug:!1,timeout:qe("timeout",r?.timeout,8e4),token:t,direct:r?.direct===!0,engineUrl:r?.engineUrl}}static getInstance(){if(e.instance)return e.instance;throw new Error('RushDB not initialized. Please create a RushDB instance first: new RushDB("RUSHDB_API_KEY")')}static isInitialized(){return b(e.instance)}toDBRecordInstance(t){return new R(t)}},nt=e=>{rt=e};var st=class{constructor(t,r,n){this.label=t,this.schema=r,this.config=n??{}}getLabel(){return this.label}async toDBRecordInstance(t){try{return f.getInstance().toDBRecordInstance(t)}catch{throw new Error("No RushDB instance was provided during model initialization.")}}async find(t,r){let n=t??{};return f.getInstance().records.find({...n,labels:[this.label]},r)}async findOne(t,r){let n=t??{};return f.getInstance().records.findOne({...n,labels:[this.label]},r)}async findById(t,r){return this.findOne({where:{$id:t}},r)}async findUniq(t,r){let n=t??{};return f.getInstance().records.findUniq({...n,labels:[this.label]},r)}async create(t,r,n){let s=await z(this.schema,t),a=ue(this.schema,s),i=b(a),o=f.getInstance();if(i){let c=r??await o.tx.begin(),p=await this.find({where:a},c),h=typeof r<"u";if(!p?.data?.length){let l=await o.records.create({label:this.label,data:s},c);return h||await c.commit(),l}else switch(n?.onConflict??"throw"){case"upsert":{let m=p.data[0],E=await o.records.set({target:m.id,label:this.label,data:s},c);return h||await c.commit(),E}case"skip":return h||await c.commit(),null;default:throw h||await c.commit(),new _(this.label,a)}}return await o.records.create({label:this.label,data:s},r)}async attach({source:t,target:r,options:n},s){return await f.getInstance().records.attach({source:t,target:r,options:n},s)}async detach({source:t,target:r,options:n},s){return await f.getInstance().records.detach({source:t,target:r,options:n},s)}async validateTargetLabel(t,r){let n=P(t);if(!n)return;let a=await f.getInstance().records.findById(n,r);if(!a)throw new Error(`Record with id "${n}" not found.`);if(a.data.__label!==this.label)throw new TypeError(`Target record label "${a.data.__label}" does not match model label "${this.label}".`)}async handleSetOrUpdate(t,r,n,s){if(this.config.validateTargetLabel&&await this.validateTargetLabel(t,s),w(r)&&r.every(L))return await f.getInstance().records[n]({label:this.label,target:t,data:r},s);let a=f.getInstance(),i=await z(this.schema,r),o=ue(this.schema,i);if(!j(o)){let c=s??await a.tx.begin(),p=await this.find({where:o},c),h=typeof s<"u";if(!p?.data?.length||p.data.length===1&&p.data[0]?.id===P(t)){let l=await a.records[n]({target:t,label:this.label,data:i},c);return h||await c.commit(),l}else throw h||await c.commit(),new _(this.label,o)}return await a.records[n]({label:this.label,target:t,data:i},s)}async set(t,r,n){return await this.handleSetOrUpdate(t,r,"set",n)}async update(t,r,n){return await this.handleSetOrUpdate(t,r,"update",n)}async createMany(t,r){let n=f.getInstance(),s=typeof r<"u",a=r??await n.tx.begin();try{let i=await Promise.all(t.map(async p=>await z(this.schema,p))),o=Oe(i,this.schema,this.label);if(!j(o)){let p=Object.entries(o).map(([d,l])=>({[d]:{$in:l}}));if((await this.find({where:{$or:p}},a))?.data?.length)throw new _(this.label,Object.keys(o))}let c=await n.records.createMany({label:this.label,data:i},a);return s||await a.commit(),c}catch(i){throw s||await a.rollback(),i}}async delete(t,r){if(j(t.where))throw new O(`You must specify criteria to delete records of type '${this.label}'. Empty criteria are not allowed. If this was intentional, use the Dashboard instead.`);return await f.getInstance().records.delete({...t,labels:[this.label]},r)}async deleteById(t,r){return await f.getInstance().records.deleteById(t,r)}};nt(new J);var $r=f;export{ee as CLOUD_ONLY_FORMS,Z as CLOUD_ONLY_METHODS,V as CloudOnlyError,R as DBRecordInstance,I as DBRecordsArrayInstance,H as DirectModeError,O as EmptyTargetError,$ as HttpClient,oe as HttpClientResponse,st as Model,G as NonUniqueResultError,F as RestAPI,f as RushDB,C as Transaction,_ as UniquenessError,$r as default,ke as idToDate,me as idToTimestamp,nt as initSDK,mt as isCloudOnlyMethod,z as mergeDefaultsWithPayload,Ae as parseConfig,ue as pickUniqFieldsFromRecord,Oe as pickUniqFieldsFromRecords,qe as validateInteger};
@@ -56,7 +56,11 @@ export type Relation = {
56
56
  type: string;
57
57
  direction: RelationDirection;
58
58
  properties: Record<string, unknown>;
59
+ /** Type of each typed property (engines that type relationship properties send it). */
60
+ propertyTypes?: Record<string, RelationPropertyType>;
59
61
  };
62
+ /** Type of a relationship property value. */
63
+ export type RelationPropertyType = 'string' | 'number' | 'boolean' | 'datetime';
60
64
  /**
61
65
  * Direction of a relationship.
62
66
  * 'in' for incoming relationships, 'out' for outgoing relationships.
package/package.json CHANGED
@@ -18,7 +18,7 @@
18
18
  "agent-memory"
19
19
  ],
20
20
  "license": "Apache-2.0",
21
- "version": "3.2.0",
21
+ "version": "3.3.0",
22
22
  "type": "module",
23
23
  "files": [
24
24
  "dist"