@rowvyn/servicetitan-mcp 2.4.1 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +31 -0
- package/README.md +56 -6
- package/build/chunks/chunk-MMQLAZ4R.js +54 -0
- package/build/index.js +1 -1
- package/build/sse.js +1 -1
- package/build/streamable-http.js +1 -1
- package/package.json +1 -1
- package/build/chunks/chunk-XORPTVFD.js +0 -54
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
var Sm=["secret","password","token","key","auth","credential","apikey","accesstoken"],wm=["phone","email","firstname","lastname","address","street","zipcode","ssn","socialsecurity","dateofbirth","bankaccount","routingnumber","creditcard","cardnumber","contactnumber"],_m=new Set(["name","city","zip","dob"]);function ca(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function da(n){return Array.isArray(n)?n.map(a=>da(a)):ca(n)?ma(n):n}function ma(n){let a={};for(let[r,e]of Object.entries(n)){let t=r.toLowerCase();if(!Sm.some(s=>t.includes(s))){if(_m.has(t)||wm.some(s=>t.includes(s))){a[r]="[REDACTED]";continue}a[r]=da(e)}}return a}function er(n){return ca(n)?ma(n):{}}var Sn=class{constructor(a){this.logger=a}log(a){let e=a.params,t=JSON.stringify(a.params);t.length>2048&&(e={_truncated:!0,_originalSize:t.length,...Object.fromEntries(Object.entries(a.params).filter(([s])=>s==="id"||s==="ids"||s==="page"||s==="pageSize"))}),this.logger.info(`[AUDIT] ${a.operation.toUpperCase()} ${a.tool}`,{timestamp:a.timestamp,tool:a.tool,operation:a.operation,domain:a.domain,resource:a.resource,resourceId:a.resourceId,params:e,success:a.success,error:a.error})}};import{z as ct}from"zod";var Dm=new Set(["requestId","paginationToken","nextPageToken","requestedAt","generatedAt","apiVersion","tool","_warnings","_cache","_meta","productivity","sales","byBusinessUnit","membershipTypes","conversionTotals","conversionByBusinessUnit","leadGeneration","memberships","salesFromTechLeads","salesFromMarketingLeads","upcomingJobs","notSentBreakdown","revenueBreakdown","activityBreakdown","regularHours","overtimeHours","doubleOvertimeHours","invoices","openByAge","breakdownByJobType"]),pa=new Map([["staleEstimates",3],["byTechnician",4],["campaigns",3],["technicians",3]]),Cm=new Map([["leadGenerationOpportunity","leadOpp"],["replacementOpportunity","replOpp"],["membershipSales","memSales"],["billableHours","billHrs"],["totalOpportunities","totOpps"],["averageTicket","avgTicket"],["estimateValue","estVal"],["customerName","customer"],["technician","tech"],["businessUnit","bu"],["opportunity","opp"],["membership","mem"],["campaign","camp"],["conversionOpportunities","convOpps"],["replacementRevenue","replRev"],["serviceAgreements","svcAgree"]]),km=new Set(["amount","balance","cost","credit","debit","estimate","fee","fees","income","invoice","payment","pay","price","profit","revenue","sale","sales","tax","ticket","value","wage"]),Om=new Set(["efficiency","margin","pct","percent","percentage","rate","ratio","share","utilization"]),Rm=new Set(["date","scheduleddate","duedate","expirationdate"]),jm=/^(\d{4}-\d{2}-\d{2})T(\d{2}):(\d{2})(?::\d{2}(?:\.\d+)?)?(?:Z|[+-]\d{2}:\d{2})?$/;function xm(n){if(typeof n!="object"||n===null||Array.isArray(n))return!1;let a=Object.getPrototypeOf(n);return a===Object.prototype||a===null}function Am(n=process.env){return n.ST_RESPONSE_SHAPING?.trim().toLowerCase()!=="false"}function Pm(n){return n?n.replace(/([a-z0-9])([A-Z])/g,"$1 $2").split(/[^A-Za-z0-9]+|\s+/).filter(Boolean).map(a=>a.toLowerCase()):[]}function Em(n){let a=Pm(n);return a.some(r=>Om.has(r))?1:a.some(r=>km.has(r))?2:null}function Bm(n,a){if(!Number.isFinite(n))return n;let r=Em(a);if(r===null)return n;let e=10**r;return Math.round((n+Number.EPSILON)*e)/e}function Lm(n,a){let r=jm.exec(n);if(!r)return n;if(a&&Rm.has(a.toLowerCase())){let[,e]=r;return e}return n}function tr(n,a={}){if(Array.isArray(n)){let r=n.map(t=>tr(t,{parentKey:a.parentKey,currentKey:a.currentKey})),e=a.parentKey?pa.get(a.parentKey):void 0;return e===void 0?r:r.slice(0,e)}if(xm(n)){let r={};for(let[e,t]of Object.entries(n)){if(Dm.has(e))continue;let s=tr(t,{parentKey:e,currentKey:e}),m=Cm.get(e)??e;r[m]=s;let b=Array.isArray(t)?t:void 0;if(b){let w=pa.get(e);w!==void 0&&b.length>w&&(r._truncated=!0,r._total=b.length)}}return r}return typeof n=="number"?Bm(n,a.currentKey):typeof n=="string"?Lm(n,a.currentKey):n}function la(n){return Am()?tr(n):n}var Mm=1e5,wn=Mm,ba="UTC",Um=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(:\d{2}(\.\d+)?)?(Z|[+-]\d{2}:\d{2})$/,ua=new Map;function of(n){if(!Number.isInteger(n)||n<=0)throw new Error(`maxResponseChars must be a positive integer. Received: ${n}`);wn=n}function sf(n){ba=n.trim()===""?"UTC":n}function Fm(n){if(typeof n!="object"||n===null||Array.isArray(n))return!1;let a=Object.getPrototypeOf(n);return a===Object.prototype||a===null}function Nm(n){return n.trim().toUpperCase()==="UTC"}function zm(n){let a=ua.get(n);if(a)return a;let r=new Intl.DateTimeFormat("en-US",{timeZone:n,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hourCycle:"h23",fractionalSecondDigits:3});return ua.set(n,r),r}function $m(n,a){let r=new Date(n);if(Number.isNaN(r.getTime()))return n;let e=zm(a),t=Object.fromEntries(e.formatToParts(r).filter(G=>G.type!=="literal").map(G=>[G.type,G.value])),s=`${t.year}-${t.month}-${t.day}T${t.hour}:${t.minute}:${t.second}.${t.fractionalSecond??"000"}`,m=new Date(`${s}Z`);if(Number.isNaN(m.getTime()))return n;let b=Math.round((m.getTime()-r.getTime())/6e4),w=b>=0?"+":"-",X=Math.abs(b),B=String(Math.floor(X/60)).padStart(2,"0"),H=String(X%60).padStart(2,"0");return`${s}${w}${B}:${H}`}function nr(n,a){return Nm(a)?n:Array.isArray(n)?n.map(r=>nr(r,a)):Fm(n)?Object.fromEntries(Object.entries(n).map(([r,e])=>[r,nr(e,a)])):typeof n=="string"&&Um.test(n)?$m(n,a):n}function i(n,a){let r=a?.shape?la(n):n,e=a?.timezone??ba,t=nr(r,e),s=JSON.stringify(t,null,2);if(s.length>wn){let m={_truncated:!0,_originalSize:s.length,_message:`Response was ${s.length.toLocaleString()} characters (limit: ${wn.toLocaleString()}). Use pagination (page/pageSize) to get smaller result sets.`,_preview:s.slice(0,Math.max(0,wn-256))};return{content:[{type:"text",text:JSON.stringify(m,null,2)}]}}return{content:[{type:"text",text:s}]}}function o(n){return{content:[{type:"text",text:`Error: ${n}`}],isError:!0}}function p(n){return n.extend({page:ct.number().int().min(1).optional().describe("Page number (starts at 1)"),pageSize:ct.number().int().min(1).max(5e3).optional().describe("Records per page (default 50)"),includeTotal:ct.boolean().optional().describe("Include total count in response")})}function u(n){return n.extend({createdBefore:ct.string().datetime().optional(),createdOnOrAfter:ct.string().datetime().optional(),modifiedBefore:ct.string().datetime().optional(),modifiedOnOrAfter:ct.string().datetime().optional()})}function S(){return{active:ct.enum(["True","Any","False"]).optional().default("True").describe("Filter by active status")}}function f(n){let a=new Set(n);return{sort:ct.string().regex(/^[+-]?[A-Za-z][A-Za-z0-9_]*$/,"Sort must be Field, +Field (asc), or -Field (desc)").refine(r=>{let e=r.replace(/^[+-]/,"");return a.has(e)},{message:`Sort field must be one of: ${n.join(", ")}`}).optional().describe(`Sort: Field (default), +Field (asc), or -Field (desc). Fields: ${n.join(", ")}`)}}function c(n){return n instanceof ct.ZodError?`Invalid input: ${n.issues.map(r=>`${r.path.length>0?`${r.path.join(".")}: `:""}${r.message}`).join("; ")}`:n instanceof Error?n.message:String(n)}function d(n){return Object.fromEntries(Object.entries(n).filter(([,a])=>a!=null))}import Gm from"https";import rr from"axios";var qm=6e4,ha=new Gm.Agent({keepAlive:!0,maxSockets:32,maxFreeSockets:10,timeout:6e4}),ar={"/customers":"crm","/contacts":"crm","/leads":"crm","/locations":"crm","/bookings":"crm","/booking-provider":"crm","/booking-provider-tags":"crm","/tags":"crm","/jobs":"jpm","/appointments":"jpm","/job-cancel-reasons":"jpm","/job-hold-reasons":"jpm","/job-types":"jpm","/projects":"jpm","/project-types":"jpm","/project-statuses":"jpm","/project-substatuses":"jpm","/technicians":"settings","/images":"jpm","/installed-equipment":"jpm","/appointment-assignments":"dispatch","/arrival-windows":"dispatch","/capacity":"dispatch","/non-job-appointments":"dispatch","/gps-provider":"dispatch","/teams":"dispatch","/zones":"dispatch","/invoices":"accounting","/invoice-items":"accounting","/payments":"accounting","/ap-credits":"accounting","/ap-payments":"accounting","/gl-accounts":"accounting","/journal-entries":"accounting","/payment-terms":"accounting","/payment-types":"accounting","/tax-zones":"accounting","/estimates":"sales","/services":"pricebook","/materials":"pricebook","/materialsmarkup":"pricebook","/equipment":"pricebook","/categories":"pricebook","/discounts":"pricebook","/discounts-and-fees":"pricebook","/pricebook":"pricebook","/payrolls":"payroll","/payroll-adjustments":"payroll","/payroll-settings":"payroll","/gross-pay-items":"payroll","/timesheet-codes":"payroll","/timesheets":"payroll","/non-job-timesheets":"payroll","/splits":"payroll","/memberships":"memberships","/membership-types":"memberships","/service-agreements":"memberships","/recurring-services":"memberships","/recurring-service-types":"memberships","/recurring-service-events":"memberships","/campaigns":"marketing","/costs":"marketing","/attributed-leads":"marketing","/external-call-attributions":"marketing","/job-attributions":"marketing","/web-booking-attributions":"marketing","/web-lead-form-attributions":"marketing","/clientspecificpricing":"marketing","/reviews":"marketing","/suppressions":"marketing","/submissions":"marketing","/calls":"telecom","/call-reasons":"telecom","/purchase-orders":"inventory","/purchase-order-types":"inventory","/purchase-order-markups":"inventory","/vendors":"inventory","/warehouses":"inventory","/adjustments":"inventory","/transfers":"inventory","/receipts":"inventory","/returns":"inventory","/return-types":"inventory","/report-categories":"reporting","/report-category":"reporting","/dynamic-value-sets":"reporting","/data":"reporting","/business-units":"settings","/employees":"settings","/tag-types":"settings","/user-roles":"settings","/activities":"settings","/activity-categories":"settings","/activity-types":"settings","/business-hours":"settings","/performance":"settings","/schedulers":"settings","/technician-rating":"settings","/technician-shifts":"settings","/trucks":"settings","/tasks":"task-management","/forms":"forms","/optinouts":"marketing"},ga={"/customers":"crm","/customers/contacts":"crm","/contacts":"crm","/leads":"crm","/locations":"crm","/locations/contacts":"crm","/bookings":"crm","/jobs":"jpm","/job-notes":"jpm","/job-history":"jpm","/job-canceled-logs":"jpm","/jobs/splits":"jpm","/appointments":"jpm","/appointment-assignments":"dispatch","/job-types":"jpm","/projects":"jpm","/project-notes":"jpm","/job-cancel-reasons":"jpm","/installed-equipment":"jpm","/invoices":"accounting","/invoice-items":"accounting","/invoice-templates":"accounting","/payments":"accounting","/inventory-bills":"accounting","/estimates":"sales","/estimate-items":"sales","/services":"pricebook","/materials":"pricebook","/equipment":"pricebook","/campaigns":"marketing","/calls":"telecom","/membership-types":"memberships","/memberships":"memberships","/membership-status-changes":"memberships","/service-agreements":"memberships","/recurring-services":"memberships","/recurring-service-types":"memberships","/location-recurring-services":"memberships","/location-recurring-service-events":"memberships","/purchase-orders":"inventory","/returns":"inventory","/transfers":"inventory","/vendors":"inventory","/employees":"settings","/business-units":"settings","/tag-types":"settings","/technicians":"settings","/activities":"settings","/activity-categories":"settings","/activity-codes":"settings","/adjustments":"inventory","/payrolls":"payroll","/payroll-adjustments":"payroll","/payroll-settings":"payroll","/gross-pay-items":"payroll","/timesheets":"payroll","/timesheet-codes":"payroll"},Jm={integration:{authUrl:"https://auth-integration.servicetitan.io",apiUrl:"https://api-integration.servicetitan.io"},production:{authUrl:"https://auth.servicetitan.io",apiUrl:"https://api.servicetitan.io"}},an=class extends Error{constructor(r,e,t){super(e);this.status=r;this.path=t;this.name="ServiceTitanApiError"}toJSON(){return{status:this.status,message:this.message,path:this.path}}},fa=class{constructor(a){this.config=a;let r=Jm[a.environment];this.authUrl=r.authUrl,this.http=rr.create({baseURL:r.apiUrl,timeout:6e4,httpsAgent:ha}),this.setupInterceptors()}http;authUrl;accessToken=null;tokenExpiration=0;tokenRequest=null;async get(a,r){return this.request("get",a,void 0,r)}async post(a,r,e){return this.request("post",a,r,e)}async put(a,r,e){return this.request("put",a,r,e)}async patch(a,r,e){return this.request("patch",a,r,e)}async delete(a,r){return this.request("delete",a,void 0,r)}async ensureToken(){await this.getAccessToken()}async request(a,r,e,t){let s=this.resolvePath(r),m={method:a,url:s,params:t?d(t):void 0,data:e};try{return(await this.http.request(m)).data}catch(b){throw this.sanitizeError(b,s)}}resolvePath(a){let e=(a.startsWith("/")?a:`/${a}`).replaceAll("{tenant}",this.config.tenantId);return this.addApiPrefix(e)}addApiPrefix(a){if(/^\/(?:crm|accounting|jpm|dispatch|settings|pricebook|payroll|memberships|marketing|telecom|inventory|reporting|sales|equipment-systems|task-management|forms)\/v\d+\//i.test(a))return a;let r=a.match(/^\/(v\d+)\/tenant\/[^/]+(\/export)?(\/[^/?]+)/);if(r){let b=r[2]==="/export",w=r[3],B=(b?ga:ar)[w];return B?`/${B}${a}`:a}let e=a.match(/^\/tenant\/[^/]+(\/export)?(\/[^/?]+)/);if(!e)return a;let t=e[1]==="/export",s=e[2];if(t){let b=ga[s];if(b)return`/${b}/v2${a}`;let w=ar[s];if(w)return`/${w}/v2${a}`}let m=ar[s];return m?`/${m}/v2${a}`:a}setupInterceptors(){this.http.interceptors.request.use(async a=>{let r=await this.getAccessToken();return a.headers?.set?(a.headers.set("Authorization",`Bearer ${r}`),a.headers.set("ST-App-Key",this.config.appKey)):a.headers={...a.headers??{},Authorization:`Bearer ${r}`,"ST-App-Key":this.config.appKey},a}),this.http.interceptors.response.use(a=>a,async a=>{let r=a.config,e=a.response?.status;if(e===401&&r&&!r._retried401)return r._retried401=!0,await this.refreshToken(),this.http.request(r);if(e===429&&r&&!r._retried429){r._retried429=!0;let t=this.parseRetryAfter(a.response?.headers?.["retry-after"]);return await this.sleep(t*1e3),this.http.request(r)}return Promise.reject(a)})}async prewarm(){try{await this.getAccessToken()}catch{}}async getAccessToken(a=!1){let r=this.accessToken!==null&&Date.now()<this.tokenExpiration-qm;if(!a&&r)return this.accessToken;if(this.tokenRequest)return this.tokenRequest;this.tokenRequest=this.fetchAccessToken();try{return await this.tokenRequest}finally{this.tokenRequest=null}}async refreshToken(){this.accessToken=null,this.tokenExpiration=0,await this.getAccessToken(!0)}async fetchAccessToken(){let a=new URLSearchParams({grant_type:"client_credentials",client_id:this.config.clientId,client_secret:this.config.clientSecret}),r=await rr.post(`${this.authUrl}/connect/token`,a.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded"},httpsAgent:ha,timeout:15e3}),e=r.data?.access_token,t=Number(r.data?.expires_in??0);if(!e||!Number.isFinite(t)||t<=0)throw new Error("Invalid token response from ServiceTitan auth endpoint");return this.accessToken=e,this.tokenExpiration=Date.now()+t*1e3,e}parseRetryAfter(a){if(typeof a=="string"){let r=Number.parseInt(a,10);if(Number.isFinite(r)&&r>0)return r;let e=Date.parse(a);if(Number.isFinite(e)){let t=Math.ceil((e-Date.now())/1e3);if(t>0)return Math.min(t,300)}}return 1}async sleep(a){await new Promise(r=>setTimeout(r,a))}sanitizeError(a,r){if(rr.isAxiosError(a)){let e=a.response?.status??0,t=this.extractServiceTitanMessage(a)??"Request failed";return new an(e,t,r)}return a instanceof Error?new an(0,a.message,r):new an(0,"Unknown error",r)}extractServiceTitanMessage(a){let r=a.response?.data;if(typeof r=="string"&&r.trim().length>0)return r;if(r&&typeof r=="object"){let e=["message","error_description","error"];for(let t of e){let s=r[t];if(typeof s=="string"&&s.trim().length>0)return s}}return a.message??null}};var Wm=["ST_CLIENT_ID","ST_CLIENT_SECRET","ST_APP_KEY","ST_TENANT_ID"],ya=["integration","production"],va=["debug","info","warn","error"];function Ia(n,a,r){if(n===void 0)return r;let e=n.trim().toLowerCase();if(["true","1"].includes(e))return!0;if(["false","0"].includes(e))return!1;throw new Error(`${a} must be one of: true, false, 1, 0 (case-insensitive)`)}function Hm(n,a,r){if(n===void 0||n.trim()==="")return r;let e=Number(n.trim());if(Number.isInteger(e)&&e>0)return e;throw new Error(`${a} must be a positive integer. Received: ${n}`)}function Vm(n){let a=(n??"integration").trim().toLowerCase();if(ya.includes(a))return a;throw new Error(`ST_ENVIRONMENT must be one of: ${ya.join(", ")}. Received: ${n}`)}function Km(n){if(n===void 0||n.trim()==="")return null;let a=n.split(",").map(r=>r.trim().toLowerCase()).filter(Boolean);return a.length===0?null:a}function Zm(n){if(n===void 0||n.trim()==="")return null;let a=n.split(",").map(r=>r.trim().toLowerCase()).filter(Boolean);return a.length===0?null:a}function Ym(n){let a=(n??"info").trim().toLowerCase();if(va.includes(a))return a;throw new Error(`ST_LOG_LEVEL must be one of: ${va.join(", ")}. Received: ${n}`)}function Xm(n){if(n===void 0||n.trim()==="")return"UTC";let a=n.trim();try{return Intl.DateTimeFormat(void 0,{timeZone:a}),a}catch{throw new Error(`ST_TIMEZONE must be a valid IANA timezone (e.g. "America/New_York", "US/Eastern"). Received: ${n}`)}}function on(n,a){return(n[a]??"").trim()}function bf(n=process.env){let a=Wm.filter(r=>on(n,r)==="");if(a.length>0)throw new Error(`Missing required environment variables: ${a.join(", ")}`);return{clientId:on(n,"ST_CLIENT_ID"),clientSecret:on(n,"ST_CLIENT_SECRET"),appKey:on(n,"ST_APP_KEY"),tenantId:on(n,"ST_TENANT_ID"),environment:Vm(n.ST_ENVIRONMENT),readonlyMode:Ia(n.ST_READONLY,"ST_READONLY",!0),confirmWrites:Ia(n.ST_CONFIRM_WRITES,"ST_CONFIRM_WRITES",!1),maxResponseChars:Hm(n.ST_MAX_RESPONSE_CHARS,"ST_MAX_RESPONSE_CHARS",1e5),enabledDomains:Km(n.ST_DOMAINS),logLevel:Ym(n.ST_LOG_LEVEL),timezone:Xm(n.ST_TIMEZONE),corsOrigin:n.ST_CORS_ORIGIN??"",allowedCallers:Zm(n.ST_ALLOWED_CALLERS)}}import{z as cn}from"zod";import{createHash as Qm}from"node:crypto";var Sa=500,or=Number(process.env.ST_INTEL_MAX_PAGES)||20,ir=1440*60*1e3,wa=/^\d{4}-\d{2}-\d{2}$/,_a=process.env.ST_TIMEZONE||"UTC",ep=Number(process.env.ST_INTEL_CACHE_TTL_MS)||300*1e3,Ta=new Map,_n=new Map;function tp(n,a){let r=JSON.stringify(a,Object.keys(a).sort());return`${n}:${Qm("sha256").update(r).digest("hex").slice(0,16)}`}async function Da(n,a,r,e=ep){let t=tp(n,a),s=Ta.get(t);if(s&&s.expiresAt>Date.now())return s.value;let m=_n.get(t);if(m)return m;let b=r().then(w=>(Ta.set(t,{value:w,expiresAt:Date.now()+e}),_n.delete(t),w)).catch(w=>{throw _n.delete(t),w});return _n.set(t,b),b}function Me(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function g(n){return n instanceof Error?n.message:String(n)}function np(n,a=_a){let e=new Intl.DateTimeFormat("en-US",{timeZone:a,year:"numeric",month:"2-digit",day:"2-digit"}).formatToParts(n),t=s=>e.find(m=>m.type===s)?.value??"00";return`${t("year")}-${t("month")}-${t("day")}`}function sr(n=_a){return np(new Date,n)}async function te(n,a,r,e){try{return await r()}catch(t){return n.push(`${a} unavailable: ${g(t)}`),e}}async function dt(n,a,r,e=or,t){let s=await rp(n,a,r,e);return s._truncated&&t&&t.push(`Pagination truncated: fetched ${s.data.length} items from ${a} (max ${e} pages). Results may be incomplete.`),s.data}async function rp(n,a,r,e=or){let t=[],s=1,m,b=!1;for(;s<=e;){let w=await n.get(a,d({...r,page:s,pageSize:Sa,includeTotal:!0}));s===1&&Me(w)&&typeof w.totalCount=="number"&&(m=w.totalCount);let X=Ca(w);if(t.push(...X),!(Me(w)&&w.hasMore===!0)||X.length===0)break;if(s===e){console.warn(`Pagination truncated at ${e} pages (${t.length} items fetched). Increase ST_INTEL_MAX_PAGES for full coverage.`),b=!0;break}s+=1}return{data:t,totalCount:m,_truncated:b||void 0}}async function Ct(n,a,r,e=or,t){let s=[];for(let w=1;w<=e;w++)s.push(n.get(a,d({...r,page:w,pageSize:Sa})).then(X=>({items:Ca(X)})).catch(X=>({items:[],error:X})));let m=await Promise.all(s),b=m.filter(w=>w.error);if(b.length>0){let w=`Failed to fetch ${b.length}/${m.length} pages from ${a}. Results may be incomplete.`;console.warn(w),t?.push(w)}return m.flatMap(w=>w.items)}function Ca(n){return Array.isArray(n)?n:Me(n)&&Array.isArray(n.data)?n.data:[]}function ka(n){if(typeof n=="number")return Number.isFinite(n)?n:0;if(typeof n=="string"&&n.trim().length>0){let a=Number.parseFloat(n);return Number.isFinite(a)?a:0}return 0}function h(n,a=2){if(!Number.isFinite(n))return 0;let r=10**a;return Math.round((n+Number.EPSILON)*r)/r}function de(n,a,r=0){if(a===0||!Number.isFinite(a))return r;let e=n/a;return Number.isFinite(e)?e:r}function me(n,a){return n.reduce((r,e)=>r+ka(a(e)),0)}function ap(n,a){if(n==="UTC")return 0;let e=new Intl.DateTimeFormat("en-US",{timeZone:n,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1}).formatToParts(a),t=m=>{let b=e.find(w=>w.type===m);return b?Number.parseInt(b.value,10):0};return Date.UTC(t("year"),t("month")-1,t("day"),t("hour")===24?0:t("hour"),t("minute"),t("second"))-a.getTime()}function Ye(n,a,r="UTC"){let e=Nt(n,!1,r),t=Nt(a,!0,r);if(t.getTime()<e.getTime())throw new Error("endDate must be on or after startDate");return{start:e,end:t,startIso:e.toISOString(),endIso:t.toISOString()}}function Oa(n,a="UTC"){let r=Nt(n,!1,a),e=Nt(n,!0,a),t=op(n),s=Nt(t,!1,a);return{start:r,end:e,startIso:r.toISOString(),endIso:e.toISOString(),nextDate:t,nextDayStartIso:s.toISOString()}}function Cn(n,a,r="UTC"){return Nt(n,a,r).toISOString()}function Nt(n,a,r="UTC"){if(!wa.test(n)){let m=new Date(n);if(Number.isNaN(m.getTime()))throw new Error(`Invalid date: ${n}`);return m}let e=new Date(`${n}T${a?"23:59:59.999":"00:00:00.000"}Z`);if(Number.isNaN(e.getTime()))throw new Error(`Invalid date: ${n}`);if(r==="UTC")return e;let t=new Date(`${n}T00:00:00.000Z`),s=ap(r,t);if(a){let m=new Date(t.getTime()+ir);return new Date(m.getTime()-s-1)}return new Date(t.getTime()-s)}function op(n){if(!wa.test(n))throw new Error(`Invalid date: ${n}`);let[a,r,e]=n.split("-"),t=new Date(Date.UTC(Number(a),Number(r)-1,Number(e)+1)),s=String(t.getUTCFullYear()),m=String(t.getUTCMonth()+1).padStart(2,"0"),b=String(t.getUTCDate()).padStart(2,"0");return`${s}-${m}-${b}`}function y(n){return ka(n)}function ie(n){if(typeof n=="string"){let a=n.trim();return a.length>0?a:null}return typeof n=="number"||typeof n=="boolean"?String(n):null}function cr(n){if(n instanceof Date&&!Number.isNaN(n.getTime()))return n;if(typeof n!="string"||n.trim().length===0)return null;let a=new Date(n);return Number.isNaN(a.getTime())?null:a}function ip(n,a){let r=a.split("."),e=n;for(let t of r){if(Array.isArray(e)){let s=Number.parseInt(t,10);if(!Number.isInteger(s)||s<0||s>=e.length)return;e=e[s];continue}if(!Me(e))return;e=e[t]}return e}function xe(n,a){for(let r of a){let e=ip(n,r);if(e!=null)return e}}function zt(n,a=[]){let r=xe(n,["status.name","status.value","status","jobStatus","appointmentStatus","callStatus",...a]),e=ie(r);return e?e.toLowerCase():""}function Dn(n,a){if(a&&a!=="UTC")try{let r=new Intl.DateTimeFormat("en-US",{timeZone:a,year:"numeric",month:"2-digit",day:"2-digit"}).formatToParts(n),e=Number(r.find(m=>m.type==="year")?.value??n.getUTCFullYear()),t=Number(r.find(m=>m.type==="month")?.value??n.getUTCMonth()+1)-1,s=Number(r.find(m=>m.type==="day")?.value??n.getUTCDate());return{year:e,month:t,day:s}}catch{}return{year:n.getUTCFullYear(),month:n.getUTCMonth(),day:n.getUTCDate()}}function Ra(n,a,r){if(a.getTime()<n.getTime())return 0;let e=Dn(n,r),t=Dn(a,r),s=Date.UTC(e.year,e.month,e.day),m=Date.UTC(t.year,t.month,t.day),b=0;for(;s<=m;){let w=new Date(s).getUTCDay();w!==0&&w!==6&&(b+=1),s+=ir}return b}function dr(n,a,r){let e=Dn(n,r),t=Dn(a,r),s=Date.UTC(e.year,e.month,e.day),m=Date.UTC(t.year,t.month,t.day);return Math.max(0,Math.floor((m-s)/ir))}function sn(n){return h(n,2).toLocaleString("en-US",{minimumFractionDigits:0,maximumFractionDigits:2})}var sp=u(p(cn.object({ids:cn.string().optional().describe("Comma-delimited AP credit IDs (max 50)"),...f(["Id","CreatedOn","ModifiedOn"])}))),ja=cn.object({ids:cn.array(cn.number().int().describe("AP credit ID")).min(1).describe("AP credit IDs to mark as exported")});function xa(n,a){a.register({name:"accounting_ap_credits_mark_as_exported",domain:"accounting",operation:"write",description:"Mark AP credits as exported",schema:ja.shape,handler:async r=>{let e=ja.parse(r);try{let t=await n.post("/tenant/{tenant}/ap-credits/markasexported",{ids:e.ids});return i(t)}catch(t){return o(g(t))}}}),a.register({name:"accounting_ap_credits_list",domain:"accounting",operation:"read",description:"List AP credits",schema:sp.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/ap-credits",d({ids:e.ids,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,sort:e.sort}));return i(t)}catch(t){return o(g(t))}}})}import{z as dn}from"zod";var cp=u(p(dn.object({ids:dn.string().optional().describe("Comma-delimited AP payment IDs (max 50)"),...f(["Id","CreatedOn","ModifiedOn"])}))),Aa=dn.object({ids:dn.array(dn.number().int().describe("AP payment ID")).min(1).describe("AP payment IDs to mark as exported")});function Pa(n,a){a.register({name:"accounting_ap_payments_mark_as_exported",domain:"accounting",operation:"write",description:"Mark AP payments as exported",schema:Aa.shape,handler:async r=>{let e=Aa.parse(r);try{let t=await n.post("/tenant/{tenant}/ap-payments/markasexported",{ids:e.ids});return i(t)}catch(t){return o(g(t))}}}),a.register({name:"accounting_ap_payments_list",domain:"accounting",operation:"read",description:"List AP payments",schema:cp.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/ap-payments",d({ids:e.ids,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,sort:e.sort}));return i(t)}catch(t){return o(g(t))}}})}import{z as we}from"zod";var Ea=we.object({name:we.string().describe("GL account name"),number:we.string().describe("GL account number"),description:we.string().optional().describe("GL account description"),type:we.string().describe("GL account type"),subtype:we.string().describe("GL account subtype"),active:we.boolean().optional().describe("Whether account is active"),isIntacctGroup:we.boolean().optional().describe("Whether this is an Intacct group account"),isIntacctBankAccount:we.boolean().optional().describe("Whether this is an Intacct bank account")}),dp=Ea.partial(),mp=u(p(we.object({ids:we.string().optional().describe("Comma-delimited account IDs (max 50)"),names:we.string().optional().describe("Comma-delimited account names (max 50)"),numbers:we.string().optional().describe("Comma-delimited account numbers (max 50)"),types:we.string().optional().describe("Comma-delimited account types (max 50)"),subtypes:we.string().optional().describe("Comma-delimited account subtypes (max 50)"),description:we.string().max(255).optional().describe("Description contains value"),source:we.enum(["Undefined","AccountingSystem","ManuallyCreated","PublicApi"]).optional().describe("Account source"),...S(),isIntacctGroup:we.boolean().optional().describe("Only Intacct group accounts"),isIntacctBankAccount:we.boolean().optional().describe("Only Intacct bank accounts"),...f(["Id","Name","Number","ModifiedOn","CreatedOn"])}))),pp=u(p(we.object({ids:we.string().optional().describe("Comma-delimited account type IDs (max 50)"),names:we.string().optional().describe("Comma-delimited account type names (max 50)"),...S(),...f(["Id","Name","ModifiedOn","CreatedOn"])}))),lp=we.object({accountId:we.number().int().describe("GL account ID")}),up=we.object({accountId:we.number().int().describe("GL account ID"),payload:dp.optional().describe("Fields to patch on the GL account")});function Ba(n,a){a.register({name:"accounting_gl_accounts_get",domain:"accounting",operation:"read",description:"Get a GL account by ID",schema:lp.shape,handler:async r=>{let e=r;try{let t=await n.get(`/tenant/{tenant}/gl-accounts/${e.accountId}`);return i(t)}catch(t){return o(g(t))}}}),a.register({name:"accounting_gl_accounts_create",domain:"accounting",operation:"write",description:"Create a GL account",schema:Ea.shape,handler:async r=>{let e=r;try{let t=await n.post("/tenant/{tenant}/gl-accounts",e);return i(t)}catch(t){return o(g(t))}}}),a.register({name:"accounting_gl_accounts_list",domain:"accounting",operation:"read",description:"List GL accounts",schema:mp.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/gl-accounts",d({ids:e.ids,names:e.names,numbers:e.numbers,types:e.types,subtypes:e.subtypes,description:e.description,source:e.source,active:e.active,isIntacctGroup:e.isIntacctGroup,isIntacctBankAccount:e.isIntacctBankAccount,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,sort:e.sort}));return i(t)}catch(t){return o(g(t))}}}),a.register({name:"accounting_gl_accounts_update",domain:"accounting",operation:"write",description:"Patch a GL account",schema:up.shape,handler:async r=>{let e=r;try{let t=await n.patch(`/tenant/{tenant}/gl-accounts/${e.accountId}`,e.payload);return i(t)}catch(t){return o(g(t))}}}),a.register({name:"accounting_gl_account_types_list",domain:"accounting",operation:"read",description:"List GL account types",schema:pp.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/gl-accounts/types",d({ids:e.ids,names:e.names,active:e.active,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,sort:e.sort}));return i(t)}catch(t){return o(g(t))}}})}import{z as k}from"zod";var bp=k.union([k.string(),k.number(),k.boolean(),k.null()]),hp=k.object({}).catchall(bp).describe("Custom field key/value map"),gp=k.object({status:k.string().optional().describe("Invoice status"),number:k.string().optional().describe("Invoice reference number"),customerId:k.number().int().optional().describe("Customer ID"),jobId:k.number().int().optional().describe("Job ID"),businessUnitId:k.number().int().optional().describe("Business unit ID"),invoicedOn:k.string().optional().describe("Invoice date-time"),dueDate:k.string().optional().describe("Invoice due date-time"),total:k.number().optional().describe("Invoice total"),balance:k.number().optional().describe("Invoice balance"),memo:k.string().optional().describe("Invoice memo"),exportId:k.string().optional().describe("External export ID"),customFields:k.array(k.object({typeId:k.number().int().optional().describe("Custom field type ID"),name:k.string().optional().describe("Custom field name"),value:k.string().optional().describe("Custom field value")})).optional().describe("Invoice custom fields")}),La=k.object({id:k.number().int().optional().describe("Invoice item ID"),skuId:k.number().int().optional().describe("SKU ID"),quantity:k.number().optional().describe("Item quantity"),unitPrice:k.number().optional().describe("Item unit price"),total:k.number().optional().describe("Item total amount"),description:k.string().optional().describe("Item description"),tax:k.number().optional().describe("Tax amount")}),fp=p(u(k.object({ids:k.string().optional().describe("Comma-delimited invoice IDs"),statuses:k.array(k.string()).optional().describe("Invoice statuses"),batchId:k.number().int().optional().describe("Batch ID"),batchNumber:k.number().int().optional().describe("Batch number"),customFieldFields:k.record(k.string()).optional().describe("Custom field name/value filters"),customFieldOperator:k.enum(["And","Or"]).optional().describe("Operator for custom field filters"),jobId:k.number().int().optional().describe("Job ID"),jobNumber:k.string().optional().describe("Job number"),businessUnitId:k.number().int().optional().describe("Business unit ID"),customerId:k.number().int().optional().describe("Customer ID"),invoicedOnOrAfter:k.string().optional().describe("Invoiced on or after RFC3339 date-time"),invoicedOnBefore:k.string().optional().describe("Invoiced on or before RFC3339 date-time"),adjustmentToId:k.number().int().optional().describe("Adjusted invoice ID"),number:k.string().optional().describe("Invoice number"),totalGreater:k.number().optional().describe("Minimum invoice total"),totalLess:k.number().optional().describe("Maximum invoice total"),balanceFilterBalance:k.number().optional().describe("Balance filter value"),balanceFilterComparer:k.enum(["Equals","NotEquals","Greater","Less"]).optional().describe("Balance comparison operator"),dueDateBefore:k.string().optional().describe("Due date before RFC3339 date-time"),dueDateOnOrAfter:k.string().optional().describe("Due date on or after RFC3339 date-time"),orderBy:k.string().optional().describe("Order by field"),orderByDirection:k.string().optional().describe("Order direction: asc|desc"),reviewStatuses:k.array(k.string()).optional().describe("Review statuses"),assignedToIds:k.array(k.number().int()).optional().describe("Assignee user IDs"),...f(["Id","ModifiedOn","CreatedOn","Number","InvoicedOn","DueDate","Total","Balance"])}))),yp=k.object({id:k.number().int().describe("Invoice ID"),payload:gp.optional().describe("Invoice fields to patch")}),vp=k.object({customFields:hp.describe("Invoice custom fields payload")}),Ip=k.object({invoiceId:k.number().int().describe("Invoice ID"),itemId:k.number().int().describe("Invoice item ID")}),Tp=k.object({invoiceId:k.number().int().describe("Invoice ID"),payload:k.union([La,k.array(La).describe("Invoice item patch operations")]).optional().describe("Invoice item patch payload")}),Sp=u(p(k.object({...f(["Id","Name","CreatedOn","ModifiedOn"])}))),Ma=k.object({payload:k.object({}).passthrough().describe("Invoice adjustment payload")}),Ua=k.object({ids:k.array(k.number().int().describe("Invoice ID")).min(1).describe("Invoice IDs to mark as exported")});function Fa(n,a){a.register({name:"accounting_invoices_create_adjustment",domain:"accounting",operation:"write",description:"Create an adjustment invoice",schema:Ma.shape,handler:async r=>{let e=Ma.parse(r);try{let t=await n.post("/tenant/{tenant}/invoices",e.payload);return i(t)}catch(t){return o(g(t))}}}),a.register({name:"accounting_invoices_update_custom_fields",domain:"accounting",operation:"write",description:"Update invoice custom fields",schema:vp.shape,handler:async r=>{let e=r;try{let t=await n.patch("/tenant/{tenant}/invoices/custom-fields",e.customFields);return i(t)}catch(t){return o(g(t))}}}),a.register({name:"accounting_invoices_update",domain:"accounting",operation:"write",description:"Patch an invoice",schema:yp.shape,handler:async r=>{let e=r;try{let t=await n.patch(`/tenant/{tenant}/invoices/${e.id}`,e.payload);return i(t)}catch(t){return o(g(t))}}}),a.register({name:"accounting_invoices_list",domain:"accounting",operation:"read",description:"List invoices",schema:fp.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/invoices",d({ids:e.ids,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,statuses:e.statuses,batchId:e.batchId,batchNumber:e.batchNumber,page:e.page,pageSize:e.pageSize,"customField.Fields":e.customFieldFields,"customField.Operator":e.customFieldOperator,includeTotal:e.includeTotal,jobId:e.jobId,jobNumber:e.jobNumber,businessUnitId:e.businessUnitId,customerId:e.customerId,invoicedOnOrAfter:e.invoicedOnOrAfter,invoicedOnBefore:e.invoicedOnBefore,adjustmentToId:e.adjustmentToId,number:e.number,createdOnOrAfter:e.createdOnOrAfter,createdBefore:e.createdBefore,totalGreater:e.totalGreater,totalLess:e.totalLess,"balanceFilter.Balance":e.balanceFilterBalance,"balanceFilter.Comparer":e.balanceFilterComparer,dueDateBefore:e.dueDateBefore,dueDateOnOrAfter:e.dueDateOnOrAfter,orderBy:e.orderBy,orderByDirection:e.orderByDirection,reviewStatuses:e.reviewStatuses,assignedToIds:e.assignedToIds,sort:e.sort}));return i(t)}catch(t){return o(g(t))}}}),a.register({name:"accounting_invoices_custom_field_types_list",domain:"accounting",operation:"read",description:"List invoice custom field types",schema:Sp.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/invoices/custom-fields",d({page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,sort:e.sort}));return i(t)}catch(t){return o(g(t))}}}),a.register({name:"accounting_invoice_items_delete",domain:"accounting",operation:"delete",description:"Delete an invoice item",schema:Ip.shape,handler:async r=>{let e=r;try{return await n.delete(`/tenant/{tenant}/invoices/${e.invoiceId}/items/${e.itemId}`),i({success:!0,message:"Invoice item deleted successfully"})}catch(t){return o(g(t))}}}),a.register({name:"accounting_invoice_items_update",domain:"accounting",operation:"write",description:"Patch invoice items",schema:Tp.shape,handler:async r=>{let e=r;try{let t=await n.patch(`/tenant/{tenant}/invoices/${e.invoiceId}/items`,e.payload);return i(t)}catch(t){return o(g(t))}}}),a.register({name:"accounting_invoices_mark_as_exported",domain:"accounting",operation:"write",description:"Mark invoices as exported",schema:Ua.shape,handler:async r=>{let e=Ua.parse(r);try{let t=await n.post("/tenant/{tenant}/invoices/markasexported",{ids:e.ids});return i(t)}catch(t){return o(g(t))}}})}import{z as ne}from"zod";var wp=ne.object({id:ne.string().uuid().describe("Journal entry UUID")}),Na=p(wp),_p=p(u(ne.object({ids:ne.string().optional().describe("Comma-delimited journal entry IDs (max 50)"),exportedFrom:ne.string().datetime().optional().describe("Exported on or after UTC timestamp"),exportedTo:ne.string().datetime().optional().describe("Exported on or before UTC timestamp"),postedFrom:ne.string().datetime().optional().describe("Posted on or after UTC timestamp"),postedTo:ne.string().datetime().optional().describe("Posted on or before UTC timestamp"),exportedBy:ne.string().optional().describe("Comma-delimited user IDs who exported entries"),name:ne.string().max(255).optional().describe("Journal entry name contains"),numberFrom:ne.number().int().optional().describe("Entry number lower bound"),numberTo:ne.number().int().optional().describe("Entry number upper bound"),statuses:ne.array(ne.string()).max(50).optional().describe("Entry statuses"),syncStatuses:ne.array(ne.string()).max(50).optional().describe("Sync statuses"),transactionPostedFrom:ne.string().datetime().optional().describe("Contains transaction posted on or after UTC timestamp"),transactionPostedTo:ne.string().datetime().optional().describe("Contains transaction posted on or before UTC timestamp"),businessUnitIds:ne.string().optional().describe("Comma-delimited business unit IDs (max 50)"),serviceAgreementIds:ne.string().optional().describe("Comma-delimited service agreement IDs (max 50)"),customerName:ne.string().max(255).optional().describe("Customer name contains"),locationName:ne.string().max(255).optional().describe("Location name contains"),vendorName:ne.string().max(255).optional().describe("Vendor name contains"),inventoryLocationName:ne.string().max(255).optional().describe("Inventory location name contains"),refNumber:ne.string().max(255).optional().describe("Transaction reference number contains"),transactionTypes:ne.array(ne.string()).max(50).optional().describe("Transaction types"),customField:ne.record(ne.string()).optional().describe("Custom field name/value filters"),...f(["Id","Number","Name","Status","CreatedOn","ExportedOn","ExportedBy","PostDate"])}))),Dp=ne.object({name:ne.string().optional().describe("Journal entry name"),status:ne.enum(["Open","Closed","Draft"]).optional().describe("Journal entry status"),customFields:ne.array(ne.object({name:ne.string().describe("Custom field name"),value:ne.string().describe("Custom field value")})).optional().describe("Custom fields")}).partial(),Cp=ne.object({id:ne.string().uuid().describe("Journal entry UUID"),payload:Dp.optional().describe("Journal entry patch payload")}),kp=ne.object({id:ne.string().uuid().describe("Journal entry UUID")});function Op(n){return n?Object.fromEntries(Object.entries(n).map(([a,r])=>[`customField.${a}`,r])):{}}function za(n,a){a.register({name:"accounting_journal_entries_get_summary",domain:"accounting",operation:"read",description:"Get journal entry summary rows",schema:Na.shape,handler:async r=>{let e=r;try{let t=await n.get(`/tenant/{tenant}/journal-entries/${e.id}/summary`,d({pageSize:e.pageSize,page:e.page,includeTotal:e.includeTotal}));return i(t)}catch(t){return o(g(t))}}}),a.register({name:"accounting_journal_entries_get_details",domain:"accounting",operation:"read",description:"Get journal entry detail rows",schema:Na.shape,handler:async r=>{let e=r;try{let t=await n.get(`/tenant/{tenant}/journal-entries/${e.id}/details`,d({pageSize:e.pageSize,page:e.page,includeTotal:e.includeTotal}));return i(t)}catch(t){return o(g(t))}}}),a.register({name:"accounting_journal_entries_list",domain:"accounting",operation:"read",description:"List journal entries",schema:_p.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/journal-entries",d({ids:e.ids,exportedFrom:e.exportedFrom,exportedTo:e.exportedTo,postedFrom:e.postedFrom,postedTo:e.postedTo,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,exportedBy:e.exportedBy,name:e.name,numberFrom:e.numberFrom,numberTo:e.numberTo,statuses:e.statuses,syncStatuses:e.syncStatuses,transactionPostedFrom:e.transactionPostedFrom,transactionPostedTo:e.transactionPostedTo,businessUnitIds:e.businessUnitIds,serviceAgreementIds:e.serviceAgreementIds,customerName:e.customerName,locationName:e.locationName,vendorName:e.vendorName,inventoryLocationName:e.inventoryLocationName,refNumber:e.refNumber,transactionTypes:e.transactionTypes,...Op(e.customField),sort:e.sort,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal}));return i(t)}catch(t){return o(g(t))}}}),a.register({name:"accounting_journal_entries_update",domain:"accounting",operation:"write",description:"Patch a journal entry",schema:Cp.shape,handler:async r=>{let e=r;try{let t=await n.patch(`/tenant/{tenant}/journal-entries/${e.id}`,e.payload);return i(t)}catch(t){return o(g(t))}}}),a.register({name:"accounting_journal_entries_sync_update",domain:"accounting",operation:"write",description:"Trigger journal entry sync update",schema:kp.shape,handler:async r=>{let e=r;try{let t=await n.patch(`/tenant/{tenant}/journal-entries/${e.id}/sync`);return i(t)}catch(t){return o(g(t))}}})}import{z as kn}from"zod";var Rp=kn.object({paymentTermId:kn.number().int().describe("Payment term ID")}),jp=p(u(kn.object({ids:kn.string().optional().describe("Comma-delimited payment term IDs (max 50)"),...f(["Id","Name","CreatedOn"])})));function $a(n,a){a.register({name:"accounting_payment_terms_get",domain:"accounting",operation:"read",description:"Get a payment term by ID",schema:Rp.shape,handler:async r=>{let e=r;try{let t=await n.get(`/tenant/{tenant}/payment-terms/${e.paymentTermId}`);return i(t)}catch(t){return o(g(t))}}}),a.register({name:"accounting_payment_terms_list",domain:"accounting",operation:"read",description:"List payment terms",schema:jp.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/payment-terms",d({ids:e.ids,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,sort:e.sort}));return i(t)}catch(t){return o(g(t))}}})}import{z as On}from"zod";var xp=On.object({id:On.number().int().describe("Payment type ID")}),Ap=p(u(On.object({ids:On.string().optional().describe("Comma-delimited payment type IDs (max 50)"),...S()})));function Ga(n,a){a.register({name:"accounting_payment_types_get",domain:"accounting",operation:"read",description:"Get a payment type by ID",schema:xp.shape,handler:async r=>{let e=r;try{let t=await n.get(`/tenant/{tenant}/payment-types/${e.id}`);return i(t)}catch(t){return o(g(t))}}}),a.register({name:"accounting_payment_types_list",domain:"accounting",operation:"read",description:"List payment types",schema:Ap.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/payment-types",d({ids:e.ids,active:e.active,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal}));return i(t)}catch(t){return o(g(t))}}})}import{z as q}from"zod";var Pp=q.union([q.string(),q.number(),q.boolean(),q.null()]),Ep=q.object({}).catchall(Pp).describe("Custom field key/value map"),Bp=q.object({invoiceId:q.number().int().optional().describe("Invoice ID receiving payment"),amount:q.number().optional().describe("Split amount")}),Lp=q.object({typeId:q.number().int().optional().describe("Payment type ID"),active:q.boolean().optional().describe("Whether payment is active"),memo:q.string().optional().describe("Payment memo"),paidOn:q.string().optional().describe("Payment date-time"),authCode:q.string().optional().describe("Authorization code"),checkNumber:q.string().optional().describe("Check number"),exportId:q.string().optional().describe("External export ID"),transactionStatus:q.string().optional().describe("Transaction status value from ServiceTitan"),status:q.string().optional().describe("Payment status value from ServiceTitan"),splits:q.array(Bp).optional().describe("Invoice split allocations")}),Mp=p(u(q.object({ids:q.string().optional().describe("Comma-delimited payment IDs (max 50)"),appliedToInvoiceIds:q.string().optional().describe("Comma-delimited invoice IDs applied to"),appliedToReferenceNumber:q.string().optional().describe("Applied reference number"),statuses:q.string().optional().describe("Payment statuses"),paidOnAfter:q.string().optional().describe("Paid date on or after RFC3339 date-time"),paidOnBefore:q.string().optional().describe("Paid date on or before RFC3339 date-time"),businessUnitIds:q.string().optional().describe("Comma-delimited business unit IDs"),batchNumber:q.number().int().optional().describe("Batch number"),batchId:q.number().int().optional().describe("Batch ID"),transactionType:q.enum(["Undefined","JournalEntry","ReceivePayment"]).optional().describe("Transaction type"),customerId:q.number().int().optional().describe("Customer ID"),totalGreater:q.number().optional().describe("Minimum total amount"),totalLess:q.number().optional().describe("Maximum total amount"),customFieldFields:q.record(q.string()).optional().describe("Custom field name/value filters"),customFieldOperator:q.enum(["And","Or"]).optional().describe("Operator for custom field filters"),...f(["Id","CreatedOn","ModifiedOn","PaidOn","Total"])}))),Zf=q.object({id:q.number().int().describe("Payment ID")}),Up=q.object({id:q.number().int().describe("Payment ID"),payload:Lp.optional().describe("Payment fields to patch")}),Fp=q.object({customFields:Ep.describe("Payment custom fields payload")}),Np=u(p(q.object({...f(["Id","Name","CreatedOn","ModifiedOn"])}))),qa=q.object({payload:q.object({}).passthrough().describe("Payment create payload")}),Ja=q.object({payload:q.object({}).passthrough().describe("Payment status update payload")});function Wa(n,a){a.register({name:"accounting_payments_create",domain:"accounting",operation:"write",description:"Create a payment",schema:qa.shape,handler:async r=>{let e=qa.parse(r);try{let t=await n.post("/tenant/{tenant}/payments",e.payload);return i(t)}catch(t){return o(g(t))}}}),a.register({name:"accounting_payments_update_custom_fields",domain:"accounting",operation:"write",description:"Update payment custom fields",schema:Fp.shape,handler:async r=>{let e=r;try{let t=await n.patch("/tenant/{tenant}/payments/custom-fields",e.customFields);return i(t)}catch(t){return o(g(t))}}}),a.register({name:"accounting_payments_custom_field_types_list",domain:"accounting",operation:"read",description:"List payment custom field types",schema:Np.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/payments/custom-fields",d({page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,sort:e.sort}));return i(t)}catch(t){return o(g(t))}}}),a.register({name:"accounting_payments_list",domain:"accounting",operation:"read",description:"List payments",schema:Mp.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/payments",d({ids:e.ids,appliedToInvoiceIds:e.appliedToInvoiceIds,appliedToReferenceNumber:e.appliedToReferenceNumber,statuses:e.statuses,paidOnAfter:e.paidOnAfter,paidOnBefore:e.paidOnBefore,businessUnitIds:e.businessUnitIds,batchNumber:e.batchNumber,batchId:e.batchId,transactionType:e.transactionType,customerId:e.customerId,totalGreater:e.totalGreater,totalLess:e.totalLess,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,"customField.Fields":e.customFieldFields,"customField.Operator":e.customFieldOperator,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,sort:e.sort}));return i(t)}catch(t){return o(g(t))}}}),a.register({name:"accounting_payments_update_status",domain:"accounting",operation:"write",description:"Update payment statuses",schema:Ja.shape,handler:async r=>{let e=Ja.parse(r);try{let t=await n.post("/tenant/{tenant}/payments/status",e.payload);return i(t)}catch(t){return o(g(t))}}}),a.register({name:"accounting_payments_update",domain:"accounting",operation:"write",description:"Patch a payment",schema:Up.shape,handler:async r=>{let e=r;try{let t=await n.patch(`/tenant/{tenant}/payments/${e.id}`,e.payload);return i(t)}catch(t){return o(g(t))}}})}import{z as Ha}from"zod";var zp=p(u(Ha.object({ids:Ha.string().optional().describe("Comma-delimited tax zone IDs"),...S(),...f(["Id","Name","CreatedOn"])})));function Va(n,a){a.register({name:"accounting_tax_zones_list",domain:"accounting",operation:"read",description:"List tax zones",schema:zp.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/tax-zones",d({ids:e.ids,active:e.active,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,sort:e.sort}));return i(t)}catch(t){return o(g(t))}}})}var $p=(n,a)=>{xa(n,a),Pa(n,a),Ba(n,a),Fa(n,a),za(n,a),Wa(n,a),Ga(n,a),$a(n,a),Va(n,a)},Ka=$p;import{z as tt}from"zod";var Gp=tt.object({id:tt.number().int().describe("Booking provider tag ID")}),qp=tt.object({tagName:tt.string().optional().describe("Booking provider tag name"),description:tt.string().optional().describe("Booking provider tag description")}),Jp=tt.object({id:tt.number().int().describe("Booking provider tag ID"),tagName:tt.string().optional().describe("Booking provider tag name"),description:tt.string().optional().describe("Booking provider tag description")}),Wp=u(p(tt.object({name:tt.string().optional().describe("Booking provider tag name"),ids:tt.string().optional().describe("Comma-delimited booking provider tag IDs"),...f(["Id","ModifiedOn","CreatedOn"])})));function Za(n,a){a.register({name:"crm_booking_provider_tags_create",domain:"crm",operation:"write",description:"Create a booking provider tag",schema:qp.shape,handler:async r=>{let e=r;try{let t=await n.post("/tenant/{tenant}/booking-provider-tags",e);return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_booking_provider_tags_get",domain:"crm",operation:"read",description:"Get a booking provider tag by ID",schema:Gp.shape,handler:async r=>{let e=r;try{let t=await n.get(`/tenant/{tenant}/booking-provider-tags/${e.id}`);return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_booking_provider_tags_update",domain:"crm",operation:"write",description:"Patch a booking provider tag",schema:Jp.shape,handler:async r=>{let e=r;try{let t=await n.patch(`/tenant/{tenant}/booking-provider-tags/${e.id}`,d({tagName:e.tagName,description:e.description}));return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_booking_provider_tags_list",domain:"crm",operation:"read",description:"List booking provider tags",schema:Wp.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/booking-provider-tags",d({name:e.name,ids:e.ids,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,sort:e.sort}));return i(t)}catch(t){return o(g(t))}}})}import{z as K}from"zod";var Hp=K.object({id:K.number().int().describe("Booking ID")}),Vp=K.object({bookingProvider:K.number().int().describe("Booking provider ID"),id:K.number().int().describe("Booking ID")}),Xa=u(p(K.object({ids:K.string().optional().describe("Comma-delimited booking IDs (max 50)"),externalId:K.string().optional().describe("External booking ID"),...f(["Id","ModifiedOn","CreatedOn"])}))),Qa=K.object({externalId:K.string().optional().describe("External booking ID"),start:K.string().optional().describe("Booking start date-time"),end:K.string().optional().describe("Booking end date-time"),notes:K.string().optional().describe("Booking notes"),summary:K.string().optional().describe("Booking summary"),customerId:K.number().int().optional().describe("Customer ID"),locationId:K.number().int().optional().describe("Location ID"),leadId:K.number().int().optional().describe("Lead ID"),campaignId:K.number().int().optional().describe("Campaign ID")}),Kp=K.object({bookingProvider:K.number().int().describe("Booking provider ID"),id:K.number().int().describe("Booking ID"),payload:Qa.optional().describe("Booking patch payload")}),Zp=K.object({bookingProvider:K.number().int().describe("Booking provider ID"),body:Qa.describe("Booking create payload")}),Ya=K.object({type:K.string().describe("Contact type"),value:K.string().describe("Contact value"),memo:K.string().optional().describe("Contact memo")}),Yp=K.object({bookingProvider:K.number().int().describe("Booking provider ID"),id:K.number().int().describe("Booking ID"),type:K.string().describe("Contact type"),value:K.string().describe("Contact value"),memo:K.string().optional().describe("Contact memo")}),Xp=K.object({bookingProvider:K.number().int().describe("Booking provider ID"),id:K.number().int().describe("Booking ID"),contactId:K.number().int().describe("Contact ID"),type:K.string().describe("Contact type"),value:K.string().describe("Contact value"),memo:K.string().optional().describe("Contact memo")}),Qp=p(K.object({id:K.number().int().describe("Booking ID")})),el=p(K.object({bookingProvider:K.number().int().describe("Booking provider ID"),id:K.number().int().describe("Booking ID")})),tl=Xa.extend({bookingProvider:K.number().int().describe("Booking provider ID")});function eo(n,a){a.register({name:"crm_bookings_get",domain:"crm",operation:"read",description:"Get a booking by ID",schema:Hp.shape,handler:async r=>{let e=r;try{let t=await n.get(`/tenant/{tenant}/bookings/${e.id}`);return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_bookings_provider_get",domain:"crm",operation:"read",description:"Get a provider-scoped booking",schema:Vp.shape,handler:async r=>{let e=r;try{let t=await n.get(`/tenant/{tenant}/booking-provider/${e.bookingProvider}/bookings/${e.id}`);return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_bookings_contacts_list",domain:"crm",operation:"read",description:"List contacts for a booking",schema:Qp.shape,handler:async r=>{let e=r;try{let t=await n.get(`/tenant/{tenant}/bookings/${e.id}/contacts`,d({page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal}));return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_bookings_list",domain:"crm",operation:"read",description:"List bookings",schema:Xa.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/bookings",d({ids:e.ids,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,externalId:e.externalId,sort:e.sort}));return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_bookings_provider_update",domain:"crm",operation:"write",description:"Patch a provider-scoped booking",schema:Kp.shape,handler:async r=>{let e=r;try{let t=await n.patch(`/tenant/{tenant}/booking-provider/${e.bookingProvider}/bookings/${e.id}`,e.payload);return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_bookings_provider_create",domain:"crm",operation:"write",description:"Create a booking for a booking provider",schema:Zp.shape,handler:async r=>{let e=r;try{let t=await n.post(`/tenant/{tenant}/booking-provider/${e.bookingProvider}/bookings`,e.body);return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_bookings_provider_contacts_create",domain:"crm",operation:"write",description:"Create a contact on a provider-scoped booking",schema:Yp.shape,handler:async r=>{let e=r;try{let t=Ya.parse({type:e.type,value:e.value,memo:e.memo}),s=await n.post(`/tenant/{tenant}/booking-provider/${e.bookingProvider}/bookings/${e.id}/contacts`,t);return i(s)}catch(t){return o(g(t))}}}),a.register({name:"crm_bookings_provider_list",domain:"crm",operation:"read",description:"List bookings for a booking provider",schema:tl.shape,handler:async r=>{let e=r;try{let t=await n.get(`/tenant/{tenant}/booking-provider/${e.bookingProvider}/bookings`,d({ids:e.ids,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,externalId:e.externalId,sort:e.sort}));return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_bookings_provider_contacts_list",domain:"crm",operation:"read",description:"List contacts for a provider-scoped booking",schema:el.shape,handler:async r=>{let e=r;try{let t=await n.get(`/tenant/{tenant}/booking-provider/${e.bookingProvider}/bookings/${e.id}/contacts`,d({page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal}));return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_bookings_provider_contacts_update",domain:"crm",operation:"write",description:"Patch a provider-scoped booking contact",schema:Xp.shape,handler:async r=>{let e=r;try{let t=Ya.parse({type:e.type,value:e.value,memo:e.memo}),s=await n.patch(`/tenant/{tenant}/booking-provider/${e.bookingProvider}/bookings/${e.id}/contacts/${e.contactId}`,t);return i(s)}catch(t){return o(g(t))}}})}import{z as mr}from"zod";var nl=mr.object({tags:mr.array(mr.string()).describe("Tags to add")});function to(n,a){a.register({name:"crm_bulk_tags_add_tags",domain:"crm",operation:"write",description:"Add bulk tags",schema:nl.shape,handler:async r=>{let e=r;try{let t=await n.put("/tenant/{tenant}/tags",{tags:e.tags});return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_bulk_tags_remove_tags",domain:"crm",operation:"delete",description:"Remove bulk tags",schema:{},handler:async()=>{try{let r=await n.delete("/tenant/{tenant}/tags");return i(r)}catch(r){return o(g(r))}}})}import{z as ve}from"zod";var no=ve.object({contactId:ve.string().uuid().describe("Contact ID"),contactMethodId:ve.string().uuid().describe("Contact method ID")}),rl=ve.object({referenceId:ve.string().optional().describe("External reference ID"),type:ve.string().optional().describe("Contact method type"),value:ve.string().optional().describe("Contact method value"),memo:ve.string().optional().describe("Contact method memo")}),al=ve.object({contactId:ve.string().uuid().describe("Contact ID"),type:ve.string().describe("Contact method type"),value:ve.string().describe("Contact method value"),memo:ve.string().optional().describe("Contact method memo")}),ol=u(p(ve.object({contactId:ve.string().uuid().describe("Contact ID"),referenceId:ve.string().optional().describe("Reference ID filter"),type:ve.string().optional().describe("Contact method type filter"),value:ve.string().optional().describe("Contact method value filter"),...f(["Id","ModifiedOn","CreatedOn"])}))),il=ve.object({contactId:ve.string().uuid().describe("Contact ID"),contactMethodId:ve.string().uuid().describe("Contact method ID"),payload:ve.object({value:ve.string().optional().describe("Contact method value"),memo:ve.string().optional().describe("Contact method memo")}).optional().describe("Contact method patch payload")}),sl=ve.object({contactId:ve.string().uuid().describe("Contact ID"),contactMethodId:ve.string().uuid().describe("Contact method ID"),payload:rl.optional().describe("Contact method replace payload")});function ro(n,a){a.register({name:"crm_contact_methods_get",domain:"crm",operation:"read",description:"Get a contact method",schema:no.shape,handler:async r=>{let e=r;try{let t=await n.get(`/tenant/{tenant}/contacts/${e.contactId}/contact-methods/${e.contactMethodId}`);return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_contact_methods_create",domain:"crm",operation:"write",description:"Create a contact method",schema:al.shape,handler:async r=>{let e=r;try{let t=await n.post(`/tenant/{tenant}/contacts/${e.contactId}/contact-methods`,{type:e.type,value:e.value,memo:e.memo});return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_contact_methods_list",domain:"crm",operation:"read",description:"List contact methods for a contact",schema:ol.shape,handler:async r=>{let e=r;try{let t=await n.get(`/tenant/{tenant}/contacts/${e.contactId}/contact-methods`,d({referenceId:e.referenceId,type:e.type,value:e.value,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,sort:e.sort}));return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_contact_methods_update",domain:"crm",operation:"write",description:"Patch a contact method",schema:il.shape,handler:async r=>{let e=r;try{let t=await n.patch(`/tenant/{tenant}/contacts/${e.contactId}/contact-methods/${e.contactMethodId}`,e.payload);return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_contact_methods_upsert",domain:"crm",operation:"write",description:"Replace a contact method",schema:sl.shape,handler:async r=>{let e=r;try{let t=await n.put(`/tenant/{tenant}/contacts/${e.contactId}/contact-methods/${e.contactMethodId}`,e.payload);return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_contact_methods_delete",domain:"crm",operation:"delete",description:"Delete a contact method",schema:no.shape,handler:async r=>{let e=r;try{return await n.delete(`/tenant/{tenant}/contacts/${e.contactId}/contact-methods/${e.contactMethodId}`),i({success:!0,message:"Contact method deleted successfully"})}catch(t){return o(g(t))}}})}import{z as he}from"zod";var io=he.string().regex(/^[a-zA-Z0-9_-]+$/,"Must contain only alphanumeric characters, hyphens, and underscores"),ao=he.object({id:he.string().uuid().describe("Contact ID")}),so=he.object({referenceId:he.string().optional().describe("External reference ID"),name:he.string().optional().describe("Contact name"),title:he.string().optional().describe("Contact title"),isArchived:he.boolean().optional().describe("Archived flag")}),cl=he.object({id:he.string().uuid().describe("Contact ID"),body:so.describe("Contact replacement payload")}),dl=he.object({id:he.string().uuid().describe("Contact ID"),referenceId:he.string().optional().describe("External reference ID"),name:he.string().optional().describe("Contact name"),title:he.string().optional().describe("Contact title"),isArchived:he.boolean().optional().describe("Archived flag")}),ml=so,co=u(p(he.object({name:he.string().optional().describe("Filter by contact name"),title:he.string().optional().describe("Filter by contact title"),referenceId:he.string().optional().describe("Filter by external reference ID"),isArchived:he.string().optional().describe("Filter by archive status"),...f(["Id","ModifiedOn","CreatedOn"])}))),pl=co.extend({relationshipId:he.number().int().describe("Contact relationship ID")}),oo=he.object({contactId:he.string().uuid().describe("Contact ID"),relatedEntityId:he.number().int().describe("Related entity ID"),typeSlug:io.describe("Relationship type slug")}),ll=p(he.object({contactId:he.string().uuid().describe("Contact ID"),relatedEntityId:he.number().int().optional().describe("Related entity ID filter"),typeSlug:io.optional().describe("Relationship type slug filter"),typeName:he.string().optional().describe("Relationship type name filter"),createdBefore:he.string().datetime().optional().describe("List relationships created before this timestamp"),createdOnOrAfter:he.string().datetime().optional().describe("List relationships created on/after this timestamp"),...f(["Id","ModifiedOn","CreatedOn"])}));function mo(n,a){a.register({name:"crm_contacts_get",domain:"crm",operation:"read",description:"Get a contact by ID",schema:ao.shape,handler:async r=>{let e=r;try{let t=await n.get(`/tenant/{tenant}/contacts/${e.id}`);return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_contacts_delete",domain:"crm",operation:"delete",description:"Delete a contact",schema:ao.shape,handler:async r=>{let e=r;try{return await n.delete(`/tenant/{tenant}/contacts/${e.id}`),i({success:!0,message:"Contact deleted successfully"})}catch(t){return o(g(t))}}}),a.register({name:"crm_contacts_replace",domain:"crm",operation:"write",description:"Replace a contact",schema:cl.shape,handler:async r=>{let e=r;try{let t=await n.put(`/tenant/{tenant}/contacts/${e.id}`,e.body);return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_contacts_update",domain:"crm",operation:"write",description:"Patch a contact",schema:dl.shape,handler:async r=>{let e=r;try{let t=await n.patch(`/tenant/{tenant}/contacts/${e.id}`,d({referenceId:e.referenceId,name:e.name,title:e.title,isArchived:e.isArchived}));return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_contacts_create",domain:"crm",operation:"write",description:"Create a contact",schema:ml.shape,handler:async r=>{let e=r;try{let t=await n.post("/tenant/{tenant}/contacts",d({referenceId:e.referenceId,name:e.name,title:e.title,isArchived:e.isArchived}));return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_contacts_by_relationship_list",domain:"crm",operation:"read",description:"List contacts by relationship ID",schema:pl.shape,handler:async r=>{let e=r;try{let t=await n.get(`/tenant/{tenant}/contacts/relationships/${e.relationshipId}`,d({name:e.name,title:e.title,referenceId:e.referenceId,isArchived:e.isArchived,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,sort:e.sort}));return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_contacts_list",domain:"crm",operation:"read",description:"List contacts",schema:co.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/contacts",d({name:e.name,title:e.title,referenceId:e.referenceId,isArchived:e.isArchived,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,sort:e.sort}));return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_contact_relationships_delete",domain:"crm",operation:"delete",description:"Delete a contact relationship",schema:oo.shape,handler:async r=>{let e=r;try{let t=encodeURIComponent(e.typeSlug);return await n.delete(`/tenant/{tenant}/contacts/${e.contactId}/relationships/${e.relatedEntityId}/${t}`),i({success:!0,message:"Contact relationship deleted successfully"})}catch(t){return o(g(t))}}}),a.register({name:"crm_contact_relationships_create",domain:"crm",operation:"write",description:"Create a contact relationship",schema:oo.shape,handler:async r=>{let e=r;try{let t=encodeURIComponent(e.typeSlug),s=await n.post(`/tenant/{tenant}/contacts/${e.contactId}/relationships/${e.relatedEntityId}/${t}`);return i(s)}catch(t){return o(g(t))}}}),a.register({name:"crm_contact_relationships_list",domain:"crm",operation:"read",description:"List relationships for a contact",schema:ll.shape,handler:async r=>{let e=r;try{let t=await n.get(`/tenant/{tenant}/contacts/${e.contactId}/relationships`,d({relatedEntityId:e.relatedEntityId,typeSlug:e.typeSlug,typeName:e.typeName,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,sort:e.sort}));return i(t)}catch(t){return o(g(t))}}})}import{z as v}from"zod";var pr=v.object({street:v.string().optional().describe("Street"),unit:v.string().optional().describe("Unit"),city:v.string().optional().describe("City"),state:v.string().optional().describe("State"),zip:v.string().optional().describe("Zip code"),country:v.string().optional().describe("Country"),latitude:v.number().optional().describe("Latitude"),longitude:v.number().optional().describe("Longitude")}),lr=v.object({typeId:v.number().int().optional().describe("Custom field type ID"),name:v.string().optional().describe("Custom field name"),value:v.string().optional().describe("Custom field value")}),ur=v.object({key:v.string().optional().describe("External data key"),value:v.string().optional().describe("External data value")}),lo=v.object({phoneNumber:v.string().optional().describe("Phone number"),doNotText:v.boolean().optional().describe("Do not text flag")}),uo=v.object({type:v.string().optional().describe("Contact type"),value:v.string().optional().describe("Contact value"),memo:v.string().optional().describe("Contact memo"),phoneSettings:lo.optional().describe("Phone settings")}),ul=v.object({taxZoneId:v.number().int().optional().describe("Tax zone ID"),active:v.boolean().optional().describe("Active flag"),name:v.string().optional().describe("Location name"),address:pr.optional().describe("Location address"),customFields:v.array(lr).optional().describe("Custom fields"),zoneId:v.number().int().optional().describe("Zone ID"),tagTypeIds:v.array(v.number().int()).optional().describe("Tag type IDs"),externalData:v.array(ur).optional().describe("External data entries"),contacts:v.array(uo).optional().describe("Location contacts")}),bl=v.object({id:v.number().int().describe("Customer ID")}),hl=v.object({id:v.number().int().describe("Customer ID"),noteId:v.number().int().describe("Note ID")}),gl=v.object({id:v.number().int().describe("Customer ID"),contactId:v.number().int().describe("Contact ID")}),po=v.object({id:v.number().int().describe("Customer ID"),tagTypeId:v.number().int().describe("Tag type ID")}),fl=v.object({active:v.boolean().optional().describe("Customer active flag"),name:v.string().optional().describe("Customer name"),type:v.string().optional().describe("Customer type"),address:pr.optional().describe("Customer address"),customFields:v.array(lr).optional().describe("Custom fields"),balance:v.number().optional().describe("Customer balance"),tagTypeIds:v.array(v.number().int()).optional().describe("Tag type IDs"),doNotMail:v.boolean().optional().describe("Do not mail flag"),doNotService:v.boolean().optional().describe("Do not service flag"),externalData:v.array(ur).optional().describe("External data entries")}),yl=v.object({id:v.number().int().describe("Customer ID"),payload:fl.optional().describe("Customer patch payload")}),vl=u(p(v.object({ids:v.string().optional().describe("Comma-delimited customer IDs"),excludeAccountingChangesFromModifiedDateRange:v.boolean().optional().describe("Exclude accounting-only changes from modified date filters"),name:v.string().optional().describe("Filter by name"),street:v.string().optional().describe("Filter by street"),unit:v.string().optional().describe("Filter by unit"),city:v.string().optional().describe("Filter by city"),state:v.string().optional().describe("Filter by state"),zip:v.string().optional().describe("Filter by zip"),country:v.string().optional().describe("Filter by country"),latitude:v.number().optional().describe("Filter by latitude"),longitude:v.number().optional().describe("Filter by longitude"),phone:v.string().optional().describe("Filter by contact phone"),...S(),externalDataApplicationGuid:v.string().uuid().optional().describe("External data application GUID"),externalDataKey:v.string().optional().describe("External data key"),externalDataValues:v.string().optional().describe("External data values"),...f(["Id","ModifiedOn","CreatedOn"])}))),Il=u(p(v.object({id:v.number().int().describe("Customer ID")}))),Tl=v.object({id:v.number().int().describe("Customer ID"),text:v.string().describe("Note text"),isPinned:v.boolean().optional().describe("Pinned flag"),createdById:v.number().int().optional().describe("Created by user ID")}),Sl=v.object({name:v.string().describe("Customer name"),type:v.string().optional().describe("Customer type"),address:pr.optional().describe("Customer address"),customFields:v.array(lr).optional().describe("Custom fields"),balance:v.number().optional().describe("Customer balance"),tagTypeIds:v.array(v.number().int()).optional().describe("Tag type IDs"),doNotMail:v.boolean().optional().describe("Do not mail flag"),doNotService:v.boolean().optional().describe("Do not service flag"),externalData:v.array(ur).optional().describe("External data entries"),locations:v.array(ul).optional().describe("Locations"),contacts:v.array(uo).optional().describe("Contacts")}),wl=p(v.object({id:v.number().int().describe("Customer ID")})),_l=v.object({id:v.number().int().describe("Customer ID"),type:v.string().optional().describe("Contact type"),value:v.string().optional().describe("Contact value"),memo:v.string().optional().describe("Contact memo"),phoneSettings:lo.optional().describe("Phone settings")}),Dl=u(p(v.object({customerIds:v.string().optional().describe("Comma-delimited customer IDs")}))),Cl=u(p(v.object({...f(["Id","ModifiedOn","CreatedOn"])})));function bo(n,a){a.register({name:"crm_customers_get",domain:"crm",operation:"read",description:"Get a customer by ID",schema:bl.shape,handler:async r=>{let e=r;try{let t=await n.get(`/tenant/{tenant}/customers/${e.id}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"crm_customers_update",domain:"crm",operation:"write",description:"Patch a customer",schema:yl.shape,handler:async r=>{let e=r;try{let t=await n.patch(`/tenant/{tenant}/customers/${e.id}`,e.payload);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"crm_customers_list",domain:"crm",operation:"read",description:"List customers",schema:vl.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/customers",d({page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,sort:e.sort,ids:e.ids,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,excludeAccountingChangesFromModifiedDateRange:e.excludeAccountingChangesFromModifiedDateRange,name:e.name,street:e.street,unit:e.unit,city:e.city,state:e.state,zip:e.zip,country:e.country,latitude:e.latitude,longitude:e.longitude,phone:e.phone,active:e.active,externalDataApplicationGuid:e.externalDataApplicationGuid,externalDataKey:e.externalDataKey,externalDataValues:e.externalDataValues}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"crm_customers_notes_list",domain:"crm",operation:"read",description:"List notes for a customer",schema:Il.shape,handler:async r=>{let e=r;try{let t=await n.get(`/tenant/{tenant}/customers/${e.id}/notes`,d({page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"crm_customers_notes_create",domain:"crm",operation:"write",description:"Create a note for a customer",schema:Tl.shape,handler:async r=>{let e=r;try{let t=await n.post(`/tenant/{tenant}/customers/${e.id}/notes`,d({text:e.text,isPinned:e.isPinned,createdById:e.createdById}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"crm_customers_create",domain:"crm",operation:"write",description:"Create a customer",schema:Sl.shape,handler:async r=>{let e=r;try{let t=await n.post("/tenant/{tenant}/customers",d({name:e.name,type:e.type,address:e.address,customFields:e.customFields,balance:e.balance,tagTypeIds:e.tagTypeIds,doNotMail:e.doNotMail,doNotService:e.doNotService,externalData:e.externalData,locations:e.locations,contacts:e.contacts}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"crm_customers_notes_delete",domain:"crm",operation:"delete",description:"Delete a customer note",schema:hl.shape,handler:async r=>{let e=r;try{return await n.delete(`/tenant/{tenant}/customers/${e.id}/notes/${e.noteId}`),i({success:!0,message:"Customer note deleted successfully"})}catch(t){return o(c(t))}}}),a.register({name:"crm_customers_contacts_list",domain:"crm",operation:"read",description:"List customer contacts",schema:wl.shape,handler:async r=>{let e=r;try{let t=await n.get(`/tenant/{tenant}/customers/${e.id}/contacts`,d({page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"crm_customers_contacts_delete",domain:"crm",operation:"delete",description:"Delete a customer contact",schema:gl.shape,handler:async r=>{let e=r;try{return await n.delete(`/tenant/{tenant}/customers/${e.id}/contacts/${e.contactId}`),i({success:!0,message:"Customer contact deleted successfully"})}catch(t){return o(c(t))}}}),a.register({name:"crm_customers_contacts_create",domain:"crm",operation:"write",description:"Create a customer contact",schema:_l.shape,handler:async r=>{let e=r;try{let t=await n.post(`/tenant/{tenant}/customers/${e.id}/contacts`,d({type:e.type,value:e.value,memo:e.memo,phoneSettings:e.phoneSettings?d({phoneNumber:e.phoneSettings.phoneNumber,doNotText:e.phoneSettings.doNotText}):void 0}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"crm_customers_tags_create",domain:"crm",operation:"write",description:"Create a tag assignment for a customer",schema:po.shape,handler:async r=>{let e=r;try{let t=await n.post(`/tenant/{tenant}/customers/${e.id}/tags/${e.tagTypeId}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"crm_customers_contacts_modified_list",domain:"crm",operation:"read",description:"List customer contacts modified in a time range",schema:Dl.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/customers/contacts",d({page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,customerIds:e.customerIds,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"crm_customers_tags_delete",domain:"crm",operation:"delete",description:"Delete a tag assignment from a customer",schema:po.shape,handler:async r=>{let e=r;try{return await n.delete(`/tenant/{tenant}/customers/${e.id}/tags/${e.tagTypeId}`),i({success:!0,message:"Customer tag deleted successfully"})}catch(t){return o(c(t))}}}),a.register({name:"crm_customers_custom_field_types_list",domain:"crm",operation:"read",description:"List customer custom field types",schema:Cl.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/customers/custom-fields",d({page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,sort:e.sort}));return i(t)}catch(t){return o(c(t))}}})}import{z as M}from"zod";var go=M.enum(["Open","Dismissed","Converted"]),ho=M.object({id:M.number().int().describe("Lead ID")}),fo=M.object({campaignId:M.number().int().optional().describe("Campaign ID"),customerId:M.number().int().optional().describe("Customer ID"),locationId:M.number().int().optional().describe("Location ID"),businessUnitId:M.number().int().optional().describe("Business unit ID"),jobTypeId:M.number().int().optional().describe("Job type ID"),source:M.string().optional().describe("Lead source"),summary:M.string().optional().describe("Lead summary"),status:go.optional().describe("Lead status"),priority:M.string().optional().describe("Lead priority"),firstName:M.string().optional().describe("First name"),lastName:M.string().optional().describe("Last name"),phone:M.string().optional().describe("Phone number"),email:M.string().optional().describe("Email address"),street:M.string().optional().describe("Street"),unit:M.string().optional().describe("Unit"),city:M.string().optional().describe("City"),state:M.string().optional().describe("State"),zip:M.string().optional().describe("Zip code"),country:M.string().optional().describe("Country"),isProspect:M.boolean().optional().describe("Prospect flag"),callReason:M.string().optional().describe("Lead call reason"),value:M.number().optional().describe("Lead value"),externalId:M.string().optional().describe("External ID")}),kl=M.object({id:M.number().int().describe("Lead ID"),payload:fo.optional().describe("Lead patch payload")}),Ol=M.object({payload:fo.describe("Lead create payload")}),Rl=M.object({id:M.number().int().describe("Lead ID"),followUpDate:M.string().describe("Follow-up date"),text:M.string().describe("Follow-up text"),pinToTop:M.boolean().describe("Pin follow-up to top")}),jl=M.object({id:M.number().int().describe("Lead ID"),text:M.string().describe("Note text"),isPinned:M.boolean().optional().describe("Pinned flag")}),xl=u(p(M.object({id:M.number().int().describe("Lead ID")}))),Al=u(p(M.object({ids:M.string().optional().describe("Comma-delimited lead IDs"),customerId:M.number().int().optional().describe("Associated customer ID"),isProspect:M.boolean().optional().describe("Filter by prospect state"),withoutCustomer:M.boolean().optional().describe("Filter by missing customer/location"),status:go.optional().describe("Lead status"),customerCity:M.string().optional().describe("Filter by customer city"),customerState:M.string().optional().describe("Filter by customer state"),customerZip:M.string().optional().describe("Filter by customer zip"),customerCreatedOnOrAfter:M.string().datetime().optional().describe("Customer created on/after timestamp"),customerCreatedBefore:M.string().datetime().optional().describe("Customer created before timestamp"),customerModifiedOnOrAfter:M.string().datetime().optional().describe("Customer modified on/after timestamp"),...f(["Id","ModifiedOn","CreatedOn"]),genPermUrl:M.boolean().optional().describe("Generate permanent URL")}))),Pl=M.object({id:M.number().int().optional().describe("Lead form ID")});function yo(n,a){a.register({name:"crm_leads_get",domain:"crm",operation:"read",description:"Get a lead by ID",schema:ho.shape,handler:async r=>{let e=r;try{let t=await n.get(`/tenant/{tenant}/leads/${e.id}`);return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_leads_update",domain:"crm",operation:"write",description:"Patch a lead",schema:kl.shape,handler:async r=>{let e=r;try{let t=await n.patch(`/tenant/{tenant}/leads/${e.id}`,e.payload);return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_leads_create",domain:"crm",operation:"write",description:"Create a lead",schema:Ol.shape,handler:async r=>{let e=r;try{let t=await n.post("/tenant/{tenant}/leads",e.payload);return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_leads_follow_ups_create",domain:"crm",operation:"write",description:"Create a follow-up for a lead",schema:Rl.shape,handler:async r=>{let e=r;try{let t=await n.post(`/tenant/{tenant}/leads/${e.id}/follow-up`,{followUpDate:e.followUpDate,text:e.text,pinToTop:e.pinToTop});return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_leads_notes_create",domain:"crm",operation:"write",description:"Create a note for a lead",schema:jl.shape,handler:async r=>{let e=r;try{let t=await n.post(`/tenant/{tenant}/leads/${e.id}/notes`,{text:e.text,isPinned:e.isPinned});return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_leads_notes_list",domain:"crm",operation:"read",description:"List notes for a lead",schema:xl.shape,handler:async r=>{let e=r;try{let t=await n.get(`/tenant/{tenant}/leads/${e.id}/notes`,d({page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter}));return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_leads_list",domain:"crm",operation:"read",description:"List leads",schema:Al.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/leads",d({page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,ids:e.ids,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,customerId:e.customerId,isProspect:e.isProspect,withoutCustomer:e.withoutCustomer,status:e.status,customerCity:e.customerCity,customerState:e.customerState,customerZip:e.customerZip,customerCreatedOnOrAfter:e.customerCreatedOnOrAfter,customerCreatedBefore:e.customerCreatedBefore,customerModifiedOnOrAfter:e.customerModifiedOnOrAfter,sort:e.sort,genPermUrl:e.genPermUrl}));return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_leads_dismiss",domain:"crm",operation:"write",description:"Dismiss a lead",schema:ho.shape,handler:async r=>{let e=r;try{let t=await n.post(`/tenant/{tenant}/leads/${e.id}/dismiss`);return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_leads_form_submit",domain:"crm",operation:"write",description:"Submit a lead form",schema:Pl.shape,handler:async r=>{let e=r;try{let t=await n.post("/tenant/{tenant}/leads/form",{},d({id:e.id}));return i(t)}catch(t){return o(g(t))}}})}import{z as I}from"zod";var To=I.object({street:I.string().optional().describe("Street"),unit:I.string().optional().describe("Unit"),city:I.string().optional().describe("City"),state:I.string().optional().describe("State"),zip:I.string().optional().describe("Zip code"),country:I.string().optional().describe("Country"),latitude:I.number().optional().describe("Latitude"),longitude:I.number().optional().describe("Longitude")}),So=I.object({typeId:I.number().int().optional().describe("Custom field type ID"),name:I.string().optional().describe("Custom field name"),value:I.string().optional().describe("Custom field value")}),wo=I.object({key:I.string().optional().describe("External data key"),value:I.string().optional().describe("External data value")}),El=I.object({type:I.string().optional().describe("Contact type"),value:I.string().optional().describe("Contact value"),memo:I.string().optional().describe("Contact memo")}),vo=I.object({phoneNumber:I.string().optional().describe("Phone number"),doNotText:I.boolean().optional().describe("Do not text flag")}),Bl=I.object({id:I.number().int().describe("Location ID")}),Ll=I.object({id:I.number().int().describe("Location ID"),noteId:I.number().int().describe("Note ID")}),Ml=I.object({id:I.number().int().describe("Location ID"),contactId:I.number().int().describe("Contact ID")}),Io=I.object({id:I.number().int().describe("Location ID"),tagTypeId:I.number().int().describe("Tag type ID")}),Ul=I.object({customerId:I.number().int().optional().describe("Customer ID"),active:I.boolean().optional().describe("Active flag"),name:I.string().optional().describe("Location name"),address:To.optional().describe("Address"),customFields:I.array(So).optional().describe("Custom fields"),zoneId:I.number().int().optional().describe("Zone ID"),tagTypeIds:I.array(I.number().int()).optional().describe("Tag type IDs"),externalData:I.array(wo).optional().describe("External data entries"),taxZoneId:I.number().int().optional().describe("Tax zone ID")}),Fl=I.object({id:I.number().int().describe("Location ID"),payload:Ul.optional().describe("Location patch payload")}),Nl=I.object({taxZoneId:I.number().int().optional().describe("Tax zone ID"),customerId:I.number().int().optional().describe("Customer ID"),active:I.boolean().optional().describe("Active flag"),name:I.string().optional().describe("Location name"),address:To.optional().describe("Address"),customFields:I.array(So).optional().describe("Custom fields"),zoneId:I.number().int().optional().describe("Zone ID"),tagTypeIds:I.array(I.number().int()).optional().describe("Tag type IDs"),externalData:I.array(wo).optional().describe("External data entries"),contacts:I.array(El).optional().describe("Location contacts")}),zl=u(p(I.object({ids:I.string().optional().describe("Comma-delimited location IDs"),name:I.string().optional().describe("Filter by location name"),customerId:I.number().int().optional().describe("Filter by customer ID"),street:I.string().optional().describe("Filter by street"),unit:I.string().optional().describe("Filter by unit"),city:I.string().optional().describe("Filter by city"),state:I.string().optional().describe("Filter by state"),zip:I.string().optional().describe("Filter by zip"),country:I.string().optional().describe("Filter by country"),latitude:I.number().optional().describe("Filter by latitude"),longitude:I.number().optional().describe("Filter by longitude"),...S(),externalDataApplicationGuid:I.string().uuid().optional().describe("External data application GUID"),externalDataKey:I.string().optional().describe("External data key"),externalDataValues:I.string().optional().describe("External data values"),...f(["Id","ModifiedOn","CreatedOn"])}))),$l=u(p(I.object({id:I.number().int().describe("Location ID")}))),Gl=I.object({id:I.number().int().describe("Location ID"),text:I.string().describe("Note text"),isPinned:I.boolean().optional().describe("Pinned flag")}),ql=p(I.object({id:I.number().int().describe("Location ID")})),Jl=I.object({id:I.number().int().describe("Location ID"),type:I.string().describe("Contact type"),value:I.string().describe("Contact value"),memo:I.string().optional().describe("Contact memo"),phoneNumber:I.string().optional().describe("Phone number"),doNotText:I.boolean().optional().describe("Do not text flag")}),Wl=I.object({id:I.number().int().describe("Location ID"),contactId:I.number().int().describe("Contact ID"),value:I.string().optional().describe("Contact value"),memo:I.string().optional().describe("Contact memo"),phoneNumber:I.string().optional().describe("Phone number"),doNotText:I.boolean().optional().describe("Do not text flag")}),Hl=u(p(I.object({locationIds:I.string().optional().describe("Comma-delimited location IDs")}))),Vl=u(p(I.object({...f(["Id","ModifiedOn","CreatedOn"])}))),Kl=p(I.object({locationIds:I.string().optional().describe("Comma-delimited location IDs"),createdBefore:I.string().datetime().optional().describe("Created before timestamp"),createdOnOrAfter:I.string().datetime().optional().describe("Created on or after timestamp"),sort:I.string().optional().describe("Sort: +Location/-Location or +CreatedOn/-CreatedOn")}).extend(S()));function _o(n,a){a.register({name:"crm_locations_get",domain:"crm",operation:"read",description:"Get a location by ID",schema:Bl.shape,handler:async r=>{let e=r;try{let t=await n.get(`/tenant/{tenant}/locations/${e.id}`);return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_locations_update",domain:"crm",operation:"write",description:"Patch a location",schema:Fl.shape,handler:async r=>{let e=r;try{let t=await n.patch(`/tenant/{tenant}/locations/${e.id}`,e.payload);return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_locations_create",domain:"crm",operation:"write",description:"Create a location",schema:Nl.shape,handler:async r=>{let e=r;try{let t=await n.post("/tenant/{tenant}/locations",d({taxZoneId:e.taxZoneId,customerId:e.customerId,active:e.active,name:e.name,address:e.address,customFields:e.customFields,zoneId:e.zoneId,tagTypeIds:e.tagTypeIds,externalData:e.externalData,contacts:e.contacts}));return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_locations_list",domain:"crm",operation:"read",description:"List locations",schema:zl.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/locations",d({ids:e.ids,name:e.name,customerId:e.customerId,street:e.street,unit:e.unit,city:e.city,state:e.state,zip:e.zip,country:e.country,latitude:e.latitude,longitude:e.longitude,active:e.active,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,sort:e.sort,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,externalDataApplicationGuid:e.externalDataApplicationGuid,externalDataKey:e.externalDataKey,externalDataValues:e.externalDataValues}));return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_locations_notes_list",domain:"crm",operation:"read",description:"List notes for a location",schema:$l.shape,handler:async r=>{let e=r;try{let t=await n.get(`/tenant/{tenant}/locations/${e.id}/notes`,d({page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter}));return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_locations_notes_create",domain:"crm",operation:"write",description:"Create a note for a location",schema:Gl.shape,handler:async r=>{let e=r;try{let t=await n.post(`/tenant/{tenant}/locations/${e.id}/notes`,{text:e.text,isPinned:e.isPinned??!1});return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_locations_notes_delete",domain:"crm",operation:"delete",description:"Delete a location note",schema:Ll.shape,handler:async r=>{let e=r;try{return await n.delete(`/tenant/{tenant}/locations/${e.id}/notes/${e.noteId}`),i({success:!0,message:"Location note deleted successfully"})}catch(t){return o(g(t))}}}),a.register({name:"crm_locations_contacts_list",domain:"crm",operation:"read",description:"List contacts for a location",schema:ql.shape,handler:async r=>{let e=r;try{let t=await n.get(`/tenant/{tenant}/locations/${e.id}/contacts`,d({page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal}));return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_locations_contacts_create",domain:"crm",operation:"write",description:"Create a contact for a location",schema:Jl.shape,handler:async r=>{let e=r;try{let t=e.phoneNumber!==void 0||e.doNotText!==void 0?vo.parse({phoneNumber:e.phoneNumber,doNotText:e.doNotText}):void 0,s=await n.post(`/tenant/{tenant}/locations/${e.id}/contacts`,d({type:e.type,value:e.value,memo:e.memo,phoneSettings:t}));return i(s)}catch(t){return o(g(t))}}}),a.register({name:"crm_locations_contacts_delete",domain:"crm",operation:"delete",description:"Delete a location contact",schema:Ml.shape,handler:async r=>{let e=r;try{return await n.delete(`/tenant/{tenant}/locations/${e.id}/contacts/${e.contactId}`),i({success:!0,message:"Location contact deleted successfully"})}catch(t){return o(g(t))}}}),a.register({name:"crm_locations_contacts_update",domain:"crm",operation:"write",description:"Patch a location contact",schema:Wl.shape,handler:async r=>{let e=r;try{let t=e.phoneNumber!==void 0||e.doNotText!==void 0?vo.parse({phoneNumber:e.phoneNumber,doNotText:e.doNotText}):void 0,s=await n.patch(`/tenant/{tenant}/locations/${e.id}/contacts/${e.contactId}`,d({value:e.value,memo:e.memo,phoneSettings:t}));return i(s)}catch(t){return o(g(t))}}}),a.register({name:"crm_locations_contacts_modified_list",domain:"crm",operation:"read",description:"List location contacts modified in a time range",schema:Hl.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/locations/contacts",d({page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,locationIds:e.locationIds,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter}));return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_locations_tags_create",domain:"crm",operation:"write",description:"Create a tag assignment for a location",schema:Io.shape,handler:async r=>{let e=r;try{let t=await n.post(`/tenant/{tenant}/locations/${e.id}/tags/${e.tagTypeId}`);return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_locations_tags_delete",domain:"crm",operation:"delete",description:"Delete a tag assignment from a location",schema:Io.shape,handler:async r=>{let e=r;try{return await n.delete(`/tenant/{tenant}/locations/${e.id}/tags/${e.tagTypeId}`),i({success:!0,message:"Location tag deleted successfully"})}catch(t){return o(g(t))}}}),a.register({name:"crm_locations_custom_field_types_list",domain:"crm",operation:"read",description:"List location custom field types",schema:Vl.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/locations/custom-fields",d({page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,sort:e.sort}));return i(t)}catch(t){return o(g(t))}}}),a.register({name:"crm_location_labor_types_list",domain:"crm",operation:"read",description:"List location labor types by locations",schema:Kl.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/locations/rates",d({locationIds:e.locationIds,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,active:e.active,sort:e.sort}));return i(t)}catch(t){return o(g(t))}}})}var Zl=(n,a)=>{eo(n,a),Za(n,a),to(n,a),ro(n,a),mo(n,a),bo(n,a),yo(n,a),_o(n,a)},Do=Zl;import{z as re}from"zod";var Co=re.enum(["Scheduled","Dispatched","Working","Hold","Done","Canceled"]);function Yl(n){return u(n).extend({createdBefore:re.string().datetime().optional().describe("Return appointments created before this UTC timestamp"),createdOnOrAfter:re.string().datetime().optional().describe("Return appointments created on or after this UTC timestamp"),modifiedBefore:re.string().datetime().optional().describe("Return appointments modified before this UTC timestamp"),modifiedOnOrAfter:re.string().datetime().optional().describe("Return appointments modified on or after this UTC timestamp")})}var Xl=p(Yl(re.object({...f(["Id","ModifiedOn","CreatedOn"]),ids:re.string().optional().describe("Comma-separated appointment IDs (maximum 50)"),jobId:re.number().int().optional().describe("Filter by job ID"),projectId:re.number().int().optional().describe("Filter by project ID"),number:re.string().optional().describe("Filter by appointment number"),status:Co.optional().describe("Filter by appointment status"),startsOnOrAfter:re.string().datetime().optional().describe("Return appointments starting on or after this UTC timestamp"),startsBefore:re.string().datetime().optional().describe("Return appointments starting before this UTC timestamp"),technicianId:re.number().int().optional().describe("Filter by assigned technician ID"),customerId:re.number().int().optional().describe("Filter by customer ID"),unused:re.boolean().optional().describe("Return unused appointments only")})));function ko(n,a){a.register({name:"dispatch_appointments_get",domain:"dispatch",operation:"read",description:"Get an appointment by ID",schema:{id:re.number().int().describe("Appointment ID")},handler:async r=>{let{id:e}=r;try{let t=await n.get(`/tenant/{tenant}/appointments/${e}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_appointments_delete",domain:"dispatch",operation:"delete",description:"Delete an appointment by ID",schema:{id:re.number().int().describe("Appointment ID")},handler:async r=>{let{id:e}=r;try{let t=await n.delete(`/tenant/{tenant}/appointments/${e}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_appointments_list",domain:"dispatch",operation:"read",description:"List appointments",schema:Xl.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/appointments",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_appointments_create",domain:"dispatch",operation:"write",description:"Create an appointment",schema:{jobId:re.number().int().describe("Job ID"),appointmentNumber:re.string().describe("Appointment number"),start:re.string().describe("Appointment start time"),end:re.string().describe("Appointment end time"),arrivalWindowStart:re.string().optional().describe("Arrival window start timestamp"),arrivalWindowEnd:re.string().optional().describe("Arrival window end timestamp"),status:Co.optional().describe("Initial appointment status"),specialInstructions:re.string().optional().describe("Special instructions for dispatch"),customerId:re.number().int().describe("Customer ID"),createdById:re.number().int().describe("User ID creating the appointment"),isConfirmed:re.boolean().optional().describe("Whether the appointment is confirmed")},handler:async r=>{let e=r;try{let t=await n.post("/tenant/{tenant}/appointments",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_appointments_reschedule",domain:"dispatch",operation:"write",description:"Reschedule an appointment",schema:{id:re.number().int().describe("Appointment ID"),start:re.string().optional().describe("Updated appointment start time"),end:re.string().optional().describe("Updated appointment end time"),arrivalWindowStart:re.string().optional().describe("Updated arrival window start time"),arrivalWindowEnd:re.string().optional().describe("Updated arrival window end time"),specialInstructions:re.string().optional().describe("Updated special instructions")},handler:async r=>{let{id:e,...t}=r;try{let s=d(t),m=await n.patch(`/tenant/{tenant}/appointments/${e}/reschedule`,Object.keys(s).length>0?s:void 0);return i(m)}catch(s){return o(c(s))}}}),a.register({name:"dispatch_appointments_hold",domain:"dispatch",operation:"write",description:"Put an appointment on hold",schema:{id:re.number().int().describe("Appointment ID")},handler:async r=>{let{id:e}=r;try{let t=await n.put(`/tenant/{tenant}/appointments/${e}/hold`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_appointments_unhold",domain:"dispatch",operation:"delete",description:"Remove hold from an appointment",schema:{id:re.number().int().describe("Appointment ID")},handler:async r=>{let{id:e}=r;try{let t=await n.delete(`/tenant/{tenant}/appointments/${e}/hold`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_appointments_update_special_instructions",domain:"dispatch",operation:"write",description:"Update appointment special instructions",schema:{id:re.number().int().describe("Appointment ID"),specialInstructions:re.string().describe("Special instructions to store on the appointment")},handler:async r=>{let{id:e,specialInstructions:t}=r;try{let s=await n.put(`/tenant/{tenant}/appointments/${e}/special-instructions`,{specialInstructions:t});return i(s)}catch(s){return o(c(s))}}}),a.register({name:"dispatch_appointments_confirm",domain:"dispatch",operation:"write",description:"Confirm an appointment",schema:{id:re.number().int().describe("Appointment ID")},handler:async r=>{let{id:e}=r;try{let t=await n.put(`/tenant/{tenant}/appointments/${e}/confirmation`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_appointments_unconfirm",domain:"dispatch",operation:"delete",description:"Remove appointment confirmation",schema:{id:re.number().int().describe("Appointment ID")},handler:async r=>{let{id:e}=r;try{let t=await n.delete(`/tenant/{tenant}/appointments/${e}/confirmation`);return i(t)}catch(t){return o(c(t))}}})}import{z as _e}from"zod";var br=_e.object({fromHour:_e.number().int().describe("Starting hour of availability block (0-23)"),toHour:_e.number().int().describe("Ending hour of availability block (0-23)")});function Ql(n){return u(n).extend({createdBefore:_e.string().datetime().optional().describe("Return items created before this UTC timestamp"),createdOnOrAfter:_e.string().datetime().optional().describe("Return items created on or after this UTC timestamp"),modifiedBefore:_e.string().datetime().optional().describe("Return items modified before this UTC timestamp"),modifiedOnOrAfter:_e.string().datetime().optional().describe("Return items modified on or after this UTC timestamp")})}var eu=p(Ql(_e.object({...S()})));function Oo(n,a){a.register({name:"dispatch_arrival_windows_create",domain:"dispatch",operation:"write",description:"Create a new arrival window",schema:{start:_e.string().describe("Arrival window start time"),duration:_e.string().describe("Arrival window duration"),businessUnitIds:_e.array(_e.number().int().describe("Business unit ID")).min(1).describe("Business units that can use this arrival window"),active:_e.boolean().describe("Whether the arrival window is active")},handler:async r=>{let{start:e,duration:t,businessUnitIds:s,active:m}=r;try{let b=await n.post("/tenant/{tenant}/arrival-windows",{start:e,duration:t,businessUnitIds:s,active:m});return i(b)}catch(b){return o(c(b))}}}),a.register({name:"dispatch_arrival_windows_get",domain:"dispatch",operation:"read",description:"Get an arrival window by ID",schema:{id:_e.number().int().describe("Arrival window ID")},handler:async r=>{let{id:e}=r;try{let t=await n.get(`/tenant/{tenant}/arrival-windows/${e}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_arrival_windows_list",domain:"dispatch",operation:"read",description:"List arrival windows",schema:eu.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/arrival-windows",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_arrival_windows_activate",domain:"dispatch",operation:"write",description:"Activate an arrival window",schema:{id:_e.number().int().describe("Arrival window ID")},handler:async r=>{let{id:e}=r;try{let t=await n.put(`/tenant/{tenant}/arrival-windows/${e}/activated`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_arrival_window_configuration_get",domain:"dispatch",operation:"read",description:"Get arrival window configuration",schema:{},handler:async()=>{try{let r=await n.get("/tenant/{tenant}/arrival-windows/configuration");return i(r)}catch(r){return o(c(r))}}}),a.register({name:"dispatch_arrival_window_configuration_update",domain:"dispatch",operation:"write",description:"Update arrival window configuration",schema:{enabled:_e.boolean().optional().describe("Whether arrival windows are enabled for dispatching"),defaultArrivalWindowId:_e.number().int().optional().describe("Default arrival window ID used for scheduling"),weekdays:_e.array(br).optional().describe("Weekday availability blocks in local business hours"),saturday:_e.array(br).optional().describe("Saturday availability blocks in local business hours"),sunday:_e.array(br).optional().describe("Sunday availability blocks in local business hours")},handler:async r=>{let e=r;try{let t=await n.post("/tenant/{tenant}/arrival-windows/configuration",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_arrival_windows_update",domain:"dispatch",operation:"write",description:"Update an arrival window",schema:{id:_e.number().int().describe("Arrival window ID"),start:_e.string().optional().describe("Arrival window start time"),duration:_e.string().optional().describe("Arrival window duration"),businessUnitIds:_e.array(_e.number().int().describe("Business unit ID")).optional().describe("Business units that can use this arrival window"),active:_e.boolean().optional().describe("Whether the arrival window is active")},handler:async r=>{let{id:e,...t}=r;try{let s=await n.put(`/tenant/{tenant}/arrival-windows/${e}`,d(t));return i(s)}catch(s){return o(c(s))}}})}import{z as ze}from"zod";function tu(n){return u(n).extend({createdBefore:ze.string().datetime().optional().describe("Return forms created before this UTC timestamp"),createdOnOrAfter:ze.string().datetime().optional().describe("Return forms created on or after this UTC timestamp"),modifiedBefore:ze.string().datetime().optional().describe("Return forms modified before this UTC timestamp"),modifiedOnOrAfter:ze.string().datetime().optional().describe("Return forms modified on or after this UTC timestamp")})}var nu=p(tu(ze.object({...S(),...f(["Id","CreatedOn","ModifiedOn","Name"]),hasConditionalLogic:ze.boolean().optional().describe("Filter forms by conditional logic usage"),hasTriggers:ze.boolean().optional().describe("Filter forms by trigger usage"),name:ze.string().optional().describe("Filter by form name"),status:ze.enum(["Any","Published","Unpublished"]).optional().describe("Filter by form publication status"),ids:ze.string().optional().describe("Comma-separated form IDs (maximum 50)")}))),ru=p(ze.object({...S(),...f(["Id","SubmittedOn","CreatedBy"]),formIds:ze.string().optional().describe("Comma-separated form IDs"),createdById:ze.number().int().optional().describe("Creator user ID"),status:ze.enum(["Started","Completed","Any"]).optional().describe("Submission status filter"),submittedOnOrAfter:ze.string().datetime().optional().describe("Return submissions submitted on or after this UTC timestamp"),submittedBefore:ze.string().datetime().optional().describe("Return submissions submitted before this UTC timestamp"),ownerType:ze.enum(["Job","Call","Customer","Location","Equipment","Technician","JobAppointment","Membership","Truck"]).optional().describe("Owner type filter"),owners:ze.string().optional().describe("Owner query expression used by ServiceTitan submissions endpoint")}));function Ro(n,a){a.register({name:"dispatch_forms_list",domain:"dispatch",operation:"read",description:"List forms",schema:nu.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/forms",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_form_submissions_list",domain:"dispatch",operation:"read",description:"List form submissions",schema:ru.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/submissions",d(e));return i(t)}catch(t){return o(c(t))}}})}import{z as $t}from"zod";var jo=$t.object({path:$t.string().optional().describe("Storage path of the image to retrieve")}),xo=$t.object({alias:$t.string().optional().describe("Image alias"),fileName:$t.string().optional().describe("Image file name"),url:$t.string().optional().describe("Public image URL")});function Ao(n,a){a.register({name:"dispatch_images_get",domain:"dispatch",operation:"read",description:"Get image metadata by storage path",schema:jo.shape,handler:async r=>{let e=jo.parse(r);try{let t=await n.get("/tenant/{tenant}/images",d({path:e.path}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_images_create",domain:"dispatch",operation:"write",description:"Create an image placeholder",schema:xo.shape,handler:async r=>{let e=xo.parse(r);try{let t=d(e),s=await n.post("/tenant/{tenant}/images",Object.keys(t).length>0?t:void 0);return i(s)}catch(t){return o(c(t))}}})}import{z as ae}from"zod";var mn=ae.object({id:ae.number().int().describe("Installed equipment ID")}),Po=ae.object({file:ae.string().describe("Base64-encoded attachment file")}),Eo=ae.object({path:ae.string().optional().describe("Storage path for a previously-uploaded attachment")}),Uo=ae.object({active:ae.boolean().optional().describe("Whether the installed equipment is active"),equipmentId:ae.number().int().optional().describe("Equipment catalog ID"),locationId:ae.number().int().optional().describe("Location ID"),customerId:ae.number().int().optional().describe("Customer ID"),invoiceItemId:ae.number().int().optional().describe("Invoice item ID"),name:ae.string().optional().describe("Installed equipment display name"),installedOn:ae.string().optional().describe("Installed date/time in RFC3339 format"),serialNumber:ae.string().optional().describe("Serial number"),barcodeId:ae.string().optional().describe("Barcode ID"),memo:ae.string().optional().describe("Equipment memo"),manufacturer:ae.string().optional().describe("Manufacturer name"),model:ae.string().optional().describe("Model identifier"),cost:ae.number().optional().describe("Acquisition cost"),manufacturerWarrantyStart:ae.string().optional().describe("Manufacturer warranty start date/time in RFC3339 format"),manufacturerWarrantyEnd:ae.string().optional().describe("Manufacturer warranty end date/time in RFC3339 format"),serviceProviderWarrantyStart:ae.string().optional().describe("Service provider warranty start date/time in RFC3339 format"),serviceProviderWarrantyEnd:ae.string().optional().describe("Service provider warranty end date/time in RFC3339 format"),actualReplacementDate:ae.string().optional().describe("Actual replacement date/time in RFC3339 format"),predictedReplacementMonths:ae.number().int().optional().describe("Predicted replacement cadence in months"),predictedReplacementDate:ae.string().optional().describe("Predicted replacement date/time in RFC3339 format")}),Bo=Uo.extend({equipmentId:ae.number().int().describe("Equipment catalog ID"),locationId:ae.number().int().describe("Location ID"),customerId:ae.number().int().describe("Customer ID"),name:ae.string().describe("Installed equipment display name"),installedOn:ae.string().describe("Installed date/time in RFC3339 format")}),Lo=mn.extend(Uo.shape);function au(n){return u(n).extend({createdBefore:ae.string().datetime().optional().describe("Return items created before this UTC timestamp"),createdOnOrAfter:ae.string().datetime().optional().describe("Return items created on or after this UTC timestamp"),modifiedBefore:ae.string().datetime().optional().describe("Return items modified before this UTC timestamp"),modifiedOnOrAfter:ae.string().datetime().optional().describe("Return items modified on or after this UTC timestamp")})}var Mo=p(au(ae.object({...S(),...f(["Id","ModifiedOn","CreatedOn"]),locationIds:ae.string().optional().describe("Comma-separated location IDs to include"),ids:ae.string().optional().describe("Comma-separated installed equipment IDs (maximum 50)")})));function Fo(n,a){a.register({name:"dispatch_installed_equipment_get",domain:"dispatch",operation:"read",description:"Get installed equipment by ID",schema:mn.shape,handler:async r=>{let e=mn.parse(r);try{let t=await n.get(`/tenant/{tenant}/installed-equipment/${e.id}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_installed_equipment_list",domain:"dispatch",operation:"read",description:"List installed equipment",schema:Mo.shape,handler:async r=>{let e=Mo.parse(r);try{let t=await n.get("/tenant/{tenant}/installed-equipment",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_installed_equipment_create",domain:"dispatch",operation:"write",description:"Create installed equipment",schema:Bo.shape,handler:async r=>{let e=Bo.parse(r);try{let t=await n.post("/tenant/{tenant}/installed-equipment",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_installed_equipment_update",domain:"dispatch",operation:"write",description:"Update installed equipment",schema:Lo.shape,handler:async r=>{let e=Lo.parse(r),{id:t,...s}=e;try{let m=d(s),b=await n.patch(`/tenant/{tenant}/installed-equipment/${t}`,Object.keys(m).length>0?m:void 0);return i(b)}catch(m){return o(c(m))}}}),a.register({name:"dispatch_installed_equipment_delete",domain:"dispatch",operation:"delete",description:"Delete installed equipment",schema:mn.shape,handler:async r=>{let e=mn.parse(r);try{let t=await n.delete(`/tenant/{tenant}/installed-equipment/${e.id}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_installed_equipment_attachments_create",domain:"dispatch",operation:"write",description:"Upload an installed equipment attachment",schema:Po.shape,handler:async r=>{let e=Po.parse(r);try{let t=await n.post("/tenant/{tenant}/installed-equipment/attachments",{file:e.file});return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_installed_equipment_attachments_get",domain:"dispatch",operation:"read",description:"Get installed equipment attachment metadata by storage path",schema:Eo.shape,handler:async r=>{let e=Eo.parse(r);try{let t=await n.get("/tenant/{tenant}/installed-equipment/attachments",d({path:e.path}));return i(t)}catch(t){return o(c(t))}}})}import{z as N}from"zod";var ou=N.object({key:N.string().describe("External data key"),value:N.string().describe("External data value")}),qo=N.object({name:N.string().optional().describe("Job type name"),businessUnitIds:N.array(N.number().int()).optional().describe("Business unit IDs associated to this job type"),skills:N.array(N.string()).optional().describe("Skill labels associated to this job type"),tagTypeIds:N.array(N.number().int()).optional().describe("Tag type IDs"),priority:N.string().optional().describe("Default priority"),duration:N.number().optional().describe("Default duration in seconds"),soldThreshold:N.number().optional().describe("Sold threshold value"),class:N.string().optional().describe("Job class"),summary:N.string().optional().describe("Job type summary"),noCharge:N.boolean().optional().describe("Whether this job type is no-charge"),enforceRecurringServiceEventSelection:N.boolean().optional().describe("Require recurring service event selection"),invoiceSignaturesRequired:N.boolean().optional().describe("Whether signatures are required for invoices"),externalData:N.array(ou).optional().describe("External data entries"),active:N.boolean().optional().describe("Whether this job type is active")}),No=qo.extend({name:N.string().describe("Job type name"),businessUnitIds:N.array(N.number().int()).describe("Business unit IDs associated to this job type"),skills:N.array(N.string()).describe("Skill labels associated to this job type"),tagTypeIds:N.array(N.number().int()).describe("Tag type IDs"),priority:N.string().describe("Default priority"),duration:N.number().describe("Default duration in seconds"),soldThreshold:N.number().describe("Sold threshold value"),class:N.string().describe("Job class"),summary:N.string().describe("Job type summary"),noCharge:N.boolean().describe("Whether this job type is no-charge"),enforceRecurringServiceEventSelection:N.boolean().describe("Require recurring service event selection"),invoiceSignaturesRequired:N.boolean().describe("Whether signatures are required for invoices")}),Rn=N.object({id:N.number().int().describe("Job type ID")}),zo=Rn.extend({externalDataApplicationGuid:N.string().uuid().optional().describe("External data application GUID")}),$o=Rn.extend(qo.shape);function iu(n){return u(n).extend({createdBefore:N.string().datetime().optional().describe("Return items created before this UTC timestamp"),createdOnOrAfter:N.string().datetime().optional().describe("Return items created on or after this UTC timestamp"),modifiedBefore:N.string().datetime().optional().describe("Return items modified before this UTC timestamp"),modifiedOnOrAfter:N.string().datetime().optional().describe("Return items modified on or after this UTC timestamp")})}var Go=p(iu(N.object({...S(),name:N.string().optional().describe("Filter by job type name"),minDuration:N.number().int().optional().describe("Minimum duration in seconds"),maxDuration:N.number().int().optional().describe("Maximum duration in seconds"),priority:N.string().optional().describe("Priority filter"),ids:N.string().optional().describe("Comma-separated job type IDs (maximum 50)"),orderBy:N.string().optional().describe("Order by field"),orderByDirection:N.string().optional().describe("Order direction (asc/descending)"),externalDataApplicationGuid:N.string().uuid().optional().describe("External data application GUID")})));function Jo(n,a){a.register({name:"dispatch_job_types_get",domain:"dispatch",operation:"read",description:"Get a job type by ID",schema:zo.shape,handler:async r=>{let e=zo.parse(r);try{let t=await n.get(`/tenant/{tenant}/job-types/${e.id}`,d({externalDataApplicationGuid:e.externalDataApplicationGuid}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_job_types_list",domain:"dispatch",operation:"read",description:"List job types",schema:Go.shape,handler:async r=>{let e=Go.parse(r);try{let t=await n.get("/tenant/{tenant}/job-types",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_job_types_create",domain:"dispatch",operation:"write",description:"Create a job type",schema:No.shape,handler:async r=>{let e=No.parse(r);try{let t=await n.post("/tenant/{tenant}/job-types",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_job_types_update",domain:"dispatch",operation:"write",description:"Update a job type",schema:$o.shape,handler:async r=>{let e=$o.parse(r),{id:t,...s}=e;try{let m=d(s),b=await n.patch(`/tenant/{tenant}/job-types/${t}`,Object.keys(m).length>0?m:void 0);return i(b)}catch(m){return o(c(m))}}}),a.register({name:"dispatch_job_types_delete",domain:"dispatch",operation:"delete",description:"Delete a job type",schema:Rn.shape,handler:async r=>{let e=Rn.parse(r);try{let t=await n.delete(`/tenant/{tenant}/job-types/${e.id}`);return i(t)}catch(t){return o(c(t))}}})}import{z as C}from"zod";var ii=C.enum(["Scheduled","Dispatched","InProgress","Hold","Completed","Canceled"]),su=C.enum(["Scheduled","Dispatched","Working","Hold","Done","Canceled"]),si=C.enum(["Low","Normal","High","Urgent"]),cu=C.object({key:C.string().optional().describe("External data key"),value:C.string().optional().describe("External data value")}),du=C.object({typeId:C.number().int().optional().describe("Custom field type ID"),name:C.string().optional().describe("Custom field name"),value:C.string().optional().describe("Custom field value")}),hr=C.object({number:C.string().optional().describe("Job number"),projectId:C.number().int().optional().describe("Project ID"),bookingId:C.number().int().optional().describe("Booking ID"),customerId:C.number().int().optional().describe("Customer ID"),locationId:C.number().int().optional().describe("Location ID"),soldById:C.number().int().optional().describe("Selling technician ID"),jobTypeId:C.number().int().optional().describe("Job type ID"),campaignId:C.number().int().optional().describe("Campaign ID"),businessUnitId:C.number().int().optional().describe("Business unit ID"),status:ii.optional().describe("Job status"),priority:si.optional().describe("Job priority"),summary:C.string().optional().describe("Job summary"),noCharge:C.boolean().optional().describe("Whether this job is no-charge"),externalData:C.array(cu).optional().describe("External data entries"),customFields:C.array(du).optional().describe("Custom field values"),tagTypeIds:C.array(C.number().int()).optional().describe("Tag type IDs")}),$e=C.object({id:C.number().int().describe("Job ID")}),Wo=$e.extend({externalDataApplicationGuid:C.string().uuid().optional().describe("External data application GUID")}),Ho=$e.extend(hr.shape),Vo=$e.extend({file:C.string().describe("Base64-encoded attachment file"),fileName:C.string().optional().describe("Attachment file name"),contentType:C.string().optional().describe("Attachment content type")}),Ko=C.object({id:C.number().int().describe("Job attachment ID")}),Zo=$e.extend({text:C.string().describe("Note text")}),Yo=$e.extend({message:C.string().describe("Message content")}),Xo=C.object({ids:C.string().optional().describe("Comma-separated cancel reason IDs (maximum 50)")});function qt(n){return u(n).extend({createdBefore:C.string().datetime().optional().describe("Return items created before this UTC timestamp"),createdOnOrAfter:C.string().datetime().optional().describe("Return items created on or after this UTC timestamp"),modifiedBefore:C.string().datetime().optional().describe("Return items modified before this UTC timestamp"),modifiedOnOrAfter:C.string().datetime().optional().describe("Return items modified on or after this UTC timestamp")})}var Qo=p(qt(C.object({...f(["Id","CreatedOn"]),jobId:C.number().int().describe("Job ID")}))),Gt=p(qt(C.object({...S(),...f(["Id","ModifiedOn","CreatedOn"])}))),ei=p(qt(C.object({...f(["Id","ModifiedOn","CreatedOn","Priority"]),ids:C.string().optional().describe("Comma-separated job IDs (maximum 50)"),number:C.string().optional().describe("Filter by job number"),projectId:C.number().int().optional().describe("Filter by project ID"),bookingId:C.number().int().optional().describe("Filter by booking ID"),jobStatus:ii.optional().describe("Job status filter"),appointmentStatus:su.optional().describe("Appointment status filter"),priority:si.optional().describe("Job priority filter"),firstAppointmentStartsOnOrAfter:C.string().datetime().optional().describe("Return jobs whose first appointment starts on or after this UTC timestamp"),firstAppointmentStartsBefore:C.string().datetime().optional().describe("Return jobs whose first appointment starts before this UTC timestamp"),appointmentStartsOnOrAfter:C.string().datetime().optional().describe("Return jobs with any appointment on or after this UTC timestamp"),appointmentStartsBefore:C.string().datetime().optional().describe("Return jobs with any appointment before this UTC timestamp"),technicianId:C.number().int().optional().describe("Filter by technician ID"),customerId:C.number().int().optional().describe("Filter by customer ID"),locationId:C.number().int().optional().describe("Filter by location ID"),soldById:C.number().int().optional().describe("Filter by selling technician ID"),jobTypeId:C.number().int().optional().describe("Filter by job type ID"),campaignId:C.number().int().optional().describe("Filter by campaign ID"),businessUnitId:C.number().int().optional().describe("Filter by business unit ID"),invoiceId:C.number().int().optional().describe("Filter by invoice ID"),completedOnOrAfter:C.string().datetime().optional().describe("Return jobs completed on or after this UTC timestamp"),completedBefore:C.string().datetime().optional().describe("Return jobs completed before this UTC timestamp"),tagTypeIds:C.string().optional().describe("Comma-separated tag type IDs"),externalDataApplicationGuid:C.string().uuid().optional().describe("External data application GUID"),externalDataKey:C.string().optional().describe("External data key"),externalDataValues:C.string().optional().describe("External data values (comma-separated, maximum 50)"),hasUnusedAppointments:C.boolean().optional().describe("Return jobs with unused appointments")}))),ti=p(C.object({id:C.number().int().describe("Job ID")})),ni=p(C.object({id:C.number().int().describe("Job ID")})),ri=p(qt(C.object({...f(["Id","CreatedOn","ModifiedOn"])}))),ai=p(qt(C.object({...S(),...f(["Id","ModifiedOn","CreatedOn"]),jobId:C.number().int().describe("Job ID")}))),oi=p(qt(C.object({...S(),...f(["Id","ModifiedOn","CreatedOn"]),jobIds:C.string().optional().describe("Comma-separated job IDs to include")})));function ci(n,a){a.register({name:"dispatch_jobs_create_attachment",domain:"dispatch",operation:"write",description:"Attach a file to a job",schema:Vo.shape,handler:async r=>{let e=Vo.parse(r);try{let t=await n.post(`/tenant/{tenant}/jobs/${e.id}/attachments`,{file:e.file,fileName:e.fileName,contentType:e.contentType});return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_jobs_get_attachment",domain:"dispatch",operation:"read",description:"Get a job attachment by ID",schema:Ko.shape,handler:async r=>{let e=Ko.parse(r);try{let t=await n.get(`/tenant/{tenant}/jobs/attachment/${e.id}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_jobs_list_attachments",domain:"dispatch",operation:"read",description:"List attachments for a job",schema:Qo.shape,handler:async r=>{let e=Qo.parse(r),{jobId:t,...s}=e;try{let m=await n.get(`/tenant/{tenant}/jobs/${t}/attachments`,d(s));return i(m)}catch(m){return o(c(m))}}}),a.register({name:"dispatch_call_reasons_list",domain:"dispatch",operation:"read",description:"List call reasons",schema:Gt.shape,handler:async r=>{let e=Gt.parse(r);try{let t=await n.get("/tenant/{tenant}/call-reasons",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_job_cancel_reasons_list",domain:"dispatch",operation:"read",description:"List job cancel reasons",schema:Gt.shape,handler:async r=>{let e=Gt.parse(r);try{let t=await n.get("/tenant/{tenant}/job-cancel-reasons",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_job_hold_reasons_list",domain:"dispatch",operation:"read",description:"List job hold reasons",schema:Gt.shape,handler:async r=>{let e=Gt.parse(r);try{let t=await n.get("/tenant/{tenant}/job-hold-reasons",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_jobs_get",domain:"dispatch",operation:"read",description:"Get a job by ID",schema:Wo.shape,handler:async r=>{let e=Wo.parse(r);try{let t=await n.get(`/tenant/{tenant}/jobs/${e.id}`,d({externalDataApplicationGuid:e.externalDataApplicationGuid}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_jobs_list",domain:"dispatch",operation:"read",description:"List jobs",schema:ei.shape,handler:async r=>{let e=ei.parse(r);try{let t=await n.get("/tenant/{tenant}/jobs",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_jobs_create",domain:"dispatch",operation:"write",description:"Create a job",schema:hr.shape,handler:async r=>{let e=hr.parse(r);try{let t=d(e),s=await n.post("/tenant/{tenant}/jobs",Object.keys(t).length>0?t:void 0);return i(s)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_jobs_update",domain:"dispatch",operation:"write",description:"Update a job",schema:Ho.shape,handler:async r=>{let e=Ho.parse(r),{id:t,...s}=e;try{let m=d(s),b=await n.patch(`/tenant/{tenant}/jobs/${t}`,Object.keys(m).length>0?m:void 0);return i(b)}catch(m){return o(c(m))}}}),a.register({name:"dispatch_jobs_cancel",domain:"dispatch",operation:"write",description:"Cancel a job",schema:$e.shape,handler:async r=>{let e=$e.parse(r);try{let t=await n.put(`/tenant/{tenant}/jobs/${e.id}/cancel`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_jobs_remove_cancellation",domain:"dispatch",operation:"write",description:"Remove cancellation from a job",schema:$e.shape,handler:async r=>{let e=$e.parse(r);try{let t=await n.put(`/tenant/{tenant}/jobs/${e.id}/remove-cancellation`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_jobs_hold",domain:"dispatch",operation:"write",description:"Put a job on hold",schema:$e.shape,handler:async r=>{let e=$e.parse(r);try{let t=await n.put(`/tenant/{tenant}/jobs/${e.id}/hold`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_jobs_complete",domain:"dispatch",operation:"write",description:"Complete a job",schema:$e.shape,handler:async r=>{let e=$e.parse(r);try{let t=await n.put(`/tenant/{tenant}/jobs/${e.id}/complete`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_jobs_notes_list",domain:"dispatch",operation:"read",description:"List notes for a job",schema:ti.shape,handler:async r=>{let e=ti.parse(r);try{let t=await n.get(`/tenant/{tenant}/jobs/${e.id}/notes`,d({page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_jobs_notes_create",domain:"dispatch",operation:"write",description:"Create a note for a job",schema:Zo.shape,handler:async r=>{let e=Zo.parse(r);try{let t=await n.post(`/tenant/{tenant}/jobs/${e.id}/notes`,{text:e.text});return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_jobs_cancel_reasons_list",domain:"dispatch",operation:"read",description:"List cancel reasons available for jobs",schema:Xo.shape,handler:async r=>{let e=Xo.parse(r);try{let t=await n.get("/tenant/{tenant}/jobs/cancel-reasons",d({ids:e.ids}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_jobs_history_get",domain:"dispatch",operation:"read",description:"Get history for a job",schema:$e.shape,handler:async r=>{let e=$e.parse(r);try{let t=await n.get(`/tenant/{tenant}/jobs/${e.id}/history`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_jobs_messages_create",domain:"dispatch",operation:"write",description:"Create a message for a job",schema:Yo.shape,handler:async r=>{let e=Yo.parse(r);try{let t=await n.post(`/tenant/{tenant}/jobs/${e.id}/messages`,{message:e.message});return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_jobs_canceled_logs_list",domain:"dispatch",operation:"read",description:"List canceled log entries for a job",schema:ni.shape,handler:async r=>{let e=ni.parse(r);try{let t=await n.get(`/tenant/{tenant}/jobs/${e.id}/canceled-log`,d({page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_jobs_booked_log_get",domain:"dispatch",operation:"read",description:"Get booked log details for a job",schema:$e.shape,handler:async r=>{let e=$e.parse(r);try{let t=await n.get(`/tenant/{tenant}/jobs/${e.id}/booked-log`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_jobs_custom_field_types_list",domain:"dispatch",operation:"read",description:"List job custom field types",schema:ri.shape,handler:async r=>{let e=ri.parse(r);try{let t=await n.get("/tenant/{tenant}/jobs/custom-fields",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_job_splits_list",domain:"dispatch",operation:"read",description:"List splits for a single job",schema:ai.shape,handler:async r=>{let e=ai.parse(r),{jobId:t,...s}=e;try{let m=await n.get(`/tenant/{tenant}/jobs/${t}/splits`,d(s));return i(m)}catch(m){return o(c(m))}}}),a.register({name:"dispatch_job_splits_by_jobs_list",domain:"dispatch",operation:"read",description:"List splits filtered by one or more jobs",schema:oi.shape,handler:async r=>{let e=oi.parse(r);try{let t=await n.get("/tenant/{tenant}/jobs/splits",d(e));return i(t)}catch(t){return o(c(t))}}})}import{z as O}from"zod";var mu=O.object({key:O.string().optional().describe("External data key"),value:O.string().optional().describe("External data value")}),pu=O.object({typeId:O.number().int().optional().describe("Custom field type ID"),name:O.string().optional().describe("Custom field name"),value:O.string().optional().describe("Custom field value")}),gr=O.object({number:O.string().optional().describe("Project number"),name:O.string().optional().describe("Project name"),summary:O.string().optional().describe("Project summary"),status:O.string().optional().describe("Project status label"),statusId:O.number().int().optional().describe("Project status ID"),subStatus:O.string().optional().describe("Project sub-status label"),subStatusId:O.number().int().optional().describe("Project sub-status ID"),customerId:O.number().int().optional().describe("Customer ID"),locationId:O.number().int().optional().describe("Location ID"),projectTypeId:O.number().int().optional().describe("Project type ID"),projectManagerIds:O.array(O.number().int()).optional().describe("Assigned project manager IDs"),businessUnitIds:O.array(O.number().int()).optional().describe("Assigned business unit IDs"),startDate:O.string().optional().describe("Project start date/time in RFC3339 format"),targetCompletionDate:O.string().optional().describe("Target completion date/time in RFC3339 format"),actualCompletionDate:O.string().optional().describe("Actual completion date/time in RFC3339 format"),customFields:O.array(pu).optional().describe("Custom field values for the project"),externalData:O.array(mu).optional().describe("External data entries"),jobIds:O.array(O.number().int()).optional().describe("Associated job IDs")}),jt=O.object({id:O.number().int().describe("Project ID")}),di=jt.extend(gr.shape),mi=jt.extend({text:O.string().describe("Project note text"),isPinned:O.boolean().optional().describe("Whether the note is pinned")}),pi=jt.extend({message:O.string().describe("Project message content")}),li=jt.extend({jobId:O.number().int().describe("Job ID to attach")}),ui=O.object({jobId:O.number().int().describe("Job ID to detach")}),bi=p(O.object({}));function jn(n){return u(n).extend({createdBefore:O.string().datetime().optional().describe("Return items created before this UTC timestamp"),createdOnOrAfter:O.string().datetime().optional().describe("Return items created on or after this UTC timestamp"),modifiedBefore:O.string().datetime().optional().describe("Return items modified before this UTC timestamp"),modifiedOnOrAfter:O.string().datetime().optional().describe("Return items modified on or after this UTC timestamp")})}var hi=p(jn(O.object({...f(["Id","ModifiedOn","CreatedOn"])}))),gi=p(jn(O.object({...f(["Id","ModifiedOn","CreatedOn","Name","TargetCompletionDate"]),ids:O.string().optional().describe("Comma-separated project IDs (maximum 50)"),customerId:O.number().int().optional().describe("Filter by customer ID"),locationId:O.number().int().optional().describe("Filter by location ID"),projectTypeId:O.number().int().optional().describe("Filter by project type ID"),invoiceId:O.number().int().optional().describe("Filter by invoice ID"),technicianId:O.number().int().optional().describe("Filter by technician ID"),jobId:O.number().int().optional().describe("Filter by job ID"),appointmentId:O.number().int().optional().describe("Filter by appointment ID"),projectManagerIds:O.string().optional().describe("Comma-separated manager IDs"),businessUnitIds:O.string().optional().describe("Comma-separated business unit IDs"),startsBefore:O.string().datetime().optional().describe("Return projects starting before this UTC timestamp"),startsOnOrAfter:O.string().datetime().optional().describe("Return projects starting on or after this UTC timestamp"),completedBefore:O.string().datetime().optional().describe("Return completed projects before this UTC timestamp"),completedOnOrAfter:O.string().datetime().optional().describe("Return completed projects on or after this UTC timestamp"),targetCompletionDateBefore:O.string().datetime().optional().describe("Return projects with target completion before this UTC timestamp"),targetCompletionDateOnOrAfter:O.string().datetime().optional().describe("Return projects with target completion on or after this UTC timestamp"),status:O.string().optional().describe("Project status filter"),externalDataApplicationGuid:O.string().uuid().optional().describe("External data application GUID"),externalDataKey:O.string().optional().describe("External data key"),externalDataValues:O.string().optional().describe("External data values (comma-separated)")}))),fi=p(O.object({id:O.number().int().describe("Project ID")})),yi=p(jn(O.object({...f(["Id","Name","Order","ModifiedOn","CreatedOn"]),name:O.string().optional().describe("Filter by project status name"),ids:O.string().optional().describe("Comma-separated status IDs (maximum 50)")}))),vi=p(jn(O.object({...S(),...f(["Id","Name","Order","StatusId","ModifiedOn","CreatedOn"]),name:O.string().optional().describe("Filter by project sub-status name"),statusId:O.number().int().optional().describe("Filter by parent project status ID"),ids:O.string().optional().describe("Comma-separated sub-status IDs (maximum 50)")}))),Jt=O.object({id:O.number().int().describe("Entity ID")}),Ii=jt.extend({externalDataApplicationGuid:O.string().uuid().optional().describe("External data application GUID")});function Ti(n,a){a.register({name:"dispatch_projects_get",domain:"dispatch",operation:"read",description:"Get a project by ID",schema:Ii.shape,handler:async r=>{let e=Ii.parse(r);try{let t=await n.get(`/tenant/{tenant}/projects/${e.id}`,d({externalDataApplicationGuid:e.externalDataApplicationGuid}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_projects_list",domain:"dispatch",operation:"read",description:"List projects",schema:gi.shape,handler:async r=>{let e=gi.parse(r);try{let t=await n.get("/tenant/{tenant}/projects",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_projects_create",domain:"dispatch",operation:"write",description:"Create a project",schema:gr.shape,handler:async r=>{let e=gr.parse(r);try{let t=d(e),s=await n.post("/tenant/{tenant}/projects",Object.keys(t).length>0?t:void 0);return i(s)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_projects_update",domain:"dispatch",operation:"write",description:"Update a project",schema:di.shape,handler:async r=>{let e=di.parse(r),{id:t,...s}=e;try{let m=d(s),b=await n.patch(`/tenant/{tenant}/projects/${t}`,Object.keys(m).length>0?m:void 0);return i(b)}catch(m){return o(c(m))}}}),a.register({name:"dispatch_projects_delete",domain:"dispatch",operation:"delete",description:"Delete a project",schema:jt.shape,handler:async r=>{let{id:e}=jt.parse(r);try{let t=await n.delete(`/tenant/{tenant}/projects/${e}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_projects_attach_job",domain:"dispatch",operation:"write",description:"Attach a job to a project",schema:li.shape,handler:async r=>{let e=li.parse(r);try{let t=await n.post(`/tenant/{tenant}/projects/${e.id}/attach-job/${e.jobId}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_projects_detach_job",domain:"dispatch",operation:"write",description:"Detach a job from a project",schema:ui.shape,handler:async r=>{let e=ui.parse(r);try{let t=await n.post(`/tenant/{tenant}/projects/detach-job/${e.jobId}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_projects_notes_list",domain:"dispatch",operation:"read",description:"List notes for a project",schema:fi.shape,handler:async r=>{let e=fi.parse(r);try{let t=await n.get(`/tenant/{tenant}/projects/${e.id}/notes`,d({page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_projects_notes_create",domain:"dispatch",operation:"write",description:"Create a note for a project",schema:mi.shape,handler:async r=>{let e=mi.parse(r);try{let t=await n.post(`/tenant/{tenant}/projects/${e.id}/notes`,{text:e.text,isPinned:e.isPinned});return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_projects_messages_create",domain:"dispatch",operation:"write",description:"Create a message for a project",schema:pi.shape,handler:async r=>{let e=pi.parse(r);try{let t=await n.post(`/tenant/{tenant}/projects/${e.id}/messages`,{message:e.message});return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_projects_custom_field_types_list",domain:"dispatch",operation:"read",description:"List project custom field types",schema:hi.shape,handler:async r=>{let e=hi.parse(r);try{let t=await n.get("/tenant/{tenant}/projects/custom-fields",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_project_types_get",domain:"dispatch",operation:"read",description:"Get a project type by ID",schema:Jt.shape,handler:async r=>{let e=Jt.parse(r);try{let t=await n.get(`/tenant/{tenant}/project-types/${e.id}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_project_types_list",domain:"dispatch",operation:"read",description:"List project types",schema:bi.shape,handler:async r=>{let e=bi.parse(r);try{let t=await n.get("/tenant/{tenant}/project-types",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_project_statuses_get",domain:"dispatch",operation:"read",description:"Get a project status by ID",schema:Jt.shape,handler:async r=>{let e=Jt.parse(r);try{let t=await n.get(`/tenant/{tenant}/project-statuses/${e.id}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_project_statuses_list",domain:"dispatch",operation:"read",description:"List project statuses",schema:yi.shape,handler:async r=>{let e=yi.parse(r);try{let t=await n.get("/tenant/{tenant}/project-statuses",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_project_sub_statuses_get",domain:"dispatch",operation:"read",description:"Get a project sub-status by ID",schema:Jt.shape,handler:async r=>{let e=Jt.parse(r);try{let t=await n.get(`/tenant/{tenant}/project-substatuses/${e.id}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_project_sub_statuses_list",domain:"dispatch",operation:"read",description:"List project sub-statuses",schema:vi.shape,handler:async r=>{let e=vi.parse(r);try{let t=await n.get("/tenant/{tenant}/project-substatuses",d(e));return i(t)}catch(t){return o(c(t))}}})}var lu=(n,a)=>{Oo(n,a),ko(n,a),ci(n,a),Jo(n,a),Ti(n,a),Fo(n,a),Ao(n,a),Ro(n,a)},Si=lu;import{z as U}from"zod";var uu=U.object({skuAccount:U.string().optional().describe("SKU account code for the estimate item"),description:U.string().optional().describe("Description of the estimate item"),membershipTypeId:U.number().int().optional().describe("Membership type ID associated with this item"),qty:U.number().optional().describe("Quantity for this estimate item"),unitRate:U.number().optional().describe("Unit sale rate for this estimate item"),unitCost:U.number().optional().describe("Unit cost for this estimate item"),itemGroupName:U.string().optional().describe("Item group display name"),itemGroupRootId:U.number().int().optional().describe("Item group root ID for categorization"),chargeable:U.boolean().optional().describe("Whether this estimate item is chargeable")}),bu=U.object({name:U.string().optional().describe("External link label"),url:U.string().optional().describe("External link URL")}),Oi=U.object({jobId:U.number().int().optional().describe("Job ID associated with the estimate"),projectId:U.number().int().optional().describe("Project ID associated with the estimate"),locationId:U.number().int().optional().describe("Location ID associated with the estimate"),customerId:U.number().int().optional().describe("Customer ID associated with the estimate"),name:U.string().optional().describe("Human-readable estimate name"),jobNumber:U.string().optional().describe("Job number for estimate matching"),statusValue:U.number().int().optional().describe("Estimate status numeric value"),summary:U.string().optional().describe("Short summary of the estimate"),soldOn:U.string().optional().describe("Date/time when the estimate was sold"),soldBy:U.number().int().optional().describe("User ID who sold the estimate"),active:U.boolean().optional().describe("Whether the estimate is active"),items:U.array(uu).optional().describe("Estimate line items to include"),externalLinks:U.array(bu).optional().describe("External links attached to the estimate"),subtotal:U.number().optional().describe("Subtotal amount before taxes"),tax:U.number().optional().describe("Tax amount for the estimate"),businessUnitId:U.number().int().optional().describe("Business unit ID that owns the estimate")}),wi=U.object({id:U.number().int().describe("Estimate ID")}),_i=u(p(U.object({jobId:U.number().int().optional().describe("Filter by job ID"),projectId:U.number().int().optional().describe("Filter by project ID"),jobNumber:U.string().optional().describe("Filter by job number"),totalGreater:U.number().optional().describe("Filter estimates with totals greater than this amount"),totalLess:U.number().optional().describe("Filter estimates with totals less than this amount"),soldById:U.number().int().optional().describe("Filter by seller user ID"),soldByEmployeeId:U.number().int().optional().describe("Filter by seller employee ID"),ids:U.string().optional().describe("Comma-separated estimate IDs (maximum 50)"),soldAfter:U.string().datetime().optional().describe("Return estimates sold on or after this date/time (UTC)"),soldBefore:U.string().datetime().optional().describe("Return estimates sold before this date/time (UTC)"),status:U.string().optional().describe("Filter by estimate status"),orderBy:U.string().optional().describe("Legacy order by field accepted by ServiceTitan API"),orderByDirection:U.string().optional().describe("Legacy order direction accepted by ServiceTitan API"),locationId:U.number().int().optional().describe("Filter by location ID")}).extend(S()).extend(f(["Id","CreatedOn","ModifiedOn","SoldOn","Total"])))),Di=Oi,Ci=Oi.extend({id:U.number().int().describe("Estimate ID")}),Wt=U.object({id:U.number().int().describe("Estimate ID")}),ki=U.object({from:U.string().optional().describe("Continuation token or custom date to begin export"),includeRecentChanges:U.boolean().optional().describe("Include recent changes (may include duplicates)")});function Ri(n,a){a.register({name:"estimates_get",domain:"estimates",operation:"read",description:"Get a single estimate by ID",schema:wi.shape,handler:async r=>{let{id:e}=wi.parse(r);try{let t=await n.get(`/tenant/{tenant}/estimates/${e}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"estimates_list",domain:"estimates",operation:"read",description:"List estimates with filters",schema:_i.shape,handler:async r=>{let e=_i.parse(r);try{let t=await n.get("/tenant/{tenant}/estimates",d({jobId:e.jobId,projectId:e.projectId,jobNumber:e.jobNumber,totalGreater:e.totalGreater,totalLess:e.totalLess,soldById:e.soldById,soldByEmployeeId:e.soldByEmployeeId,ids:e.ids,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,soldAfter:e.soldAfter,soldBefore:e.soldBefore,status:e.status,active:e.active,orderBy:e.orderBy,orderByDirection:e.orderByDirection,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,locationId:e.locationId,sort:e.sort}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"estimates_create",domain:"estimates",operation:"write",description:"Create a new estimate",schema:Di.shape,handler:async r=>{let e=Di.parse(r),{statusValue:t,...s}=e;try{let m=d({...s,status:t===void 0?void 0:{value:t}}),b=await n.post("/tenant/{tenant}/estimates",m);return i(b)}catch(m){return o(c(m))}}}),a.register({name:"estimates_update",domain:"estimates",operation:"write",description:"Update an existing estimate",schema:Ci.shape,handler:async r=>{let e=Ci.parse(r),{id:t,statusValue:s,...m}=e;try{let b=d({...m,status:s===void 0?void 0:{value:s}}),w=await n.put(`/tenant/{tenant}/estimates/${t}`,b);return i(w)}catch(b){return o(c(b))}}}),a.register({name:"estimates_sell",domain:"estimates",operation:"write",description:"Mark an estimate as sold",schema:Wt.shape,handler:async r=>{let{id:e}=Wt.parse(r);try{let t=await n.put(`/tenant/{tenant}/estimates/${e}/sell`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"estimates_unsell",domain:"estimates",operation:"write",description:"Revert an estimate from sold status",schema:Wt.shape,handler:async r=>{let{id:e}=Wt.parse(r);try{let t=await n.put(`/tenant/{tenant}/estimates/${e}/unsell`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"estimates_dismiss",domain:"estimates",operation:"write",description:"Dismiss an estimate",schema:Wt.shape,handler:async r=>{let{id:e}=Wt.parse(r);try{let t=await n.put(`/tenant/{tenant}/estimates/${e}/dismiss`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"estimates_export_estimates",domain:"estimates",operation:"read",description:"Export estimates",schema:ki.shape,handler:async r=>{let e=ki.parse(r);try{let t=await n.get("/tenant/{tenant}/estimates/export",d({from:e.from,includeRecentChanges:e.includeRecentChanges}));return i(t)}catch(t){return o(c(t))}}})}import{z as Ge}from"zod";var hu=Ge.object({skuAccount:Ge.string().optional().describe("SKU account code for the estimate item"),description:Ge.string().optional().describe("Description of the estimate item"),membershipTypeId:Ge.number().int().optional().describe("Membership type ID associated with this item"),qty:Ge.number().optional().describe("Quantity for the estimate item"),unitRate:Ge.number().optional().describe("Unit sale rate for the estimate item"),unitCost:Ge.number().optional().describe("Unit cost for the estimate item"),itemGroupName:Ge.string().optional().describe("Item group display name"),itemGroupRootId:Ge.number().int().optional().describe("Item group root ID for categorization"),chargeable:Ge.boolean().optional().describe("Whether this item is chargeable")}),ji=u(p(Ge.object({estimateId:Ge.number().int().optional().describe("Filter by estimate ID"),ids:Ge.string().optional().describe("Comma-separated estimate item IDs (maximum 50)")}).extend(S()))),xi=hu.extend({id:Ge.number().int().describe("Estimate ID")}),Ai=Ge.object({id:Ge.number().int().describe("Estimate ID"),itemId:Ge.number().int().describe("Estimate item ID")});function Pi(n,a){a.register({name:"estimates_items_list",domain:"estimates",operation:"read",description:"List estimate items with optional filters",schema:ji.shape,handler:async r=>{let e=ji.parse(r);try{let t=await n.get("/tenant/{tenant}/estimates/items",d({estimateId:e.estimateId,ids:e.ids,active:e.active,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"estimates_items_update",domain:"estimates",operation:"write",description:"Add or replace an item collection on an estimate",schema:xi.shape,handler:async r=>{let e=xi.parse(r),{id:t,...s}=e;try{let m=await n.put(`/tenant/{tenant}/estimates/${t}/items`,d(s));return i(m)}catch(m){return o(c(m))}}}),a.register({name:"estimates_items_delete",domain:"estimates",operation:"delete",description:"Delete a single item from an estimate",schema:Ai.shape,handler:async r=>{let{id:e,itemId:t}=Ai.parse(r);try{return await n.delete(`/tenant/{tenant}/estimates/${e}/items/${t}`),i({success:!0,message:"Estimate item deleted"})}catch(s){return o(c(s))}}})}var gu=(n,a)=>{Ri(n,a),Pi(n,a)},Ei=gu;import{z as xn}from"zod";var Bi={from:xn.string().optional().describe("Continuation token or date string for incremental export"),includeRecentChanges:xn.boolean().optional().describe("Include recent changes not yet committed")},fu={...Bi,modifiedBefore:xn.string().optional().describe("Filter: modified before this date (ISO 8601)"),modifiedOnOrAfter:xn.string().optional().describe("Filter: modified on or after this date (ISO 8601)")};function $(n,a,r,e,t,s=Bi){n.register({name:r,domain:"export",operation:"read",description:e,schema:s,handler:async m=>{try{let b=await a.get(t,d(m));return i(b)}catch(b){return o(b instanceof Error?b.message:String(b))}}})}function Li(n,a){$(a,n,"export_invoices","Export invoices","/tenant/{tenant}/export/invoices"),$(a,n,"export_invoice_items","Export invoice items","/tenant/{tenant}/export/invoice-items"),$(a,n,"export_invoice_templates","Export invoice templates","/tenant/{tenant}/export/invoice-templates"),$(a,n,"export_payments","Export payments","/tenant/{tenant}/export/payments"),$(a,n,"export_adjustments","Export adjustments","/tenant/{tenant}/export/adjustments"),$(a,n,"export_inventory_bills","Export inventory bills","/tenant/{tenant}/export/inventory-bills"),$(a,n,"export_payroll_adjustments","Export payroll adjustments","/tenant/{tenant}/export/payroll-adjustments",fu),$(a,n,"export_customers","Export customers","/tenant/{tenant}/export/customers"),$(a,n,"export_customers_contacts","Export customer contacts","/tenant/{tenant}/export/customers/contacts"),$(a,n,"export_locations_contacts","Export location contacts","/tenant/{tenant}/export/locations/contacts"),$(a,n,"export_contacts","Export contacts","/tenant/{tenant}/export/contacts"),$(a,n,"export_locations","Export locations","/tenant/{tenant}/export/locations"),$(a,n,"export_leads","Export leads","/tenant/{tenant}/export/leads"),$(a,n,"export_bookings","Export bookings","/tenant/{tenant}/export/bookings"),$(a,n,"export_jobs","Export jobs","/tenant/{tenant}/export/jobs"),$(a,n,"export_job_notes","Export job notes","/tenant/{tenant}/export/job-notes"),$(a,n,"export_job_history","Export job history","/tenant/{tenant}/export/job-history"),$(a,n,"export_job_canceled_logs","Export job canceled logs","/tenant/{tenant}/export/job-canceled-logs"),$(a,n,"export_job_splits","Export job splits","/tenant/{tenant}/export/jobs/splits"),$(a,n,"export_job_cancel_reasons","Export job cancel reasons","/tenant/{tenant}/export/job-cancel-reasons"),$(a,n,"export_appointments","Export appointments","/tenant/{tenant}/export/appointments"),$(a,n,"export_appointment_assignments","Export appointment assignments","/tenant/{tenant}/export/appointment-assignments"),$(a,n,"export_projects","Export projects","/tenant/{tenant}/export/projects"),$(a,n,"export_project_notes","Export project notes","/tenant/{tenant}/export/project-notes"),$(a,n,"export_installed_equipment","Export installed equipment","/tenant/{tenant}/export/installed-equipment"),$(a,n,"export_technicians","Export technicians","/tenant/{tenant}/export/technicians"),$(a,n,"export_employees","Export employees","/tenant/{tenant}/export/employees"),$(a,n,"export_services","Export pricebook services","/tenant/{tenant}/export/services"),$(a,n,"export_materials","Export pricebook materials","/tenant/{tenant}/export/materials"),$(a,n,"export_equipment","Export pricebook equipment","/tenant/{tenant}/export/equipment"),$(a,n,"export_memberships","Export memberships","/tenant/{tenant}/export/memberships"),$(a,n,"export_membership_types","Export membership types","/tenant/{tenant}/export/membership-types"),$(a,n,"export_membership_status_changes","Export membership status changes","/tenant/{tenant}/export/membership-status-changes"),$(a,n,"export_service_agreements","Export service agreements","/tenant/{tenant}/export/service-agreements"),$(a,n,"export_recurring_service_types","Export recurring service types","/tenant/{tenant}/export/recurring-service-types"),$(a,n,"export_location_recurring_services","Export location recurring services","/tenant/{tenant}/export/location-recurring-services"),$(a,n,"export_location_recurring_service_events","Export location recurring service events","/tenant/{tenant}/export/location-recurring-service-events"),$(a,n,"export_calls","Export calls","/tenant/{tenant}/export/calls"),$(a,n,"export_timesheets","Export timesheets","/tenant/{tenant}/export/timesheets"),$(a,n,"export_timesheet_codes","Export timesheet codes","/tenant/{tenant}/export/timesheet-codes"),$(a,n,"export_gross_pay_items","Export gross pay items","/tenant/{tenant}/export/gross-pay-items"),$(a,n,"export_payroll_settings","Export payroll settings","/tenant/{tenant}/export/payroll-settings"),$(a,n,"export_activities","Export activities","/tenant/{tenant}/export/activities"),$(a,n,"export_activity_codes","Export activity codes","/tenant/{tenant}/export/activity-codes"),$(a,n,"export_business_units","Export business units","/tenant/{tenant}/export/business-units"),$(a,n,"export_tag_types","Export tag types","/tenant/{tenant}/export/tag-types"),$(a,n,"export_purchase_orders","Export purchase orders","/tenant/{tenant}/export/purchase-orders"),$(a,n,"export_returns","Export returns","/tenant/{tenant}/export/returns"),$(a,n,"export_transfers","Export transfers","/tenant/{tenant}/export/transfers")}var yu=(n,a)=>{Li(n,a)},Mi=yu;import{z as ln}from"zod";import{z as Be}from"zod";var Ui={warn(n,a){if(a){console.warn(n,a);return}console.warn(n)}};function pn(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function vu(n){return Array.isArray(n)?n.filter(pn):pn(n)&&Array.isArray(n.data)?n.data.filter(pn):[]}function Iu(n){return pn(n)&&n.hasMore===!0}function mt(n){if(typeof n=="string"){let a=n.trim();return a.length>0?a:null}return typeof n=="number"||typeof n=="boolean"?String(n):null}function Tu(n){if(typeof n=="number")return Number.isSafeInteger(n)&&n>=0?n:null;if(typeof n=="string"&&n.trim().length>0){let a=n.trim();if(!/^\d+$/.test(a))return null;let r=Number(a);return Number.isSafeInteger(r)?r:null}return null}function Su(n,a){let r=a.split("."),e=n;for(let t of r){if(!pn(e))return;e=e[t]}return e}function ot(n,a){for(let r of a){let e=Su(n,r);if(e!=null)return e}}function Fi(n){let a=n.filter(r=>r!==null).join(" ").trim();return a.length>0?a:null}function Ni(n){return n.trim().toLowerCase().replace(/\s+/g," ")}function fr(n){return Tu(ot(n,["id","technicianId","businessUnitId","paymentTypeId","membershipTypeId"]))}function zi(n,a){let r=mt(ot(n,["name","displayName","fullName"]));if(r)return r;let e=Fi([mt(ot(n,["firstName"])),mt(ot(n,["lastName"]))]);if(e)return e;let t=mt(ot(n,["nickname"]));return t||(a===void 0?"Unknown Technician":`Technician ${a}`)}function wu(n,a){let r=mt(ot(n,["name","displayName"]));return r||(a===void 0?"Unknown Business Unit":`Business Unit ${a}`)}function _u(n){let a=new Set,r=fr(n)??void 0,e=t=>{if(!t)return;let s=Ni(t);s.length>0&&a.add(s)};return e(zi(n,r)),e(Fi([mt(ot(n,["firstName"])),mt(ot(n,["lastName"]))])),e(mt(ot(n,["firstName"]))),e(mt(ot(n,["lastName"]))),e(mt(ot(n,["nickname"]))),[...a]}async function An(n,a,r={},e=50,t=Ui){let s=[];for(let m=1;m<=e;m+=1){let b=await n.get(a,{...r,page:m,pageSize:500,includeTotal:!0}),w=vu(b);s.push(...w);let X=Iu(b);if(m===e&&X&&w.length>0&&t.warn("Reference data cache truncated at max pages, some records may be missing",{maxPages:e,endpoint:a}),!X||w.length===0)break}return s}var yr=class{constructor(a=18e5){this.ttlMs=a;this.assertPositiveTtl(a)}store=new Map;get(a){let r=this.store.get(a);if(r){if(r.expiresAt<=Date.now()){this.store.delete(a);return}return r.value}}set(a,r,e=this.ttlMs){this.assertPositiveTtl(e),this.store.set(a,{value:r,expiresAt:Date.now()+e})}has(a){let r=this.store.get(a);return r?r.expiresAt<=Date.now()?(this.store.delete(a),!1):!0:!1}clear(){this.store.clear()}assertPositiveTtl(a){if(!Number.isFinite(a)||a<=0)throw new Error(`ttlMs must be a positive number. Received: ${a}`)}},vr=class{constructor(a=18e5,r=Ui){this.logger=r;this.cache=new yr(a)}cache;inFlight=new Map;clear(){this.cache.clear(),this.inFlight.clear()}async getTechnicians(a,r){return this.getOrLoad("technicians",()=>An(a,"/tenant/{tenant}/technicians",{active:"Any"},50,this.logger),r)}async getBusinessUnits(a,r){return this.getOrLoad("business-units",()=>An(a,"/tenant/{tenant}/business-units",{active:"Any"},50,this.logger),r)}async getPaymentTypes(a,r){return this.getOrLoad("payment-types",()=>An(a,"/tenant/{tenant}/payment-types",{active:"Any"},50,this.logger),r)}async getMembershipTypes(a,r){return this.getOrLoad("membership-types",()=>An(a,"/tenant/{tenant}/membership-types",{active:"Any"},50,this.logger),r)}async getTechnicianName(a,r){let t=(await this.getTechnicians(a)).find(s=>fr(s)===r);return t?zi(t,r):`Technician ${r}`}async getBusinessUnitName(a,r){let t=(await this.getBusinessUnits(a)).find(s=>fr(s)===r);return t?wu(t,r):`Business Unit ${r}`}async findTechniciansByName(a,r){let e=Ni(r);return e.length===0?[]:(await this.getTechnicians(a)).filter(s=>_u(s).some(m=>m.includes(e)))}async getOrLoad(a,r,e){let t=this.cache.get(a);if(t!==void 0)return t;let s=this.inFlight.get(a);if(s)return s;let m=r().then(b=>(this.cache.set(a,b,e),this.inFlight.delete(a),b)).catch(b=>{throw this.inFlight.delete(a),b});return this.inFlight.set(a,m),m}},kt=new vr;function $i(n){return{data:n,count:n.length}}async function pt(n,a,r){if(a!==void 0)return{id:a,resolvedName:void 0};if(!r||r.trim().length===0)return{id:void 0,resolvedName:void 0};let e=r.trim().toLowerCase(),t=$i(await kt.getBusinessUnits(n));for(let s of[m=>m===e,m=>m.startsWith(e),m=>m.includes(e)]){let m=t.data.find(b=>{let w=Ir(b)?.toLowerCase();return w?s(w):!1});if(m){let b=Gi(m),w=Ir(m);return b!==void 0?{id:b,resolvedName:w??void 0}:{id:void 0,resolvedName:void 0}}}return{id:void 0,resolvedName:void 0}}async function Pn(n,a,r){if(a!==void 0)return{id:a,resolvedName:void 0};if(!r||r.trim().length===0)return{id:void 0,resolvedName:void 0};let e=$i(await kt.findTechniciansByName(n,r));if(e.count>0){let t=Gi(e.data[0]),s=Ir(e.data[0]);return t!==void 0?{id:t,resolvedName:s??void 0}:{id:void 0,resolvedName:void 0}}return{id:void 0,resolvedName:void 0}}function Gi(n){let a=n.id??n.technicianId??n.businessUnitId;if(typeof a=="number"&&Number.isFinite(a))return Math.trunc(a);if(typeof a=="string"&&a.trim().length>0){let r=Number.parseInt(a,10);return Number.isFinite(r)?r:void 0}}function Ir(n){for(let t of["name","displayName","fullName"]){let s=n[t];if(typeof s=="string"&&s.trim().length>0)return s.trim()}let a=typeof n.firstName=="string"?n.firstName.trim():"",r=typeof n.lastName=="string"?n.lastName.trim():"",e=`${a} ${r}`.trim();return e.length>0?e:void 0}var qi=Be.object({startDate:Be.string().describe("Start date (YYYY-MM-DD)"),endDate:Be.string().describe("End date (YYYY-MM-DD)"),businessUnitId:Be.number().int().optional().describe("Filter by business unit ID"),businessUnitName:Be.string().optional().describe("Filter by business unit name (resolved via cache, e.g. 'HVAC'). Alternative to businessUnitId."),includeCollections:Be.boolean().optional().default(!1).describe("Include payment/collections data (totalCollected, outstanding). Adds ~20s latency due to payment pagination. Default: false."),includeProductivityMetrics:Be.boolean().optional().default(!1).describe("Include BU-level productivity metrics (Report 177: rev/hr, billable efficiency, upsold, tasks/opp, recalls). Adds ~0.5-1s latency. Default: false.")}),qe={Name:0,CompletedRevenue:1,OpportunityJobAverage:2,OpportunityConversionRate:3,Opportunity:4,ConvertedJobs:5,CustomerSatisfaction:6,AdjustmentRevenue:7,TotalRevenue:8,NonJobRevenue:9},De={Name:0,RevenuePerHour:1,BillableEfficiency:2,Upsold:3,TasksPerOpportunity:4,OptionsPerOpportunity:5,RecallsCaused:6,AdjustmentRevenue:7,TotalRevenue:8,NonJobRevenue:9},Ae={Name:0,TotalSales:1,ClosedAverageSale:2,CloseRate:3,SalesOpportunity:4,OptionsPerOpportunity:5,AdjustmentRevenue:6,TotalRevenue:7,NonJobRevenue:8},Sr=Be.string().trim().min(1),Re=Be.union([Be.number().finite(),Be.string().trim().refine(n=>Number.isFinite(Number.parseFloat(n)),"Expected a numeric string")]),Ji=[{index:qe.Name,name:"Name",schema:Sr},{index:qe.CompletedRevenue,name:"CompletedRevenue",schema:Re},{index:qe.OpportunityConversionRate,name:"OpportunityConversionRate",schema:Re},{index:qe.Opportunity,name:"Opportunity",schema:Re},{index:qe.ConvertedJobs,name:"ConvertedJobs",schema:Re},{index:qe.AdjustmentRevenue,name:"AdjustmentRevenue",schema:Re},{index:qe.TotalRevenue,name:"TotalRevenue",schema:Re},{index:qe.NonJobRevenue,name:"NonJobRevenue",schema:Re}],Wi=[{index:De.Name,name:"Name",schema:Sr},{index:De.RevenuePerHour,name:"RevenuePerHour",schema:Re},{index:De.BillableEfficiency,name:"BillableEfficiency",schema:Re},{index:De.Upsold,name:"Upsold",schema:Re},{index:De.TasksPerOpportunity,name:"TasksPerOpportunity",schema:Re},{index:De.OptionsPerOpportunity,name:"OptionsPerOpportunity",schema:Re},{index:De.RecallsCaused,name:"RecallsCaused",schema:Re},{index:De.AdjustmentRevenue,name:"AdjustmentRevenue",schema:Re},{index:De.TotalRevenue,name:"TotalRevenue",schema:Re},{index:De.NonJobRevenue,name:"NonJobRevenue",schema:Re}],Hi=[{index:Ae.Name,name:"Name",schema:Sr},{index:Ae.TotalSales,name:"TotalSales",schema:Re},{index:Ae.ClosedAverageSale,name:"ClosedAverageSale",schema:Re},{index:Ae.CloseRate,name:"CloseRate",schema:Re},{index:Ae.SalesOpportunity,name:"SalesOpportunity",schema:Re},{index:Ae.OptionsPerOpportunity,name:"OptionsPerOpportunity",schema:Re},{index:Ae.AdjustmentRevenue,name:"AdjustmentRevenue",schema:Re},{index:Ae.TotalRevenue,name:"TotalRevenue",schema:Re},{index:Ae.NonJobRevenue,name:"NonJobRevenue",schema:Re}],Du=Be.object({name:Be.string().trim().min(1).optional()}).passthrough().required({name:!0});function Cu(){return{data:[],count:0}}function En(){return{fields:[],...Cu()}}function wr(n,a){let r=Be.array(Be.unknown()).superRefine((e,t)=>{for(let s of n){if(s.index>=e.length){t.addIssue({code:Be.ZodIssueCode.custom,message:`Missing required row index ${s.index} (${s.name})`});continue}s.schema.safeParse(e[s.index]).success||t.addIssue({code:Be.ZodIssueCode.custom,message:`Invalid value for ${s.name}`})}});return Be.object({fields:Be.array(Du).optional(),data:Be.array(r).optional(),count:Be.number().int().nonnegative().optional()}).passthrough().required({fields:!0,data:!0}).superRefine((e,t)=>{if(e.data.length!==0&&a?.requireFieldMetadata!==!1)for(let s of n)e.fields[s.index]?.name!==s.name&&t.addIssue({code:Be.ZodIssueCode.custom,message:`Expected field ${s.name} at index ${s.index}`})})}var ku=wr(Ji,{requireFieldMetadata:!0}),Ou=wr(Wi,{requireFieldMetadata:!0}),Ru=wr(Hi,{requireFieldMetadata:!0});function ju(n){return n.map(a=>a.name).join(", ")}function _r(n,a){return new Error(`Report ${n} response structure changed \u2014 expected fields: ${ju(a)}`)}function xu(n){let a=ku.safeParse(n);if(!a.success)throw _r(175,Ji);return a.data}function Au(n){let a=Ou.safeParse(n);if(!a.success)throw _r(177,Wi);return a.data}function Pu(n){let a=Ru.safeParse(n);if(!a.success)throw _r(179,Hi);return a.data}function Vi(n){let a=xu(n);return{data:a.data,count:a.data.length}}function Ki(n){return h(me(Vi(n).data,a=>y(a[qe.TotalRevenue])),2)}function Eu(n){let a=Au(n);return{data:a.data,count:a.data.length}}function Bu(n){let a=Pu(n);return{data:a.data,count:a.data.length}}function Lu(n){let a=Vi(n).data,r=[];for(let e of a){let t=y(e[qe.TotalRevenue]),s=y(e[qe.CompletedRevenue]);t===0&&s===0||r.push({name:String(e[qe.Name]??"Unknown"),totalRevenue:h(t,2),completedRevenue:h(s,2),nonJobRevenue:h(y(e[qe.NonJobRevenue]),2),adjustmentRevenue:h(y(e[qe.AdjustmentRevenue]),2),opportunities:Math.round(y(e[qe.Opportunity])),convertedJobs:Math.round(y(e[qe.ConvertedJobs])),conversionRate:h(y(e[qe.OpportunityConversionRate])*100,1)})}return r.sort((e,t)=>t.totalRevenue-e.totalRevenue)}function Mu(n){return y(n[De.RevenuePerHour])!==0||y(n[De.BillableEfficiency])!==0||y(n[De.Upsold])!==0||y(n[De.TasksPerOpportunity])!==0||y(n[De.OptionsPerOpportunity])!==0||y(n[De.RecallsCaused])!==0||y(n[De.AdjustmentRevenue])!==0||y(n[De.TotalRevenue])!==0||y(n[De.NonJobRevenue])!==0}function Uu(n){let a=Eu(n).data,r=[];for(let e of a)Mu(e)&&r.push({name:String(e[De.Name]??"Unknown"),productivity:{revenuePerHour:h(y(e[De.RevenuePerHour]),2),billableEfficiency:h(y(e[De.BillableEfficiency]),3),upsold:h(y(e[De.Upsold]),2),tasksPerOpportunity:h(y(e[De.TasksPerOpportunity]),2),optionsPerOpportunity:h(y(e[De.OptionsPerOpportunity]),2),recallsCaused:Math.round(y(e[De.RecallsCaused]))}});return r}function Fu(n){return y(n[Ae.TotalSales])!==0||y(n[Ae.ClosedAverageSale])!==0||y(n[Ae.CloseRate])!==0||y(n[Ae.SalesOpportunity])!==0||y(n[Ae.OptionsPerOpportunity])!==0||y(n[Ae.AdjustmentRevenue])!==0||y(n[Ae.TotalRevenue])!==0||y(n[Ae.NonJobRevenue])!==0}function Nu(n){let a=Bu(n).data,r=[];for(let e of a)Fu(e)&&r.push({name:String(e[Ae.Name]??"Unknown"),sales:{totalSales:h(y(e[Ae.TotalSales]),2),closedAvgSale:h(y(e[Ae.ClosedAverageSale]),2),closeRate:h(y(e[Ae.CloseRate])*100,1),salesOpportunity:Math.round(y(e[Ae.SalesOpportunity])),optionsPerOpportunity:h(y(e[Ae.OptionsPerOpportunity]),2)}});return r}function Zi(n){return n.trim().toLowerCase()}function Tr(n){return new Map(n.map(a=>[Zi(a.name),a]))}function zu(n,a,r){let e=Tr(n),t=Tr(a),s=Tr(r),m=new Set([...n.map(b=>b.name),...a.map(b=>b.name),...r.map(b=>b.name)]);return Array.from(m).map(b=>{let w=Zi(b),X=e.get(w),B=X?{...X}:{name:b,totalRevenue:0,completedRevenue:0,nonJobRevenue:0,adjustmentRevenue:0,opportunities:0,convertedJobs:0,conversionRate:0},H=t.get(w);H&&(B.productivity=H.productivity);let G=s.get(w);return G&&(B.sales=G.sales),B}).sort((b,w)=>w.totalRevenue-b.totalRevenue||b.name.localeCompare(w.name))}function $u(n){return n.productivity!==void 0}function Gu(n){return n.sales!==void 0}function xt(n,a,r=2){return h(de(me(n,a),n.length),r)}function qu(n){let a=n.amount??n.total??n.paymentAmount;return y(a)}function Yi(n,a){a.register({name:"intel_revenue_summary",domain:"intelligence",operation:"read",description:`Revenue summary using ServiceTitan's native reporting engine (matches the ST dashboard). Returns total revenue, breakdown by business unit (completed, non-job, adjustment), opportunities, conversion rates, and sales metrics. Set includeProductivityMetrics=true for BU-level productivity metrics (adds ~0.5-1s). Set includeCollections=true for payment/collections data (adds ~20s).
|
|
2
|
+
|
|
3
|
+
Examples:
|
|
4
|
+
- "What was our total revenue last month?" -> startDate="2026-02-01", endDate="2026-03-01"
|
|
5
|
+
- "How much did HVAC bring in this quarter?" -> startDate="2026-01-01", endDate="2026-04-01", businessUnitName="HVAC"
|
|
6
|
+
- "Revenue year to date" -> startDate="2026-01-01", endDate="2026-03-10"`,schema:qi.shape,handler:async r=>{try{let e=qi.parse(r),t=[],s=await pt(n,e.businessUnitId,e.businessUnitName),m=s.id;e.businessUnitName&&!m&&t.push(`Business unit "${e.businessUnitName}" not found. Showing all business units.`),s.resolvedName&&t.push(`Resolved "${e.businessUnitName}" \u2192 ${s.resolvedName} (ID: ${m})`);let b=[{name:"From",value:e.startDate},{name:"To",value:e.endDate}];m!==void 0&&b.push({name:"BusinessUnitIds",value:String(m)});let{startIso:w,endIso:X}=Ye(e.startDate,e.endDate,a.timezone),B=[te(t,"Revenue report (Report 175)",()=>n.post("/tenant/{tenant}/report-category/business-unit-dashboard/reports/175/data",{parameters:b}),En()),e.includeProductivityMetrics?te(t,"Productivity report (Report 177)",()=>n.post("/tenant/{tenant}/report-category/business-unit-dashboard/reports/177/data",{parameters:b}),En()):Promise.resolve(En()),te(t,"Sales report (Report 179)",()=>n.post("/tenant/{tenant}/report-category/business-unit-dashboard/reports/179/data",{parameters:b}),En()),e.includeCollections?te(t,"Payment data",()=>Ct(n,"/tenant/{tenant}/payments",{paidOnAfter:w,paidOnBefore:X,businessUnitIds:m===void 0?void 0:String(m)}),[]):Promise.resolve([])],[H,G,_,V]=await Promise.all(B),pe=Lu(H),ye=Uu(G),be=Nu(_),le=zu(pe,ye,be),Te=h(me(le,z=>z.totalRevenue),2),Oe=h(me(le,z=>z.completedRevenue),2),Le=h(me(le,z=>z.nonJobRevenue),2),D=h(me(le,z=>z.adjustmentRevenue),2),Q=le.reduce((z,He)=>z+He.opportunities,0),R=le.reduce((z,He)=>z+He.convertedJobs,0),L=h(de(Oe,R),2),oe=h(de(R,Q)*100,1),E=le.filter($u),Se=le.filter(Gu),Ne=e.includeCollections?h(me(V,qu),2):void 0,Ze=Ne!==void 0?h(Te-Ne,2):void 0,Fe={period:{start:e.startDate,end:e.endDate},totalRevenue:Te,revenueBreakdown:{completedRevenue:Oe,nonJobRevenue:Le,adjustmentRevenue:D},productivity:{averageRevenuePerHour:xt(E,z=>z.productivity.revenuePerHour,2),averageBillableEfficiency:xt(E,z=>z.productivity.billableEfficiency,3),totalUpsold:h(me(E,z=>z.productivity.upsold),2),averageTasksPerOpportunity:xt(E,z=>z.productivity.tasksPerOpportunity,2),averageOptionsPerOpportunity:xt(E,z=>z.productivity.optionsPerOpportunity,2),totalRecallsCaused:E.reduce((z,He)=>z+He.productivity.recallsCaused,0)},sales:{totalSales:h(me(Se,z=>z.sales.totalSales),2),averageClosedAvgSale:xt(Se,z=>z.sales.closedAvgSale,2),averageCloseRate:xt(Se,z=>z.sales.closeRate,1),totalSalesOpportunity:Se.reduce((z,He)=>z+He.sales.salesOpportunity,0),averageOptionsPerOpportunity:xt(Se,z=>z.sales.optionsPerOpportunity,2)},totalCollected:Ne,outstanding:Ze,avgTicket:L,totalOpportunities:Q,totalConvertedJobs:R,overallConversionRate:oe,byBusinessUnit:le};return t.length>0&&(Fe._warnings=t),i(Fe,{shape:!0})}catch(e){return o(g(e))}}})}var Xi=ln.object({startDate:ln.string().describe("Start date (YYYY-MM-DD)"),endDate:ln.string().describe("End date (YYYY-MM-DD)"),campaignId:ln.number().int().optional().describe("Single campaign (omit for all)"),limit:ln.number().int().min(1).max(50).optional().describe("Max campaigns to analyze (default 20, max 50).")}),nt={Name:0,LeadGenerationOpportunity:1,LeadsSet:2,LeadConversionRate:3,AverageLeadSale:4,ReplacementOpportunity:5,ReplacementLeadsSet:6,ReplacementLeadConversionRate:7,MembershipSales:8,AdjustmentRevenue:9,TotalRevenue:10,NonJobRevenue:11},Ju="Per-campaign revenue unavailable (ServiceTitan invoices API does not support campaign-level filtering). Total period revenue shown in totals only.";function Wu(n){return y(xe(n,["id","campaignId"]))}function Hu(n,a){return ie(xe(n,["name","campaignName"]))??`Campaign ${a}`}function Vu(n){return Math.round(y(xe(n,["campaignId","campaign.id","leadCall.campaign.id"])))}function Qi(n){let a=new Map;for(let r of n){let e=Vu(r);e<=0||a.set(e,(a.get(e)??0)+1)}return a}function Ku(n){return!Me(n)||!Array.isArray(n.data)?[]:n.data.filter(Array.isArray)}function Zu(n){return n.leadGenerationOpportunity!==0||n.leadsSet!==0||n.replacementOpportunity!==0||n.replacementLeadsSet!==0||n.membershipSales!==0||n.totalRevenue!==0}function Yu(n){let a=Ku(n),r=[];for(let e of a){let t={name:ie(e[nt.Name])??"Unknown",leadGenerationOpportunity:Math.round(y(e[nt.LeadGenerationOpportunity])),leadsSet:Math.round(y(e[nt.LeadsSet])),leadConversionRate:h(y(e[nt.LeadConversionRate]),3),averageLeadSale:h(y(e[nt.AverageLeadSale]),2),replacementOpportunity:Math.round(y(e[nt.ReplacementOpportunity])),replacementLeadsSet:Math.round(y(e[nt.ReplacementLeadsSet])),replacementLeadConversionRate:h(y(e[nt.ReplacementLeadConversionRate]),3),membershipSales:h(y(e[nt.MembershipSales]),2),adjustmentRevenue:h(y(e[nt.AdjustmentRevenue]),2),totalRevenue:h(y(e[nt.TotalRevenue]),2),nonJobRevenue:h(y(e[nt.NonJobRevenue]),2)};Zu(t)&&r.push(t)}return r}function es(n,a){a.register({name:"intel_campaign_performance",domain:"intelligence",operation:"read",description:`Marketing campaign performance summary with calls, bookings, conversion rate, revenue, and revenue per call
|
|
7
|
+
|
|
8
|
+
Examples:
|
|
9
|
+
- "Which marketing campaigns are working?" -> startDate="2026-01-01", endDate="2026-03-10"
|
|
10
|
+
- "How many calls are we getting from Google Ads?" -> startDate="2026-01-01", endDate="2026-03-10", campaignId=<Google Ads ID>
|
|
11
|
+
- "What's our call-to-booking rate?" -> startDate="2026-01-01", endDate="2026-03-10"`,schema:Xi.shape,handler:async r=>{try{let e=Xi.parse(r),{startIso:t,endIso:s}=Ye(e.startDate,e.endDate,a.timezone),m=[],b=e.limit??20,[w,X,B,H,G]=await Promise.all([te(m,"Campaign data",()=>dt(n,"/tenant/{tenant}/campaigns",{ids:e.campaignId===void 0?void 0:String(e.campaignId),active:e.campaignId===void 0?"Any":void 0}),[]),te(m,"Call data",()=>dt(n,"/v3/tenant/{tenant}/calls",{createdOnOrAfter:t,createdBefore:s,active:"Any"}),[]),te(m,"Booking data",()=>Ct(n,"/tenant/{tenant}/bookings",{createdOnOrAfter:t,createdBefore:s}),[]),te(m,"Revenue report (Report 175)",()=>n.post("/tenant/{tenant}/report-category/business-unit-dashboard/reports/175/data",{parameters:[{name:"From",value:e.startDate},{name:"To",value:e.endDate}]}),null),te(m,"Lead generation report (Report 176)",()=>n.post("/tenant/{tenant}/report-category/business-unit-dashboard/reports/176/data",{parameters:[{name:"From",value:e.startDate},{name:"To",value:e.endDate}]}),null)]),_=w.length>0?w:e.campaignId===void 0?[]:[{id:e.campaignId,name:`Campaign ${e.campaignId}`}],V=Qi(X),pe=Qi(B),ye=G?Yu(G):[],be=[];for(let R of _){let L=Wu(R);if(L<=0)continue;let oe=Hu(R,L),E=V.get(L)??0,Se=pe.get(L)??0;be.push({id:L,name:oe,calls:E,bookings:Se,conversionRate:h(de(Se,E),3),revenue:0,revenuePerCall:0})}be.sort((R,L)=>L.calls+L.bookings-(R.calls+R.bookings));let le=be.length,Te=be.length>b?be.slice(0,b):be;be.length>b&&m.push(`Limited to ${b} of ${le} campaigns. Use 'limit' param to increase (max 50) or 'campaignId' for a specific campaign.`),m.push(Ju);let Oe=Te.reduce((R,L)=>R+L.calls,0),Le=Te.reduce((R,L)=>R+L.bookings,0),D=H===null?0:Ki(H),Q={period:{start:e.startDate,end:e.endDate},campaigns:Te,totals:{calls:Oe,bookings:Le,conversionRate:h(de(Le,Oe),3),revenue:D},leadGeneration:ye};return be.length>b&&(Q.totalsNote="Revenue represents the full period; calls and bookings reflect only the top N listed campaigns."),m.length>0&&(Q._warnings=m),i(Q,{shape:!0})}catch(e){return o(g(e))}}})}import{z as un}from"zod";var ts=un.object({startDate:un.string().describe("Start date (YYYY-MM-DD)"),endDate:un.string().describe("End date (YYYY-MM-DD)"),businessUnitId:un.number().int().optional().describe("Filter by business unit ID"),businessUnitName:un.string().optional().describe("Filter by business unit name (resolved via cache, e.g. 'HVAC'). Alternative to businessUnitId.")}),At={BookedBy:0,JobNumber:1,InvoiceNumber:2,JobType:3,CustomerName:4,LocationAddress:5,CustomerPhone:6,JobSummary:7,FirstDispatch:8,JobStatus:9,Campaign:10,Total:11,CampaignCategory:12,IsPrevailingWageJob:13};function Xu(n){return!Me(n)||!Array.isArray(n.data)?[]:n.data.filter(Array.isArray)}function Dr(n){return n.trim().toLowerCase()}function Cr(n,a){return a.some(r=>n.includes(r))}function lt(n,a,r=2){let e=n.reduce((t,s)=>t+a(s),0);return h(de(e,n.length),r)}function Qu(n,a=5){return Array.from(n.values()).map(r=>({name:r.name,category:r.category,jobs:r.jobs,revenue:h(r.revenue,2)})).sort((r,e)=>e.jobs-r.jobs||e.revenue-r.revenue).slice(0,a)}function eb(n){return Array.from(n.values()).map(a=>({name:a.name,jobs:a.jobs,revenue:h(a.revenue,2)})).sort((a,r)=>r.jobs-a.jobs||r.revenue-a.revenue)}function ns(n,a){a.register({name:"intel_csr_performance",domain:"intelligence",operation:"read",description:`CSR booking performance using Job Detail By CSR with booked jobs, revenue, average ticket, campaign mix, job type mix, and team averages
|
|
12
|
+
|
|
13
|
+
Examples:
|
|
14
|
+
- "How are our CSRs performing this month?" -> startDate="2026-03-01", endDate="2026-04-01"
|
|
15
|
+
- "Show CSR booking revenue for last quarter" -> startDate="2025-10-01", endDate="2026-01-01"
|
|
16
|
+
- "Which CSR is booking the most revenue for plumbing?" -> startDate="2026-01-01", endDate="2026-03-10", businessUnitName="Plumbing"`,schema:ts.shape,handler:async r=>{try{let e=ts.parse(r);Ye(e.startDate,e.endDate,a.timezone);let t=[],s=await pt(n,e.businessUnitId,e.businessUnitName),m=s.id;e.businessUnitName&&!m&&t.push(`Business unit "${e.businessUnitName}" not found. Showing all business units.`),s.resolvedName&&t.push(`Resolved "${e.businessUnitName}" \u2192 ${s.resolvedName} (ID: ${m})`);let b=[{name:"DateType",value:"Job Completion Date"},{name:"From",value:e.startDate},{name:"To",value:e.endDate}];m!==void 0&&b.push({name:"BusinessUnitId",value:String(m)});let w=await te(t,"CSR performance report (Report 162)",()=>n.post("/tenant/{tenant}/report-category/operations/reports/162/data",{parameters:b}),null),X=w?Xu(w):[],B=new Map;for(let _ of X){let V=ie(_[At.BookedBy])??"Unassigned",pe=Dr(V),ye=y(_[At.Total]),be=(ie(_[At.JobStatus])??"").toLowerCase(),le=ie(_[At.InvoiceNumber]),Te=ie(_[At.Campaign])??"Unattributed",Oe=ie(_[At.CampaignCategory]),Le=ie(_[At.JobType])??"Unknown",D=B.get(pe)??{name:V,jobsBooked:0,totalRevenue:0,completedJobs:0,invoicedJobs:0,canceledJobs:0,openJobs:0,campaigns:new Map,jobTypes:new Map};D.jobsBooked+=1,D.totalRevenue+=ye,Cr(be,["cancel"])?D.canceledJobs+=1:Cr(be,["complete","done"])?D.completedJobs+=1:D.openJobs+=1,(le||Cr(be,["invoice"]))&&(D.invoicedJobs+=1);let Q=Dr(Te),R=D.campaigns.get(Q)??{name:Te,category:Oe,jobs:0,revenue:0};R.jobs+=1,R.revenue+=ye,R.category===null&&(R.category=Oe),D.campaigns.set(Q,R);let L=Dr(Le),oe=D.jobTypes.get(L)??{name:Le,jobs:0,revenue:0};oe.jobs+=1,oe.revenue+=ye,D.jobTypes.set(L,oe),B.set(pe,D)}let H=Array.from(B.values()).map(_=>({name:_.name,jobsBooked:_.jobsBooked,totalRevenue:h(_.totalRevenue,2),avgTicket:h(de(_.totalRevenue,_.jobsBooked),2),topCampaigns:Qu(_.campaigns),jobTypes:eb(_.jobTypes),conversionMetrics:{completedJobs:_.completedJobs,invoicedJobs:_.invoicedJobs,canceledJobs:_.canceledJobs,openJobs:_.openJobs,completionRate:h(de(_.completedJobs,_.jobsBooked)*100,1),invoiceRate:h(de(_.invoicedJobs,_.jobsBooked)*100,1),cancellationRate:h(de(_.canceledJobs,_.jobsBooked)*100,1)}})).sort((_,V)=>V.totalRevenue-_.totalRevenue||V.jobsBooked-_.jobsBooked),G={period:{start:e.startDate,end:e.endDate},csrs:H,teamAverages:{jobsBooked:lt(H,_=>_.jobsBooked,2),totalRevenue:lt(H,_=>_.totalRevenue,2),avgTicket:lt(H,_=>_.avgTicket,2),completedJobs:lt(H,_=>_.conversionMetrics.completedJobs,2),invoicedJobs:lt(H,_=>_.conversionMetrics.invoicedJobs,2),canceledJobs:lt(H,_=>_.conversionMetrics.canceledJobs,2),openJobs:lt(H,_=>_.conversionMetrics.openJobs,2),completionRate:lt(H,_=>_.conversionMetrics.completionRate,1),invoiceRate:lt(H,_=>_.conversionMetrics.invoiceRate,1),cancellationRate:lt(H,_=>_.conversionMetrics.cancellationRate,1)}};return t.length>0&&(G._warnings=t),i(G,{shape:!0})}catch(e){return o(g(e))}}})}import{z as bn}from"zod";var rs=bn.object({startDate:bn.string().describe("Start date (YYYY-MM-DD)"),endDate:bn.string().describe("End date (YYYY-MM-DD)"),businessUnitId:bn.number().int().optional().describe("Filter by business unit ID"),businessUnitName:bn.string().optional().describe("Filter by business unit name (resolved via cache, e.g. 'HVAC'). Alternative to businessUnitId.")}),Bn={InvoiceNumber:0,Customer:1,EMail:2,Amount:3,InvoiceBalance:4,CustomerBalance:5,Project:6,ProjectEmailed:7,JobNumber:8,JobType:9,BusinessUnit:10,Technician:11,InvoicedOn:12,EmailedOn:13},Ln={InvoiceNumber:0,Customer:1,EMail:2,Amount:3,InvoiceBalance:4,CustomerBalance:5,Project:6,ProjectEmailed:7,JobNumber:8,JobType:9,BusinessUnit:10,Technician:11,InvoicedOn:12};function os(n){return!Me(n)||!Array.isArray(n.data)?[]:n.data.filter(Array.isArray)}function kr(n){return n.trim().toLowerCase()}function tb(n){let a=os(n),r=new Map,e=[];for(let t of a){let s={invoiceNumber:ie(t[Bn.InvoiceNumber])??"",amount:h(y(t[Bn.Amount]),2),businessUnit:ie(t[Bn.BusinessUnit])??"Unknown",technician:ie(t[Bn.Technician])??"Unassigned"},m=kr(s.invoiceNumber);if(m.length===0){e.push(s);continue}r.has(m)||r.set(m,s)}return[...r.values(),...e]}function nb(n){let a=os(n),r=new Map,e=[];for(let t of a){let s={invoiceNumber:ie(t[Ln.InvoiceNumber])??"",amount:h(y(t[Ln.Amount]),2),businessUnit:ie(t[Ln.BusinessUnit])??"Unknown",technician:ie(t[Ln.Technician])??"Unassigned"},m=kr(s.invoiceNumber);if(m.length===0){e.push(s);continue}r.has(m)||r.set(m,s)}return[...r.values(),...e]}function as(n,a){let r=new Map;for(let e of n){let t=a(e),s=kr(t),m=r.get(s)??{name:t,count:0,amount:0};m.count+=1,m.amount+=e.amount,r.set(s,m)}return Array.from(r.values()).map(e=>({name:e.name,count:e.count,amount:h(e.amount,2)})).sort((e,t)=>t.count-e.count||t.amount-e.amount)}function is(n,a){a.register({name:"intel_invoice_tracking",domain:"intelligence",operation:"read",description:`Invoice email tracking with sent vs not-sent counts, send rate, dollar impact, and unsent breakdown by business unit and technician
|
|
17
|
+
|
|
18
|
+
Examples:
|
|
19
|
+
- "What percent of invoices were sent this week?" -> startDate="2026-03-02", endDate="2026-03-09"
|
|
20
|
+
- "Which techs are not sending invoices?" -> startDate="2026-01-01", endDate="2026-03-10"
|
|
21
|
+
- "Show invoice send rate for plumbing last month" -> startDate="2026-02-01", endDate="2026-03-01", businessUnitName="Plumbing"`,schema:rs.shape,handler:async r=>{try{let e=rs.parse(r);Ye(e.startDate,e.endDate,a.timezone);let t=[],s=await pt(n,e.businessUnitId,e.businessUnitName),m=s.id;e.businessUnitName&&!m&&t.push(`Business unit "${e.businessUnitName}" not found. Showing all business units.`),s.resolvedName&&t.push(`Resolved "${e.businessUnitName}" \u2192 ${s.resolvedName} (ID: ${m})`);let b=[{name:"From",value:e.startDate},{name:"To",value:e.endDate}];m!==void 0&&b.push({name:"BusinessUnitIds",value:String(m)});let[w,X]=await Promise.all([te(t,"Invoices sent report (Report 2281)",()=>n.post("/tenant/{tenant}/report-category/operations/reports/2281/data",{parameters:b}),null),te(t,"Invoices not sent report (Report 2282)",()=>n.post("/tenant/{tenant}/report-category/operations/reports/2282/data",{parameters:b}),null)]),B=w?tb(w):[],H=new Set(B.map(oe=>oe.invoiceNumber.trim().toLowerCase()).filter(oe=>oe.length>0)),_=(X?nb(X):[]).filter(oe=>{let E=oe.invoiceNumber.trim().toLowerCase();return E.length===0||!H.has(E)}),V=B.length,pe=_.length,ye=V+pe,be=h(me(B,oe=>oe.amount),2),le=h(me(_,oe=>oe.amount),2),Te=h(de(V,ye)*100,1),Oe=as(_,oe=>oe.businessUnit),Le=as(_,oe=>oe.technician),D=Oe[0],Q=Le[0],R=pe===0?[`All ${V} invoices in the period were sent.`]:[`${V} of ${ye} invoices were sent (${Te}%).`,D?`${D.name} has ${D.count} unsent invoices totaling $${sn(D.amount)}.`:"No business unit breakdown available for unsent invoices.",Q?`${Q.name} owns ${Q.count} unsent invoices totaling $${sn(Q.amount)}.`:"No technician breakdown available for unsent invoices."],L={period:{start:e.startDate,end:e.endDate},sentCount:V,notSentCount:pe,sendRate:Te,totalAmountSent:be,totalAmountNotSent:le,notSentBreakdown:{byBusinessUnit:Oe,byTechnician:Le},highlights:R};return t.length>0&&(L._warnings=t),i(L,{shape:!0})}catch(e){return o(g(e))}}})}import{z as Pt}from"zod";var ss=Pt.object({startDate:Pt.string().describe("Start date (YYYY-MM-DD)"),endDate:Pt.string().describe("End date (YYYY-MM-DD)"),businessUnitId:Pt.number().int().optional().describe("Filter by business unit ID"),businessUnitName:Pt.string().optional().describe("Filter by business unit name (resolved via cache, e.g. 'HVAC'). Alternative to businessUnitId."),technicianId:Pt.number().int().optional().describe("Filter by technician ID"),technicianName:Pt.string().optional().describe("Filter by technician name (resolved via cache, e.g. 'John'). Alternative to technicianId.")}),Et={EmployeeName:0,Activity:1,Date:2,InvoiceNumber:3,EmployeeBusinessUnit:4,Duration:5,RegularHours:6,OvertimeHours:7,DoubleOvertimeHours:8,GrossPay:9,CustomerName:10,ProjectNumber:11,Zone:12,TaxZone:13,LocationZip:14,LocationName:15,LocationAddress:16,LaborTypeCode:17};function rb(n){return!Me(n)||!Array.isArray(n.data)?[]:n.data.filter(Array.isArray)}function Or(n){return n.trim().toLowerCase()}function Rr(n,a,r){return n+a+r}function ab(n){return n.totalHours!==0||n.grossPay!==0}function cs(n,a){a.register({name:"intel_labor_cost",domain:"intelligence",operation:"read",description:`Labor cost summary from the Master Pay File with employee hours, gross pay, hourly rates, activity mix, and business unit breakdown
|
|
22
|
+
|
|
23
|
+
Examples:
|
|
24
|
+
- "What did labor cost us this month?" -> startDate="2026-03-01", endDate="2026-04-01"
|
|
25
|
+
- "Show overtime costs by employee for Q1" -> startDate="2026-01-01", endDate="2026-04-01"
|
|
26
|
+
- "How much did Andrew cost in labor last week?" -> startDate="2026-03-02", endDate="2026-03-09", technicianName="Andrew"`,schema:ss.shape,handler:async r=>{try{let e=ss.parse(r);Ye(e.startDate,e.endDate,a.timezone);let t=[],s=await pt(n,e.businessUnitId,e.businessUnitName),m=s.id;e.businessUnitName&&!m&&t.push(`Business unit "${e.businessUnitName}" not found. Showing all business units.`),s.resolvedName&&t.push(`Resolved "${e.businessUnitName}" \u2192 ${s.resolvedName} (ID: ${m})`);let b=await Pn(n,e.technicianId,e.technicianName),w=b.id;e.technicianName&&!w&&t.push(`Technician "${e.technicianName}" not found. Showing all technicians.`),b.resolvedName&&t.push(`Resolved "${e.technicianName}" \u2192 ${b.resolvedName} (ID: ${w})`);let X=[{name:"From",value:e.startDate},{name:"To",value:e.endDate}];m!==void 0&&X.push({name:"BusinessUnitId",value:String(m)}),w!==void 0&&X.push({name:"TechnicianId",value:String(w)});let B=await te(t,"Labor cost report (Report 166)",()=>n.post("/tenant/{tenant}/report-category/accounting/reports/166/data",{parameters:X}),null),H=B?rb(B):[],G=new Map,_=new Map;for(let D of H){let Q=ie(D[Et.EmployeeName])??"Unknown Employee",R=ie(D[Et.Activity])??"Unknown Activity",L=ie(D[Et.EmployeeBusinessUnit])??"Unknown",oe=y(D[Et.RegularHours]),E=y(D[Et.OvertimeHours]),Se=y(D[Et.DoubleOvertimeHours]),Ne=y(D[Et.GrossPay]),Ze=Rr(oe,E,Se),Fe=Or(Q),z=G.get(Fe)??{name:Q,businessUnits:new Set,regularHours:0,overtimeHours:0,doubleOvertimeHours:0,grossPay:0,activities:new Map};z.businessUnits.add(L),z.regularHours+=oe,z.overtimeHours+=E,z.doubleOvertimeHours+=Se,z.grossPay+=Ne;let He=Or(R),gt=z.activities.get(He)??{activity:R,entries:0,hours:0,grossPay:0};gt.entries+=1,gt.hours+=Ze,gt.grossPay+=Ne,z.activities.set(He,gt),G.set(Fe,z);let Rt=Or(L),et=_.get(Rt)??{name:L,employees:new Set,regularHours:0,overtimeHours:0,doubleOvertimeHours:0,grossPay:0};et.employees.add(Q),et.regularHours+=oe,et.overtimeHours+=E,et.doubleOvertimeHours+=Se,et.grossPay+=Ne,_.set(Rt,et)}let V=Array.from(G.values()).map(D=>{let Q=Rr(D.regularHours,D.overtimeHours,D.doubleOvertimeHours);return{name:D.name,businessUnits:Array.from(D.businessUnits).sort((R,L)=>R.localeCompare(L)),totalHours:h(Q,2),regularHours:h(D.regularHours,2),overtimeHours:h(D.overtimeHours,2),doubleOvertimeHours:h(D.doubleOvertimeHours,2),grossPay:h(D.grossPay,2),avgHourlyRate:h(de(D.grossPay,Q),2),activityBreakdown:Array.from(D.activities.values()).map(R=>({activity:R.activity,entries:R.entries,hours:h(R.hours,2),grossPay:h(R.grossPay,2),avgHourlyRate:h(de(R.grossPay,R.hours),2)})).sort((R,L)=>L.grossPay-R.grossPay||L.hours-R.hours)}}).filter(ab).sort((D,Q)=>Q.grossPay-D.grossPay||Q.totalHours-D.totalHours),pe=Array.from(_.values()).map(D=>{let Q=Rr(D.regularHours,D.overtimeHours,D.doubleOvertimeHours),R=D.overtimeHours+D.doubleOvertimeHours;return{name:D.name,employeeCount:D.employees.size,totalHours:h(Q,2),regularHours:h(D.regularHours,2),overtimeHours:h(D.overtimeHours,2),doubleOvertimeHours:h(D.doubleOvertimeHours,2),grossPay:h(D.grossPay,2),avgHourlyRate:h(de(D.grossPay,Q),2),overtimePercent:h(de(R,Q)*100,1)}}).sort((D,Q)=>Q.grossPay-D.grossPay||Q.totalHours-D.totalHours),ye=h(me(V,D=>D.grossPay),2),be=h(me(V,D=>D.totalHours),2),le=h(me(V,D=>D.regularHours),2),Te=h(me(V,D=>D.overtimeHours),2),Oe=h(me(V,D=>D.doubleOvertimeHours),2),Le={period:{start:e.startDate,end:e.endDate},totalGrossPay:ye,totalHours:be,regularHours:le,overtimeHours:Te,doubleOvertimeHours:Oe,avgHourlyRate:h(de(ye,be),2),overtimePercent:h(de(Te+Oe,be)*100,1),employees:V,byBusinessUnit:pe};return t.length>0&&(Le._warnings=t),i(Le,{shape:!0})}catch(e){return o(g(e))}}})}import{z as jr}from"zod";var ds=jr.object({type:jr.enum(["technicians","business-units","payment-types","membership-types"]).describe("Type of reference data to look up"),search:jr.string().optional().describe("Search by name (partial match). Omit to list all.")});function ob(n){let a=n.id??n.technicianId??n.businessUnitId??n.paymentTypeId??n.membershipTypeId;if(typeof a=="number"&&Number.isFinite(a))return Math.trunc(a);if(typeof a=="string"&&a.trim().length>0){let r=Number.parseInt(a,10);return Number.isFinite(r)?r:void 0}}function ib(n){for(let t of["name","displayName","fullName"]){let s=n[t];if(typeof s=="string"&&s.trim().length>0)return s.trim()}let a=typeof n.firstName=="string"?n.firstName.trim():"",r=typeof n.lastName=="string"?n.lastName.trim():"",e=`${a} ${r}`.trim();return e.length>0?e:null}function sb(n){return typeof n.active=="boolean"?n.active:!0}function cb(n){let a=[];for(let r of n){let e=ob(r),t=ib(r);e!==void 0&&t!==null&&a.push({id:e,name:t,active:sb(r)})}return a.sort((r,e)=>r.name.localeCompare(e.name))}function db(n,a){let r=a.trim().toLowerCase();return r.length===0?n:n.filter(e=>e.name.toLowerCase().includes(r))}function ms(n,a){a.register({name:"intel_lookup",domain:"intelligence",operation:"read",description:`Look up reference data (technicians, business units, payment types, membership types). Returns IDs and names from a 30-minute cache. Use this to find IDs for other intel tool filters.
|
|
27
|
+
|
|
28
|
+
Examples:
|
|
29
|
+
- "What are our business units?" -> type="business-units"
|
|
30
|
+
- "Find technician named John" -> type="technicians", search="John"
|
|
31
|
+
- "List all payment types" -> type="payment-types"
|
|
32
|
+
- "What membership types do we have?" -> type="membership-types"`,schema:ds.shape,handler:async r=>{try{let e=ds.parse(r),t;switch(e.type){case"technicians":t=await kt.getTechnicians(n);break;case"business-units":t=await kt.getBusinessUnits(n);break;case"payment-types":t=await kt.getPaymentTypes(n);break;case"membership-types":t=await kt.getMembershipTypes(n);break}let s=cb(t);return e.search&&(s=db(s,e.search)),i({type:e.type,search:e.search??null,count:s.length,items:s,_cache:"Results cached for 30 minutes. Subsequent lookups are instant."})}catch(e){return o(e instanceof Error?e.message:String(e))}}})}import{z as Mn}from"zod";var ps=Mn.object({startDate:Mn.string().describe("Start date (YYYY-MM-DD)"),endDate:Mn.string().describe("End date (YYYY-MM-DD)"),includeServiceRevenue:Mn.boolean().optional().default(!1).describe("Include totalServiceRevenue from invoice pagination (adds ~1-2s latency). Default: false.")}),ft={Name:0,Suspended:1,Canceled:2,Expired:3,Deleted:4,Renewed:5,Reactivated:6,NewSales:7,ActiveAtEnd:8},Un={Name:0,Opportunities:1,Converted:2,ConversionRate:3};function ls(n){return!Me(n)||!Array.isArray(n.data)?[]:n.data.filter(Array.isArray)}function ut(n){return Math.round(y(n))}function mb(n){return n.activeAtEnd!==0||n.newSales!==0||n.canceled!==0||n.expired!==0||n.renewed!==0||n.suspended!==0||n.reactivated!==0||n.deleted!==0}function pb(n){let a=ls(n),r=[];for(let e of a){let t={name:ie(e[ft.Name])??"Unknown",suspended:ut(e[ft.Suspended]),canceled:ut(e[ft.Canceled]),expired:ut(e[ft.Expired]),deleted:ut(e[ft.Deleted]),renewed:ut(e[ft.Renewed]),reactivated:ut(e[ft.Reactivated]),newSales:ut(e[ft.NewSales]),activeAtEnd:ut(e[ft.ActiveAtEnd])};mb(t)&&r.push(t)}return r}function lb(n){let a=ls(n),r=[];for(let e of a){let t=ut(e[Un.Opportunities]),s=ut(e[Un.Converted]);t===0&&s===0||r.push({name:ie(e[Un.Name])??"Unknown",opportunities:t,converted:s,conversionRate:h(y(e[Un.ConversionRate])*100,1)})}return r.sort((e,t)=>t.opportunities-e.opportunities||t.converted-e.converted)}function ub(n){return y(xe(n,["total","amount","invoiceTotal"]))}function us(n,a){a.register({name:"intel_membership_health",domain:"intelligence",operation:"read",description:`Membership health summary with active counts, signups, cancellations, renewals, retention rate, and business-unit membership conversion metrics. Set includeServiceRevenue=true to also fetch tenant-wide totalServiceRevenue from invoices (adds ~1-2s latency).
|
|
33
|
+
|
|
34
|
+
Examples:
|
|
35
|
+
- "How are memberships doing this year?" -> startDate="2026-01-01", endDate="2026-03-10"
|
|
36
|
+
- "Membership retention rate last quarter" -> startDate="2025-10-01", endDate="2026-01-01"
|
|
37
|
+
- "How many new signups vs cancellations?" -> startDate="2026-01-01", endDate="2026-03-10"`,schema:ps.shape,handler:async r=>{try{let e=ps.parse(r),{startIso:t,endIso:s}=Ye(e.startDate,e.endDate,a.timezone),m=[],b=[{name:"From",value:e.startDate},{name:"To",value:e.endDate}],w=[te(m,"Membership summary report (Report 182)",()=>n.post("/tenant/{tenant}/report-category/marketing/reports/182/data",{parameters:b}),null),te(m,"Business unit memberships report (Report 178)",()=>n.post("/tenant/{tenant}/report-category/business-unit-dashboard/reports/178/data",{parameters:b}),null),e.includeServiceRevenue?te(m,"Invoice data",()=>Ct(n,"/tenant/{tenant}/invoices",{invoicedOnOrAfter:t,invoicedOnBefore:s}),[]):Promise.resolve([])],[X,B,H]=await Promise.all(w),G=X?pb(X):[],_=B?lb(B):[],V=e.includeServiceRevenue?h(me(H,ub),2):null,pe=Math.round(me(G,E=>E.activeAtEnd)),ye=Math.round(me(G,E=>E.newSales)),be=Math.round(me(G,E=>E.canceled)),le=Math.round(me(G,E=>E.expired)),Te=Math.round(me(G,E=>E.renewed)),Oe=Math.round(me(G,E=>E.suspended)),Le=Math.round(me(G,E=>E.reactivated)),D=Math.round(me(G,E=>E.deleted)),Q=Math.round(me(_,E=>E.opportunities)),R=Math.round(me(_,E=>E.converted)),L=G.map(E=>({name:E.name,activeAtEnd:E.activeAtEnd,newSales:E.newSales,canceled:E.canceled,expired:E.expired,renewed:E.renewed,suspended:E.suspended,reactivated:E.reactivated})).sort((E,Se)=>Se.activeAtEnd-E.activeAtEnd),oe={period:{start:e.startDate,end:e.endDate},activeMemberships:pe,newSignups:ye,cancellations:be,expirations:le,renewals:Te,suspended:Oe,reactivated:Le,deleted:D,retentionRate:h(de(pe,pe+be),3),totalServiceRevenue:V,conversionTotals:{opportunities:Q,converted:R,conversionRate:h(de(R,Q)*100,1)},conversionByBusinessUnit:_,membershipTypes:L};return m.length>0&&(oe._warnings=m),i(oe,{shape:!0})}catch(e){return o(g(e))}}})}import{z as bs}from"zod";var xr=bs.object({date:bs.string().optional().describe("Date to snapshot (YYYY-MM-DD, defaults to today)")}),Ar=20,Ht={JobNumber:0,ScheduledDate:1,CustomerName:2,LocationAddress:7,JobType:10,AssignedTechnicians:11};function bb(n){return y(xe(n,["total","amount","invoiceTotal"]))}function hb(n){return y(xe(n,["amount","total","paymentAmount"]))}function gb(n){return y(xe(n,["total","amount","subtotal"]))}function hn(n,a){return a.some(r=>n.includes(r))}function hs(n){let a=xe(n,["leadCall.callType"]);return typeof a=="string"?a.trim().toLowerCase():""}function fb(n){return hs(n)==="booked"||xe(n,["booked","isBooked","bookingCreated"])===!0?!0:xe(n,["bookingId","jobId"])!==void 0}function yb(n){let a=hs(n);if(a==="missed"||a==="abandoned"||xe(n,["missed","isMissed","unanswered"])===!0)return!0;let r=zt(n,["statusValue"]);return r.includes("missed")||r.includes("noanswer")||r.includes("unanswered")||r.includes("abandoned")}function vb(n){return!Me(n)||!Array.isArray(n.data)?[]:n.data.filter(Array.isArray)}function Ib(n){let a=vb(n),r=[];for(let e of a)r.push({jobNumber:ie(e[Ht.JobNumber])??"Unknown",scheduledDate:ie(e[Ht.ScheduledDate])??"",customerName:ie(e[Ht.CustomerName])??"Unknown",locationAddress:ie(e[Ht.LocationAddress])??"Unknown",jobType:ie(e[Ht.JobType])??"Unknown",assignedTechnicians:ie(e[Ht.AssignedTechnicians])??"Unassigned"});return r}function Tb(n){let a=new Map;for(let r of n)a.set(r.jobType,(a.get(r.jobType)??0)+1);return Array.from(a.entries()).map(([r,e])=>({jobType:r,count:e})).sort((r,e)=>e.count-r.count||r.jobType.localeCompare(e.jobType))}function gs(n,a){a.register({name:"intel_daily_snapshot",domain:"intelligence",operation:"read",cacheTtlMs:6e4,cacheKeyParams:r=>{let e=xr.parse(r);return{...e,date:e.date??sr(a.timezone)}},description:`Daily operational snapshot with appointments, job progress, revenue to-date, call outcomes, next-day upcoming jobs, and plain-English highlights
|
|
38
|
+
|
|
39
|
+
Examples:
|
|
40
|
+
- "How did today go?" -> date="2026-03-10"
|
|
41
|
+
- "Give me yesterday's numbers" -> date="2026-03-09"
|
|
42
|
+
- "What happened on Monday?" -> date="2026-03-09"`,schema:xr.shape,handler:async r=>{try{let t=xr.parse(r).date??sr(a.timezone),{startIso:s,endIso:m,nextDate:b,nextDayStartIso:w}=Oa(t,a.timezone),X=b,B=[],H=await te(B,"Appointment data",()=>dt(n,"/tenant/{tenant}/appointments",{startsOnOrAfter:s,startsBefore:w}),[]),G=await te(B,"Job data",()=>dt(n,"/tenant/{tenant}/jobs",{appointmentStartsOnOrAfter:s,appointmentStartsBefore:w}),[]),_=await te(B,"Invoice data",()=>dt(n,"/tenant/{tenant}/invoices",{invoicedOnOrAfter:s,invoicedOnBefore:m}),[]),V=await te(B,"Payment data",()=>dt(n,"/tenant/{tenant}/payments",{paidOnAfter:s,paidOnBefore:m}),[]),pe=await te(B,"Estimate data",()=>dt(n,"/tenant/{tenant}/estimates",{soldAfter:s,soldBefore:m,status:"Sold"}),[]),ye=await te(B,"Call data",()=>dt(n,"/v3/tenant/{tenant}/calls",{createdOnOrAfter:s,createdBefore:m,active:"Any"}),[]),be=await te(B,"Upcoming jobs report (Report 163)",()=>n.post("/tenant/{tenant}/report-category/operations/reports/163/data",{parameters:[{name:"DateType",value:"Appointment Date"},{name:"From",value:X},{name:"To",value:X}]}),null),le=0,Te=0;for(let se of H){let st=zt(se,["statusValue"]);hn(st,["done","completed"])?le+=1:hn(st,["working","inprogress","dispatched","hold"])&&(Te+=1)}let Oe=H.length,Le=Math.max(Oe-le-Te,0),D=0,Q=0,R=0;for(let se of G){let st=zt(se,["statusValue"]);hn(st,["completed","done"])?D+=1:hn(st,["inprogress","working","dispatched","hold"])?Q+=1:hn(st,["canceled","cancelled"])&&(R+=1)}let L=h(me(_,bb),2),oe=h(me(V,hb),2),E=h(me(pe,gb),2),Se=ye.length,Ne=ye.filter(fb).length,Ze=ye.filter(yb).length,Fe=be?Ib(be):[],z=Fe.slice(0,Ar),He=Tb(Fe),gt=Math.round(de(le,Oe)*100);Fe.length>Ar&&B.push(`Upcoming jobs list truncated to ${Ar} of ${Fe.length} jobs.`);let Rt=[`${le} of ${Oe} appointments completed (${gt}%)`,Ze>0?`${Ze} missed calls today may need follow-up`:"No missed calls recorded today",`${Fe.length} ${Fe.length===1?"job":"jobs"} scheduled for tomorrow`,`$${sn(E)} in estimates sold`],et={date:t,appointments:{total:Oe,completed:le,inProgress:Te,pending:Le},jobs:{total:G.length,completed:D,inProgress:Q,canceled:R},revenue:{invoiced:L,collected:oe,estimatesSold:E},calls:{total:Se,booked:Ne,missed:Ze},upcomingJobs:{total:Fe.length,breakdownByJobType:He,jobs:z},highlights:Rt};return B.length>0&&(et._warnings=B),i(et,{shape:!0})}catch(e){return o(g(e))}}})}import{z as Fn}from"zod";var fs=Fn.object({startDate:Fn.string().optional().describe("Filter estimates created after this date"),endDate:Fn.string().optional().describe("Filter estimates created before this date"),soldById:Fn.number().int().optional().describe("Filter by salesperson/technician")}),Bt={Name:0,TotalSales:1,ClosedAverageSale:2,CloseRate:3,SalesOpportunity:4,OptionsPerOpportunity:5,TechnicianId:6,AdjustmentRevenue:7,CompletedRevenueWithAdjustments:8};function Sb(n){return!Me(n)||!Array.isArray(n.data)?[]:n.data.filter(Array.isArray)}function wb(n){return n.totalSales!==0||n.salesOpportunity!==0||n.closeRate!==0}function _b(n){let a=Sb(n),r=[];for(let e of a){let t=Math.round(y(e[Bt.TechnicianId]));if(t<=0)continue;let s={id:t,name:ie(e[Bt.Name])??`Technician ${t}`,totalSales:h(y(e[Bt.TotalSales]),2),closedAverageSale:h(y(e[Bt.ClosedAverageSale]),2),closeRate:h(y(e[Bt.CloseRate])*100,1),salesOpportunity:Math.round(y(e[Bt.SalesOpportunity])),optionsPerOpportunity:h(y(e[Bt.OptionsPerOpportunity]),2)};wb(s)&&r.push(s)}return r}function Db(n){return y(xe(n,["total","amount","subtotal"]))}function Cb(n){let a=zt(n,["statusValue"]);return a.includes("sold")||a.includes("accepted")||xe(n,["soldOn","soldDate"])!==void 0?"sold":a.includes("dismiss")||a.includes("reject")||a.includes("cancel")?"dismissed":"open"}function ys(n){return cr(xe(n,["createdOn","createdAt","createdDate"]))}function kb(n){return cr(xe(n,["soldOn","soldDate"]))}function Ob(n){let a=ie(xe(n,["customerName","name","locationName"]));return a||(ie(xe(n,["customer.name","customer.displayName"]))??"Unknown")}function vs(n,a){a.register({name:"intel_estimate_pipeline",domain:"intelligence",operation:"read",description:`Estimate pipeline summary with open/sold/dismissed funnel, conversion rate, close speed, age buckets, and stale opportunities
|
|
43
|
+
|
|
44
|
+
Examples:
|
|
45
|
+
- "What's our close rate on estimates?" -> startDate="2026-01-01", endDate="2026-03-10"
|
|
46
|
+
- "Show me stale estimates over 30 days" -> returns staleEstimates automatically
|
|
47
|
+
- "How is Andrew doing on sales?" -> soldById=<Andrew's ID>`,schema:fs.shape,handler:async r=>{try{let e=fs.parse(r),t=[],s=a.timezone,m=e.startDate===void 0?void 0:Cn(e.startDate,!1,s),b=e.endDate===void 0?void 0:Cn(e.endDate,!0,s),[w,X]=await Promise.all([te(t,"Estimate data",()=>Ct(n,"/tenant/{tenant}/estimates",{createdOnOrAfter:m,createdBefore:b,soldById:e.soldById}),[]),te(t,"Technician sales report (Report 172)",()=>n.post("/tenant/{tenant}/report-category/technician-dashboard/reports/172/data",{parameters:[{name:"From",value:e.startDate??""},{name:"To",value:e.endDate??""}]}),null)]),B=_b(X),H=e.soldById===void 0?B:B.filter(R=>R.id===e.soldById),G=e.endDate===void 0?new Date:new Date(Cn(e.endDate,!0,s)),_={open:{count:0,value:0},sold:{count:0,value:0},dismissed:{count:0,value:0}},V={"0-7":{bucket:"0-7 days",count:0,value:0},"8-14":{bucket:"8-14 days",count:0,value:0},"15-30":{bucket:"15-30 days",count:0,value:0},"30+":{bucket:"30+ days",count:0,value:0}},pe=[],ye=[];for(let R of w){let L=Cb(R),oe=Db(R);if(_[L].count+=1,_[L].value+=oe,L==="sold"){let Fe=ys(R),z=kb(R);Fe&&z&&ye.push(dr(Fe,z,s));continue}if(L!=="open")continue;let E=ys(R),Se=E?dr(E,G,s):0,Ne="30+";Se<=7?Ne="0-7":Se<=14?Ne="8-14":Se<=30&&(Ne="15-30");let Ze=V[Ne];Ze.count+=1,Ze.value+=oe,Se>30&&pe.push({id:y(xe(R,["id","estimateId"])),customer:Ob(R),value:h(oe,2),daysOld:Se})}let be=ye.length===0?0:h(de(ye.reduce((R,L)=>R+L,0),ye.length),1),le=h(H.reduce((R,L)=>R+L.totalSales,0),2),Te=H.reduce((R,L)=>R+L.salesOpportunity,0),Oe=h(H.reduce((R,L)=>R+L.totalSales*L.closedAverageSale,0),2),Le=h(de(le,Te)*100,1),D=h(de(Oe,le),2),Q={totalEstimates:w.length,pipeline:{open:{count:_.open.count,value:h(_.open.value,2)},sold:{count:_.sold.count,value:h(_.sold.value,2)},dismissed:{count:_.dismissed.count,value:h(_.dismissed.value,2)}},conversionRate:h(de(_.sold.count,w.length),3),averageDaysToClose:be,salesFunnel:{totalSales:le,averageCloseRate:Le,totalOpportunities:Te,averageClosedSale:D,byTechnician:H},openByAge:[{bucket:V["0-7"].bucket,count:V["0-7"].count,value:h(V["0-7"].value,2)},{bucket:V["8-14"].bucket,count:V["8-14"].count,value:h(V["8-14"].value,2)},{bucket:V["15-30"].bucket,count:V["15-30"].count,value:h(V["15-30"].value,2)},{bucket:V["30+"].bucket,count:V["30+"].count,value:h(V["30+"].value,2)}],staleEstimates:pe.sort((R,L)=>L.daysOld!==R.daysOld?L.daysOld-R.daysOld:L.value-R.value).slice(0,25)};return t.length>0&&(Q._warnings=t),i(Q,{shape:!0})}catch(e){return o(g(e))}}})}import{z as yt}from"zod";var Is=yt.object({startDate:yt.string().describe("Start date (YYYY-MM-DD)"),endDate:yt.string().describe("End date (YYYY-MM-DD)"),technicianId:yt.number().int().optional().describe("Single technician (omit for all)"),technicianName:yt.string().optional().describe("Single technician by name (resolved via cache, e.g. 'John'). Alternative to technicianId."),businessUnitId:yt.number().int().optional().describe("Filter by business unit"),businessUnitName:yt.string().optional().describe("Filter by business unit name (resolved via cache, e.g. 'HVAC'). Alternative to businessUnitId."),limit:yt.number().int().min(1).max(50).optional().describe("Max technicians to analyze (default 25, max 50)"),includeExtendedMetrics:yt.boolean().optional().default(!1).describe("Include memberships sold, sales from tech leads, and sales from marketing leads (Reports 171/173/174). Adds ~0.5-1s latency. Default: false.")}),Ot={Name:0,CompletedRevenue:1,OpportunityJobAverage:2,OpportunityConversionRate:3,Opportunity:4,ConvertedJobs:5,CustomerSatisfaction:6,TechnicianId:7},Vt={Name:0,RevenuePerHour:1,BillableEfficiency:2,Upsold:3,RecallsCaused:6,TechnicianId:7},Lt={Name:0,ReplacementOpportunity:1,LeadsSet:2,AverageLeadSale:3,ReplacementLeadConversionRate:4,ReplacementLeadsSold:5,TotalLeadSales:6,AverageReplacementLeadSale:7,TechnicianId:8},gn={Name:0,MembershipOpportunities:1,MembershipsSold:2,MembershipConversionRate:3,TechnicianId:4,AdjustmentRevenue:5,CompletedRevenueWithAdjustments:6},fn={Name:0,TechnicianBusinessUnit:1,TotalSalesFromTgl:2,ClosedAverageSaleFromTgl:3,CloseRateFromTgl:4,OptionsPerOpportunityFromTgl:5,TechnicianBusinessUnitId:6,TechnicianDivision:7,PaidTimeByBusinessUnit:8,AdjustmentRevenue:9,CompletedRevenueWithAdjustments:10,TechnicianId:11},yn={Name:0,TotalSalesFromMarketingLeads:1,ClosedAverageSaleFromMarketingLeads:2,CloseRateFromMarketingLeads:3,OptionsPerOpportunityFromMarketingLeads:4,TechnicianId:5,AdjustmentRevenue:6,CompletedRevenueWithAdjustments:7};function Kt(n){return!Me(n)||!Array.isArray(n.data)?[]:n.data.filter(Array.isArray)}function Zt(n){return Math.round(y(n))}function Yt(n,a){return ie(n)??`Technician ${a}`}function Rb(n){return{replacementOpps:n?.replacementOpps??0,leadsSet:n?.leadsSet??0,avgLeadSale:n?.avgLeadSale??0,conversionRate:n?.conversionRate??0,totalLeadSales:n?.totalLeadSales??0}}function jb(n){return{opportunities:n?.opportunities??0,sold:n?.sold??0,conversionRate:n?.conversionRate??0}}function Ts(n){return{totalSales:n?.totalSales??0,avgSale:n?.avgSale??0,closeRate:n?.closeRate??0}}function xb(n){let a=Kt(n),r=[];for(let e of a){let t=Zt(e[Ot.TechnicianId]);t<=0||r.push({id:t,name:Yt(e[Ot.Name],t),revenue:h(y(e[Ot.CompletedRevenue]),2),averageTicket:h(y(e[Ot.OpportunityJobAverage]),2),opportunities:Math.round(y(e[Ot.Opportunity])),convertedJobs:Math.round(y(e[Ot.ConvertedJobs])),conversionRate:h(y(e[Ot.OpportunityConversionRate])*100,1),customerSatisfaction:h(y(e[Ot.CustomerSatisfaction]),2)})}return r}function Ab(n){let a=Kt(n),r=[];for(let e of a){let t=Zt(e[Vt.TechnicianId]);t<=0||r.push({id:t,name:Yt(e[Vt.Name],t),revenuePerHour:h(y(e[Vt.RevenuePerHour]),2),billableEfficiency:h(y(e[Vt.BillableEfficiency]),3),recallsCaused:Math.round(y(e[Vt.RecallsCaused])),upsold:h(y(e[Vt.Upsold]),2)})}return r}function Ss(n){return n.replacementOpps!==0||n.leadsSet!==0||n.avgLeadSale!==0||n.conversionRate!==0||n.totalLeadSales!==0}function ws(n){return n.opportunities!==0||n.sold!==0||n.conversionRate!==0}function Nn(n){return n.totalSales!==0||n.avgSale!==0||n.closeRate!==0}function Pb(n){let a=Kt(n),r=[];for(let e of a){let t=Zt(e[Lt.TechnicianId]);if(t<=0)continue;let s={id:t,name:Yt(e[Lt.Name],t),replacementOpps:Math.round(y(e[Lt.ReplacementOpportunity])),leadsSet:Math.round(y(e[Lt.LeadsSet])),avgLeadSale:h(y(e[Lt.AverageLeadSale]),2),conversionRate:h(y(e[Lt.ReplacementLeadConversionRate])*100,1),totalLeadSales:h(y(e[Lt.TotalLeadSales]),2)};Ss(s)&&r.push(s)}return r}function Eb(n){let a=Kt(n),r=[];for(let e of a){let t=Zt(e[gn.TechnicianId]);if(t<=0)continue;let s={id:t,name:Yt(e[gn.Name],t),opportunities:Math.round(y(e[gn.MembershipOpportunities])),sold:Math.round(y(e[gn.MembershipsSold])),conversionRate:h(y(e[gn.MembershipConversionRate])*100,1)};ws(s)&&r.push(s)}return r}function Bb(n){let a=Kt(n),r=[];for(let e of a){let t=Zt(e[fn.TechnicianId]);if(t<=0)continue;let s={id:t,name:Yt(e[fn.Name],t),totalSales:h(y(e[fn.TotalSalesFromTgl]),2),avgSale:h(y(e[fn.ClosedAverageSaleFromTgl]),2),closeRate:h(y(e[fn.CloseRateFromTgl])*100,1)};Nn(s)&&r.push(s)}return r}function Lb(n){let a=Kt(n),r=[];for(let e of a){let t=Zt(e[yn.TechnicianId]);if(t<=0)continue;let s={id:t,name:Yt(e[yn.Name],t),totalSales:h(y(e[yn.TotalSalesFromMarketingLeads]),2),avgSale:h(y(e[yn.ClosedAverageSaleFromMarketingLeads]),2),closeRate:h(y(e[yn.CloseRateFromMarketingLeads])*100,1)};Nn(s)&&r.push(s)}return r}function Mb(n){return n.jobsCompleted>0||n.revenue>0||n.opportunities>0||n.customerSatisfaction>0||n.revenuePerHour>0||n.billableEfficiency>0||n.recallsCaused>0||n.upsold>0||Ss(n.leadGeneration)||ws(n.memberships)||Nn(n.salesFromTechLeads)||Nn(n.salesFromMarketingLeads)}function Ce(n,a,r=2){let e=n.reduce((t,s)=>t+a(s),0);return h(de(e,n.length),r)}function _s(n,a){a.register({name:"intel_technician_scorecard",domain:"intelligence",operation:"read",description:`Technician performance scorecard with completed jobs, revenue, opportunities, conversion rates, productivity, and lead generation. Set includeExtendedMetrics=true for memberships sold and sales from tech/marketing leads (adds ~0.5-1s).
|
|
48
|
+
|
|
49
|
+
Examples:
|
|
50
|
+
- "How are our techs performing this month?" -> startDate="2026-03-01", endDate="2026-04-01"
|
|
51
|
+
- "Show me Andrew's numbers for Q1" -> startDate="2026-01-01", endDate="2026-04-01", technicianName="Andrew"
|
|
52
|
+
- "Who is our top performer this year?" -> startDate="2026-01-01", endDate="2026-03-10"`,schema:Is.shape,handler:async r=>{try{let e=Is.parse(r),{start:t,end:s}=Ye(e.startDate,e.endDate,a.timezone),m=Ra(t,s,a.timezone),b=[],w=e.limit??25,X=await Pn(n,e.technicianId,e.technicianName),B=X.id;e.technicianName&&!B&&b.push(`Technician "${e.technicianName}" not found. Showing all technicians.`),X.resolvedName&&b.push(`Resolved "${e.technicianName}" \u2192 ${X.resolvedName} (ID: ${B})`);let H=await pt(n,e.businessUnitId,e.businessUnitName),G=H.id;e.businessUnitName&&!G&&b.push(`Business unit "${e.businessUnitName}" not found. Showing all business units.`),H.resolvedName&&b.push(`Resolved "${e.businessUnitName}" \u2192 ${H.resolvedName} (ID: ${G})`);let _=[{name:"From",value:e.startDate},{name:"To",value:e.endDate}],V=[{name:"From",value:e.startDate},{name:"To",value:e.endDate}],pe=[{name:"From",value:e.startDate},{name:"To",value:e.endDate}],ye=[{name:"From",value:e.startDate},{name:"To",value:e.endDate}],be=[{name:"From",value:e.startDate},{name:"To",value:e.endDate}],le=[{name:"From",value:e.startDate},{name:"To",value:e.endDate}];G!==void 0&&(_.push({name:"BusinessUnitIds",value:String(G)}),V.push({name:"BusinessUnitIds",value:String(G)}),pe.push({name:"BusinessUnitId",value:String(G)}),ye.push({name:"BusinessUnitIds",value:String(G)}),be.push({name:"BusinessUnitIds",value:String(G)}),le.push({name:"BusinessUnitIds",value:String(G)}));let[Te,Oe,Le,D,Q,R]=await Promise.all([te(b,"Technician revenue report (Report 168)",()=>n.post("/tenant/{tenant}/report-category/technician-dashboard/reports/168/data",{parameters:_}),null),te(b,"Technician productivity report (Report 170)",()=>n.post("/tenant/{tenant}/report-category/technician-dashboard/reports/170/data",{parameters:V}),null),te(b,"Technician lead generation report (Report 169)",()=>n.post("/tenant/{tenant}/report-category/technician-dashboard/reports/169/data",{parameters:pe}),null),e.includeExtendedMetrics?te(b,"Technician memberships report (Report 171)",()=>n.post("/tenant/{tenant}/report-category/technician-dashboard/reports/171/data",{parameters:ye}),null):Promise.resolve(null),e.includeExtendedMetrics?te(b,"Technician sales from tech leads report (Report 173)",()=>n.post("/tenant/{tenant}/report-category/technician-dashboard/reports/173/data",{parameters:be}),null):Promise.resolve(null),e.includeExtendedMetrics?te(b,"Technician sales from marketing leads report (Report 174)",()=>n.post("/tenant/{tenant}/report-category/technician-dashboard/reports/174/data",{parameters:le}),null):Promise.resolve(null)]),L=xb(Te),oe=Ab(Oe),E=Pb(Le),Se=Eb(D),Ne=Bb(Q),Ze=Lb(R);B!==void 0&&(L=L.filter(T=>T.id===B),oe=oe.filter(T=>T.id===B),E=E.filter(T=>T.id===B),Se=Se.filter(T=>T.id===B),Ne=Ne.filter(T=>T.id===B),Ze=Ze.filter(T=>T.id===B));let Fe=new Map(L.map(T=>[T.id,T])),z=new Map(oe.map(T=>[T.id,T])),He=new Map(E.map(T=>[T.id,T])),gt=new Map(Se.map(T=>[T.id,T])),Rt=new Map(Ne.map(T=>[T.id,T])),et=new Map(Ze.map(T=>[T.id,T])),se=[],st=new Set([...Fe.keys(),...z.keys(),...He.keys(),...gt.keys(),...Rt.keys(),...et.keys()]);B!==void 0&&st.forEach(T=>{T!==B&&st.delete(T)});for(let T of st){let Dt=Fe.get(T),rn=z.get(T),na=He.get(T),ra=gt.get(T),aa=Rt.get(T),oa=et.get(T),ia=Dt?.convertedJobs??0,Tm=h(de(ia,m),2),sa={id:T,name:Dt?.name??rn?.name??na?.name??ra?.name??aa?.name??oa?.name??`Technician ${T}`,jobsCompleted:ia,revenue:Dt?.revenue??0,averageTicket:Dt?.averageTicket??0,opportunities:Dt?.opportunities??0,convertedJobs:Dt?.convertedJobs??0,conversionRate:Dt?.conversionRate??0,customerSatisfaction:Dt?.customerSatisfaction??0,revenuePerHour:rn?.revenuePerHour??0,billableEfficiency:rn?.billableEfficiency??0,recallsCaused:rn?.recallsCaused??0,upsold:rn?.upsold??0,jobsPerDay:Tm,leadGeneration:Rb(na),memberships:jb(ra),salesFromTechLeads:Ts(aa),salesFromMarketingLeads:Ts(oa)};Mb(sa)&&se.push(sa)}let ym=se.length,vm={jobsCompleted:Ce(se,T=>T.jobsCompleted,2),revenue:Ce(se,T=>T.revenue,2),averageTicket:Ce(se,T=>T.averageTicket,2),opportunities:Ce(se,T=>T.opportunities,2),convertedJobs:Ce(se,T=>T.convertedJobs,2),conversionRate:Ce(se,T=>T.conversionRate,1),customerSatisfaction:Ce(se,T=>T.customerSatisfaction,2),revenuePerHour:Ce(se,T=>T.revenuePerHour,2),billableEfficiency:Ce(se,T=>T.billableEfficiency,3),recallsCaused:Ce(se,T=>T.recallsCaused,2),upsold:Ce(se,T=>T.upsold,2),jobsPerDay:Ce(se,T=>T.jobsPerDay,2),leadGeneration:{replacementOpps:Ce(se,T=>T.leadGeneration.replacementOpps,2),leadsSet:Ce(se,T=>T.leadGeneration.leadsSet,2),avgLeadSale:Ce(se,T=>T.leadGeneration.avgLeadSale,2),conversionRate:Ce(se,T=>T.leadGeneration.conversionRate,1),totalLeadSales:Ce(se,T=>T.leadGeneration.totalLeadSales,2)},memberships:{opportunities:Ce(se,T=>T.memberships.opportunities,2),sold:Ce(se,T=>T.memberships.sold,2),conversionRate:Ce(se,T=>T.memberships.conversionRate,1)},salesFromTechLeads:{totalSales:Ce(se,T=>T.salesFromTechLeads.totalSales,2),avgSale:Ce(se,T=>T.salesFromTechLeads.avgSale,2),closeRate:Ce(se,T=>T.salesFromTechLeads.closeRate,1)},salesFromMarketingLeads:{totalSales:Ce(se,T=>T.salesFromMarketingLeads.totalSales,2),avgSale:Ce(se,T=>T.salesFromMarketingLeads.avgSale,2),closeRate:Ce(se,T=>T.salesFromMarketingLeads.closeRate,1)}},Im=se.length>w?se.slice(0,w):se;se.length>w&&b.push(`Limited to ${w} of ${ym} technicians. Use 'limit' param to increase (max 50) or 'technicianId' for a specific tech.`);let ta={period:{start:e.startDate,end:e.endDate},technicians:Im,teamAverages:vm};return b.length>0&&(ta._warnings=b),i(ta,{shape:!0})}catch(e){return o(g(e))}}})}function Ub(n){let a="intel_";return new Proxy(n,{get(r,e,t){return e==="register"?s=>{if(s.name.startsWith(a)&&s.name!=="intel_lookup"){let m=s.handler,b=s.cacheKeyParams??(w=>w);s={...s,handler:async w=>Da(s.name,b(w),()=>m(w),s.cacheTtlMs)}}return r.register(s)}:Reflect.get(r,e,t)}})}var Fb=(n,a)=>{let r=Ub(a);ms(n,r),Yi(n,r),_s(n,r),us(n,r),vs(n,r),es(n,r),gs(n,r),ns(n,r),cs(n,r),is(n,r)},Ds=Fb;import{z as vt}from"zod";var Pr=vt.object({from:vt.number().optional().describe("Starting value for this markup range"),to:vt.number().optional().describe("Ending value for this markup range"),percent:vt.number().optional().describe("Markup percentage for this range")}),zn=vt.object({id:vt.number().int().describe("Purchase order markup ID")}),Cs=Pr.extend({id:vt.number().int().describe("Purchase order markup ID")}),ks=u(p(vt.object({ids:vt.string().optional().describe("Comma-separated purchase order markup IDs (maximum 50)")}).extend(f(["Id","From","To","Percent"]))));function Os(n,a){a.register({name:"inventory_purchase_order_markups_create",domain:"inventory",operation:"write",description:"Create a purchase order markup",schema:Pr.shape,handler:async r=>{let e=Pr.parse(r);try{let t=await n.post("/tenant/{tenant}/purchase-order-markups",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"inventory_purchase_order_markups_get",domain:"inventory",operation:"read",description:"Get a purchase order markup by ID",schema:zn.shape,handler:async r=>{let{id:e}=zn.parse(r);try{let t=await n.get(`/tenant/{tenant}/purchase-order-markups/${e}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"inventory_purchase_order_markups_list",domain:"inventory",operation:"read",description:"List purchase order markups",schema:ks.shape,handler:async r=>{let e=ks.parse(r);try{let t=await n.get("/tenant/{tenant}/purchase-order-markups",d({ids:e.ids,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,sort:e.sort}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"inventory_purchase_order_markups_update",domain:"inventory",operation:"write",description:"Update a purchase order markup",schema:Cs.shape,handler:async r=>{let e=Cs.parse(r),{id:t,...s}=e;try{let m=await n.patch(`/tenant/{tenant}/purchase-order-markups/${t}`,d(s));return i(m)}catch(m){return o(c(m))}}}),a.register({name:"inventory_purchase_order_markups_delete",domain:"inventory",operation:"delete",description:"Delete a purchase order markup",schema:zn.shape,handler:async r=>{let{id:e}=zn.parse(r);try{return await n.delete(`/tenant/{tenant}/purchase-order-markups/${e}`),i({success:!0,message:"Purchase order markup deleted"})}catch(t){return o(c(t))}}})}import{z as A}from"zod";var Ps=A.enum(["Pending","Sent","PartiallyReceived","Received","Exported","Canceled"]),Nb=A.enum(["PendingApproval","Approved","Rejected"]),Rs=A.object({street:A.string().optional().describe("Street address line"),unit:A.string().optional().describe("Address unit/suite"),city:A.string().optional().describe("Address city"),state:A.string().optional().describe("Address state/province"),postalCode:A.string().optional().describe("Address postal code"),country:A.string().optional().describe("Address country")}),zb=A.object({skuId:A.number().int().optional().describe("SKU ID for this purchase order line"),skuCode:A.string().optional().describe("SKU code for this purchase order line"),description:A.string().optional().describe("Line item description"),quantity:A.number().optional().describe("Line item quantity"),unitCost:A.number().optional().describe("Line item unit cost"),taxCodeId:A.number().int().optional().describe("Tax code ID for this line item"),inventoryLocationId:A.number().int().optional().describe("Inventory location ID for this line item")}),$b=A.object({name:A.string().optional().describe("External link label"),url:A.string().optional().describe("External link URL")}),Er=A.object({vendorId:A.number().int().optional().describe("Vendor ID for the purchase order"),purchaseOrderTypeId:A.number().int().optional().describe("Purchase order type ID"),number:A.string().optional().describe("Purchase order number"),status:Ps.optional().describe("Purchase order status"),date:A.string().optional().describe("Purchase order date"),sentOn:A.string().optional().describe("Date/time when PO was sent"),expectedDeliveryOn:A.string().optional().describe("Expected delivery date/time"),jobId:A.number().int().optional().describe("Job ID associated with the PO"),projectId:A.number().int().optional().describe("Project ID associated with the PO"),technicianId:A.number().int().optional().describe("Technician ID associated with the PO"),businessUnitId:A.number().int().optional().describe("Business unit ID associated with the PO"),inventoryLocationId:A.number().int().optional().describe("Inventory location ID associated with the PO"),summary:A.string().optional().describe("Purchase order summary text"),memo:A.string().optional().describe("Purchase order memo text"),shipTo:Rs.optional().describe("Shipping address for the purchase order"),billTo:Rs.optional().describe("Billing address for the purchase order"),items:A.array(zb).optional().describe("Purchase order line items"),externalLinks:A.array($b).optional().describe("External links associated with the PO")}),$n=A.object({id:A.number().int().describe("Purchase order ID")}),js=Er.extend({id:A.number().int().describe("Purchase order ID")}),xs=u(p(A.object({ids:A.string().optional().describe("Comma-separated purchase order IDs (maximum 50)"),status:Ps.optional().describe("Filter by purchase order status"),number:A.string().optional().describe("Filter by purchase order number"),jobId:A.number().int().optional().describe("Filter by job ID"),jobIds:A.string().optional().describe("Comma-separated job IDs"),technicianId:A.number().int().optional().describe("Filter by technician ID"),projectId:A.number().int().optional().describe("Filter by project ID"),dateOnOrAfter:A.string().optional().describe("Filter by purchase order date on or after this value"),dateBefore:A.string().optional().describe("Filter by purchase order date before this value"),sentOnOrAfter:A.string().optional().describe("Filter by sent-on date on or after this value"),sentBefore:A.string().optional().describe("Filter by sent-on date before this value")}).extend(f(["Id","ModifiedOn","CreatedOn"])))),As=u(p(A.object({ids:A.string().optional().describe("Comma-separated purchase order request IDs (maximum 50)"),requestStatus:Nb.optional().describe("Filter by purchase order request status"),requestNumber:A.string().optional().describe("Filter by purchase order request number"),jobId:A.number().int().optional().describe("Filter by job ID"),jobIds:A.string().optional().describe("Comma-separated job IDs"),technicianId:A.number().int().optional().describe("Filter by technician ID"),projectId:A.number().int().optional().describe("Filter by project ID"),dateOnOrAfter:A.string().optional().describe("Filter by request date on or after this value"),dateBefore:A.string().optional().describe("Filter by request date before this value")}).extend(f(["Id","ModifiedOn","CreatedOn"])))),Gn=A.object({id:A.number().int().describe("Purchase order request ID")});function Es(n,a){a.register({name:"inventory_purchase_orders_create",domain:"inventory",operation:"write",description:"Create a purchase order",schema:Er.shape,handler:async r=>{let e=Er.parse(r);try{let t=await n.post("/tenant/{tenant}/purchase-orders",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"inventory_purchase_orders_get",domain:"inventory",operation:"read",description:"Get a purchase order by ID",schema:$n.shape,handler:async r=>{let{id:e}=$n.parse(r);try{let t=await n.get(`/tenant/{tenant}/purchase-orders/${e}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"inventory_purchase_orders_list",domain:"inventory",operation:"read",description:"List purchase orders",schema:xs.shape,handler:async r=>{let e=xs.parse(r);try{let t=await n.get("/tenant/{tenant}/purchase-orders",d({ids:e.ids,status:e.status,number:e.number,jobId:e.jobId,jobIds:e.jobIds,technicianId:e.technicianId,projectId:e.projectId,createdOnOrAfter:e.createdOnOrAfter,createdBefore:e.createdBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,modifiedBefore:e.modifiedBefore,dateOnOrAfter:e.dateOnOrAfter,dateBefore:e.dateBefore,sentOnOrAfter:e.sentOnOrAfter,sentBefore:e.sentBefore,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,sort:e.sort}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"inventory_purchase_orders_requests_list",domain:"inventory",operation:"read",description:"List purchase order requests",schema:As.shape,handler:async r=>{let e=As.parse(r);try{let t=await n.get("/tenant/{tenant}/purchase-orders/requests",d({ids:e.ids,requestStatus:e.requestStatus,requestNumber:e.requestNumber,jobId:e.jobId,jobIds:e.jobIds,technicianId:e.technicianId,projectId:e.projectId,createdOnOrAfter:e.createdOnOrAfter,createdBefore:e.createdBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,modifiedBefore:e.modifiedBefore,dateOnOrAfter:e.dateOnOrAfter,dateBefore:e.dateBefore,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,sort:e.sort}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"inventory_purchase_orders_update",domain:"inventory",operation:"write",description:"Update a purchase order",schema:js.shape,handler:async r=>{let e=js.parse(r),{id:t,...s}=e;try{let m=await n.patch(`/tenant/{tenant}/purchase-orders/${t}`,d(s));return i(m)}catch(m){return o(c(m))}}}),a.register({name:"inventory_purchase_orders_cancel",domain:"inventory",operation:"write",description:"Cancel a purchase order",schema:$n.shape,handler:async r=>{let{id:e}=$n.parse(r);try{let t=await n.patch(`/tenant/{tenant}/purchase-orders/${e}/cancellation`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"inventory_purchase_orders_approve_request",domain:"inventory",operation:"write",description:"Approve a purchase order request",schema:Gn.shape,handler:async r=>{let{id:e}=Gn.parse(r);try{let t=await n.patch(`/tenant/{tenant}/purchase-orders/requests/${e}/approve`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"inventory_purchase_orders_reject_request",domain:"inventory",operation:"write",description:"Reject a purchase order request",schema:Gn.shape,handler:async r=>{let{id:e}=Gn.parse(r);try{let t=await n.patch(`/tenant/{tenant}/purchase-orders/requests/${e}/reject`);return i(t)}catch(t){return o(c(t))}}})}import{z as It}from"zod";var Br=It.object({name:It.string().optional().describe("Purchase order type name"),active:It.boolean().optional().describe("Whether the purchase order type is active"),color:It.string().optional().describe("Color code used for this purchase order type"),memo:It.string().optional().describe("Internal note for this purchase order type")}),mT=It.object({id:It.number().int().describe("Purchase order type ID")}),Bs=Br.extend({id:It.number().int().describe("Purchase order type ID")}),Ls=u(p(It.object({}).extend(S()).extend(f(["Id","ModifiedOn","CreatedOn"]))));function Ms(n,a){a.register({name:"inventory_purchase_order_types_create",domain:"inventory",operation:"write",description:"Create a purchase order type",schema:Br.shape,handler:async r=>{let e=Br.parse(r);try{let t=await n.post("/tenant/{tenant}/purchase-order-types",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"inventory_purchase_order_types_update",domain:"inventory",operation:"write",description:"Update a purchase order type",schema:Bs.shape,handler:async r=>{let e=Bs.parse(r),{id:t,...s}=e;try{let m=await n.patch(`/tenant/{tenant}/purchase-order-types/${t}`,d(s));return i(m)}catch(m){return o(c(m))}}}),a.register({name:"inventory_purchase_order_types_list",domain:"inventory",operation:"read",description:"List purchase order types",schema:Ls.shape,handler:async r=>{let e=Ls.parse(r);try{let t=await n.get("/tenant/{tenant}/purchase-order-types",d({active:e.active,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,sort:e.sort}));return i(t)}catch(t){return o(c(t))}}})}import{z as F}from"zod";var Gb=F.union([F.string(),F.number(),F.boolean(),F.null()]),$s=F.object({}).catchall(Gb).describe("Custom field key/value map"),qb=F.object({skuId:F.number().int().optional().describe("SKU ID"),skuCode:F.string().optional().describe("SKU code"),description:F.string().optional().describe("Line item description"),quantity:F.number().optional().describe("Receipt quantity"),unitCost:F.number().optional().describe("Unit cost"),inventoryLocationId:F.number().int().optional().describe("Inventory location ID"),purchaseOrderItemId:F.number().int().optional().describe("Purchase order item ID"),taxCodeId:F.number().int().optional().describe("Tax code ID")}),Jb=F.object({name:F.string().optional().describe("External link label"),url:F.string().optional().describe("External link URL")}),Us=F.object({number:F.string().optional().describe("Receipt number"),vendorInvoiceNumber:F.string().optional().describe("Vendor invoice number"),receivedOn:F.string().optional().describe("Receipt received date/time"),vendorId:F.number().int().optional().describe("Vendor ID"),billId:F.number().int().optional().describe("Bill ID"),batchId:F.number().int().optional().describe("Batch ID"),businessUnitId:F.number().int().optional().describe("Business unit ID"),inventoryLocationId:F.number().int().optional().describe("Inventory location ID"),purchaseOrderId:F.number().int().optional().describe("Purchase order ID"),syncStatus:F.string().optional().describe("Sync status"),active:F.boolean().optional().describe("Whether receipt is active"),summary:F.string().optional().describe("Receipt summary"),memo:F.string().optional().describe("Receipt memo"),items:F.array(qb).optional().describe("Receipt line items"),externalLinks:F.array(Jb).optional().describe("External links for this receipt"),customFields:$s.optional().describe("Receipt custom fields")}),Fs=F.object({id:F.number().int().describe("Receipt ID")}),Ns=u(p(F.object({ids:F.string().optional().describe("Comma-separated receipt IDs (maximum 50)"),number:F.string().optional().describe("Receipt number filter"),vendorInvoiceNumber:F.string().optional().describe("Vendor invoice number filter"),billId:F.number().int().optional().describe("Bill ID filter"),batchId:F.number().int().optional().describe("Batch ID filter"),vendorIds:F.string().optional().describe("Comma-separated vendor IDs"),businessUnitIds:F.string().optional().describe("Comma-separated business unit IDs"),inventoryLocationIds:F.string().optional().describe("Comma-separated inventory location IDs"),purchaseOrderIds:F.string().optional().describe("Comma-separated purchase order IDs"),syncStatuses:F.string().optional().describe("Comma-separated sync statuses"),customFieldsFields:F.record(F.string()).optional().describe("Custom field name/value filters"),customFieldsOperator:F.enum(["And","Or"]).optional().describe("Operator for custom field filters"),receivedOnOrAfter:F.string().datetime().optional().describe("Received-on timestamp lower bound"),receivedBefore:F.string().datetime().optional().describe("Received-on timestamp upper bound")}).extend(S()).extend(f(["Id","ModifiedOn","CreatedOn"])))),zs=F.object({customFields:$s.describe("Custom fields payload")});function Gs(n,a){a.register({name:"inventory_receipts_create",domain:"inventory",operation:"write",description:"Create a receipt",schema:Us.shape,handler:async r=>{let e=Us.parse(r);try{let t=await n.post("/tenant/{tenant}/receipts",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"inventory_receipts_cancel",domain:"inventory",operation:"write",description:"Cancel a receipt",schema:Fs.shape,handler:async r=>{let{id:e}=Fs.parse(r);try{let t=await n.patch(`/tenant/{tenant}/receipts/${e}/cancellation`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"inventory_receipts_list",domain:"inventory",operation:"read",description:"List receipts",schema:Ns.shape,handler:async r=>{let e=Ns.parse(r);try{let t=await n.get("/tenant/{tenant}/receipts",d({ids:e.ids,active:e.active,number:e.number,vendorInvoiceNumber:e.vendorInvoiceNumber,billId:e.billId,batchId:e.batchId,vendorIds:e.vendorIds,businessUnitIds:e.businessUnitIds,inventoryLocationIds:e.inventoryLocationIds,purchaseOrderIds:e.purchaseOrderIds,syncStatuses:e.syncStatuses,"customFields.Fields":e.customFieldsFields,"customFields.Operator":e.customFieldsOperator,receivedOnOrAfter:e.receivedOnOrAfter,receivedBefore:e.receivedBefore,createdOnOrAfter:e.createdOnOrAfter,createdBefore:e.createdBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,modifiedBefore:e.modifiedBefore,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,sort:e.sort}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"inventory_receipts_update_custom_fields",domain:"inventory",operation:"write",description:"Update receipt custom fields",schema:zs.shape,handler:async r=>{let e=zs.parse(r);try{let t=await n.patch("/tenant/{tenant}/receipts/custom-fields",e.customFields);return i(t)}catch(t){return o(c(t))}}})}import{z as j}from"zod";var Wb=j.union([j.string(),j.number(),j.boolean(),j.null()]),Zs=j.object({}).catchall(Wb).describe("Custom field key/value map"),Hb=j.object({skuId:j.number().int().optional().describe("SKU ID for this return item"),skuCode:j.string().optional().describe("SKU code for this return item"),description:j.string().optional().describe("Return item description"),quantity:j.number().optional().describe("Return quantity"),unitCost:j.number().optional().describe("Unit cost"),inventoryLocationId:j.number().int().optional().describe("Inventory location ID"),purchaseOrderItemId:j.number().int().optional().describe("Purchase order item ID"),taxCodeId:j.number().int().optional().describe("Tax code ID")}),Vb=j.object({name:j.string().optional().describe("External link label"),url:j.string().optional().describe("External link URL")}),Lr=j.object({number:j.string().optional().describe("Return number"),referenceNumber:j.string().optional().describe("Reference number"),returnDate:j.string().optional().describe("Return date/time"),vendorId:j.number().int().optional().describe("Vendor ID"),jobId:j.number().int().optional().describe("Job ID"),purchaseOrderId:j.number().int().optional().describe("Purchase order ID"),batchId:j.number().int().optional().describe("Batch ID"),businessUnitId:j.number().int().optional().describe("Business unit ID"),inventoryLocationId:j.number().int().optional().describe("Inventory location ID"),returnTypeId:j.number().int().optional().describe("Return type ID"),status:j.string().optional().describe("Return status"),syncStatus:j.string().optional().describe("Sync status"),active:j.boolean().optional().describe("Whether return is active"),summary:j.string().optional().describe("Return summary"),memo:j.string().optional().describe("Return memo"),items:j.array(Hb).optional().describe("Return line items"),externalLinks:j.array(Vb).optional().describe("External links for this return"),customFields:Zs.optional().describe("Return custom fields")}),qs=j.object({id:j.number().int().describe("Return ID")}),Js=Lr.extend({id:j.number().int().describe("Return ID")}),Ws=u(p(j.object({ids:j.string().optional().describe("Comma-separated return IDs (maximum 50)"),number:j.string().optional().describe("Return number filter"),referenceNumber:j.string().optional().describe("Reference number filter"),jobId:j.number().int().optional().describe("Job ID filter"),purchaseOrderId:j.number().int().optional().describe("Purchase order ID filter"),batchId:j.number().int().optional().describe("Batch ID filter"),vendorIds:j.string().optional().describe("Comma-separated vendor IDs"),businessUnitIds:j.string().optional().describe("Comma-separated business unit IDs"),inventoryLocationIds:j.string().optional().describe("Comma-separated inventory location IDs"),syncStatuses:j.string().optional().describe("Comma-separated sync statuses"),customFieldsFields:j.record(j.string()).optional().describe("Custom field name/value filters"),customFieldsOperator:j.enum(["And","Or"]).optional().describe("Operator for custom field filters"),returnDateOnOrAfter:j.string().datetime().optional().describe("Return date on or after this UTC timestamp"),returnDateBefore:j.string().datetime().optional().describe("Return date before this UTC timestamp"),externalDataApplicationGuid:j.string().uuid().optional().describe("External data application GUID"),externalDataKey:j.string().optional().describe("External data key"),externalDataValues:j.string().optional().describe("External data values")}).extend(S()).extend(f(["Id","ModifiedOn","CreatedOn"])))),Hs=j.object({customFields:Zs.describe("Custom fields payload")}),Mr=j.object({name:j.string().optional().describe("Return type name"),active:j.boolean().optional().describe("Whether the return type is active"),color:j.string().optional().describe("Color code for display"),memo:j.string().optional().describe("Internal note")}),Vs=Mr.extend({id:j.number().int().describe("Return type ID")}),Ks=u(p(j.object({activeOnly:j.boolean().optional().describe("When true, return only active return types"),name:j.string().optional().describe("Return type name filter")}).extend(f(["Id","ModifiedOn","CreatedOn"]))));function Ys(n,a){a.register({name:"inventory_returns_create",domain:"inventory",operation:"write",description:"Create a return",schema:Lr.shape,handler:async r=>{let e=Lr.parse(r);try{let t=await n.post("/tenant/{tenant}/returns",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"inventory_returns_update_custom_fields",domain:"inventory",operation:"write",description:"Update return custom fields",schema:Hs.shape,handler:async r=>{let e=Hs.parse(r);try{let t=await n.patch("/tenant/{tenant}/returns/custom-fields",e.customFields);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"inventory_returns_update",domain:"inventory",operation:"write",description:"Update a return",schema:Js.shape,handler:async r=>{let e=Js.parse(r),{id:t,...s}=e;try{let m=await n.patch(`/tenant/{tenant}/returns/${t}`,d(s));return i(m)}catch(m){return o(c(m))}}}),a.register({name:"inventory_returns_cancel",domain:"inventory",operation:"write",description:"Cancel a return",schema:qs.shape,handler:async r=>{let{id:e}=qs.parse(r);try{let t=await n.patch(`/tenant/{tenant}/returns/${e}/cancellation`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"inventory_returns_list",domain:"inventory",operation:"read",description:"List returns",schema:Ws.shape,handler:async r=>{let e=Ws.parse(r);try{let t=await n.get("/tenant/{tenant}/returns",d({ids:e.ids,active:e.active,number:e.number,referenceNumber:e.referenceNumber,jobId:e.jobId,purchaseOrderId:e.purchaseOrderId,batchId:e.batchId,vendorIds:e.vendorIds,businessUnitIds:e.businessUnitIds,inventoryLocationIds:e.inventoryLocationIds,syncStatuses:e.syncStatuses,"customFields.Fields":e.customFieldsFields,"customFields.Operator":e.customFieldsOperator,returnDateOnOrAfter:e.returnDateOnOrAfter,returnDateBefore:e.returnDateBefore,createdOnOrAfter:e.createdOnOrAfter,createdBefore:e.createdBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,modifiedBefore:e.modifiedBefore,externalDataApplicationGuid:e.externalDataApplicationGuid,externalDataKey:e.externalDataKey,externalDataValues:e.externalDataValues,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,sort:e.sort}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"inventory_return_types_create",domain:"inventory",operation:"write",description:"Create a return type",schema:Mr.shape,handler:async r=>{let e=Mr.parse(r);try{let t=await n.post("/tenant/{tenant}/return-types",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"inventory_return_types_update",domain:"inventory",operation:"write",description:"Update a return type",schema:Vs.shape,handler:async r=>{let e=Vs.parse(r),{id:t,...s}=e;try{let m=await n.patch(`/tenant/{tenant}/return-types/${t}`,d(s));return i(m)}catch(m){return o(c(m))}}}),a.register({name:"inventory_return_types_list",domain:"inventory",operation:"read",description:"List return types",schema:Ks.shape,handler:async r=>{let e=Ks.parse(r);try{let t=await n.get("/tenant/{tenant}/return-types",d({activeOnly:e.activeOnly,name:e.name,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,sort:e.sort}));return i(t)}catch(t){return o(c(t))}}})}import{z as J}from"zod";var Kb=J.union([J.string(),J.number(),J.boolean(),J.null()]),tc=J.object({}).catchall(Kb).describe("Custom field key/value map"),Zb=J.object({skuId:J.number().int().optional().describe("SKU ID"),skuCode:J.string().optional().describe("SKU code"),description:J.string().optional().describe("Line item description"),quantity:J.number().optional().describe("Transfer quantity"),fromInventoryLocationId:J.number().int().optional().describe("From inventory location ID"),toInventoryLocationId:J.number().int().optional().describe("To inventory location ID"),unitCost:J.number().optional().describe("Unit cost")}),Yb=J.object({number:J.string().optional().describe("Transfer number"),referenceNumber:J.string().optional().describe("Transfer reference number"),date:J.string().optional().describe("Transfer date/time"),status:J.string().optional().describe("Transfer status"),transferTypeId:J.number().int().optional().describe("Transfer type ID"),fromLocationId:J.number().int().optional().describe("From location ID"),toLocationId:J.number().int().optional().describe("To location ID"),batchId:J.number().int().optional().describe("Batch ID"),syncStatus:J.string().optional().describe("Sync status"),active:J.boolean().optional().describe("Whether transfer is active"),memo:J.string().optional().describe("Transfer memo"),items:J.array(Zb).optional().describe("Transfer line items"),customFields:tc.optional().describe("Transfer custom fields")}),Xs=Yb.extend({id:J.number().int().describe("Transfer ID")}),Qs=u(p(J.object({ids:J.string().optional().describe("Comma-separated transfer IDs (maximum 50)"),statuses:J.string().optional().describe("Comma-separated transfer statuses"),number:J.string().optional().describe("Transfer number filter"),referenceNumber:J.string().optional().describe("Reference number filter"),batchId:J.number().int().optional().describe("Batch ID filter"),transferTypeIds:J.string().optional().describe("Comma-separated transfer type IDs"),fromLocationIds:J.string().optional().describe("Comma-separated from-location IDs"),toLocationIds:J.string().optional().describe("Comma-separated to-location IDs"),syncStatuses:J.string().optional().describe("Comma-separated sync statuses"),customFieldsFields:J.record(J.string()).optional().describe("Custom field name/value filters"),customFieldsOperator:J.enum(["And","Or"]).optional().describe("Operator for custom field filters"),dateOnOrAfter:J.string().datetime().optional().describe("Transfer date on or after this UTC timestamp"),dateBefore:J.string().datetime().optional().describe("Transfer date before this UTC timestamp"),externalDataApplicationGuid:J.string().uuid().optional().describe("External data application GUID"),externalDataKey:J.string().optional().describe("External data key"),externalDataValues:J.string().optional().describe("External data values")}).extend(f(["Id","ModifiedOn","CreatedOn"])))),ec=J.object({customFields:tc.describe("Custom fields payload")});function nc(n,a){a.register({name:"inventory_transfers_update_custom_fields",domain:"inventory",operation:"write",description:"Update transfer custom fields",schema:ec.shape,handler:async r=>{let e=ec.parse(r);try{let t=await n.patch("/tenant/{tenant}/transfers/custom-fields",e.customFields);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"inventory_transfers_update",domain:"inventory",operation:"write",description:"Update a transfer",schema:Xs.shape,handler:async r=>{let e=Xs.parse(r),{id:t,...s}=e;try{let m=await n.patch(`/tenant/{tenant}/transfers/${t}`,d(s));return i(m)}catch(m){return o(c(m))}}}),a.register({name:"inventory_transfers_list",domain:"inventory",operation:"read",description:"List transfers",schema:Qs.shape,handler:async r=>{let e=Qs.parse(r);try{let t=await n.get("/tenant/{tenant}/transfers",d({ids:e.ids,statuses:e.statuses,number:e.number,referenceNumber:e.referenceNumber,batchId:e.batchId,transferTypeIds:e.transferTypeIds,fromLocationIds:e.fromLocationIds,toLocationIds:e.toLocationIds,syncStatuses:e.syncStatuses,"customFields.Fields":e.customFieldsFields,"customFields.Operator":e.customFieldsOperator,dateOnOrAfter:e.dateOnOrAfter,dateBefore:e.dateBefore,createdOnOrAfter:e.createdOnOrAfter,createdBefore:e.createdBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,modifiedBefore:e.modifiedBefore,externalDataApplicationGuid:e.externalDataApplicationGuid,externalDataKey:e.externalDataKey,externalDataValues:e.externalDataValues,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,sort:e.sort}));return i(t)}catch(t){return o(c(t))}}})}import{z as ue}from"zod";var rc=ue.object({street:ue.string().optional().describe("Street address line"),unit:ue.string().optional().describe("Address unit or suite"),city:ue.string().optional().describe("Address city"),state:ue.string().optional().describe("Address state or province"),postalCode:ue.string().optional().describe("Address postal code"),country:ue.string().optional().describe("Address country")}),Ur=ue.object({name:ue.string().optional().describe("Vendor name"),code:ue.string().optional().describe("Vendor internal code"),contactName:ue.string().optional().describe("Primary vendor contact name"),phone:ue.string().optional().describe("Vendor phone number"),email:ue.string().optional().describe("Vendor email address"),website:ue.string().optional().describe("Vendor website URL"),accountNumber:ue.string().optional().describe("Vendor account number"),taxId:ue.string().optional().describe("Vendor tax ID"),memo:ue.string().optional().describe("Internal vendor memo"),active:ue.boolean().optional().describe("Whether the vendor is active"),address:rc.optional().describe("Vendor mailing address"),remitToAddress:rc.optional().describe("Vendor remit-to address"),businessUnitIds:ue.array(ue.number().int().describe("Business unit ID associated with this vendor")).optional().describe("Business units associated with this vendor")}),Xb=ue.object({id:ue.number().int().describe("Vendor ID")}),ac=Xb.extend({externalDataApplicationGuid:ue.string().uuid().optional().describe("External data application GUID for lookup"),externalDataKey:ue.string().optional().describe("External data key used with externalDataValues"),externalDataValues:ue.string().optional().describe("External data values used with externalDataKey")}),oc=Ur.extend({id:ue.number().int().describe("Vendor ID")}),ic=u(p(ue.object({ids:ue.array(ue.number().int().describe("Vendor ID to include")).optional().describe("Collection of vendor IDs to filter by"),externalDataApplicationGuid:ue.string().uuid().optional().describe("External data application GUID for lookup"),externalDataKey:ue.string().optional().describe("External data key used with externalDataValues"),externalDataValues:ue.string().optional().describe("External data values used with externalDataKey")}).extend(S()).extend(f(["Id","ModifiedOn","CreatedOn"]))));function sc(n,a){a.register({name:"inventory_vendors_create",domain:"inventory",operation:"write",description:"Create a vendor",schema:Ur.shape,handler:async r=>{let e=Ur.parse(r);try{let t=await n.post("/tenant/{tenant}/vendors",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"inventory_vendors_get",domain:"inventory",operation:"read",description:"Get a vendor by ID",schema:ac.shape,handler:async r=>{let e=ac.parse(r);try{let t=await n.get(`/tenant/{tenant}/vendors/${e.id}`,d({externalDataApplicationGuid:e.externalDataApplicationGuid,externalDataKey:e.externalDataKey,externalDataValues:e.externalDataValues}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"inventory_vendors_list",domain:"inventory",operation:"read",description:"List vendors",schema:ic.shape,handler:async r=>{let e=ic.parse(r);try{let t=await n.get("/tenant/{tenant}/vendors",d({ids:e.ids,active:e.active,externalDataApplicationGuid:e.externalDataApplicationGuid,externalDataKey:e.externalDataKey,externalDataValues:e.externalDataValues,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,sort:e.sort}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"inventory_vendors_update",domain:"inventory",operation:"write",description:"Update a vendor",schema:oc.shape,handler:async r=>{let e=oc.parse(r),{id:t,...s}=e;try{let m=await n.patch(`/tenant/{tenant}/vendors/${t}`,d(s));return i(m)}catch(m){return o(c(m))}}})}import{z as fe}from"zod";var Qb=fe.object({street:fe.string().optional().describe("Street address"),unit:fe.string().optional().describe("Address unit/suite"),city:fe.string().optional().describe("City"),state:fe.string().optional().describe("State/province"),postalCode:fe.string().optional().describe("Postal code"),country:fe.string().optional().describe("Country")}),eh=fe.object({key:fe.string().optional().describe("External data key"),value:fe.string().optional().describe("External data value")}),th=fe.object({name:fe.string().optional().describe("Warehouse name"),code:fe.string().optional().describe("Warehouse code"),description:fe.string().optional().describe("Warehouse description"),active:fe.boolean().optional().describe("Whether the warehouse is active"),businessUnitId:fe.number().int().optional().describe("Business unit ID"),inventoryLocationId:fe.number().int().optional().describe("Primary inventory location ID"),managerEmployeeId:fe.number().int().optional().describe("Manager employee ID"),phone:fe.string().optional().describe("Warehouse phone number"),email:fe.string().optional().describe("Warehouse email"),memo:fe.string().optional().describe("Internal note"),address:Qb.optional().describe("Warehouse address"),externalData:fe.array(eh).optional().describe("External data entries")}),cc=th.extend({id:fe.number().int().describe("Warehouse ID")}),dc=u(p(fe.object({ids:fe.string().optional().describe("Comma-separated warehouse IDs (maximum 50)"),externalDataApplicationGuid:fe.string().uuid().optional().describe("External data application GUID"),externalDataKey:fe.string().optional().describe("External data key"),externalDataValues:fe.string().optional().describe("External data values")}).extend(S()).extend(f(["Id","ModifiedOn","CreatedOn"]))));function mc(n,a){a.register({name:"inventory_warehouses_update",domain:"inventory",operation:"write",description:"Update a warehouse",schema:cc.shape,handler:async r=>{let e=cc.parse(r),{id:t,...s}=e;try{let m=await n.patch(`/tenant/{tenant}/warehouses/${t}`,d(s));return i(m)}catch(m){return o(c(m))}}}),a.register({name:"inventory_warehouses_list",domain:"inventory",operation:"read",description:"List warehouses",schema:dc.shape,handler:async r=>{let e=dc.parse(r);try{let t=await n.get("/tenant/{tenant}/warehouses",d({ids:e.ids,active:e.active,externalDataApplicationGuid:e.externalDataApplicationGuid,externalDataKey:e.externalDataKey,externalDataValues:e.externalDataValues,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,sort:e.sort}));return i(t)}catch(t){return o(c(t))}}})}var nh=(n,a)=>{Es(n,a),Ms(n,a),Os(n,a),Ys(n,a),nc(n,a),sc(n,a),mc(n,a),Gs(n,a)},pc=nh;import{z as Z}from"zod";var Fr=Z.string().regex(/^[a-zA-Z0-9_-]+$/,"Must contain only alphanumeric characters, hyphens, and underscores"),rh=Z.object({payload:Z.object({}).passthrough().optional().describe("Attribution payload")}),ah=p(Z.object({fromUtc:Z.string().datetime().describe("Start date/time in UTC for the filtering period"),toUtc:Z.string().datetime().describe("End date/time in UTC for the filtering period"),leadType:Z.enum(["Call","WebBooking","WebLeadForm","ManualJob"]).optional().describe("Lead type filter")})),oh=p(Z.object({ids:Z.string().optional().describe("Comma-delimited rate sheet IDs"),searchTerm:Z.string().optional().describe("Search term"),...S()})),ih=Z.object({rateSheetId:Z.number().int().describe("Rate sheet ID"),payload:Z.object({}).passthrough().describe("Rate sheet update payload")}),sh=p(Z.object({search:Z.string().optional().describe("Search text"),reportType:Z.number().int().optional().describe("Report type"),sort:Z.string().optional().describe("Sort expression"),createdOnOrAfter:Z.string().datetime().optional().describe("Created on or after timestamp"),createdBefore:Z.string().datetime().optional().describe("Created before timestamp"),modifiedOnOrAfter:Z.string().datetime().optional().describe("Modified on or after timestamp"),modifiedBefore:Z.string().datetime().optional().describe("Modified before timestamp"),fromDate:Z.string().datetime().optional().describe("Review date from"),toDate:Z.string().datetime().optional().describe("Review date to"),responseTypes:Z.array(Z.string()).optional().describe("Response types"),locationIds:Z.array(Z.number().int()).optional().describe("Location IDs"),sources:Z.array(Z.string()).optional().describe("Review sources"),reviewStatuses:Z.array(Z.string()).optional().describe("Review statuses"),technicianIds:Z.array(Z.number().int()).optional().describe("Technician IDs"),campaignIds:Z.array(Z.number().int()).optional().describe("Campaign IDs"),fromRating:Z.number().optional().describe("From rating"),toRating:Z.number().optional().describe("To rating"),includeReviewsWithoutLocation:Z.boolean().optional().describe("Include reviews without location"),includeReviewsWithoutCampaign:Z.boolean().optional().describe("Include reviews without campaign"),includeReviewsWithoutTechnician:Z.boolean().optional().describe("Include reviews without technician")})),FT=Z.object({id:Fr.describe("Scheduler ID")}),ch=Z.object({id:Fr.describe("Scheduler ID"),sessionCreatedOnOrAfter:Z.string().datetime().describe("Session created on or after timestamp"),sessionCreatedBefore:Z.string().datetime().describe("Session created before timestamp")}),dh=u(p(Z.object({}))),mh=u(p(Z.object({id:Fr.describe("Scheduler ID")})));function Xt(n){return n&&n.length>0?n.join(","):void 0}function qn(n,a,r){a.register({name:r.name,domain:"marketing",operation:"write",description:r.description,schema:rh.shape,handler:async e=>{let t=e;try{let s=await n.post(r.path,t.payload);return i(s)}catch(s){return o(c(s))}}})}function lc(n,a){qn(n,a,{name:"marketing_external_call_attributions_create",description:"Create external call attributions",path:"/tenant/{tenant}/external-call-attributions"}),qn(n,a,{name:"marketing_scheduled_job_attributions_create",description:"Create scheduled job attributions",path:"/tenant/{tenant}/job-attributions"}),qn(n,a,{name:"marketing_web_booking_attributions_create",description:"Create web booking attributions",path:"/tenant/{tenant}/web-booking-attributions"}),qn(n,a,{name:"marketing_web_lead_form_attributions_create",description:"Create web lead form attributions",path:"/tenant/{tenant}/web-lead-form-attributions"}),a.register({name:"marketing_attributed_leads_get",domain:"marketing",operation:"read",description:"Get attributed leads",schema:ah.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/attributed-leads",d({fromUtc:e.fromUtc,toUtc:e.toUtc,leadType:e.leadType,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"marketing_client_side_data_get",domain:"marketing",operation:"read",description:"Get marketing client-side data",schema:{},handler:async()=>{try{let r=await n.get("/tenant/{tenant}/data");return i(r)}catch(r){return o(c(r))}}}),a.register({name:"marketing_client_specific_pricing_get_all_rate_sheets",domain:"marketing",operation:"read",description:"List all client-specific pricing rate sheets",schema:oh.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/clientspecificpricing",d({ids:e.ids,searchTerm:e.searchTerm,active:e.active,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"marketing_client_specific_pricing_update_rate_sheet",domain:"marketing",operation:"write",description:"Update a client-specific pricing rate sheet",schema:ih.shape,handler:async r=>{let e=r;try{let t=await n.patch(`/tenant/{tenant}/clientspecificpricing/${e.rateSheetId}`,e.payload);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"marketing_reviews",domain:"marketing",operation:"read",description:"List marketing reviews",schema:sh.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/reviews",d({page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,search:e.search,reportType:e.reportType,sort:e.sort,createdOnOrAfter:e.createdOnOrAfter,createdBefore:e.createdBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,modifiedBefore:e.modifiedBefore,fromDate:e.fromDate,toDate:e.toDate,responseTypes:Xt(e.responseTypes),locationIds:Xt(e.locationIds),sources:Xt(e.sources),reviewStatuses:Xt(e.reviewStatuses),technicianIds:Xt(e.technicianIds),campaignIds:Xt(e.campaignIds),fromRating:e.fromRating,toRating:e.toRating,includeReviewsWithoutLocation:e.includeReviewsWithoutLocation,includeReviewsWithoutCampaign:e.includeReviewsWithoutCampaign,includeReviewsWithoutTechnician:e.includeReviewsWithoutTechnician}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"marketing_scheduler_schedulers",domain:"marketing",operation:"read",description:"List schedulers",schema:dh.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/schedulers",d({createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"marketing_scheduler_scheduler_performance",domain:"marketing",operation:"read",description:"Get scheduler performance",schema:ch.shape,handler:async r=>{let e=r;try{let t=encodeURIComponent(e.id),s=await n.get(`/tenant/{tenant}/schedulers/${t}/performance`,{sessionCreatedOnOrAfter:e.sessionCreatedOnOrAfter,sessionCreatedBefore:e.sessionCreatedBefore});return i(s)}catch(t){return o(c(t))}}}),a.register({name:"marketing_scheduler_schedulersessions",domain:"marketing",operation:"read",description:"List scheduler sessions",schema:mh.shape,handler:async r=>{let e=r;try{let t=encodeURIComponent(e.id),s=await n.get(`/tenant/{tenant}/schedulers/${t}/sessions`,d({createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal}));return i(s)}catch(t){return o(c(t))}}})}import{z as ce}from"zod";var Nr=ce.object({id:ce.number().int().describe("Call ID")}),ph=ce.object({id:ce.number().int().describe("Call ID"),payload:ce.object({}).passthrough().describe("Call update payload")}),lh=p(u(ce.object({...S(),ids:ce.string().optional().describe("Comma-delimited call IDs"),createdAfter:ce.string().datetime().optional().describe("Created after UTC timestamp"),modifiedAfter:ce.string().datetime().optional().describe("Modified after UTC timestamp"),campaignId:ce.number().int().optional().describe("Campaign ID"),agentId:ce.number().int().optional().describe("Agent ID"),minDuration:ce.number().int().optional().describe("Minimum duration in seconds"),phoneNumberCalled:ce.string().optional().describe("Phone number called"),callerPhoneNumber:ce.string().optional().describe("Caller phone number"),agentName:ce.string().optional().describe("Agent name"),agentIsExternal:ce.boolean().optional().describe("Whether agent is external"),agentExternalId:ce.number().int().optional().describe("Agent external ID"),...f(["Id","CreatedOn","ModifiedOn"])}))),uh=p(ce.object({modifiedBefore:ce.string().datetime().optional().describe("Modified before UTC timestamp"),modifiedOnOrAfter:ce.string().datetime().optional().describe("Modified on or after UTC timestamp"),createdOnOrAfter:ce.string().datetime().optional().describe("Created on or after UTC timestamp"),modifiedAfter:ce.string().datetime().optional().describe("Modified after UTC timestamp"),minDuration:ce.number().int().optional().describe("Minimum duration in seconds"),phoneNumberCalled:ce.string().optional().describe("Phone number called"),campaignId:ce.number().int().optional().describe("Campaign ID"),agentId:ce.number().int().optional().describe("Agent ID"),agentName:ce.string().optional().describe("Agent name"),agentIsExternal:ce.boolean().optional().describe("Whether agent is external"),agentExternalId:ce.number().int().optional().describe("Agent external ID"),orderBy:ce.enum(["Id","CreatedOn","ModifiedOn","createdOn","modifiedOn"]).optional().describe("Field used for ordering"),orderByDirection:ce.enum(["asc","desc"]).optional().describe("Sort direction"),activeOnly:ce.boolean().optional().describe("Return only active calls"),createdAfter:ce.string().datetime().optional().describe("Created after UTC timestamp"),createdBefore:ce.string().datetime().optional().describe("Created before UTC timestamp"),ids:ce.array(ce.number().int()).optional().describe("Specific call IDs")}));function uc(n,a){a.register({name:"marketing_calls_v3_list",domain:"marketing",operation:"read",description:"List calls from v3 calls endpoint",schema:lh.shape,handler:async r=>{let e=r;try{let t=await n.get("/v3/tenant/{tenant}/calls",d({page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,ids:e.ids,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,active:e.active,createdAfter:e.createdAfter,modifiedAfter:e.modifiedAfter,campaignId:e.campaignId,agentId:e.agentId,minDuration:e.minDuration,phoneNumberCalled:e.phoneNumberCalled,callerPhoneNumber:e.callerPhoneNumber,agentName:e.agentName,agentIsExternal:e.agentIsExternal,agentExternalId:e.agentExternalId,sort:e.sort}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"marketing_calls_get",domain:"marketing",operation:"read",description:"Get call details by ID (v2)",schema:Nr.shape,handler:async r=>{let e=r;try{let t=await n.get(`/v2/tenant/{tenant}/calls/${e.id}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"marketing_calls_update",domain:"marketing",operation:"write",description:"Update a call (v2)",schema:ph.shape,handler:async r=>{let e=r;try{let t=await n.put(`/v2/tenant/{tenant}/calls/${e.id}`,e.payload);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"marketing_calls_recording_get",domain:"marketing",operation:"read",description:"Get call recording metadata or payload (v2)",schema:Nr.shape,handler:async r=>{let e=r;try{let t=await n.get(`/v2/tenant/{tenant}/calls/${e.id}/recording`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"marketing_calls_voice_mail_get",domain:"marketing",operation:"read",description:"Get call voicemail metadata or payload (v2)",schema:Nr.shape,handler:async r=>{let e=r;try{let t=await n.get(`/v2/tenant/{tenant}/calls/${e.id}/voicemail`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"marketing_calls_v2_list",domain:"marketing",operation:"read",description:"List calls from v2 calls endpoint",schema:uh.shape,handler:async r=>{let e=r;try{let t=await n.get("/v2/tenant/{tenant}/calls",d({modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,createdOnOrAfter:e.createdOnOrAfter,modifiedAfter:e.modifiedAfter,minDuration:e.minDuration,phoneNumberCalled:e.phoneNumberCalled,campaignId:e.campaignId,agentId:e.agentId,agentName:e.agentName,agentIsExternal:e.agentIsExternal,agentExternalId:e.agentExternalId,orderBy:e.orderBy,orderByDirection:e.orderByDirection,activeOnly:e.activeOnly,createdAfter:e.createdAfter,createdBefore:e.createdBefore,ids:e.ids,page:e.page,pageSize:e.pageSize}));return i(t)}catch(t){return o(c(t))}}})}import{z as Je}from"zod";var hc=Je.object({year:Je.number().int().optional().describe("Cost year"),month:Je.number().int().optional().describe("Cost month"),dailyCost:Je.number().optional().describe("Daily cost"),campaignId:Je.number().int().optional().describe("Campaign ID")}),bh=hc.extend({year:Je.number().int().describe("Cost year"),month:Je.number().int().describe("Cost month"),dailyCost:Je.number().describe("Daily cost"),campaignId:Je.number().int().describe("Campaign ID")}),bc=Je.object({id:Je.number().int().describe("Campaign cost ID")}),hh=Je.object({id:Je.number().int().describe("Campaign cost ID"),payload:hc.optional().describe("Campaign cost update payload")}),gh=p(Je.object({year:Je.number().int().optional().describe("Cost year"),month:Je.number().int().optional().describe("Cost month"),campaignId:Je.number().int().optional().describe("Campaign ID"),...f(["Id","Date"])}));function fh(n,a,r,e){a.register({name:r,domain:"marketing",operation:"read",description:e,schema:gh.shape,handler:async t=>{let s=t;try{let m=await n.get("/tenant/{tenant}/costs",d({page:s.page,pageSize:s.pageSize,includeTotal:s.includeTotal,year:s.year,month:s.month,campaignId:s.campaignId,sort:s.sort}));return i(m)}catch(m){return o(c(m))}}})}function gc(n,a){fh(n,a,"marketing_campaign_costs_list","List campaign costs"),a.register({name:"marketing_campaign_costs_create",domain:"marketing",operation:"write",description:"Create a campaign cost",schema:bh.shape,handler:async r=>{let e=r;try{let t=await n.post("/tenant/{tenant}/costs",e);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"marketing_campaign_costs_get",domain:"marketing",operation:"read",description:"Get a campaign cost by ID",schema:bc.shape,handler:async r=>{let e=r;try{let t=await n.get(`/tenant/{tenant}/costs/${e.id}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"marketing_campaign_costs_update",domain:"marketing",operation:"write",description:"Update a campaign cost",schema:hh.shape,handler:async r=>{let e=r;try{let t=await n.patch(`/tenant/{tenant}/costs/${e.id}`,e.payload);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"marketing_campaign_costs_delete",domain:"marketing",operation:"delete",description:"Delete a campaign cost",schema:bc.shape,handler:async r=>{let e=r;try{let t=await n.delete(`/tenant/{tenant}/costs/${e.id}`);return i(t)}catch(t){return o(c(t))}}})}import{z as je}from"zod";var fc=je.object({name:je.string().optional().describe("Campaign name"),active:je.boolean().optional().describe("Campaign active flag"),source:je.string().optional().describe("Campaign source"),otherSource:je.string().optional().describe("Other campaign source"),businessUnit:je.string().optional().describe("Business unit"),medium:je.string().optional().describe("Campaign medium"),otherMedium:je.string().optional().describe("Other campaign medium"),campaignPhoneNumbers:je.array(je.string()).optional().describe("Campaign phone numbers")}).passthrough(),yh=je.object({payload:fc.extend({name:je.string().describe("Campaign name")})}),vh=je.object({id:je.number().int().describe("Campaign ID")}),Ih=je.object({id:je.number().int().describe("Campaign ID"),payload:fc.describe("Campaign update payload")}),Th=p(u(je.object({...S(),ids:je.string().optional().describe("Comma-delimited campaign IDs"),name:je.string().optional().describe("Campaign name filter"),campaignPhoneNumber:je.string().optional().describe("Campaign phone number filter"),...f(["Id","Name","CreatedOn","ModifiedOn"])}))),Sh=p(je.object({id:je.number().int().describe("Campaign ID"),year:je.number().int().optional().describe("Cost year"),month:je.number().int().optional().describe("Cost month"),...f(["Id","Date"])}));function yc(n,a){a.register({name:"marketing_campaigns_create",domain:"marketing",operation:"write",description:"Create a campaign",schema:yh.shape,handler:async r=>{let e=r;try{let t=await n.post("/tenant/{tenant}/campaigns",e.payload);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"marketing_campaigns_get",domain:"marketing",operation:"read",description:"Get a campaign by ID",schema:vh.shape,handler:async r=>{let e=r;try{let t=await n.get(`/tenant/{tenant}/campaigns/${e.id}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"marketing_campaigns_list",domain:"marketing",operation:"read",description:"List campaigns",schema:Th.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/campaigns",d({page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,active:e.active,ids:e.ids,name:e.name,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,campaignPhoneNumber:e.campaignPhoneNumber,sort:e.sort}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"marketing_campaigns_update",domain:"marketing",operation:"write",description:"Update a campaign",schema:Ih.shape,handler:async r=>{let e=r;try{let t=await n.patch(`/tenant/{tenant}/campaigns/${e.id}`,e.payload);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"marketing_campaigns_costs_list",domain:"marketing",operation:"read",description:"List costs for a campaign",schema:Sh.shape,handler:async r=>{let e=r;try{let t=await n.get(`/tenant/{tenant}/campaigns/${e.id}/costs`,d({page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,year:e.year,month:e.month,sort:e.sort}));return i(t)}catch(t){return o(c(t))}}})}import{z as bt}from"zod";var vc=bt.object({contact_numbers:bt.array(bt.string()).optional().describe("Phone numbers to opt out (legacy naming)"),contactNumbers:bt.array(bt.string()).optional().describe("Phone numbers to opt out")}),XT=vc.refine(n=>!!(n.contact_numbers??n.contactNumbers),{message:"Provide contact_numbers or contactNumbers"}),Ic=bt.object({contact_numbers:bt.array(bt.string()).optional().describe("Phone numbers to lookup (legacy naming)"),contactNumbers:bt.array(bt.string()).optional().describe("Phone numbers to lookup")}),QT=Ic.refine(n=>!!(n.contact_numbers??n.contactNumbers),{message:"Provide contact_numbers or contactNumbers"});function wh(n){return n.contact_numbers??n.contactNumbers??[]}function _h(n,a,r,e){a.register({name:r,domain:"marketing",operation:"read",description:e,schema:{},handler:async()=>{try{let t=await n.get("/v3/tenant/{tenant}/optinouts/optouts");return i(t)}catch(t){return o(c(t))}}})}function Dh(n,a,r,e){a.register({name:r,domain:"marketing",operation:"write",description:e,schema:vc.shape,handler:async t=>{let s=t;try{let m=await n.post("/v3/tenant/{tenant}/optinouts/optouts",{contactNumbers:wh(s)});return i(m)}catch(m){return o(c(m))}}})}function Ch(n,a,r,e){a.register({name:r,domain:"marketing",operation:"write",description:e,schema:Ic.shape,handler:async t=>{let s=t;try{let m=await n.post("/v3/tenant/{tenant}/optinouts/optouts/getlist",s.contact_numbers??s.contactNumbers);return i(m)}catch(m){return o(c(m))}}})}function Tc(n,a){_h(n,a,"marketing_opt_in_outs_list","List all opt-out records"),Dh(n,a,"marketing_opt_in_outs_create","Create opt-out records for phone numbers"),Ch(n,a,"marketing_opt_in_outs_lookup_create","Lookup opt-out records for phone numbers")}import{z as it}from"zod";var kh=it.object({email:it.string().email().describe("Suppression email address")}),Oh=it.object({email:it.string().email().describe("Email address to suppress"),group_id:it.number().int().optional().describe("Suppression group ID"),reason:it.string().optional().describe("Suppression reason")}),Rh=it.object({email:it.string().email().optional().describe("Email address to unsuppress"),group_id:it.number().int().optional().describe("Suppression group ID"),reason:it.string().optional().describe("Unsuppression reason")}),jh=p(it.object({}));function xh(n,a,r,e){a.register({name:r,domain:"marketing",operation:"read",description:e,schema:jh.shape,handler:async t=>{let s=t;try{let m=await n.get("/tenant/{tenant}/suppressions",d({page:s.page,pageSize:s.pageSize,includeTotal:s.includeTotal}));return i(m)}catch(m){return o(c(m))}}})}function Sc(n,a){xh(n,a,"marketing_suppressions_list","List suppressions"),a.register({name:"marketing_suppressions_get",domain:"marketing",operation:"read",description:"Get a suppression by email",schema:kh.shape,handler:async r=>{let e=r;try{let t=encodeURIComponent(e.email),s=await n.get(`/tenant/{tenant}/suppressions/${t}`);return i(s)}catch(t){return o(c(t))}}}),a.register({name:"marketing_suppressions_remove",domain:"marketing",operation:"write",description:"Remove suppression records",schema:Rh.shape,handler:async r=>{let e=r;try{let t=e.email!==void 0||e.group_id!==void 0||e.reason!==void 0,s=await n.post("/tenant/{tenant}/suppressions/unsuppress",t?e:void 0);return i(s)}catch(t){return o(c(t))}}}),a.register({name:"marketing_suppressions_add",domain:"marketing",operation:"write",description:"Add a suppression",schema:Oh.shape,handler:async r=>{let e=r;try{let t=await n.post("/tenant/{tenant}/suppressions/suppress",e);return i(t)}catch(t){return o(c(t))}}})}var Ah=(n,a)=>{lc(n,a),gc(n,a),yc(n,a),uc(n,a),Tc(n,a),Sc(n,a)},wc=Ah;import{z as ke}from"zod";var kc=ke.enum(["Active","Suspended","Expired","Canceled","Deleted"]),Oc=ke.enum(["OneTime","Monthly","EveryOtherMonth","Quarterly","BiAnnual","Annual"]),Ph=ke.object({typeId:ke.number().int().optional().describe("Custom field type ID"),value:ke.string().optional().describe("Custom field value")}),zr=ke.object({customerId:ke.number().int().optional().describe("Customer ID for membership sale"),locationId:ke.number().int().optional().describe("Location ID for membership sale"),membershipTypeId:ke.number().int().optional().describe("Membership type ID to sell"),soldOn:ke.string().optional().describe("Date/time when the membership was sold"),soldById:ke.number().int().optional().describe("User ID who sold the membership"),campaignId:ke.number().int().optional().describe("Campaign ID attributed to the sale"),businessUnitId:ke.number().int().optional().describe("Business unit ID associated with the membership"),duration:ke.number().int().optional().describe("Membership duration in months for fixed-term memberships"),billingFrequency:Oc.optional().describe("Billing frequency for recurring membership billing"),active:ke.boolean().optional().describe("Whether the membership is active"),autoRenew:ke.boolean().optional().describe("Whether the membership auto-renews"),memo:ke.string().optional().describe("Internal memo for the membership"),customFields:ke.array(Ph).optional().describe("Custom field values for the membership")}),_c=u(p(ke.object({ids:ke.string().optional().describe("Comma-separated membership IDs (maximum 50)"),customerIds:ke.string().optional().describe("Comma-separated customer IDs"),status:kc.optional().describe("Filter by membership status"),duration:ke.number().int().optional().describe("Filter by membership duration in months"),billingFrequency:Oc.optional().describe("Filter by membership billing frequency")}).extend(S()))),Jn=ke.object({id:ke.number().int().describe("Customer membership ID")}),Dc=zr.extend({id:ke.number().int().describe("Customer membership ID"),status:kc.optional().describe("Updated membership status value")}),Cc=u(p(ke.object({}).extend(f(["Id","Name","CreatedOn","ModifiedOn"]))));function Rc(n,a){a.register({name:"memberships_list",domain:"memberships",operation:"read",description:"List customer memberships",schema:_c.shape,handler:async r=>{let e=_c.parse(r);try{let t=await n.get("/tenant/{tenant}/memberships",d({ids:e.ids,customerIds:e.customerIds,status:e.status,duration:e.duration,billingFrequency:e.billingFrequency,active:e.active,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"memberships_custom_fields_list",domain:"memberships",operation:"read",description:"List membership custom field definitions",schema:Cc.shape,handler:async r=>{let e=Cc.parse(r);try{let t=await n.get("/tenant/{tenant}/memberships/custom-fields",d({page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,sort:e.sort}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"memberships_get",domain:"memberships",operation:"read",description:"Get a single customer membership by ID",schema:Jn.shape,handler:async r=>{let{id:e}=Jn.parse(r);try{let t=await n.get(`/tenant/{tenant}/memberships/${e}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"memberships_create",domain:"memberships",operation:"write",description:"Create a customer membership sale",schema:zr.shape,handler:async r=>{let e=zr.parse(r);try{let t=await n.post("/tenant/{tenant}/memberships/sale",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"memberships_update",domain:"memberships",operation:"write",description:"Update a customer membership",schema:Dc.shape,handler:async r=>{let e=Dc.parse(r),{id:t,...s}=e;try{let m=await n.patch(`/tenant/{tenant}/memberships/${t}`,d(s));return i(m)}catch(m){return o(c(m))}}}),a.register({name:"memberships_status_changes_list",domain:"memberships",operation:"read",description:"List status changes for a customer membership",schema:Jn.shape,handler:async r=>{let{id:e}=Jn.parse(r);try{let t=await n.get(`/tenant/{tenant}/memberships/${e}/status-changes`);return i(t)}catch(t){return o(c(t))}}})}import{z as ge}from"zod";var Eh=ge.enum(["NotAttempted","Unreachable","Contacted","Won","Dismissed"]),Bh=ge.enum(["Weekly","Monthly","Seasonal","Daily","NthWeekdayOfMonth"]),Lh=ge.enum(["Continuous","NumberOfVisits"]),Mh=ge.object({membershipId:ge.number().int().optional().describe("Customer membership ID associated with this recurring service"),locationId:ge.number().int().optional().describe("Location ID for this recurring service"),recurringServiceTypeId:ge.number().int().optional().describe("Recurring service type ID"),summary:ge.string().optional().describe("Short summary for the recurring service"),startDate:ge.string().optional().describe("Recurring service start date"),endDate:ge.string().optional().describe("Recurring service end date"),nextServiceDate:ge.string().optional().describe("Next scheduled service date for this recurring service"),active:ge.boolean().optional().describe("Whether the recurring service is active"),autoRenew:ge.boolean().optional().describe("Whether the recurring service auto-renews")}),jc=ge.object({id:ge.number().int().describe("Recurring service ID")}),xc=Mh.extend({id:ge.number().int().describe("Recurring service ID")}),Ac=u(p(ge.object({ids:ge.string().optional().describe("Comma-separated recurring service IDs (maximum 50)"),membershipIds:ge.string().optional().describe("Comma-separated customer membership IDs"),locationIds:ge.string().optional().describe("Comma-separated location IDs")}).extend(S()))),Wn=ge.object({id:ge.number().int().describe("Recurring service event ID")}),Pc=u(p(ge.object({ids:ge.string().optional().describe("Comma-separated recurring service event IDs (maximum 50)"),locationId:ge.number().int().optional().describe("Filter by location ID"),jobId:ge.number().int().optional().describe("Filter by job ID"),status:Eh.optional().describe("Filter by recurring service event follow-up status")}))),Ec=ge.object({id:ge.number().int().describe("Recurring service type ID")}),Bc=u(p(ge.object({ids:ge.string().optional().describe("Comma-separated recurring service type IDs (maximum 50)"),membershipTypeId:ge.number().int().optional().describe("Filter by membership type ID"),recurrenceType:Bh.optional().describe("Filter by recurrence type"),durationType:Lh.optional().describe("Filter by duration type")}).extend(S()).extend(f(["Id","Name","CreatedOn","ModifiedOn"]))));function Lc(n,a){a.register({name:"memberships_recurring_services_get",domain:"memberships",operation:"read",description:"Get a recurring service by ID",schema:jc.shape,handler:async r=>{let{id:e}=jc.parse(r);try{let t=await n.get(`/tenant/{tenant}/recurring-services/${e}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"memberships_recurring_services_list",domain:"memberships",operation:"read",description:"List recurring services",schema:Ac.shape,handler:async r=>{let e=Ac.parse(r);try{let t=await n.get("/tenant/{tenant}/recurring-services",d({ids:e.ids,membershipIds:e.membershipIds,locationIds:e.locationIds,active:e.active,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"memberships_recurring_services_update",domain:"memberships",operation:"write",description:"Update a recurring service",schema:xc.shape,handler:async r=>{let e=xc.parse(r),{id:t,...s}=e;try{let m=await n.patch(`/tenant/{tenant}/recurring-services/${t}`,d(s));return i(m)}catch(m){return o(c(m))}}}),a.register({name:"memberships_recurring_service_events_list",domain:"memberships",operation:"read",description:"List recurring service events",schema:Pc.shape,handler:async r=>{let e=Pc.parse(r);try{let t=await n.get("/tenant/{tenant}/recurring-service-events",d({ids:e.ids,locationId:e.locationId,jobId:e.jobId,status:e.status,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"memberships_recurring_service_events_mark_complete",domain:"memberships",operation:"write",description:"Mark a recurring service event as complete",schema:Wn.shape,handler:async r=>{let{id:e}=Wn.parse(r);try{let t=await n.post(`/tenant/{tenant}/recurring-service-events/${e}/mark-complete`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"memberships_recurring_service_events_mark_incomplete",domain:"memberships",operation:"write",description:"Mark a recurring service event as incomplete",schema:Wn.shape,handler:async r=>{let{id:e}=Wn.parse(r);try{let t=await n.post(`/tenant/{tenant}/recurring-service-events/${e}/mark-incomplete`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"memberships_recurring_service_types_get",domain:"memberships",operation:"read",description:"Get a recurring service type by ID",schema:Ec.shape,handler:async r=>{let{id:e}=Ec.parse(r);try{let t=await n.get(`/tenant/{tenant}/recurring-service-types/${e}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"memberships_recurring_service_types_list",domain:"memberships",operation:"read",description:"List recurring service types",schema:Bc.shape,handler:async r=>{let e=Bc.parse(r);try{let t=await n.get("/tenant/{tenant}/recurring-service-types",d({ids:e.ids,membershipTypeId:e.membershipTypeId,recurrenceType:e.recurrenceType,durationType:e.durationType,active:e.active,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,sort:e.sort}));return i(t)}catch(t){return o(c(t))}}})}import{z as Mt}from"zod";var Uh=Mt.enum(["Draft","Sent","Rejected","Accepted","Activated","Canceled","Expired","AutoRenew"]),Mc=Mt.object({id:Mt.number().int().describe("Service agreement ID")}),Uc=u(p(Mt.object({ids:Mt.string().optional().describe("Comma-separated service agreement IDs (maximum 50)"),customerIds:Mt.string().optional().describe("Comma-separated customer IDs"),businessUnitIds:Mt.string().optional().describe("Comma-separated business unit IDs"),status:Uh.optional().describe("Filter by service agreement status")}).extend(f(["Id","Name","CreatedOn","ModifiedOn","StartDate","EndDate"]))));function Fc(n,a){a.register({name:"memberships_service_agreements_list",domain:"memberships",operation:"read",description:"List service agreements",schema:Uc.shape,handler:async r=>{let e=Uc.parse(r);try{let t=await n.get("/tenant/{tenant}/service-agreements",d({ids:e.ids,customerIds:e.customerIds,businessUnitIds:e.businessUnitIds,status:e.status,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,sort:e.sort}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"memberships_service_agreements_get",domain:"memberships",operation:"read",description:"Get a service agreement by ID",schema:Mc.shape,handler:async r=>{let{id:e}=Mc.parse(r);try{let t=await n.get(`/tenant/{tenant}/service-agreements/${e}`);return i(t)}catch(t){return o(c(t))}}})}import{z as Ft}from"zod";var Fh=Ft.enum(["OneTime","Monthly","EveryOtherMonth","Quarterly","BiAnnual","Annual"]),Ut=Ft.object({id:Ft.number().int().describe("Membership type ID")}),Nc=u(p(Ft.object({ids:Ft.string().optional().describe("Comma-separated membership type IDs (maximum 50)"),duration:Ft.number().int().optional().describe("Filter by membership duration in months"),billingFrequency:Fh.optional().describe("Filter by billing frequency"),includeDurationBilling:Ft.boolean().optional().describe("Include duration billing items in each result")}).extend(S()))),zc=Ut.extend(S());function $c(n,a){a.register({name:"memberships_types_get",domain:"memberships",operation:"read",description:"Get a membership type by ID",schema:Ut.shape,handler:async r=>{let{id:e}=Ut.parse(r);try{let t=await n.get(`/tenant/{tenant}/membership-types/${e}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"memberships_types_list",domain:"memberships",operation:"read",description:"List membership types",schema:Nc.shape,handler:async r=>{let e=Nc.parse(r);try{let t=await n.get("/tenant/{tenant}/membership-types",d({ids:e.ids,active:e.active,duration:e.duration,billingFrequency:e.billingFrequency,includeDurationBilling:e.includeDurationBilling,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"memberships_types_recurring_service_items_list",domain:"memberships",operation:"read",description:"List recurring service items for a membership type",schema:Ut.shape,handler:async r=>{let{id:e}=Ut.parse(r);try{let t=await n.get(`/tenant/{tenant}/membership-types/${e}/recurring-service-items`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"memberships_types_discounts_list",domain:"memberships",operation:"read",description:"List discounts for a membership type",schema:Ut.shape,handler:async r=>{let{id:e}=Ut.parse(r);try{let t=await n.get(`/tenant/{tenant}/membership-types/${e}/discounts`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"memberships_types_duration_billing_list",domain:"memberships",operation:"read",description:"List duration billing items for a membership type",schema:zc.shape,handler:async r=>{let e=zc.parse(r);try{let t=await n.get(`/tenant/{tenant}/membership-types/${e.id}/duration-billing-items`,d({active:e.active}));return i(t)}catch(t){return o(c(t))}}})}var Nh=(n,a)=>{Rc(n,a),$c(n,a),Lc(n,a),Fc(n,a)},Gc=Nh;import{z as Tt}from"zod";var zh=Tt.object({}).passthrough(),$h=Tt.object({payload:zh.describe("Payroll adjustment create payload")}),Gh=Tt.object({id:Tt.number().int().describe("Payroll adjustment ID"),employeeType:Tt.enum(["Technician","Employee"]).optional().describe("Employee type")}),qh=p(Tt.object({employeeIds:Tt.string().optional().describe("Comma-delimited employee IDs"),postedOnOrAfter:Tt.string().datetime().optional().describe("Filter adjustments posted on or after this UTC timestamp"),postedOnOrBefore:Tt.string().datetime().optional().describe("Filter adjustments posted on or before this UTC timestamp")}));function qc(n,a){a.register({name:"payroll_payroll_adjustments_create",domain:"payroll",operation:"write",description:"Create a payroll adjustment",schema:$h.shape,handler:async r=>{let e=r;try{let t=await n.post("/tenant/{tenant}/payroll-adjustments",e.payload);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"payroll_payroll_adjustments_get",domain:"payroll",operation:"read",description:"Get a payroll adjustment by ID",schema:Gh.shape,handler:async r=>{let e=r;try{let t=await n.get(`/tenant/{tenant}/payroll-adjustments/${e.id}`,{employeeType:e.employeeType});return i(t)}catch(t){return o(c(t))}}}),a.register({name:"payroll_payroll_adjustments_list",domain:"payroll",operation:"read",description:"List payroll adjustments",schema:qh.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/payroll-adjustments",d({page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,employeeIds:e.employeeIds,postedOnOrAfter:e.postedOnOrAfter,postedOnOrBefore:e.postedOnOrBefore}));return i(t)}catch(t){return o(c(t))}}})}import{z as Ue}from"zod";var Jh=Ue.object({name:Ue.string().describe("Gross pay item name"),description:Ue.string().optional().describe("Gross pay item description"),amount:Ue.number().describe("Gross pay amount"),is_active:Ue.boolean().optional().describe("Whether the gross pay item is active")}),Wh=Ue.object({name:Ue.string().optional().describe("Gross pay item name"),description:Ue.string().optional().describe("Gross pay item description"),amount:Ue.number().optional().describe("Gross pay amount"),is_active:Ue.boolean().optional().describe("Whether the gross pay item is active")}).passthrough(),Hh=Ue.object({id:Ue.number().int().describe("Gross pay item ID"),payload:Wh.describe("Gross pay item update payload")}),Vh=Ue.object({id:Ue.number().int().describe("Gross pay item ID")}),Kh=p(Ue.object({employeeType:Ue.enum(["Technician","Employee"]).optional().describe("Employee type"),employeeId:Ue.number().int().optional().describe("Employee ID"),payrollIds:Ue.string().optional().describe("Comma-delimited payroll IDs"),dateOnOrAfter:Ue.string().datetime().optional().describe("Filter items on or after this UTC timestamp"),dateOnOrBefore:Ue.string().datetime().optional().describe("Filter items on or before this UTC timestamp")}));function Jc(n,a){a.register({name:"payroll_gross_pay_items_create",domain:"payroll",operation:"write",description:"Create a gross pay item",schema:Jh.shape,handler:async r=>{let e=r;try{let t=await n.post("/tenant/{tenant}/gross-pay-items",e);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"payroll_gross_pay_items_update",domain:"payroll",operation:"write",description:"Update a gross pay item",schema:Hh.shape,handler:async r=>{let e=r;try{let t=await n.put(`/tenant/{tenant}/gross-pay-items/${e.id}`,e.payload);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"payroll_gross_pay_items_delete",domain:"payroll",operation:"delete",description:"Delete a gross pay item",schema:Vh.shape,handler:async r=>{let e=r;try{return await n.delete(`/tenant/{tenant}/gross-pay-items/${e.id}`),i({success:!0,message:"Gross pay item deleted successfully."})}catch(t){return o(c(t))}}}),a.register({name:"payroll_gross_pay_items_list",domain:"payroll",operation:"read",description:"List gross pay items",schema:Kh.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/gross-pay-items",d({page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,employeeType:e.employeeType,employeeId:e.employeeId,payrollIds:e.payrollIds,dateOnOrAfter:e.dateOnOrAfter,dateOnOrBefore:e.dateOnOrBefore}));return i(t)}catch(t){return o(c(t))}}})}import{z as Qe}from"zod";var Zh=Qe.enum(["Pending","Expired","Approved","Paid","Locked"]),Wc=Qe.enum(["Technician","Employee"]),Yh=Qe.enum(["True","Any","False"]),$r=Qe.object({startedOnOrAfter:Qe.string().datetime().optional().describe("Filter payrolls started on or after this UTC timestamp"),endedOnOrBefore:Qe.string().datetime().optional().describe("Filter payrolls ended on or before this UTC timestamp"),modifiedBefore:Qe.string().datetime().optional().describe("Filter payrolls modified before this UTC timestamp"),modifiedOnOrAfter:Qe.string().datetime().optional().describe("Filter payrolls modified on or after this UTC timestamp"),approvedOnOrAfter:Qe.string().datetime().optional().describe("Filter payrolls approved on or after this UTC timestamp"),status:Zh.optional().describe("Payroll status"),active:Yh.optional().describe("Active filter")}),Xh=p($r.extend({employeeType:Wc.optional().describe("Employee type")})),Qh=Qe.object({id:Qe.number().int().describe("Payroll ID"),employeeType:Wc.optional().describe("Optional employee type filter")}),eg=p($r.extend({technicianId:Qe.number().int().describe("Technician ID")})),tg=p($r.extend({employeeId:Qe.number().int().describe("Employee ID")}));function Hc(n,a){a.register({name:"payroll_payrolls_list",domain:"payroll",operation:"read",description:"List payroll periods",schema:Xh.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/payrolls",d({employeeType:e.employeeType,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,startedOnOrAfter:e.startedOnOrAfter,endedOnOrBefore:e.endedOnOrBefore,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,approvedOnOrAfter:e.approvedOnOrAfter,status:e.status,active:e.active}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"payroll_payrolls_get",domain:"payroll",operation:"read",description:"Get a payroll period by ID",schema:Qh.shape,handler:async r=>{let e=r;try{let t=await n.get(`/tenant/{tenant}/payrolls/${e.id}`,{employeeType:e.employeeType});return i(t)}catch(t){return o(c(t))}}}),a.register({name:"payroll_technicians_payrolls_list",domain:"payroll",operation:"read",description:"List payroll periods for a technician",schema:eg.shape,handler:async r=>{let e=r;try{let t=await n.get(`/tenant/{tenant}/technicians/${e.technicianId}/payrolls`,d({page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,startedOnOrAfter:e.startedOnOrAfter,endedOnOrBefore:e.endedOnOrBefore,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,approvedOnOrAfter:e.approvedOnOrAfter,status:e.status,active:e.active}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"payroll_employees_payrolls_list",domain:"payroll",operation:"read",description:"List payroll periods for an employee",schema:tg.shape,handler:async r=>{let e=r;try{let t=await n.get(`/tenant/{tenant}/employees/${e.employeeId}/payrolls`,d({page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,startedOnOrAfter:e.startedOnOrAfter,endedOnOrBefore:e.endedOnOrBefore,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,approvedOnOrAfter:e.approvedOnOrAfter,status:e.status,active:e.active}));return i(t)}catch(t){return o(c(t))}}})}import{z as Pe}from"zod";var ng=Pe.enum(["Technician","Employee"]),Yc=Pe.object({employeeId:Pe.number().int().optional().describe("Linked employee ID"),active:Pe.boolean().optional().describe("Whether payroll settings are active"),payType:Pe.string().optional().describe("Pay type value"),payRate:Pe.number().optional().describe("Primary pay rate"),hourlyRate:Pe.number().optional().describe("Hourly pay rate"),overtimeRate:Pe.number().optional().describe("Overtime rate"),overtimeMultiplier:Pe.number().optional().describe("Overtime multiplier"),doubleTimeMultiplier:Pe.number().optional().describe("Double-time multiplier"),regularHoursPerWeek:Pe.number().optional().describe("Regular hours per week"),dailyOvertimeThresholdMinutes:Pe.number().int().optional().describe("Daily overtime threshold in minutes"),weeklyOvertimeThresholdMinutes:Pe.number().int().optional().describe("Weekly overtime threshold in minutes"),timesheetCodeId:Pe.number().int().optional().describe("Timesheet code ID"),laborWageTypeId:Pe.number().int().optional().describe("Labor wage type ID"),externalPayrollId:Pe.string().optional().describe("External payroll identifier"),startDate:Pe.string().optional().describe("Payroll setting start date/time"),endDate:Pe.string().optional().describe("Payroll setting end date/time")}).passthrough(),Gr=Pe.object({employeeId:Pe.number().int().describe("Employee ID")}),qr=Pe.object({technicianId:Pe.number().int().describe("Technician ID")}),Vc=Gr.extend({payload:Yc.optional().describe("Employee payroll settings payload")}),Kc=qr.extend({payload:Yc.optional().describe("Technician payroll settings payload")}),Zc=u(p(Pe.object({employeeType:ng.optional().describe("Employee type"),...S()})));function Xc(n,a){a.register({name:"payroll_payroll_settings_employee_get",domain:"payroll",operation:"read",description:"Get payroll settings for an employee",schema:Gr.shape,handler:async r=>{let e=Gr.parse(r);try{let t=await n.get(`/tenant/{tenant}/employees/${e.employeeId}/payroll-settings`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"payroll_payroll_settings_employee_update",domain:"payroll",operation:"write",description:"Update payroll settings for an employee",schema:Vc.shape,handler:async r=>{let e=Vc.parse(r);try{let t=await n.put(`/tenant/{tenant}/employees/${e.employeeId}/payroll-settings`,e.payload);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"payroll_payroll_settings_list",domain:"payroll",operation:"read",description:"List payroll settings",schema:Zc.shape,handler:async r=>{let e=Zc.parse(r);try{let t=await n.get("/tenant/{tenant}/payroll-settings",d({employeeType:e.employeeType,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,active:e.active}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"payroll_payroll_settings_technician_get",domain:"payroll",operation:"read",description:"Get payroll settings for a technician",schema:qr.shape,handler:async r=>{let e=qr.parse(r);try{let t=await n.get(`/tenant/{tenant}/technicians/${e.technicianId}/payroll-settings`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"payroll_payroll_settings_technician_update",domain:"payroll",operation:"write",description:"Update payroll settings for a technician",schema:Kc.shape,handler:async r=>{let e=Kc.parse(r);try{let t=await n.put(`/tenant/{tenant}/technicians/${e.technicianId}/payroll-settings`,e.payload);return i(t)}catch(t){return o(c(t))}}})}import{z as W}from"zod";var rg=p(u(W.object({...S(),...f(["Id","ModifiedOn","CreatedOn"])}))),ag=W.object({id:W.number().int().describe("Timesheet code ID")}),td=W.object({technicianId:W.number().int().optional().describe("Technician ID"),employeeId:W.number().int().optional().describe("Employee ID"),employeeType:W.enum(["Technician","Employee"]).optional().describe("Employee type"),startedOn:W.string().datetime().optional().describe("Start timestamp"),endedOn:W.string().datetime().optional().describe("End timestamp"),durationMinutes:W.number().int().optional().describe("Duration in minutes"),timesheetCodeId:W.number().int().optional().describe("Timesheet code ID"),payrollId:W.number().int().optional().describe("Payroll ID"),note:W.string().optional().describe("Timesheet note"),memo:W.string().optional().describe("Timesheet memo"),active:W.boolean().optional().describe("Whether timesheet is active")}).passthrough(),og=W.object({jobId:W.number().int().describe("Job ID"),payload:td.optional().describe("Optional payload for job timesheet creation")}),ig=p(u(W.object({jobId:W.number().int().describe("Job ID"),technicianId:W.number().int().optional().describe("Technician ID"),startedOn:W.string().datetime().optional().describe("Filter by started-on date/time"),endedOn:W.string().datetime().optional().describe("Filter by ended-on date/time"),...f(["Id","ModifiedOn","CreatedOn"])}))),sg=p(u(W.object({jobIds:W.string().optional().describe("Comma-delimited job IDs"),technicianId:W.number().int().optional().describe("Technician ID"),startedOn:W.string().datetime().optional().describe("Filter by started-on date/time"),endedOn:W.string().datetime().optional().describe("Filter by ended-on date/time"),...f(["Id","ModifiedOn","CreatedOn"])}))),cg=W.object({jobId:W.number().int().describe("Job ID"),id:W.number().int().describe("Job timesheet ID"),payload:td.optional().describe("Payload for updating a job timesheet")}),dg=p(u(W.object({employeeId:W.number().int().optional().describe("Employee ID"),employeeType:W.enum(["Technician","Employee"]).optional().describe("Employee type"),...S(),...f(["Id","ModifiedOn","CreatedOn"])}))),Hn=W.object({id:W.number().int().describe("Non-job timesheet ID")}),nd=W.object({employeeId:W.number().int().optional().describe("Employee ID"),employeeType:W.enum(["Technician","Employee"]).optional().describe("Employee type"),startedOn:W.string().datetime().optional().describe("Start timestamp"),endedOn:W.string().datetime().optional().describe("End timestamp"),durationMinutes:W.number().int().optional().describe("Duration in minutes"),timesheetCodeId:W.number().int().optional().describe("Timesheet code ID"),payrollId:W.number().int().optional().describe("Payroll ID"),note:W.string().optional().describe("Timesheet note"),memo:W.string().optional().describe("Timesheet memo"),active:W.boolean().optional().describe("Whether timesheet is active")}).passthrough(),Qc=nd,ed=nd.extend({id:W.number().int().describe("Non-job timesheet ID")});function rd(n,a){a.register({name:"payroll_timesheet_codes_get",domain:"payroll",operation:"read",description:"Get a timesheet code by ID",schema:ag.shape,handler:async r=>{let e=r;try{let t=await n.get(`/tenant/{tenant}/timesheet-codes/${e.id}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"payroll_timesheet_codes_list",domain:"payroll",operation:"read",description:"List timesheet codes",schema:rg.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/timesheet-codes",d({createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,active:e.active,sort:e.sort}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"payroll_timesheets_non_job_create",domain:"payroll",operation:"write",description:"Create a non-job timesheet",schema:Qc.shape,handler:async r=>{let e=Qc.parse(r);try{let t=await n.post("/tenant/{tenant}/non-job-timesheets",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"payroll_timesheets_non_job_get",domain:"payroll",operation:"read",description:"Get a non-job timesheet by ID",schema:Hn.shape,handler:async r=>{let e=Hn.parse(r);try{let t=await n.get(`/tenant/{tenant}/non-job-timesheets/${e.id}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"payroll_timesheets_create_job",domain:"payroll",operation:"write",description:"Create a job timesheet",schema:og.shape,handler:async r=>{let e=r;try{let t=await n.post(`/tenant/{tenant}/jobs/${e.jobId}/timesheets`,e.payload);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"payroll_timesheets_job_list",domain:"payroll",operation:"read",description:"List job timesheets for a job",schema:ig.shape,handler:async r=>{let e=r;try{let t=await n.get(`/tenant/{tenant}/jobs/${e.jobId}/timesheets`,d({page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,technicianId:e.technicianId,startedOn:e.startedOn,endedOn:e.endedOn,sort:e.sort}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"payroll_timesheets_jobs_list",domain:"payroll",operation:"read",description:"List job timesheets across multiple jobs",schema:sg.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/jobs/timesheets",d({jobIds:e.jobIds,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,technicianId:e.technicianId,startedOn:e.startedOn,endedOn:e.endedOn,sort:e.sort}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"payroll_timesheets_job_update",domain:"payroll",operation:"write",description:"Update a job timesheet",schema:cg.shape,handler:async r=>{let e=r;try{let t=await n.put(`/tenant/{tenant}/jobs/${e.jobId}/timesheets/${e.id}`,e.payload);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"payroll_timesheets_non_job_list",domain:"payroll",operation:"read",description:"List non-job timesheets",schema:dg.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/non-job-timesheets",d({page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,employeeId:e.employeeId,employeeType:e.employeeType,active:e.active,sort:e.sort}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"payroll_timesheets_non_job_update",domain:"payroll",operation:"write",description:"Update a non-job timesheet",schema:ed.shape,handler:async r=>{let e=ed.parse(r),{id:t,...s}=e;try{let m=await n.put(`/tenant/{tenant}/non-job-timesheets/${t}`,d(s));return i(m)}catch(m){return o(c(m))}}}),a.register({name:"payroll_timesheets_non_job_delete",domain:"payroll",operation:"delete",description:"Delete a non-job timesheet",schema:Hn.shape,handler:async r=>{let e=Hn.parse(r);try{return await n.delete(`/tenant/{tenant}/non-job-timesheets/${e.id}`),i({success:!0,message:"Non-job timesheet deleted"})}catch(t){return o(c(t))}}})}var mg=(n,a)=>{Hc(n,a),Xc(n,a),rd(n,a),Jc(n,a),qc(n,a)},ad=mg;import{z as ee}from"zod";var pg=ee.object({key:ee.string().describe("External data key"),value:ee.string().describe("External data value")}).describe("External data entry"),lg=ee.object({street:ee.string().optional().describe("Street address"),unit:ee.string().optional().describe("Address unit/suite"),city:ee.string().optional().describe("City"),state:ee.string().optional().describe("State/province"),zip:ee.string().optional().describe("Postal code"),country:ee.string().optional().describe("Country")}).describe("Employee address"),ug=ee.object({name:ee.string().optional().describe("Emergency contact name"),relationship:ee.string().optional().describe("Emergency contact relationship"),phoneNumber:ee.string().optional().describe("Emergency contact phone number")}).describe("Emergency contact details"),dd=ee.object({firstName:ee.string().optional().describe("Employee first name"),middleName:ee.string().optional().describe("Employee middle name"),lastName:ee.string().optional().describe("Employee last name"),nickname:ee.string().optional().describe("Employee nickname"),employeeNumber:ee.string().optional().describe("Employee number/code"),email:ee.string().optional().describe("Primary email address"),phoneNumber:ee.string().optional().describe("Primary phone number"),mobilePhoneNumber:ee.string().optional().describe("Mobile phone number"),active:ee.boolean().optional().describe("Whether the employee is active"),userId:ee.number().int().optional().describe("Associated user ID"),userRoleId:ee.number().int().optional().describe("Associated user role ID"),businessUnitId:ee.number().int().optional().describe("Default business unit ID"),technicianId:ee.number().int().optional().describe("Associated technician ID"),hireDate:ee.string().optional().describe("Hire date/time in RFC3339 format"),terminationDate:ee.string().optional().describe("Termination date/time in RFC3339 format"),address:lg.optional().describe("Employee mailing address"),emergencyContact:ug.optional().describe("Emergency contact"),externalData:ee.array(pg).optional().describe("External data entries")}).passthrough(),vn=ee.object({id:ee.number().int().describe("Employee ID")}),od=ee.object({body:dd.optional().describe("Employee create payload")}),id=vn.extend({body:dd.optional().describe("Employee update payload")}),sd=u(p(ee.object({...S(),ids:ee.string().optional().describe("Comma-separated employee IDs (max 50)"),userIds:ee.string().optional().describe("Comma-separated user IDs (max 50)"),name:ee.string().optional().describe("Filter employees by name (case-insensitive contains)")}))),cd=ee.object({from:ee.string().optional().describe("Continuation token from previous response or custom start date"),includeRecentChanges:ee.boolean().optional().describe("Prioritize recent changes in the export stream")});function md(n,a){a.register({name:"people_employees_create",domain:"people",operation:"write",description:"Create an employee",schema:od.shape,handler:async r=>{let e=od.parse(r);try{let t=await n.post("/tenant/{tenant}/employees",e.body);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"people_employees_get",domain:"people",operation:"read",description:"Get an employee by ID",schema:vn.shape,handler:async r=>{let{id:e}=vn.parse(r);try{let t=await n.get(`/tenant/{tenant}/employees/${e}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"people_employees_list",domain:"people",operation:"read",description:"List employees",schema:sd.shape,handler:async r=>{let e=sd.parse(r);try{let t=await n.get("/tenant/{tenant}/employees",d({ids:e.ids,userIds:e.userIds,name:e.name,active:e.active,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"people_employees_update",domain:"people",operation:"write",description:"Update an employee",schema:id.shape,handler:async r=>{let{id:e,body:t}=id.parse(r);try{let s=await n.patch(`/tenant/{tenant}/employees/${e}`,t);return i(s)}catch(s){return o(c(s))}}}),a.register({name:"people_employees_accountactions",domain:"people",operation:"write",description:"Run account actions for an employee",schema:vn.shape,handler:async r=>{let{id:e}=vn.parse(r);try{let t=await n.post(`/tenant/{tenant}/employees/${e}/account-actions`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"people_employees_export",domain:"people",operation:"read",description:"Export employees",schema:cd.shape,handler:async r=>{let e=cd.parse(r);try{let t=await n.get("/tenant/{tenant}/export/employees",d({from:e.from,includeRecentChanges:e.includeRecentChanges}));return i(t)}catch(t){return o(c(t))}}})}import{z as rt}from"zod";var bg=rt.object({recordedOn:rt.string().datetime().describe("UTC timestamp when the GPS ping was recorded"),latitude:rt.number().describe("Latitude in decimal degrees"),longitude:rt.number().describe("Longitude in decimal degrees"),speed:rt.number().optional().describe("Speed reported by the source device"),heading:rt.number().optional().describe("Heading in degrees from true north"),accuracy:rt.number().optional().describe("GPS horizontal accuracy in meters"),technicianId:rt.number().int().optional().describe("Related technician ID"),vehicleId:rt.number().int().optional().describe("Related vehicle ID"),providerTechnicianId:rt.string().optional().describe("Technician identifier from the provider system")});function pd(n,a){a.register({name:"people_gps_create",domain:"people",operation:"write",description:"Submit GPS pings from an external provider",schema:{gpsProvider:rt.string().regex(/^[A-Za-z0-9_-]+$/,"GPS provider must be alphanumeric, hyphens, or underscores").describe("GPS provider identifier"),pings:rt.array(bg).min(1).describe("One or more GPS ping events to ingest")},handler:async r=>{let{gpsProvider:e,pings:t}=r;try{let s=await n.post(`/tenant/{tenant}/gps-provider/${e}/gps-pings`,{pings:t});return i(s)}catch(s){return o(c(s))}}})}import{z as x}from"zod";var hg=x.object({key:x.string().optional().describe("External data key"),value:x.string().optional().describe("External data value")}),Jr=x.object({name:x.string().optional().describe("Technician display name"),firstName:x.string().optional().describe("Technician first name"),lastName:x.string().optional().describe("Technician last name"),nickname:x.string().optional().describe("Technician nickname"),employeeId:x.number().int().optional().describe("Related employee ID"),userId:x.number().int().optional().describe("Related user ID"),userRoleId:x.number().int().optional().describe("Related user role ID"),employeeNumber:x.string().optional().describe("Technician employee number"),mobilePhoneNumber:x.string().optional().describe("Mobile phone number"),businessUnitId:x.number().int().optional().describe("Default business unit ID"),active:x.boolean().optional().describe("Whether the technician is active"),color:x.string().optional().describe("Schedule display color"),laborWageTypeId:x.number().int().optional().describe("Labor wage type ID"),laborCostPerHour:x.number().optional().describe("Labor cost per hour"),memo:x.string().optional().describe("Internal note"),externalData:x.array(hg).optional().describe("External data entries")}),Vn=x.object({id:x.number().int().describe("Technician ID")}),ld=Jr.extend({id:x.number().int().describe("Technician ID")}),ud=u(p(x.object({ids:x.string().optional().describe("Comma-separated technician IDs (maximum 50)"),userIds:x.string().optional().describe("Comma-separated user IDs (maximum 50)"),name:x.string().optional().describe("Filter technicians by name (case-insensitive contains)"),...S()}))),Wr=x.enum(["Normal","OnCall","TimeOff"]),bd=x.object({technicianId:x.number().int().describe("Technician ID"),start:x.string().datetime().describe("Shift start timestamp"),end:x.string().datetime().describe("Shift end timestamp"),shiftType:Wr.optional().describe("Shift type"),title:x.string().optional().describe("Shift title"),note:x.string().optional().describe("Shift note"),active:x.boolean().optional().describe("Whether the shift is active"),timesheetCodeId:x.number().int().optional().describe("Timesheet code ID")}),Kn=x.object({id:x.number().int().describe("Technician shift ID")}),hd=u(p(x.object({startsOnOrAfter:x.string().datetime().optional().describe("Return shifts starting on or after this UTC timestamp"),endsOnOrBefore:x.string().datetime().optional().describe("Return shifts ending on or before this UTC timestamp"),shiftType:Wr.optional().describe("Shift type filter"),technicianId:x.number().int().optional().describe("Technician ID filter"),titleContains:x.string().optional().describe("Filter shifts by title substring"),noteContains:x.string().optional().describe("Filter shifts by note substring")}).extend(S()).extend(f(["Id","CreatedOn","ModifiedOn"])))),gd=x.object({id:x.number().int().describe("Technician shift ID"),shiftType:Wr.optional().describe("Shift type"),title:x.string().optional().describe("Shift title"),note:x.string().optional().describe("Shift note"),active:x.boolean().optional().describe("Whether the shift is active"),technicianId:x.number().int().optional().describe("Technician ID"),start:x.string().datetime().optional().describe("Shift start timestamp"),end:x.string().datetime().optional().describe("Shift end timestamp"),timesheetCodeId:x.number().int().optional().describe("Timesheet code ID")}),fd=x.object({deletedIds:x.array(x.number().int().describe("Technician shift ID")).optional().describe("IDs of shifts to delete")}),yd=p(x.object({fromUtc:x.string().datetime().describe("Start of filtering period in UTC"),toUtc:x.string().datetime().describe("End of filtering period in UTC"),performanceSegmentationType:x.enum(["Campaign","AdGroup","Keyword"]).describe("Performance segmentation type")}));function vd(n,a){a.register({name:"people_technicians_create",domain:"people",operation:"write",description:"Create a technician",schema:Jr.shape,handler:async r=>{let e=Jr.parse(r);try{let t=await n.post("/tenant/{tenant}/technicians",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"people_technicians_get",domain:"people",operation:"read",description:"Get a technician by ID",schema:Vn.shape,handler:async r=>{let e=Vn.parse(r);try{let t=await n.get(`/tenant/{tenant}/technicians/${e.id}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"people_technicians_list",domain:"people",operation:"read",description:"List technicians",schema:ud.shape,handler:async r=>{let e=ud.parse(r);try{let t=await n.get("/tenant/{tenant}/technicians",d({ids:e.ids,userIds:e.userIds,name:e.name,active:e.active,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"people_technicians_update",domain:"people",operation:"write",description:"Update a technician",schema:ld.shape,handler:async r=>{let e=ld.parse(r),{id:t,...s}=e;try{let m=await n.patch(`/tenant/{tenant}/technicians/${t}`,d(s));return i(m)}catch(m){return o(c(m))}}}),a.register({name:"people_technicians_accountactions",domain:"people",operation:"write",description:"Run account actions for a technician",schema:Vn.shape,handler:async r=>{let e=Vn.parse(r);try{let t=await n.post(`/tenant/{tenant}/technicians/${e.id}/account-actions`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"people_technician_ratings_update",domain:"people",operation:"write",description:"Update technician rating for a specific job",schema:{technicianId:x.number().int().describe("Technician ID"),jobId:x.number().int().describe("Job ID")},handler:async r=>{let{technicianId:e,jobId:t}=x.object({technicianId:x.number().int(),jobId:x.number().int()}).parse(r);try{return await n.put(`/tenant/{tenant}/technician-rating/technician/${e}/job/${t}`),i({success:!0,message:"Technician rating updated successfully."})}catch(s){return o(c(s))}}}),a.register({name:"people_technician_shifts_create",domain:"people",operation:"write",description:"Create a technician shift",schema:bd.shape,handler:async r=>{let e=bd.parse(r);try{let t=await n.post("/tenant/{tenant}/technician-shifts",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"people_technician_shifts_get",domain:"people",operation:"read",description:"Get a technician shift by ID",schema:Kn.shape,handler:async r=>{let e=Kn.parse(r);try{let t=await n.get(`/tenant/{tenant}/technician-shifts/${e.id}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"people_technician_shifts_list",domain:"people",operation:"read",description:"List technician shifts",schema:hd.shape,handler:async r=>{let e=hd.parse(r);try{let t=await n.get("/tenant/{tenant}/technician-shifts",d({startsOnOrAfter:e.startsOnOrAfter,endsOnOrBefore:e.endsOnOrBefore,shiftType:e.shiftType,technicianId:e.technicianId,titleContains:e.titleContains,noteContains:e.noteContains,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,active:e.active,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,sort:e.sort}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"people_technician_shifts_delete",domain:"people",operation:"delete",description:"Delete a technician shift",schema:Kn.shape,handler:async r=>{let e=Kn.parse(r);try{let t=await n.delete(`/tenant/{tenant}/technician-shifts/${e.id}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"people_technician_shifts_update",domain:"people",operation:"write",description:"Update a technician shift",schema:gd.shape,handler:async r=>{let e=gd.parse(r),{id:t,...s}=e;try{let m=await n.patch(`/tenant/{tenant}/technician-shifts/${t}`,d(s));return i(m)}catch(m){return o(c(m))}}}),a.register({name:"people_technician_shifts_bulk_delete",domain:"people",operation:"write",description:"Delete multiple technician shifts",schema:fd.shape,handler:async r=>{let e=fd.parse(r);try{let t=await n.post("/tenant/{tenant}/technician-shifts/bulk-delete",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"people_performance_get",domain:"people",operation:"read",description:"Get performance segmented by campaign/ad group/keyword",schema:yd.shape,handler:async r=>{let e=yd.parse(r);try{let t=await n.get("/tenant/{tenant}/performance",d({fromUtc:e.fromUtc,toUtc:e.toUtc,performanceSegmentationType:e.performanceSegmentationType,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal}));return i(t)}catch(t){return o(c(t))}}})}import{z as Ie}from"zod";var gg=Ie.object({key:Ie.string().optional().describe("External data key"),value:Ie.string().optional().describe("External data value")}),fg=Ie.object({name:Ie.string().optional().describe("Truck display name"),number:Ie.string().optional().describe("Truck number/code"),description:Ie.string().optional().describe("Truck description"),active:Ie.boolean().optional().describe("Whether the truck is active"),businessUnitId:Ie.number().int().optional().describe("Business unit ID"),employeeId:Ie.number().int().optional().describe("Assigned employee ID"),technicianId:Ie.number().int().optional().describe("Assigned technician ID"),inventoryLocationId:Ie.number().int().optional().describe("Inventory location ID"),warehouseId:Ie.number().int().optional().describe("Warehouse ID"),licensePlate:Ie.string().optional().describe("License plate"),vin:Ie.string().optional().describe("Vehicle identification number"),make:Ie.string().optional().describe("Vehicle make"),model:Ie.string().optional().describe("Vehicle model"),year:Ie.number().int().optional().describe("Vehicle model year"),color:Ie.string().optional().describe("Vehicle color"),memo:Ie.string().optional().describe("Internal note"),externalData:Ie.array(gg).optional().describe("External data entries")}),Id=fg.extend({id:Ie.number().int().describe("Truck ID")}),Td=u(p(Ie.object({ids:Ie.string().optional().describe("Comma-separated truck IDs (maximum 50)"),externalDataApplicationGuid:Ie.string().uuid().optional().describe("External data application GUID"),externalDataKey:Ie.string().optional().describe("External data key"),externalDataValues:Ie.string().optional().describe("External data values")}).extend(S()).extend(f(["Id","ModifiedOn","CreatedOn"]))));function Sd(n,a){a.register({name:"people_trucks_update",domain:"people",operation:"write",description:"Update a truck",schema:Id.shape,handler:async r=>{let e=Id.parse(r),{id:t,...s}=e;try{let m=await n.patch(`/tenant/{tenant}/trucks/${t}`,d(s));return i(m)}catch(m){return o(c(m))}}}),a.register({name:"people_trucks_list",domain:"people",operation:"read",description:"List trucks",schema:Td.shape,handler:async r=>{let e=Td.parse(r);try{let t=await n.get("/tenant/{tenant}/trucks",d({ids:e.ids,active:e.active,externalDataApplicationGuid:e.externalDataApplicationGuid,externalDataKey:e.externalDataKey,externalDataValues:e.externalDataValues,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,sort:e.sort}));return i(t)}catch(t){return o(c(t))}}})}var yg=(n,a)=>{md(n,a),vd(n,a),Sd(n,a),pd(n,a)},wd=yg;import{z as l}from"zod";var Yn=l.object({key:l.string().describe("External data key"),value:l.string().describe("External data value")}),Hr=l.object({alias:l.string().optional().describe("Asset alias"),fileName:l.string().optional().describe("Asset file name"),isDefault:l.boolean().optional().describe("Whether the asset is default"),type:l.string().optional().describe("Asset type"),url:l.string().optional().describe("Asset URL")}),Xn=l.object({name:l.string().describe("Category name"),categoryType:l.enum(["Services","Materials"]).describe("Category type for the pricebook item"),active:l.boolean().optional().describe("Whether the category is active")}),Qn=l.object({type:l.string().optional().describe("Discount or fee type"),code:l.string().describe("Discount or fee code"),displayName:l.string().describe("Discount or fee display name"),description:l.string().optional().describe("Discount or fee description"),amountType:l.string().optional().describe("Discount or fee amount type"),amount:l.number().describe("Discount or fee amount"),limit:l.number().optional().describe("Discount or fee limit"),taxable:l.boolean().optional().describe("Whether the discount or fee is taxable"),categories:l.array(l.number().int().describe("Category ID")).optional().describe("Category IDs attached to this discount or fee"),hours:l.number().optional().describe("Labor hours for the discount or fee"),assets:l.array(Hr.describe("Discount or fee asset")).optional().describe("Assets attached to this discount or fee"),account:l.string().optional().describe("Accounting account"),crossSaleGroup:l.string().optional().describe("Cross-sale group"),active:l.boolean().optional().describe("Whether the discount or fee is active"),bonus:l.number().optional().describe("Bonus amount"),commissionBonus:l.number().optional().describe("Commission bonus amount"),paysCommission:l.boolean().optional().describe("Whether this item pays commission"),excludeFromPayroll:l.boolean().optional().describe("Whether this item is excluded from payroll"),externalData:l.array(Yn.describe("External data entry")).optional().describe("External data entries")}),_d=l.object({cost:l.number().optional().describe("Vendor subaccount cost"),accountName:l.string().optional().describe("Vendor subaccount name")}),Zn=l.object({vendorName:l.string().optional().describe("Vendor name"),vendorId:l.number().int().optional().describe("Vendor ID"),memo:l.string().optional().describe("Vendor memo"),vendorPart:l.string().optional().describe("Vendor part number"),cost:l.number().optional().describe("Vendor cost"),active:l.boolean().optional().describe("Whether the vendor link is active"),primarySubAccount:_d.optional().describe("Primary vendor subaccount"),otherSubAccounts:l.array(_d.describe("Additional vendor subaccount")).optional().describe("Additional vendor subaccounts")}),Vr=l.object({code:l.string().optional().describe("Equipment code"),displayName:l.string().optional().describe("Equipment display name"),description:l.string().optional().describe("Equipment description"),cost:l.number().optional().describe("Equipment cost"),active:l.boolean().optional().describe("Whether equipment is active"),price:l.number().optional().describe("Equipment price"),memberPrice:l.number().optional().describe("Equipment member price"),addOnPrice:l.number().optional().describe("Equipment add-on price"),addOnMemberPrice:l.number().optional().describe("Equipment add-on member price"),hours:l.number().optional().describe("Labor hours for the equipment"),bonus:l.number().optional().describe("Bonus amount"),commissionBonus:l.number().optional().describe("Commission bonus amount"),paysCommission:l.boolean().optional().describe("Whether the equipment pays commission"),account:l.string().optional().describe("Accounting account"),taxable:l.boolean().optional().describe("Whether equipment is taxable"),primaryVendor:Zn.optional().describe("Primary vendor"),otherVendors:l.array(Zn.describe("Additional vendor")).optional().describe("Additional vendors"),categories:l.array(l.number().int().describe("Category ID")).optional().describe("Category IDs"),assets:l.array(Hr.describe("Equipment asset")).optional().describe("Equipment assets"),source:l.string().optional().describe("Equipment source"),externalId:l.string().optional().describe("External equipment ID"),externalData:l.array(Yn.describe("External data entry")).optional().describe("External data entries"),businessUnitId:l.number().int().optional().describe("Business unit ID")}),Kr=l.object({code:l.string().describe("Service code"),displayName:l.string().describe("Service display name"),description:l.string().optional().describe("Service description"),warrantyDuration:l.number().int().optional().describe("Warranty duration"),warrantyDescription:l.string().optional().describe("Warranty description"),categoryIds:l.array(l.number().int().describe("Category ID")).optional().describe("Category IDs"),price:l.number().optional().describe("Service price"),memberPrice:l.number().optional().describe("Service member price"),addOnPrice:l.number().optional().describe("Service add-on price"),addOnMemberPrice:l.number().optional().describe("Service add-on member price"),taxable:l.boolean().optional().describe("Whether the service is taxable"),account:l.string().optional().describe("Accounting account"),hours:l.number().optional().describe("Labor hours"),isLabor:l.boolean().optional().describe("Whether this is a labor service"),recommendationIds:l.array(l.number().int().describe("Recommendation ID")).optional().describe("Recommendation IDs"),upgradeIds:l.array(l.number().int().describe("Upgrade ID")).optional().describe("Upgrade IDs"),active:l.boolean().optional().describe("Whether the service is active"),crossSaleGroup:l.string().optional().describe("Cross-sale group"),paysCommission:l.boolean().optional().describe("Whether the service pays commission"),bonus:l.number().optional().describe("Bonus amount"),commissionBonus:l.number().optional().describe("Commission bonus amount"),source:l.string().optional().describe("Service source"),externalId:l.string().optional().describe("External service ID"),externalData:l.array(Yn.describe("External data entry")).optional().describe("External data entries"),businessUnitId:l.number().int().optional().describe("Business unit ID"),cost:l.number().optional().describe("Service cost"),soldByCommission:l.number().optional().describe("Sales commission percentage")}),Zr=Kr.partial().describe("Service update payload"),Yr=l.object({code:l.string().describe("Material code"),displayName:l.string().describe("Material display name"),description:l.string().optional().describe("Material description"),cost:l.number().optional().describe("Material cost"),active:l.boolean().optional().describe("Whether the material is active"),price:l.number().optional().describe("Material price"),memberPrice:l.number().optional().describe("Material member price"),addOnPrice:l.number().optional().describe("Material add-on price"),addOnMemberPrice:l.number().optional().describe("Material add-on member price"),hours:l.number().optional().describe("Labor hours"),taxable:l.boolean().optional().describe("Whether the material is taxable"),categories:l.array(l.number().int().describe("Category ID")).optional().describe("Category IDs"),assets:l.array(Hr.describe("Material asset")).optional().describe("Material assets"),source:l.string().optional().describe("Material source"),externalId:l.string().optional().describe("External material ID"),externalData:l.array(Yn.describe("External data entry")).optional().describe("External data entries"),businessUnitId:l.number().int().optional().describe("Business unit ID"),isOtherDirectCost:l.boolean().optional().describe("Whether material is an other direct cost"),costTypeId:l.number().int().optional().describe("Cost type ID")}),Xr=Yr.extend({bonus:l.number().optional().describe("Bonus amount"),commissionBonus:l.number().optional().describe("Commission bonus amount"),paysCommission:l.boolean().optional().describe("Whether material pays commission"),deductAsJobCost:l.boolean().optional().describe("Whether to deduct as job cost"),unitOfMeasure:l.string().optional().describe("Unit of measure"),isInventory:l.boolean().optional().describe("Whether material is inventory"),account:l.string().optional().describe("Accounting account"),costOfSaleAccount:l.string().optional().describe("Cost of sale account"),assetAccount:l.string().optional().describe("Asset account"),primaryVendor:Zn.optional().describe("Primary vendor"),otherVendors:l.array(Zn.describe("Additional vendor")).optional().describe("Additional vendors"),isConfigurableMaterial:l.boolean().optional().describe("Whether material is configurable"),chargeableByDefault:l.boolean().optional().describe("Whether material is chargeable by default"),variationsOrConfigurableMaterials:l.array(l.number().int().describe("Variation material ID")).optional().describe("Variation or configurable material IDs"),generalLedgerAccountId:l.number().int().optional().describe("General ledger account ID"),displayInAmount:l.boolean().optional().describe("Whether the material displays in amount mode")}).describe("Material update payload"),vg=l.object({operation:l.enum(["create","update","delete"]).describe("Bulk operation type"),entityType:l.enum(["services","materials","equipment","categories","discounts-and-fees"]).describe("Pricebook entity type"),id:l.number().int().optional().describe("Entity ID for update/delete operations"),externalId:l.string().optional().describe("External identifier for the entity"),service:Zr.optional().describe("Service payload"),material:Xr.optional().describe("Material payload"),equipment:Vr.optional().describe("Equipment payload"),category:Xn.partial().optional().describe("Category payload"),discountAndFee:Qn.partial().optional().describe("Discount and fee payload")}),Qr=l.object({operations:l.array(vg.describe("Bulk operation")).min(1).describe("Bulk operations to process")});function Dd(n,a){a.register({name:"pricebook_bulk_create",domain:"pricebook",operation:"write",description:"Create or import bulk pricebook operations",schema:{body:Qr.describe("Bulk create payload")},handler:async r=>{let{body:e}=r;try{let t=await n.post("/tenant/{tenant}/pricebook",e);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"pricebook_bulk_update",domain:"pricebook",operation:"write",description:"Update pricebook records in bulk",schema:{body:Qr.optional().describe("Bulk update payload")},handler:async r=>{let{body:e}=r;try{let t=await n.patch("/tenant/{tenant}/pricebook",e);return i(t)}catch(t){return o(c(t))}}})}import{z as In}from"zod";var Ig=u(p(In.object({...f(["Id","Name"]),...S(),categoryType:In.enum(["Services","Materials"]).optional().describe("Category type filter")}))),Tg=Xn.partial().describe("Category update payload");function Cd(n,a){a.register({name:"pricebook_categories_create",domain:"pricebook",operation:"write",description:"Create a pricebook category",schema:{body:Xn.describe("Category create payload")},handler:async r=>{let{body:e}=r;try{let t=await n.post("/tenant/{tenant}/categories",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"pricebook_categories_get",domain:"pricebook",operation:"read",description:"Get a pricebook category by ID",schema:{id:In.number().int().describe("Category ID")},handler:async r=>{let{id:e}=r;try{let t=await n.get(`/tenant/{tenant}/categories/${e}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"pricebook_categories_list",domain:"pricebook",operation:"read",description:"List pricebook categories",schema:Ig.shape,handler:async r=>{let e=d(r);try{let t=await n.get("/tenant/{tenant}/categories",e);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"pricebook_categories_update",domain:"pricebook",operation:"write",description:"Update a pricebook category",schema:{id:In.number().int().describe("Category ID"),body:Tg},handler:async r=>{let{id:e,body:t}=r;try{let s=await n.patch(`/tenant/{tenant}/categories/${e}`,d(t));return i(s)}catch(s){return o(c(s))}}}),a.register({name:"pricebook_categories_delete",domain:"pricebook",operation:"delete",description:"Delete a pricebook category",schema:{id:In.number().int().describe("Category ID")},handler:async r=>{let{id:e}=r;try{return await n.delete(`/tenant/{tenant}/categories/${e}`),i({success:!0,message:"Category deleted successfully."})}catch(t){return o(c(t))}}})}import{z as St}from"zod";var Sg=Qn.partial().describe("Discount and fee update payload"),wg=u(p(St.object({...f(["Id","Code","DisplayName","CreatedOn","ModifiedOn","Price","MemberPrice","AddOnPrice","AddOnMemberPrice","MaterialsCost","PrimaryVendor","Cost","Manufacturer","Priority"]),...S(),ids:St.string().optional().describe("Comma-separated IDs (max 50)"),externalDataApplicationGuid:St.string().uuid().optional().describe("External data application GUID"),externalDataKey:St.string().optional().describe("External data key filter"),externalDataValues:St.string().optional().describe("External data values filter")})));function kd(n,a){a.register({name:"pricebook_discounts_fees_get",domain:"pricebook",operation:"read",description:"Get a discount or fee by ID",schema:{id:St.number().int().describe("Discount/Fee ID"),externalDataApplicationGuid:St.string().uuid().optional().describe("External data application GUID")},handler:async r=>{let{id:e,externalDataApplicationGuid:t}=r;try{let s=await n.get(`/tenant/{tenant}/discounts-and-fees/${e}`,d({externalDataApplicationGuid:t}));return i(s)}catch(s){return o(c(s))}}}),a.register({name:"pricebook_discounts_fees_list",domain:"pricebook",operation:"read",description:"List discounts and fees",schema:wg.shape,handler:async r=>{let e=d(r);try{let t=await n.get("/tenant/{tenant}/discounts-and-fees",e);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"pricebook_discounts_fees_create",domain:"pricebook",operation:"write",description:"Create a discount or fee",schema:{body:Qn.describe("Discount and fee create payload")},handler:async r=>{let{body:e}=r;try{let t=await n.post("/tenant/{tenant}/discounts-and-fees",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"pricebook_discounts_fees_update",domain:"pricebook",operation:"write",description:"Update a discount or fee",schema:{id:St.number().int().describe("Discount/Fee ID"),body:Sg},handler:async r=>{let{id:e,body:t}=r;try{let s=await n.patch(`/tenant/{tenant}/discounts-and-fees/${e}`,d(t));return i(s)}catch(s){return o(c(s))}}}),a.register({name:"pricebook_discounts_fees_delete",domain:"pricebook",operation:"delete",description:"Delete a discount or fee",schema:{id:St.number().int().describe("Discount/Fee ID")},handler:async r=>{let{id:e}=r;try{return await n.delete(`/tenant/{tenant}/discounts-and-fees/${e}`),i({success:!0,message:"Discount and fee deleted successfully."})}catch(t){return o(c(t))}}})}import{z as wt}from"zod";var _g=u(p(wt.object({...f(["Id","Code","DisplayName","CreatedOn","ModifiedOn","Price","MemberPrice","AddOnPrice","AddOnMemberPrice","MaterialsCost","PrimaryVendor","Cost","Manufacturer","Priority"]),...S(),ids:wt.string().optional().describe("Comma-separated IDs (max 50)"),externalDataApplicationGuid:wt.string().uuid().optional().describe("External data application GUID"),externalDataKey:wt.string().optional().describe("External data key filter"),externalDataValues:wt.string().optional().describe("External data values filter")})));function Od(n,a){a.register({name:"pricebook_equipment_list",domain:"pricebook",operation:"read",description:"List equipment pricebook items",schema:_g.shape,handler:async r=>{let e=d(r);try{let t=await n.get("/tenant/{tenant}/equipment",e);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"pricebook_equipment_get",domain:"pricebook",operation:"read",description:"Get equipment item by ID",schema:{id:wt.number().int().describe("Equipment ID"),externalDataApplicationGuid:wt.string().uuid().optional().describe("External data application GUID")},handler:async r=>{let{id:e,externalDataApplicationGuid:t}=r;try{let s=await n.get(`/tenant/{tenant}/equipment/${e}`,d({externalDataApplicationGuid:t}));return i(s)}catch(s){return o(c(s))}}}),a.register({name:"pricebook_equipment_update",domain:"pricebook",operation:"write",description:"Update equipment item",schema:{id:wt.number().int().describe("Equipment ID"),body:Vr.partial().describe("Equipment update payload")},handler:async r=>{let{id:e,body:t}=r;try{let s=await n.patch(`/tenant/{tenant}/equipment/${e}`,d(t));return i(s)}catch(s){return o(c(s))}}}),a.register({name:"pricebook_equipment_delete",domain:"pricebook",operation:"delete",description:"Delete equipment item",schema:{id:wt.number().int().describe("Equipment ID")},handler:async r=>{let{id:e}=r;try{return await n.delete(`/tenant/{tenant}/equipment/${e}`),i({success:!0,message:"Equipment deleted successfully."})}catch(t){return o(c(t))}}})}import{z as Ee}from"zod";var Dg=u(p(Ee.object({...f(["Id","Code","DisplayName","CreatedOn","ModifiedOn","Price","MemberPrice","AddOnPrice","AddOnMemberPrice","MaterialsCost","PrimaryVendor","Cost","Manufacturer","Priority"]),...S(),ids:Ee.string().optional().describe("Comma-separated IDs (max 50)"),isOtherDirectCost:Ee.boolean().optional().describe("Filter by other direct cost materials"),costTypeIds:Ee.string().optional().describe("Comma-separated cost type IDs"),externalDataApplicationGuid:Ee.string().uuid().optional().describe("External data application GUID"),externalDataKey:Ee.string().optional().describe("External data key filter"),externalDataValues:Ee.string().optional().describe("External data values filter")}))),Cg=p(Ee.object({sort:Ee.string().optional().describe("Sort expression for markups (+Field or -Field)")})),kg=Ee.object({from:Ee.number().describe("Start value for the markup range"),to:Ee.number().describe("End value for the markup range"),percent:Ee.number().describe("Markup percentage")}),Og=Ee.object({from:Ee.number().optional().describe("Start value for the markup range"),to:Ee.number().optional().describe("End value for the markup range"),percent:Ee.number().optional().describe("Markup percentage")});function Rd(n,a){a.register({name:"pricebook_materials_create",domain:"pricebook",operation:"write",description:"Create a material pricebook item",schema:{body:Yr.describe("Material create payload")},handler:async r=>{let{body:e}=r;try{let t=await n.post("/tenant/{tenant}/materials",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"pricebook_materials_get",domain:"pricebook",operation:"read",description:"Get a material by ID",schema:{id:Ee.number().int().describe("Material ID"),externalDataApplicationGuid:Ee.string().uuid().optional().describe("External data application GUID")},handler:async r=>{let{id:e,externalDataApplicationGuid:t}=r;try{let s=await n.get(`/tenant/{tenant}/materials/${e}`,d({externalDataApplicationGuid:t}));return i(s)}catch(s){return o(c(s))}}}),a.register({name:"pricebook_materials_list",domain:"pricebook",operation:"read",description:"List material pricebook items",schema:Dg.shape,handler:async r=>{let e=d(r);try{let t=await n.get("/tenant/{tenant}/materials",e);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"pricebook_materials_delete",domain:"pricebook",operation:"delete",description:"Delete a material by ID",schema:{id:Ee.number().int().describe("Material ID")},handler:async r=>{let{id:e}=r;try{return await n.delete(`/tenant/{tenant}/materials/${e}`),i({success:!0,message:"Material deleted successfully."})}catch(t){return o(c(t))}}}),a.register({name:"pricebook_materials_cost_types_list",domain:"pricebook",operation:"read",description:"List material cost types",schema:{},handler:async()=>{try{let r=await n.get("/tenant/{tenant}/materials/costtypes");return i(r)}catch(r){return o(c(r))}}}),a.register({name:"pricebook_materials_markup_list",domain:"pricebook",operation:"read",description:"List material markup ranges",schema:Cg.shape,handler:async r=>{let e=d(r);try{let t=await n.get("/tenant/{tenant}/materialsmarkup",e);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"pricebook_materials_markup_create",domain:"pricebook",operation:"write",description:"Create a material markup range",schema:{body:kg.describe("Material markup create payload")},handler:async r=>{let{body:e}=r;try{let t=await n.post("/tenant/{tenant}/materialsmarkup",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"pricebook_materials_markup_get",domain:"pricebook",operation:"read",description:"Get a material markup range by ID",schema:{id:Ee.number().int().describe("Material markup ID")},handler:async r=>{let{id:e}=r;try{let t=await n.get(`/tenant/{tenant}/materialsmarkup/${e}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"pricebook_materials_markup_update",domain:"pricebook",operation:"write",description:"Update a material markup range",schema:{id:Ee.number().int().describe("Material markup ID"),body:Og.describe("Material markup update payload")},handler:async r=>{let{id:e,body:t}=r;try{let s=await n.put(`/tenant/{tenant}/materialsmarkup/${e}`,d(t));return i(s)}catch(s){return o(c(s))}}}),a.register({name:"pricebook_materials_update",domain:"pricebook",operation:"write",description:"Update a material pricebook item",schema:{id:Ee.number().int().describe("Material ID"),body:Xr.describe("Material update payload")},handler:async r=>{let{id:e,body:t}=r;try{let s=await n.patch(`/tenant/{tenant}/materials/${e}`,d(t));return i(s)}catch(s){return o(c(s))}}})}import{z as _t}from"zod";var Rg=u(p(_t.object({...f(["Id","Code","DisplayName","CreatedOn","ModifiedOn","Price","MemberPrice","AddOnPrice","AddOnMemberPrice","MaterialsCost","PrimaryVendor","Cost","Manufacturer","Priority"]),...S(),ids:_t.string().optional().describe("Comma-separated IDs (max 50)"),externalDataApplicationGuid:_t.string().uuid().optional().describe("External data application GUID"),externalDataKey:_t.string().optional().describe("External data key filter"),externalDataValues:_t.string().optional().describe("External data values filter")})));function jd(n,a){a.register({name:"pricebook_services_get",domain:"pricebook",operation:"read",description:"Get a service by ID",schema:{id:_t.number().int().describe("Service ID"),externalDataApplicationGuid:_t.string().uuid().optional().describe("External data application GUID")},handler:async r=>{let{id:e,externalDataApplicationGuid:t}=r;try{let s=await n.get(`/tenant/{tenant}/services/${e}`,d({externalDataApplicationGuid:t}));return i(s)}catch(s){return o(c(s))}}}),a.register({name:"pricebook_services_list",domain:"pricebook",operation:"read",description:"List service pricebook items",schema:Rg.shape,handler:async r=>{let e=d(r);try{let t=await n.get("/tenant/{tenant}/services",e);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"pricebook_services_create",domain:"pricebook",operation:"write",description:"Create a service pricebook item",schema:Kr.shape,handler:async r=>{let e=r;try{let t=await n.post("/tenant/{tenant}/services",{code:e.code,displayName:e.displayName,description:e.description,warranty:e.warrantyDuration!==void 0||e.warrantyDescription!==void 0?{duration:e.warrantyDuration,description:e.warrantyDescription}:void 0,categories:e.categoryIds?.map(s=>({id:s})),price:e.price,memberPrice:e.memberPrice,addOnPrice:e.addOnPrice,addOnMemberPrice:e.addOnMemberPrice,taxable:e.taxable,account:e.account,hours:e.hours,isLabor:e.isLabor,recommendations:e.recommendationIds,upgrades:e.upgradeIds,active:e.active,crossSaleGroup:e.crossSaleGroup,paysCommission:e.paysCommission,bonus:e.bonus,commissionBonus:e.commissionBonus,source:e.source,externalId:e.externalId,externalData:e.externalData,businessUnitId:e.businessUnitId,cost:e.cost,soldByCommission:e.soldByCommission});return i(t)}catch(t){return o(c(t))}}}),a.register({name:"pricebook_services_update",domain:"pricebook",operation:"write",description:"Update a service pricebook item",schema:{id:_t.number().int().describe("Service ID"),body:Zr},handler:async r=>{let{id:e,body:t}=r;try{let s=await n.patch(`/tenant/{tenant}/services/${e}`,{code:t.code,displayName:t.displayName,description:t.description,warranty:t.warrantyDuration!==void 0||t.warrantyDescription!==void 0?{duration:t.warrantyDuration,description:t.warrantyDescription}:void 0,categories:t.categoryIds?.map(m=>({id:m})),price:t.price,memberPrice:t.memberPrice,addOnPrice:t.addOnPrice,addOnMemberPrice:t.addOnMemberPrice,taxable:t.taxable,account:t.account,hours:t.hours,isLabor:t.isLabor,recommendations:t.recommendationIds,upgrades:t.upgradeIds,active:t.active,crossSaleGroup:t.crossSaleGroup,paysCommission:t.paysCommission,bonus:t.bonus,commissionBonus:t.commissionBonus,source:t.source,externalId:t.externalId,externalData:t.externalData,businessUnitId:t.businessUnitId,cost:t.cost,soldByCommission:t.soldByCommission});return i(s)}catch(s){return o(c(s))}}}),a.register({name:"pricebook_services_delete",domain:"pricebook",operation:"delete",description:"Delete a service pricebook item",schema:{id:_t.number().int().describe("Service ID")},handler:async r=>{let{id:e}=r;try{return await n.delete(`/tenant/{tenant}/services/${e}`),i({success:!0,message:"Service deleted successfully."})}catch(t){return o(c(t))}}})}var jg=(n,a)=>{Cd(n,a),kd(n,a),Od(n,a),Rd(n,a),jd(n,a),Dd(n,a)},xd=jg;import{z as Ad}from"zod";var xg=p(Ad.object({dynamicSetId:Ad.string().describe("Dynamic set ID from report metadata")}));function Pd(n,a){a.register({name:"reporting_dynamic_value_sets_get",domain:"reporting",operation:"read",description:"Get values from a dynamic value set",schema:xg.shape,handler:async r=>{let{dynamicSetId:e,...t}=r;try{let s=await n.get(`/tenant/{tenant}/dynamic-value-sets/${e}`,d(t));return i(s)}catch(s){return o(c(s))}}})}import{z as Ag}from"zod";var Pg=p(Ag.object({}));function Ed(n,a){a.register({name:"reporting_report_categories_list",domain:"reporting",operation:"read",description:"List report categories",schema:Pg.shape,handler:async r=>{let e=d(r);try{let t=await n.get("/tenant/{tenant}/report-categories",e);return i(t)}catch(t){return o(c(t))}}})}import{z as Xe}from"zod";var Eg=p(Xe.object({reportCategory:Xe.string().describe("Report category ID")})),Bg=Xe.object({name:Xe.string().describe("Parameter name (from report definition)"),value:Xe.string().describe("Parameter value")}),Lg=Xe.object({reportCategory:Xe.string().describe("Report category ID"),reportId:Xe.number().int().describe("Report ID"),parameters:Xe.array(Bg).optional().describe("Report parameters (name/value pairs from report definition)"),page:Xe.number().int().optional().describe("Page number (starts at 1)"),pageSize:Xe.number().int().min(1).max(25e3).optional().describe("Records per page"),includeTotal:Xe.boolean().optional().describe("Include total count")});function Bd(n,a){a.register({name:"reporting_reports_list",domain:"reporting",operation:"read",description:"List reports in a report category",schema:Eg.shape,handler:async r=>{let{reportCategory:e,...t}=r;try{let s=await n.get(`/tenant/{tenant}/report-category/${e}/reports`,d(t));return i(s)}catch(s){return o(c(s))}}}),a.register({name:"reporting_reports_get",domain:"reporting",operation:"read",description:"Get a report definition in a category",schema:{reportCategory:Xe.string().describe("Report category ID"),reportId:Xe.number().int().describe("Report ID")},handler:async r=>{let{reportCategory:e,reportId:t}=r;try{let s=await n.get(`/tenant/{tenant}/report-category/${e}/reports/${t}`);return i(s)}catch(s){return o(c(s))}}}),a.register({name:"reporting_reports_data_create",domain:"reporting",operation:"read",description:"Fetch report data rows. Use the report definition to discover required parameters. Date parameters use YYYY-MM-DD format.",schema:Lg.shape,handler:async r=>{let{reportCategory:e,reportId:t,parameters:s,...m}=r;try{let b=await n.post(`/tenant/{tenant}/report-category/${e}/reports/${t}/data`,s?{parameters:s}:{},d(m));return i(b)}catch(b){return o(c(b))}}})}var Mg=(n,a)=>{Pd(n,a),Ed(n,a),Bd(n,a)},Ld=Mg;import{z as Ve}from"zod";var Ug=Ve.object({appointmentId:Ve.number().int().describe("Appointment ID to assign"),technicianId:Ve.number().int().describe("Technician ID to assign")});function Fg(n){return u(n).extend({createdBefore:Ve.string().datetime().optional().describe("Return items created before this UTC timestamp"),createdOnOrAfter:Ve.string().datetime().optional().describe("Return items created on or after this UTC timestamp"),modifiedBefore:Ve.string().datetime().optional().describe("Return items modified before this UTC timestamp"),modifiedOnOrAfter:Ve.string().datetime().optional().describe("Return items modified on or after this UTC timestamp")})}var Ng=p(Fg(Ve.object({...S(),...f(["Id","CreatedOn","ModifiedOn"]),ids:Ve.string().optional().describe("Comma-separated assignment IDs (maximum 50)"),appointmentIds:Ve.string().optional().describe("Comma-separated appointment IDs (maximum 50)"),jobId:Ve.number().int().optional().describe("Return assignments for a job ID")})));function Md(n,a){a.register({name:"scheduling_appointment_assignments_assign_technicians",domain:"scheduling",operation:"write",description:"Assign technicians to appointments",schema:{assignments:Ve.array(Ug).optional().describe("Appointment/technician assignment items"),overrideExisting:Ve.boolean().optional().describe("Replace existing technician assignments when true")},handler:async r=>{let e=r;try{let t=d(e),s=await n.post("/tenant/{tenant}/appointment-assignments/assign-technicians",Object.keys(t).length>0?t:void 0);return i(s)}catch(t){return o(c(t))}}}),a.register({name:"scheduling_appointment_assignments_unassign_technicians",domain:"scheduling",operation:"write",description:"Unassign technicians from appointments",schema:{assignmentIds:Ve.array(Ve.number().int().describe("Appointment assignment ID")).optional().describe("Assignment IDs to remove")},handler:async r=>{let e=r;try{let t=d(e),s=await n.post("/tenant/{tenant}/appointment-assignments/unassign-technicians",Object.keys(t).length>0?t:void 0);return i(s)}catch(t){return o(c(t))}}}),a.register({name:"scheduling_appointment_assignments_list",domain:"scheduling",operation:"read",description:"List appointment assignments",schema:Ng.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/appointment-assignments",d(e));return i(t)}catch(t){return o(c(t))}}})}import{z as Qt}from"zod";var ea=Qt.object({fromHour:Qt.number().int().describe("Starting hour (0-23)"),toHour:Qt.number().int().describe("Ending hour (0-23)")});function Ud(n,a){a.register({name:"scheduling_business_hours_list",domain:"scheduling",operation:"read",description:"Get business hour configuration",schema:{},handler:async()=>{try{let r=await n.get("/tenant/{tenant}/business-hours");return i(r)}catch(r){return o(c(r))}}}),a.register({name:"scheduling_business_hours_create",domain:"scheduling",operation:"write",description:"Create business hour configuration",schema:{weekdays:Qt.array(ea).optional().describe("Weekday hour ranges to configure"),saturday:Qt.array(ea).optional().describe("Saturday hour ranges to configure"),sunday:Qt.array(ea).optional().describe("Sunday hour ranges to configure")},handler:async r=>{let e=r;try{let t=await n.post("/tenant/{tenant}/business-hours",{weekdays:e.weekdays??[],saturday:e.saturday??[],sunday:e.sunday??[]});return i(t)}catch(t){return o(c(t))}}})}import{z as Fd}from"zod";var Nd=Fd.object({payload:Fd.object({}).passthrough().describe("Capacity calculation payload")});function zd(n,a){a.register({name:"scheduling_capacity_calculate",domain:"scheduling",operation:"write",description:"Calculate capacity for scheduling",schema:Nd.shape,handler:async r=>{let e=Nd.parse(r);try{let t=await n.post("/tenant/{tenant}/capacity",e.payload);return i(t)}catch(t){return o(c(t))}}})}import{z as Y}from"zod";function zg(n){return u(n).extend({createdBefore:Y.string().datetime().optional().describe("Return items created before this UTC timestamp"),createdOnOrAfter:Y.string().datetime().optional().describe("Return items created on or after this UTC timestamp"),modifiedBefore:Y.string().datetime().optional().describe("Return items modified before this UTC timestamp"),modifiedOnOrAfter:Y.string().datetime().optional().describe("Return items modified on or after this UTC timestamp")})}var $g={technicianId:Y.number().int().describe("Technician ID"),start:Y.string().describe("Appointment start timestamp"),name:Y.string().describe("Appointment name"),duration:Y.string().describe("Appointment duration"),timesheetCodeId:Y.number().int().describe("Timesheet code ID"),summary:Y.string().optional().describe("Appointment summary"),clearDispatchBoard:Y.boolean().optional().describe("Whether to clear the dispatch board slot"),clearTechnicianView:Y.boolean().optional().describe("Whether to clear technician view visibility"),removeTechnicianFromCapacityPlanning:Y.boolean().optional().describe("Whether technician should be removed from capacity planning"),allDay:Y.boolean().optional().describe("Whether appointment is all day"),showOnTechnicianSchedule:Y.boolean().optional().describe("Whether to show on technician schedule"),active:Y.boolean().optional().describe("Whether appointment is active"),repeat:Y.boolean().optional().describe("Whether appointment repeats"),countOccurrences:Y.number().int().optional().describe("Number of repeated occurrences"),interval:Y.number().int().optional().describe("Repeat interval"),frequency:Y.string().optional().describe("Repeat frequency"),endType:Y.string().optional().describe("Repeat end type"),endOn:Y.string().optional().describe("Repeat end timestamp"),daysOfWeek:Y.string().optional().describe("Comma-separated days of week")},Gg=p(zg(Y.object({...f(["Id","CreatedOn","ModifiedOn"]),technicianId:Y.number().int().optional().describe("Filter by technician ID"),startsOnOrAfter:Y.string().datetime().optional().describe("Return items starting on or after this UTC timestamp"),startsOnOrBefore:Y.string().datetime().optional().describe("Return items starting on or before this UTC timestamp"),timesheetCodeId:Y.number().int().optional().describe("Filter by timesheet code ID"),activeOnly:Y.boolean().optional().describe("Return active items only"),showOnTechnicianSchedule:Y.boolean().optional().describe("Filter by technician schedule visibility"),ids:Y.string().optional().describe("Comma-separated IDs (maximum 50)")})));function $d(n,a){a.register({name:"scheduling_non_job_appointments_get",domain:"scheduling",operation:"read",description:"Get a non-job appointment by ID",schema:{id:Y.number().int().describe("Non-job appointment ID")},handler:async r=>{let{id:e}=r;try{let t=await n.get(`/tenant/{tenant}/non-job-appointments/${e}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"scheduling_non_job_appointments_delete",domain:"scheduling",operation:"delete",description:"Delete a non-job appointment",schema:{id:Y.number().int().describe("Non-job appointment ID")},handler:async r=>{let{id:e}=r;try{let t=await n.delete(`/tenant/{tenant}/non-job-appointments/${e}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"scheduling_non_job_appointments_update",domain:"scheduling",operation:"write",description:"Update a non-job appointment",schema:{id:Y.number().int().describe("Non-job appointment ID"),technicianId:Y.number().int().optional().describe("Technician ID"),start:Y.string().optional().describe("Appointment start timestamp"),name:Y.string().optional().describe("Appointment name"),duration:Y.string().optional().describe("Appointment duration"),timesheetCodeId:Y.number().int().optional().describe("Timesheet code ID"),summary:Y.string().optional().describe("Appointment summary"),clearDispatchBoard:Y.boolean().optional().describe("Whether to clear the dispatch board slot"),clearTechnicianView:Y.boolean().optional().describe("Whether to clear technician view visibility"),removeTechnicianFromCapacityPlanning:Y.boolean().optional().describe("Whether technician should be removed from capacity planning"),allDay:Y.boolean().optional().describe("Whether appointment is all day"),showOnTechnicianSchedule:Y.boolean().optional().describe("Whether to show on technician schedule"),active:Y.boolean().optional().describe("Whether appointment is active")},handler:async r=>{let{id:e,...t}=r;try{let s=await n.put(`/tenant/{tenant}/non-job-appointments/${e}`,d(t));return i(s)}catch(s){return o(c(s))}}}),a.register({name:"scheduling_non_job_appointments_list",domain:"scheduling",operation:"read",description:"List non-job appointments",schema:Gg.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/non-job-appointments",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"scheduling_non_job_appointments_create",domain:"scheduling",operation:"write",description:"Create a non-job appointment",schema:$g,handler:async r=>{let e=r;try{let t=await n.post("/tenant/{tenant}/non-job-appointments",d(e));return i(t)}catch(t){return o(c(t))}}})}import{z as ht}from"zod";function qg(n){return u(n).extend({createdBefore:ht.string().datetime().optional().describe("Return teams created before this UTC timestamp"),createdOnOrAfter:ht.string().datetime().optional().describe("Return teams created on or after this UTC timestamp"),modifiedBefore:ht.string().datetime().optional().describe("Return teams modified before this UTC timestamp"),modifiedOnOrAfter:ht.string().datetime().optional().describe("Return teams modified on or after this UTC timestamp")})}var Jg=p(qg(ht.object({...f(["Id","CreatedOn","ModifiedOn"]),includeInactive:ht.boolean().optional().describe("Whether to include inactive teams")})));function Gd(n,a){a.register({name:"scheduling_teams_list",domain:"scheduling",operation:"read",description:"List teams",schema:Jg.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/teams",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"scheduling_teams_create",domain:"scheduling",operation:"write",description:"Create a team",schema:{name:ht.string().describe("Team name"),active:ht.boolean().optional().describe("Whether the team is active")},handler:async r=>{let{name:e,active:t}=r;try{let s=await n.post("/tenant/{tenant}/teams",d({name:e,active:t}));return i(s)}catch(s){return o(c(s))}}}),a.register({name:"scheduling_teams_get",domain:"scheduling",operation:"read",description:"Get a team by ID",schema:{id:ht.number().int().describe("Team ID")},handler:async r=>{let{id:e}=r;try{let t=await n.get(`/tenant/{tenant}/teams/${e}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"scheduling_teams_delete",domain:"scheduling",operation:"delete",description:"Delete a team",schema:{id:ht.number().int().describe("Team ID")},handler:async r=>{let{id:e}=r;try{return await n.delete(`/tenant/{tenant}/teams/${e}`),i({success:!0,message:"Team deleted successfully."})}catch(t){return o(c(t))}}})}import{z as en}from"zod";function Wg(n){return u(n).extend({createdBefore:en.string().datetime().optional().describe("Return zones created before this UTC timestamp"),createdOnOrAfter:en.string().datetime().optional().describe("Return zones created on or after this UTC timestamp"),modifiedBefore:en.string().datetime().optional().describe("Return zones modified before this UTC timestamp"),modifiedOnOrAfter:en.string().datetime().optional().describe("Return zones modified on or after this UTC timestamp")})}var Hg=p(Wg(en.object({...S(),...f(["Id","CreatedOn","ModifiedOn"])})));function qd(n,a){a.register({name:"scheduling_zones_get",domain:"scheduling",operation:"read",description:"Get a zone by ID",schema:{id:en.number().int().describe("Zone ID")},handler:async r=>{let{id:e}=r;try{let t=await n.get(`/tenant/{tenant}/zones/${e}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"scheduling_zones_list",domain:"scheduling",operation:"read",description:"List zones",schema:Hg.shape,handler:async r=>{let e=r;try{let t=await n.get("/tenant/{tenant}/zones",d(e));return i(t)}catch(t){return o(c(t))}}})}var Vg=(n,a)=>{Md(n,a),Ud(n,a),zd(n,a),$d(n,a),Gd(n,a),qd(n,a)},Jd=Vg;import{z as at}from"zod";var Wd=at.object({id:at.number().int().describe("Activity code ID")}),Hd=at.object({id:at.number().int().describe("Activity category ID")}),Vd=at.object({id:at.number().int().describe("Activity type ID")}),Kd=u(p(at.object({...S(),...f(["Id","ModifiedOn","CreatedOn"])}))),Zd=u(p(at.object({...S(),...f(["Id","ModifiedOn","CreatedOn"])}))),Yd=u(p(at.object({...S(),...f(["Id","ModifiedOn","CreatedOn"])}))),tn=at.object({from:at.string().optional().describe("Continuation token from previous response or custom start date"),includeRecentChanges:at.boolean().optional().describe("Prioritize recent changes in the export stream")});function Xd(n,a){a.register({name:"settings_activity_codes_get",domain:"settings",operation:"read",description:"Get an activity code by ID",schema:Wd.shape,handler:async r=>{let{id:e}=Wd.parse(r);try{let t=await n.get(`/tenant/{tenant}/activities/${e}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"settings_activity_codes_list",domain:"settings",operation:"read",description:"List activity codes",schema:Kd.shape,handler:async r=>{let e=Kd.parse(r);try{let t=await n.get("/tenant/{tenant}/activities",d({page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,active:e.active,sort:e.sort}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"settings_activity_codes_export",domain:"settings",operation:"read",description:"Export activity codes",schema:tn.shape,handler:async r=>{let e=tn.parse(r);try{let t=await n.get("/tenant/{tenant}/export/activity-codes",d({from:e.from,includeRecentChanges:e.includeRecentChanges}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"settings_activity_categories_get",domain:"settings",operation:"read",description:"Get an activity category by ID",schema:Hd.shape,handler:async r=>{let{id:e}=Hd.parse(r);try{let t=await n.get(`/tenant/{tenant}/activity-categories/${e}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"settings_activity_categories_list",domain:"settings",operation:"read",description:"List activity categories",schema:Zd.shape,handler:async r=>{let e=Zd.parse(r);try{let t=await n.get("/tenant/{tenant}/activity-categories",d({page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,active:e.active,sort:e.sort}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"settings_activity_categories_export",domain:"settings",operation:"read",description:"Export activity categories",schema:tn.shape,handler:async r=>{let e=tn.parse(r);try{let t=await n.get("/tenant/{tenant}/export/activity-categories",d({from:e.from,includeRecentChanges:e.includeRecentChanges}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"settings_activity_types_get",domain:"settings",operation:"read",description:"Get an activity type by ID",schema:Vd.shape,handler:async r=>{let{id:e}=Vd.parse(r);try{let t=await n.get(`/tenant/{tenant}/activity-types/${e}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"settings_activity_types_list",domain:"settings",operation:"read",description:"List activity types",schema:Yd.shape,handler:async r=>{let e=Yd.parse(r);try{let t=await n.get("/tenant/{tenant}/activity-types",d({page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,active:e.active,sort:e.sort}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"settings_activities_export",domain:"settings",operation:"read",description:"Export activities",schema:tn.shape,handler:async r=>{let e=tn.parse(r);try{let t=await n.get("/tenant/{tenant}/export/activities",d({from:e.from,includeRecentChanges:e.includeRecentChanges}));return i(t)}catch(t){return o(c(t))}}})}import{z as Ke}from"zod";var Kg=Ke.object({name:Ke.string().optional().describe("Business unit name"),description:Ke.string().optional().describe("Business unit description"),active:Ke.boolean().optional().describe("Whether the business unit is active"),externalData:Ke.array(Ke.object({key:Ke.string().describe("External data key"),value:Ke.string().describe("External data value")}).describe("External data entry")).optional().describe("External data entries")}),Zg=u(p(Ke.object({...S(),ids:Ke.string().optional().describe("Comma-separated IDs (max 50)"),name:Ke.string().optional().describe("Business unit name filter"),externalDataApplicationGuid:Ke.string().uuid().optional().describe("External data application GUID")})));function Qd(n,a){a.register({name:"settings_business_units_get",domain:"settings",operation:"read",description:"Get a business unit by ID",schema:{id:Ke.number().int().describe("Business unit ID"),externalDataApplicationGuid:Ke.string().uuid().optional().describe("External data application GUID")},handler:async r=>{let{id:e,externalDataApplicationGuid:t}=r;try{let s=await n.get(`/tenant/{tenant}/business-units/${e}`,d({externalDataApplicationGuid:t}));return i(s)}catch(s){return o(c(s))}}}),a.register({name:"settings_business_units_list",domain:"settings",operation:"read",description:"List business units",schema:Zg.shape,handler:async r=>{let e=d(r);try{let t=await n.get("/tenant/{tenant}/business-units",e);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"settings_business_units_update",domain:"settings",operation:"write",description:"Update a business unit",schema:{id:Ke.number().int().describe("Business unit ID"),body:Kg.describe("Business unit update payload")},handler:async r=>{let{id:e,body:t}=r;try{let s=await n.patch(`/tenant/{tenant}/business-units/${e}`,d(t));return i(s)}catch(s){return o(c(s))}}})}import{z as We}from"zod";var Yg=We.object({key:We.string().describe("External data key"),value:We.string().describe("External data value")}).describe("External data entry"),Tn=We.object({id:We.number().int().describe("Tag type ID")}),am=We.object({name:We.string().describe("Tag type name"),description:We.string().optional().describe("Tag type description"),active:We.boolean().optional().describe("Whether the tag type is active"),color:We.string().optional().describe("Tag type color value"),displayOrder:We.number().int().optional().describe("Display order for this tag type"),externalData:We.array(Yg).optional().describe("External data entries")}),Xg=am.partial(),em=We.object({body:am.describe("Tag type create payload")}),tm=Tn.extend({body:Xg.describe("Tag type update payload")}),nm=u(p(We.object({...S(),...f(["Id","ModifiedOn","CreatedOn"])}))),rm=We.object({from:We.string().optional().describe("Continuation token from previous response or custom start date"),includeRecentChanges:We.boolean().optional().describe("Prioritize recent changes in the export stream")});function om(n,a){a.register({name:"settings_tag_types_get",domain:"settings",operation:"read",description:"Get a tag type by ID",schema:Tn.shape,handler:async r=>{let{id:e}=Tn.parse(r);try{let t=await n.get(`/tenant/{tenant}/tag-types/${e}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"settings_tag_types_list",domain:"settings",operation:"read",description:"List tag types",schema:nm.shape,handler:async r=>{let e=nm.parse(r);try{let t=await n.get("/tenant/{tenant}/tag-types",d({page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,active:e.active,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,sort:e.sort}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"settings_tag_types_create",domain:"settings",operation:"write",description:"Create a tag type",schema:em.shape,handler:async r=>{let e=em.parse(r);try{let t=await n.post("/tenant/{tenant}/tag-types",d(e.body));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"settings_tag_types_update",domain:"settings",operation:"write",description:"Update a tag type",schema:tm.shape,handler:async r=>{let{id:e,body:t}=tm.parse(r);try{let s=await n.patch(`/tenant/{tenant}/tag-types/${e}`,d(t));return i(s)}catch(s){return o(c(s))}}}),a.register({name:"settings_tag_types_delete",domain:"settings",operation:"delete",description:"Delete a tag type",schema:Tn.shape,handler:async r=>{let{id:e}=Tn.parse(r);try{return await n.delete(`/tenant/{tenant}/tag-types/${e}`),i({success:!0,message:"Tag type deleted"})}catch(t){return o(c(t))}}}),a.register({name:"settings_tag_types_export",domain:"settings",operation:"read",description:"Export tag types",schema:rm.shape,handler:async r=>{let e=rm.parse(r);try{let t=await n.get("/tenant/{tenant}/export/tag-types",d({from:e.from,includeRecentChanges:e.includeRecentChanges}));return i(t)}catch(t){return o(c(t))}}})}import{z as P}from"zod";var im=P.object({id:P.number().int().describe("Task ID"),includeSubtasks:P.boolean().optional().describe("Include subtasks in the response")}),sm=u(p(P.object({...S(),...f(["Id","CreatedOn","DescriptionModifiedOn","CompletedBy","Priority"]),reportedBefore:P.string().datetime().optional().describe("Reported date upper bound (UTC)"),reportedOnOrAfter:P.string().datetime().optional().describe("Reported date lower bound (UTC)"),completeBefore:P.string().datetime().optional().describe("Completion date upper bound (UTC)"),completeOnOrAfter:P.string().datetime().optional().describe("Completion date lower bound (UTC)"),isClosed:P.boolean().optional().describe("Deprecated: filter by task closure state (use statuses when possible)"),statuses:P.string().optional().describe("Comma-separated task statuses"),ids:P.string().optional().describe("Comma-separated task IDs"),name:P.string().optional().describe("Task name filter"),includeSubtasks:P.boolean().optional().describe("Include subtasks in each task payload"),businessUnitIds:P.string().optional().describe("Comma-separated business unit IDs"),employeeTaskTypeIds:P.string().optional().describe("Comma-separated employee task type IDs"),employeeTaskSourceIds:P.string().optional().describe("Comma-separated employee task source IDs"),employeeTaskResolutionIds:P.string().optional().describe("Comma-separated employee task resolution IDs"),reportedById:P.number().int().optional().describe("Reported by employee ID"),assignedToId:P.number().int().optional().describe("Assigned to employee ID"),involvedEmployeeIdList:P.string().optional().describe("Comma-separated involved employee IDs"),customerId:P.number().int().optional().describe("Customer ID"),jobId:P.number().int().optional().describe("Job ID"),projectId:P.number().int().optional().describe("Project ID"),priorities:P.string().optional().describe("Comma-separated task priorities"),taskNumber:P.number().int().optional().describe("Task number"),jobNumber:P.string().optional().describe("Job number")}))),cm=P.object({reportedById:P.number().int().optional().describe("ID of the person who reported the task"),assignedToId:P.number().int().optional().describe("ID of the assignee"),isClosed:P.boolean().optional().describe("Whether the task is already closed"),status:P.string().optional().describe("Task status"),name:P.string().describe("Task name"),businessUnitId:P.number().int().optional().describe("Business unit ID"),employeeTaskTypeId:P.number().int().optional().describe("Employee task type ID"),employeeTaskSourceId:P.number().int().optional().describe("Employee task source ID"),employeeTaskResolutionId:P.number().int().optional().describe("Employee task resolution ID"),reportedDate:P.string().optional().describe("Date the task was reported"),completeBy:P.string().optional().describe("Target completion date"),startedOn:P.string().optional().describe("Task start date"),involvedEmployeeIdList:P.array(P.number().int()).optional().describe("List of involved employee IDs"),customerId:P.number().int().optional().describe("Customer ID"),jobId:P.number().int().optional().describe("Job ID"),projectId:P.number().int().optional().describe("Project ID"),description:P.string().optional().describe("Task description"),priority:P.string().optional().describe("Task priority"),customerName:P.string().optional().describe("Customer name"),jobNumber:P.string().optional().describe("Job number"),refundIssued:P.number().optional().describe("Refund issued amount")}),dm=P.object({id:P.number().int().describe("Parent task ID"),body:P.object({name:P.string().optional().describe("Subtask name"),description:P.string().optional().describe("Subtask description"),assignedToId:P.number().int().optional().describe("Assigned employee ID"),status:P.string().optional().describe("Subtask status"),priority:P.string().optional().describe("Subtask priority"),completeBy:P.string().optional().describe("Target completion date"),isClosed:P.boolean().optional().describe("Whether the subtask is closed")}).passthrough().optional().describe("Subtask payload")});function mm(n,a){a.register({name:"settings_tasks_get",domain:"settings",operation:"read",description:"Get a task by ID",schema:im.shape,handler:async r=>{let e=im.parse(r);try{let t=await n.get(`/tenant/{tenant}/tasks/${e.id}`,d({includeSubtasks:e.includeSubtasks}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"settings_tasks_list",domain:"settings",operation:"read",description:"List tasks",schema:sm.shape,handler:async r=>{let e=sm.parse(r);try{let t=await n.get("/tenant/{tenant}/tasks",d({page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,active:e.active,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,modifiedBefore:e.modifiedBefore,modifiedOnOrAfter:e.modifiedOnOrAfter,reportedBefore:e.reportedBefore,reportedOnOrAfter:e.reportedOnOrAfter,completeBefore:e.completeBefore,completeOnOrAfter:e.completeOnOrAfter,isClosed:e.isClosed,statuses:e.statuses,ids:e.ids,name:e.name,includeSubtasks:e.includeSubtasks,businessUnitIds:e.businessUnitIds,employeeTaskTypeIds:e.employeeTaskTypeIds,employeeTaskSourceIds:e.employeeTaskSourceIds,employeeTaskResolutionIds:e.employeeTaskResolutionIds,reportedById:e.reportedById,assignedToId:e.assignedToId,involvedEmployeeIdList:e.involvedEmployeeIdList,customerId:e.customerId,jobId:e.jobId,projectId:e.projectId,priorities:e.priorities,taskNumber:e.taskNumber,jobNumber:e.jobNumber,sort:e.sort}));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"settings_tasks_create",domain:"settings",operation:"write",description:"Create a task",schema:cm.shape,handler:async r=>{let e=cm.parse(r);try{let t=await n.post("/tenant/{tenant}/tasks",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"settings_tasks_create_subtask",domain:"settings",operation:"write",description:"Create a subtask under an existing task",schema:dm.shape,handler:async r=>{let e=dm.parse(r);try{let t=await n.post(`/tenant/{tenant}/tasks/${e.id}/subtasks`,e.body?d(e.body):void 0);return i(t)}catch(t){return o(c(t))}}})}import{z as nn}from"zod";var pm=p(nn.object({...S(),ids:nn.string().optional().describe("Comma-separated role IDs (max 50)"),name:nn.string().optional().describe("Role name filter"),createdBefore:nn.string().datetime().optional().describe("Created date upper bound (UTC)"),createdOnOrAfter:nn.string().datetime().optional().describe("Created date lower bound (UTC)"),employeeType:nn.enum(["None","Employee","Technician","All"]).optional().describe("Filter roles by employee type")}));function lm(n,a){a.register({name:"settings_user_roles_list",domain:"settings",operation:"read",description:"List user roles",schema:pm.shape,handler:async r=>{let e=pm.parse(r);try{let t=await n.get("/tenant/{tenant}/user-roles",d({ids:e.ids,name:e.name,active:e.active,page:e.page,pageSize:e.pageSize,includeTotal:e.includeTotal,createdBefore:e.createdBefore,createdOnOrAfter:e.createdOnOrAfter,employeeType:e.employeeType}));return i(t)}catch(t){return o(c(t))}}})}var Qg=(n,a)=>{Qd(n,a),om(n,a),Xd(n,a),mm(n,a),lm(n,a)},um=Qg;var ef=[["accounting",Ka],["crm",Do],["dispatch",Si],["estimates",Ei],["export",Mi],["intelligence",Ds],["inventory",pc],["marketing",wc],["memberships",Gc],["payroll",ad],["people",wd],["pricebook",xd],["reporting",Ld],["scheduling",Jd],["settings",um]];async function pD(n,a){for(let[r,e]of ef)n.registerDomain(r,e)}var bm={debug:10,info:20,warn:30,error:40},hm=class{constructor(a){this.level=a}debug(a,r){this.log("debug",a,r)}info(a,r){this.log("info",a,r)}warn(a,r){this.log("warn",a,r)}error(a,r){this.log("error",a,r)}log(a,r,e){if(!this.shouldLog(a))return;let t={level:a,ts:new Date().toISOString(),msg:r,...e??{}};try{process.stderr.write(`${JSON.stringify(t,(s,m)=>typeof m=="bigint"?m.toString():m)}
|
|
53
|
+
`)}catch{process.stderr.write(`${JSON.stringify({level:a,ts:new Date().toISOString(),msg:r,error:"Log serialization failed"})}
|
|
54
|
+
`)}}shouldLog(a){return bm[a]>=bm[this.level]}};import{z as gm}from"zod";var fm=class{constructor(a,r,e,t=new Sn(e)){this.server=a;this.config=r;this.logger=e;this.auditLogger=t}registered=0;skipped=0;domainFiltered=0;byDomain={};registeredTools=[];registeredToolNames=new Set;client=null;attachClient(a){this.client=a}get timezone(){return this.config.timezone}register(a){let r=a.domain.toLowerCase();if(r!=="_system"&&this.config.enabledDomains!==null&&!this.config.enabledDomains.includes(r)){this.skipped+=1,this.domainFiltered+=1,this.logger.debug("Skipped tool due to domain filter",{tool:a.name,domain:r});return}let e=this.wrapTool({...a,domain:r});if(this.registeredToolNames.has(e.name))throw new Error(`Tool "${e.name}" is already registered`);this.server.tool(e.name,e.schema,e.handler),this.registered+=1,this.byDomain[r]=(this.byDomain[r]??0)+1,this.registeredToolNames.add(e.name),this.registeredTools.push(e)}registerDomain(a,r){if(!this.client){this.logger.warn("Skipped domain registration because client is unavailable",{domain:a});return}try{r(this.client,this),this.logger.debug("Loaded domain module",{domain:a})}catch(e){throw this.logger.error("Failed to load domain module",{domain:a,error:e instanceof Error?e.message:String(e)}),e}}getStats(){return{registered:this.registered,skipped:this.skipped,byDomain:{...this.byDomain}}}getRegisteredTools(){return[...this.registeredTools]}logSummary(){this.logger.info(`Registered ${this.registered} tools (${this.skipped} skipped, ${this.domainFiltered} domain-filtered)`,{registered:this.registered,skipped:this.skipped,domainFiltered:this.domainFiltered})}wrapTool(a){let r=a.operation==="write",e=a.operation==="delete",t=a.operation==="write"||a.operation==="delete",s=t,m=e?{...a.schema,confirm:a.schema.confirm??gm.boolean().optional().default(!1).describe("Set to true to confirm this potentially destructive action")}:r?{...a.schema,_confirmed:a.schema._confirmed??gm.boolean().optional().describe("Set to true to confirm this write operation")}:a.schema,b=a.handler;return{...a,schema:m,handler:async(X,B)=>{let H=this.toRecord(X),G=!e||H.confirm===!0,_=r?this.withoutWriteConfirmation(H):e?this.withoutConfirm(H):H,V=this.authorizeCaller(B);if(V)return V;if(t&&this.config.readonlyMode)return o("Readonly mode: operation not permitted");if(r&&this.config.confirmWrites&&H._confirmed!==!0)return o("Write confirmation required. Re-call with _confirmed: true to proceed.");if(!G)return i(this.buildConfirmationPreview(a,H));try{let pe=await b(_,B);return s&&this.auditLogger.log(this.buildAuditEntry(a,_,!pe.isError,pe)),pe}catch(pe){throw s&&this.auditLogger.log(this.buildAuditEntry(a,_,!1,void 0,pe instanceof Error?pe.message:String(pe))),pe}}}}toRecord(a){return typeof a!="object"||a===null||Array.isArray(a)?{}:{...a}}withoutConfirm(a){let{confirm:r,...e}=a;return e}withoutWriteConfirmation(a){let{_confirmed:r,confirm:e,...t}=a;return t}authorizeCaller(a){if(this.config.allowedCallers==null)return null;let r=this.extractCallerIdentity(a);return r?this.config.allowedCallers.includes(r)?null:o("Authorization failed: caller not permitted"):o("Authorization failed: caller identity unavailable")}extractCallerIdentity(a){let r=this.toRecord(a?.authInfo?.extra),e=this.toRecord(a?._meta),t=this.normalizeHeaders(a?.requestInfo?.headers),s=[a?.authInfo?.clientId,this.readString(r,"caller"),this.readString(r,"user"),this.readString(r,"username"),this.readString(r,"email"),this.readString(r,"sub"),this.readString(e,"caller"),this.readString(e,"user"),this.readString(e,"username"),this.readString(e,"email"),t["x-caller-id"],t["x-user-id"],t["x-user-email"],t["x-forwarded-user"],t["x-auth-request-email"],t["x-ms-client-principal-name"]];for(let m of s){let b=this.normalizeCaller(m);if(b)return b}return null}normalizeHeaders(a){return a?Object.fromEntries(Object.entries(a).map(([r,e])=>[r.toLowerCase(),Array.isArray(e)?e[0]:e])):{}}readString(a,r){let e=a[r];return typeof e=="string"?e:void 0}normalizeCaller(a){if(typeof a!="string")return null;let r=a.trim().toLowerCase();return r.length>0?r:null}buildConfirmationPreview(a,r){let e=this.extractResource(a.name),t=this.extractResourceId(r);return{action:a.operation.toUpperCase(),resource:e,id:t,warning:a.operation==="delete"?`This will permanently delete the ${e}.`:`This will modify ${e} data in ServiceTitan.`,confirm:`Call ${a.name} again with confirm=true to proceed.`}}buildAuditEntry(a,r,e,t,s){return{timestamp:new Date().toISOString(),tool:a.name,operation:a.operation,domain:a.domain,resource:this.extractResource(a.name),resourceId:this.extractResourceId(r),params:er(r),success:e,error:s??this.extractResultError(t)}}extractResultError(a){if(!a?.isError)return;let r=a.content?.[0];return typeof r?.text=="string"?r.text:"Tool execution failed"}extractResource(a){let r=a.split("_");return r.length<3?a:r.slice(1,-1).join("_")}extractResourceId(a){if(typeof a.id=="number"||typeof a.id=="string")return a.id;for(let[r,e]of Object.entries(a))if(/id$/i.test(r)&&(typeof e=="number"||typeof e=="string"))return e}};export{Sn as a,of as b,sf as c,i as d,fa as e,bf as f,pD as g,hm as h,fm as i};
|