@rowvyn/servicetitan-mcp 2.5.2 → 2.6.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.
@@ -0,0 +1,54 @@
1
+ var zm=["secret","password","token","key","auth","credential","apikey","accesstoken"],$m=["phone","email","firstname","lastname","address","street","zipcode","ssn","socialsecurity","dateofbirth","bankaccount","routingnumber","creditcard","cardnumber","contactnumber"],Gm=new Set(["name","city","zip","dob"]);function la(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function ua(n){return Array.isArray(n)?n.map(a=>ua(a)):la(n)?ba(n):n}function ba(n){let a={};for(let[r,e]of Object.entries(n)){let t=r.toLowerCase();if(!zm.some(s=>t.includes(s))){if(Gm.has(t)||$m.some(s=>t.includes(s))){a[r]="[REDACTED]";continue}a[r]=ua(e)}}return a}function ar(n){return la(n)?ba(n):{}}var Dn=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 dt}from"zod";var qm=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"]),ha=new Map([["staleEstimates",3],["byTechnician",4],["campaigns",3],["technicians",3]]),Jm=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"]]),Wm=new Set(["amount","balance","cost","credit","debit","estimate","fee","fees","income","invoice","payment","pay","price","profit","revenue","sale","sales","tax","ticket","value","wage"]),Hm=new Set(["efficiency","margin","pct","percent","percentage","rate","ratio","share","utilization"]),Vm=new Set(["date","scheduleddate","duedate","expirationdate"]),Km=/^(\d{4}-\d{2}-\d{2})T(\d{2}):(\d{2})(?::\d{2}(?:\.\d+)?)?(?:Z|[+-]\d{2}:\d{2})?$/;function Zm(n){if(typeof n!="object"||n===null||Array.isArray(n))return!1;let a=Object.getPrototypeOf(n);return a===Object.prototype||a===null}function Ym(n=process.env){return n.ST_RESPONSE_SHAPING?.trim().toLowerCase()!=="false"}function Xm(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 Qm(n){let a=Xm(n);return a.some(r=>Hm.has(r))?1:a.some(r=>Wm.has(r))?2:null}function ep(n,a){if(!Number.isFinite(n))return n;let r=Qm(a);if(r===null)return n;let e=10**r;return Math.round((n+Number.EPSILON)*e)/e}function tp(n,a){let r=Km.exec(n);if(!r)return n;if(a&&Vm.has(a.toLowerCase())){let[,e]=r;return e}return n}function or(n,a={}){if(Array.isArray(n)){let r=n.map(t=>or(t,{parentKey:a.parentKey,currentKey:a.currentKey})),e=a.parentKey?ha.get(a.parentKey):void 0;return e===void 0?r:r.slice(0,e)}if(Zm(n)){let r={};for(let[e,t]of Object.entries(n)){if(qm.has(e))continue;let s=or(t,{parentKey:e,currentKey:e}),m=Jm.get(e)??e;r[m]=s;let u=Array.isArray(t)?t:void 0;if(u){let S=ha.get(e);S!==void 0&&u.length>S&&(r._truncated=!0,r._total=u.length)}}return r}return typeof n=="number"?ep(n,a.currentKey):typeof n=="string"?tp(n,a.currentKey):n}function ga(n){return Ym()?or(n):n}var np=1e5,Cn=np,fa="UTC",rp=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(:\d{2}(\.\d+)?)?(Z|[+-]\d{2}:\d{2})$/,ya=new Map;function Oy(n){if(!Number.isInteger(n)||n<=0)throw new Error(`maxResponseChars must be a positive integer. Received: ${n}`);Cn=n}function Ry(n){fa=n.trim()===""?"UTC":n}function ap(n){if(typeof n!="object"||n===null||Array.isArray(n))return!1;let a=Object.getPrototypeOf(n);return a===Object.prototype||a===null}function op(n){return n.trim().toUpperCase()==="UTC"}function ip(n){let a=ya.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 ya.set(n,r),r}function sp(n,a){let r=new Date(n);if(Number.isNaN(r.getTime()))return n;let e=ip(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 u=Math.round((m.getTime()-r.getTime())/6e4),S=u>=0?"+":"-",X=Math.abs(u),B=String(Math.floor(X/60)).padStart(2,"0"),H=String(X%60).padStart(2,"0");return`${s}${S}${B}:${H}`}var cp=/(^|[a-z0-9_])utc\b/i;function dp(n){return n?cp.test(n):!1}function ir(n,a,r){return op(a)?n:Array.isArray(n)?n.map(e=>ir(e,a,r)):ap(n)?Object.fromEntries(Object.entries(n).map(([e,t])=>[e,ir(t,a,e)])):typeof n=="string"&&rp.test(n)?dp(r)?n:sp(n,a):n}function i(n,a){let r=a?.shape?ga(n):n,e=a?.timezone??fa,t=ir(r,e),s=JSON.stringify(t,null,2);if(s.length>Cn){let m={_truncated:!0,_originalSize:s.length,_message:`Response was ${s.length.toLocaleString()} characters (limit: ${Cn.toLocaleString()}). Use pagination (page/pageSize) to get smaller result sets.`,_preview:s.slice(0,Math.max(0,Cn-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:dt.number().int().min(1).optional().describe("Page number (starts at 1)"),pageSize:dt.number().int().min(1).max(5e3).optional().describe("Records per page (default 50)"),includeTotal:dt.boolean().optional().describe("Include total count in response")})}function b(n){return n.extend({createdBefore:dt.string().datetime().optional(),createdOnOrAfter:dt.string().datetime().optional(),modifiedBefore:dt.string().datetime().optional(),modifiedOnOrAfter:dt.string().datetime().optional()})}function T(){return{active:dt.enum(["True","Any","False"]).optional().default("True").describe("Filter by active status")}}function y(n){let a=new Set(n);return{sort:dt.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 dt.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 mp from"https";import sr from"axios";var pp=6e4,va=new mp.Agent({keepAlive:!0,maxSockets:32,maxFreeSockets:10,timeout:6e4}),cr={"/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","/estimate-templates":"sales","/proposal-templates":"sales","/proposal-types":"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"},Ia={"/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"},lp={integration:{authUrl:"https://auth-integration.servicetitan.io",apiUrl:"https://api-integration.servicetitan.io"},production:{authUrl:"https://auth.servicetitan.io",apiUrl:"https://api.servicetitan.io"}},cn=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}}},Ta=class{constructor(a){this.config=a;let r=lp[a.environment];this.authUrl=r.authUrl,this.http=sr.create({baseURL:r.apiUrl,timeout:6e4,httpsAgent:va}),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 deleteWithBody(a,r,e){return this.request("delete",a,r,e)}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(u){throw this.sanitizeError(u,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 u=r[2]==="/export",S=r[3],B=(u?Ia:cr)[S];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 u=Ia[s];if(u)return`/${u}/v2${a}`;let S=cr[s];if(S)return`/${S}/v2${a}`}let m=cr[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-pp;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 sr.post(`${this.authUrl}/connect/token`,a.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded"},httpsAgent:va,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(sr.isAxiosError(a)){let e=a.response?.status??0,t=this.extractServiceTitanMessage(a)??"Request failed";return new cn(e,t,r)}return a instanceof Error?new cn(0,a.message,r):new cn(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=r;if(e.errors&&typeof e.errors=="object"){let s=Object.entries(e.errors).map(([m,u])=>{let S=Array.isArray(u)?u.filter(X=>typeof X=="string").join("; "):String(u);return`${m}: ${S}`}).join(" | ");if(s.length>0)return`${typeof e.title=="string"?e.title:"Validation error"} \u2014 ${s}`}if(typeof e.title=="string"&&e.title.trim().length>0){let s=typeof e.detail=="string"?` \u2014 ${e.detail}`:"";return`${e.title}${s}`}let t=["message","error_description","error"];for(let s of t){let m=e[s];if(typeof m=="string"&&m.trim().length>0)return m}}return a.message??null}};var up=["ST_CLIENT_ID","ST_CLIENT_SECRET","ST_APP_KEY","ST_TENANT_ID"],Sa=["integration","production"],wa=["debug","info","warn","error"];function _a(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 bp(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 hp(n){let a=(n??"integration").trim().toLowerCase();if(Sa.includes(a))return a;throw new Error(`ST_ENVIRONMENT must be one of: ${Sa.join(", ")}. Received: ${n}`)}function gp(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 yp(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 fp(n){let a=(n??"info").trim().toLowerCase();if(wa.includes(a))return a;throw new Error(`ST_LOG_LEVEL must be one of: ${wa.join(", ")}. Received: ${n}`)}function vp(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 dn(n,a){return(n[a]??"").trim()}function Ly(n=process.env){let a=up.filter(r=>dn(n,r)==="");if(a.length>0)throw new Error(`Missing required environment variables: ${a.join(", ")}`);return{clientId:dn(n,"ST_CLIENT_ID"),clientSecret:dn(n,"ST_CLIENT_SECRET"),appKey:dn(n,"ST_APP_KEY"),tenantId:dn(n,"ST_TENANT_ID"),environment:hp(n.ST_ENVIRONMENT),readonlyMode:_a(n.ST_READONLY,"ST_READONLY",!0),confirmWrites:_a(n.ST_CONFIRM_WRITES,"ST_CONFIRM_WRITES",!1),maxResponseChars:bp(n.ST_MAX_RESPONSE_CHARS,"ST_MAX_RESPONSE_CHARS",1e5),enabledDomains:gp(n.ST_DOMAINS),logLevel:fp(n.ST_LOG_LEVEL),timezone:vp(n.ST_TIMEZONE),corsOrigin:n.ST_CORS_ORIGIN??"",allowedCallers:yp(n.ST_ALLOWED_CALLERS)}}import{z as pn}from"zod";import{createHash as Ip}from"node:crypto";var Ca=500,dr=Number(process.env.ST_INTEL_MAX_PAGES)||20,mr=1440*60*1e3,ka=/^\d{4}-\d{2}-\d{2}$/,Oa=process.env.ST_TIMEZONE||"UTC",Tp=Number(process.env.ST_INTEL_CACHE_TTL_MS)||300*1e3,Da=new Map,kn=new Map;function Sp(n,a){let r=JSON.stringify(a,Object.keys(a).sort());return`${n}:${Ip("sha256").update(r).digest("hex").slice(0,16)}`}async function Ra(n,a,r,e=Tp){let t=Sp(n,a),s=Da.get(t);if(s&&s.expiresAt>Date.now())return s.value;let m=kn.get(t);if(m)return m;let u=r().then(S=>(Da.set(t,{value:S,expiresAt:Date.now()+e}),kn.delete(t),S)).catch(S=>{throw kn.delete(t),S});return kn.set(t,u),u}function Fe(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function g(n){return n instanceof Error?n.message:String(n)}function wp(n,a=Oa){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 pr(n=Oa){return wp(new Date,n)}async function re(n,a,r,e){try{return await r()}catch(t){return n.push(`${a} unavailable: ${g(t)}`),e}}async function mt(n,a,r,e=dr,t){let s=await _p(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 _p(n,a,r,e=dr){let t=[],s=1,m,u=!1;for(;s<=e;){let S=await n.get(a,d({...r,page:s,pageSize:Ca,includeTotal:!0}));s===1&&Fe(S)&&typeof S.totalCount=="number"&&(m=S.totalCount);let X=ja(S);if(t.push(...X),!(Fe(S)&&S.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.`),u=!0;break}s+=1}return{data:t,totalCount:m,_truncated:u||void 0}}async function Rt(n,a,r,e=dr,t){let s=[];for(let S=1;S<=e;S++)s.push(n.get(a,d({...r,page:S,pageSize:Ca})).then(X=>({items:ja(X)})).catch(X=>({items:[],error:X})));let m=await Promise.all(s),u=m.filter(S=>S.error);if(u.length>0){let S=`Failed to fetch ${u.length}/${m.length} pages from ${a}. Results may be incomplete.`;console.warn(S),t?.push(S)}return m.flatMap(S=>S.items)}function ja(n){return Array.isArray(n)?n:Fe(n)&&Array.isArray(n.data)?n.data:[]}function xa(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 me(n,a,r=0){if(a===0||!Number.isFinite(a))return r;let e=n/a;return Number.isFinite(e)?e:r}function pe(n,a){return n.reduce((r,e)=>r+xa(a(e)),0)}function Dp(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 u=e.find(S=>S.type===m);return u?Number.parseInt(u.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 Xe(n,a,r="UTC"){let e=Gt(n,!1,r),t=Gt(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 Aa(n,a="UTC"){let r=Gt(n,!1,a),e=Gt(n,!0,a),t=Cp(n),s=Gt(t,!1,a);return{start:r,end:e,startIso:r.toISOString(),endIso:e.toISOString(),nextDate:t,nextDayStartIso:s.toISOString()}}function Rn(n,a,r="UTC"){return Gt(n,a,r).toISOString()}function Gt(n,a,r="UTC"){if(!ka.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=Dp(r,t);if(a){let m=new Date(t.getTime()+mr);return new Date(m.getTime()-s-1)}return new Date(t.getTime()-s)}function Cp(n){if(!ka.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"),u=String(t.getUTCDate()).padStart(2,"0");return`${s}-${m}-${u}`}function f(n){return xa(n)}function se(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 lr(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 kp(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(!Fe(e))return;e=e[t]}return e}function Ae(n,a){for(let r of a){let e=kp(n,r);if(e!=null)return e}}function qt(n,a=[]){let r=Ae(n,["status.name","status.value","status","jobStatus","appointmentStatus","callStatus",...a]),e=se(r);return e?e.toLowerCase():""}function On(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 Pa(n,a,r){if(a.getTime()<n.getTime())return 0;let e=On(n,r),t=On(a,r),s=Date.UTC(e.year,e.month,e.day),m=Date.UTC(t.year,t.month,t.day),u=0;for(;s<=m;){let S=new Date(s).getUTCDay();S!==0&&S!==6&&(u+=1),s+=mr}return u}function ur(n,a,r){let e=On(n,r),t=On(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)/mr))}function mn(n){return h(n,2).toLocaleString("en-US",{minimumFractionDigits:0,maximumFractionDigits:2})}var Op=b(p(pn.object({ids:pn.string().optional().describe("Comma-delimited AP credit IDs (max 50)"),...y(["Id","CreatedOn","ModifiedOn"])}))),Ea=pn.object({ids:pn.array(pn.number().int().describe("AP credit ID")).min(1).describe("AP credit IDs to mark as exported")});function Ba(n,a){a.register({name:"accounting_ap_credits_mark_as_exported",domain:"accounting",operation:"write",description:"Mark AP credits as exported",schema:Ea.shape,handler:async r=>{let e=Ea.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:Op.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 ln}from"zod";var Rp=b(p(ln.object({ids:ln.string().optional().describe("Comma-delimited AP payment IDs (max 50)"),...y(["Id","CreatedOn","ModifiedOn"])}))),La=ln.object({ids:ln.array(ln.number().int().describe("AP payment ID")).min(1).describe("AP payment IDs to mark as exported")});function Ua(n,a){a.register({name:"accounting_ap_payments_mark_as_exported",domain:"accounting",operation:"write",description:"Mark AP payments as exported",schema:La.shape,handler:async r=>{let e=La.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:Rp.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 _e}from"zod";var Ma=_e.object({name:_e.string().describe("GL account name"),number:_e.string().describe("GL account number"),description:_e.string().optional().describe("GL account description"),type:_e.string().describe("GL account type"),subtype:_e.string().describe("GL account subtype"),active:_e.boolean().optional().describe("Whether account is active"),isIntacctGroup:_e.boolean().optional().describe("Whether this is an Intacct group account"),isIntacctBankAccount:_e.boolean().optional().describe("Whether this is an Intacct bank account")}),jp=Ma.partial(),xp=b(p(_e.object({ids:_e.string().optional().describe("Comma-delimited account IDs (max 50)"),names:_e.string().optional().describe("Comma-delimited account names (max 50)"),numbers:_e.string().optional().describe("Comma-delimited account numbers (max 50)"),types:_e.string().optional().describe("Comma-delimited account types (max 50)"),subtypes:_e.string().optional().describe("Comma-delimited account subtypes (max 50)"),description:_e.string().max(255).optional().describe("Description contains value"),source:_e.enum(["Undefined","AccountingSystem","ManuallyCreated","PublicApi"]).optional().describe("Account source"),...T(),isIntacctGroup:_e.boolean().optional().describe("Only Intacct group accounts"),isIntacctBankAccount:_e.boolean().optional().describe("Only Intacct bank accounts"),...y(["Id","Name","Number","ModifiedOn","CreatedOn"])}))),Ap=b(p(_e.object({ids:_e.string().optional().describe("Comma-delimited account type IDs (max 50)"),names:_e.string().optional().describe("Comma-delimited account type names (max 50)"),...T(),...y(["Id","Name","ModifiedOn","CreatedOn"])}))),Pp=_e.object({accountId:_e.number().int().describe("GL account ID")}),Ep=_e.object({accountId:_e.number().int().describe("GL account ID"),payload:jp.optional().describe("Fields to patch on the GL account")});function Fa(n,a){a.register({name:"accounting_gl_accounts_get",domain:"accounting",operation:"read",description:"Get a GL account by ID",schema:Pp.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:Ma.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:xp.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:Ep.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:Ap.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()]),Lp=k.object({}).catchall(Bp).describe("Custom field key/value map"),Up=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")}),Na=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")}),Mp=p(b(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"),...y(["Id","ModifiedOn","CreatedOn","Number","InvoicedOn","DueDate","Total","Balance"])}))),Fp=k.object({id:k.number().int().describe("Invoice ID"),payload:Up.optional().describe("Invoice fields to patch")}),Np=k.object({customFields:Lp.describe("Invoice custom fields payload")}),zp=k.object({invoiceId:k.number().int().describe("Invoice ID"),itemId:k.number().int().describe("Invoice item ID")}),$p=k.object({invoiceId:k.number().int().describe("Invoice ID"),payload:k.union([Na,k.array(Na).describe("Invoice item patch operations")]).optional().describe("Invoice item patch payload")}),Gp=b(p(k.object({...y(["Id","Name","CreatedOn","ModifiedOn"])}))),za=k.object({payload:k.object({}).passthrough().describe("Invoice adjustment payload")}),$a=k.object({ids:k.array(k.number().int().describe("Invoice ID")).min(1).describe("Invoice IDs to mark as exported")});function Ga(n,a){a.register({name:"accounting_invoices_create_adjustment",domain:"accounting",operation:"write",description:"Create an adjustment invoice",schema:za.shape,handler:async r=>{let e=za.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:Np.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:Fp.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:Mp.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:Gp.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:zp.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:$p.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:$a.shape,handler:async r=>{let e=$a.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 ae}from"zod";var qp=ae.object({id:ae.string().uuid().describe("Journal entry UUID")}),qa=p(qp),Jp=p(b(ae.object({ids:ae.string().optional().describe("Comma-delimited journal entry IDs (max 50)"),exportedFrom:ae.string().datetime().optional().describe("Exported on or after UTC timestamp"),exportedTo:ae.string().datetime().optional().describe("Exported on or before UTC timestamp"),postedFrom:ae.string().datetime().optional().describe("Posted on or after UTC timestamp"),postedTo:ae.string().datetime().optional().describe("Posted on or before UTC timestamp"),exportedBy:ae.string().optional().describe("Comma-delimited user IDs who exported entries"),name:ae.string().max(255).optional().describe("Journal entry name contains"),numberFrom:ae.number().int().optional().describe("Entry number lower bound"),numberTo:ae.number().int().optional().describe("Entry number upper bound"),statuses:ae.array(ae.string()).max(50).optional().describe("Entry statuses"),syncStatuses:ae.array(ae.string()).max(50).optional().describe("Sync statuses"),transactionPostedFrom:ae.string().datetime().optional().describe("Contains transaction posted on or after UTC timestamp"),transactionPostedTo:ae.string().datetime().optional().describe("Contains transaction posted on or before UTC timestamp"),businessUnitIds:ae.string().optional().describe("Comma-delimited business unit IDs (max 50)"),serviceAgreementIds:ae.string().optional().describe("Comma-delimited service agreement IDs (max 50)"),customerName:ae.string().max(255).optional().describe("Customer name contains"),locationName:ae.string().max(255).optional().describe("Location name contains"),vendorName:ae.string().max(255).optional().describe("Vendor name contains"),inventoryLocationName:ae.string().max(255).optional().describe("Inventory location name contains"),refNumber:ae.string().max(255).optional().describe("Transaction reference number contains"),transactionTypes:ae.array(ae.string()).max(50).optional().describe("Transaction types"),customField:ae.record(ae.string()).optional().describe("Custom field name/value filters"),...y(["Id","Number","Name","Status","CreatedOn","ExportedOn","ExportedBy","PostDate"])}))),Wp=ae.object({name:ae.string().optional().describe("Journal entry name"),status:ae.enum(["Open","Closed","Draft"]).optional().describe("Journal entry status"),customFields:ae.array(ae.object({name:ae.string().describe("Custom field name"),value:ae.string().describe("Custom field value")})).optional().describe("Custom fields")}).partial(),Hp=ae.object({id:ae.string().uuid().describe("Journal entry UUID"),payload:Wp.optional().describe("Journal entry patch payload")}),Vp=ae.object({id:ae.string().uuid().describe("Journal entry UUID")});function Kp(n){return n?Object.fromEntries(Object.entries(n).map(([a,r])=>[`customField.${a}`,r])):{}}function Ja(n,a){a.register({name:"accounting_journal_entries_get_summary",domain:"accounting",operation:"read",description:"Get journal entry summary rows",schema:qa.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:qa.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:Jp.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,...Kp(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:Hp.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:Vp.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 jn}from"zod";var Zp=jn.object({paymentTermId:jn.number().int().describe("Payment term ID")}),Yp=p(b(jn.object({ids:jn.string().optional().describe("Comma-delimited payment term IDs (max 50)"),...y(["Id","Name","CreatedOn"])})));function Wa(n,a){a.register({name:"accounting_payment_terms_get",domain:"accounting",operation:"read",description:"Get a payment term by ID",schema:Zp.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:Yp.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 xn}from"zod";var Xp=xn.object({id:xn.number().int().describe("Payment type ID")}),Qp=p(b(xn.object({ids:xn.string().optional().describe("Comma-delimited payment type IDs (max 50)"),...T()})));function Ha(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:Qp.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 el=q.union([q.string(),q.number(),q.boolean(),q.null()]),tl=q.object({}).catchall(el).describe("Custom field key/value map"),nl=q.object({invoiceId:q.number().int().optional().describe("Invoice ID receiving payment"),amount:q.number().optional().describe("Split amount")}),rl=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(nl).optional().describe("Invoice split allocations")}),al=p(b(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"),...y(["Id","CreatedOn","ModifiedOn","PaidOn","Total"])}))),vf=q.object({id:q.number().int().describe("Payment ID")}),ol=q.object({id:q.number().int().describe("Payment ID"),payload:rl.optional().describe("Payment fields to patch")}),il=q.object({customFields:tl.describe("Payment custom fields payload")}),sl=b(p(q.object({...y(["Id","Name","CreatedOn","ModifiedOn"])}))),Va=q.object({payload:q.object({}).passthrough().describe("Payment create payload")}),Ka=q.object({payload:q.object({}).passthrough().describe("Payment status update payload")});function Za(n,a){a.register({name:"accounting_payments_create",domain:"accounting",operation:"write",description:"Create a payment",schema:Va.shape,handler:async r=>{let e=Va.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:il.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:sl.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:al.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:Ka.shape,handler:async r=>{let e=Ka.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:ol.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 Ya}from"zod";var cl=p(b(Ya.object({ids:Ya.string().optional().describe("Comma-delimited tax zone IDs"),...T(),...y(["Id","Name","CreatedOn"])})));function Xa(n,a){a.register({name:"accounting_tax_zones_list",domain:"accounting",operation:"read",description:"List tax zones",schema:cl.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 dl=(n,a)=>{Ba(n,a),Ua(n,a),Fa(n,a),Ga(n,a),Ja(n,a),Za(n,a),Ha(n,a),Wa(n,a),Xa(n,a)},Qa=dl;import{z as nt}from"zod";var ml=nt.object({id:nt.number().int().describe("Booking provider tag ID")}),pl=nt.object({tagName:nt.string().optional().describe("Booking provider tag name"),description:nt.string().optional().describe("Booking provider tag description")}),ll=nt.object({id:nt.number().int().describe("Booking provider tag ID"),tagName:nt.string().optional().describe("Booking provider tag name"),description:nt.string().optional().describe("Booking provider tag description")}),ul=b(p(nt.object({name:nt.string().optional().describe("Booking provider tag name"),ids:nt.string().optional().describe("Comma-delimited booking provider tag IDs"),...y(["Id","ModifiedOn","CreatedOn"])})));function eo(n,a){a.register({name:"crm_booking_provider_tags_create",domain:"crm",operation:"write",description:"Create a booking provider tag",schema:pl.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:ml.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:ll.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:ul.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 bl=K.object({id:K.number().int().describe("Booking ID")}),hl=K.object({bookingProvider:K.number().int().describe("Booking provider ID"),id:K.number().int().describe("Booking ID")}),no=b(p(K.object({ids:K.string().optional().describe("Comma-delimited booking IDs (max 50)"),externalId:K.string().optional().describe("External booking ID"),...y(["Id","ModifiedOn","CreatedOn"])}))),ro=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")}),gl=K.object({bookingProvider:K.number().int().describe("Booking provider ID"),id:K.number().int().describe("Booking ID"),payload:ro.optional().describe("Booking patch payload")}),yl=K.object({bookingProvider:K.number().int().describe("Booking provider ID"),body:ro.describe("Booking create payload")}),to=K.object({type:K.string().describe("Contact type"),value:K.string().describe("Contact value"),memo:K.string().optional().describe("Contact memo")}),fl=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")}),vl=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")}),Il=p(K.object({id:K.number().int().describe("Booking ID")})),Tl=p(K.object({bookingProvider:K.number().int().describe("Booking provider ID"),id:K.number().int().describe("Booking ID")})),Sl=no.extend({bookingProvider:K.number().int().describe("Booking provider ID")});function ao(n,a){a.register({name:"crm_bookings_get",domain:"crm",operation:"read",description:"Get a booking by ID",schema:bl.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:hl.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:Il.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:no.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:gl.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:yl.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:fl.shape,handler:async r=>{let e=r;try{let t=to.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:Sl.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:Tl.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:vl.shape,handler:async r=>{let e=r;try{let t=to.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 br}from"zod";var wl=br.object({tags:br.array(br.string()).describe("Tags to add")});function oo(n,a){a.register({name:"crm_bulk_tags_add_tags",domain:"crm",operation:"write",description:"Add bulk tags",schema:wl.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 Ie}from"zod";var io=Ie.object({contactId:Ie.string().uuid().describe("Contact ID"),contactMethodId:Ie.string().uuid().describe("Contact method ID")}),_l=Ie.object({referenceId:Ie.string().optional().describe("External reference ID"),type:Ie.string().optional().describe("Contact method type"),value:Ie.string().optional().describe("Contact method value"),memo:Ie.string().optional().describe("Contact method memo")}),Dl=Ie.object({contactId:Ie.string().uuid().describe("Contact ID"),type:Ie.string().describe("Contact method type"),value:Ie.string().describe("Contact method value"),memo:Ie.string().optional().describe("Contact method memo")}),Cl=b(p(Ie.object({contactId:Ie.string().uuid().describe("Contact ID"),referenceId:Ie.string().optional().describe("Reference ID filter"),type:Ie.string().optional().describe("Contact method type filter"),value:Ie.string().optional().describe("Contact method value filter"),...y(["Id","ModifiedOn","CreatedOn"])}))),kl=Ie.object({contactId:Ie.string().uuid().describe("Contact ID"),contactMethodId:Ie.string().uuid().describe("Contact method ID"),payload:Ie.object({value:Ie.string().optional().describe("Contact method value"),memo:Ie.string().optional().describe("Contact method memo")}).optional().describe("Contact method patch payload")}),Ol=Ie.object({contactId:Ie.string().uuid().describe("Contact ID"),contactMethodId:Ie.string().uuid().describe("Contact method ID"),payload:_l.optional().describe("Contact method replace payload")});function so(n,a){a.register({name:"crm_contact_methods_get",domain:"crm",operation:"read",description:"Get a contact method",schema:io.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:Dl.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:Cl.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:kl.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:Ol.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:io.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 ge}from"zod";var po=ge.string().regex(/^[a-zA-Z0-9_-]+$/,"Must contain only alphanumeric characters, hyphens, and underscores"),co=ge.object({id:ge.string().uuid().describe("Contact ID")}),lo=ge.object({referenceId:ge.string().optional().describe("External reference ID"),name:ge.string().optional().describe("Contact name"),title:ge.string().optional().describe("Contact title"),isArchived:ge.boolean().optional().describe("Archived flag")}),Rl=ge.object({id:ge.string().uuid().describe("Contact ID"),body:lo.describe("Contact replacement payload")}),jl=ge.object({id:ge.string().uuid().describe("Contact ID"),referenceId:ge.string().optional().describe("External reference ID"),name:ge.string().optional().describe("Contact name"),title:ge.string().optional().describe("Contact title"),isArchived:ge.boolean().optional().describe("Archived flag")}),xl=lo,uo=b(p(ge.object({name:ge.string().optional().describe("Filter by contact name"),title:ge.string().optional().describe("Filter by contact title"),referenceId:ge.string().optional().describe("Filter by external reference ID"),isArchived:ge.string().optional().describe("Filter by archive status"),...y(["Id","ModifiedOn","CreatedOn"])}))),Al=uo.extend({relationshipId:ge.number().int().describe("Contact relationship ID")}),mo=ge.object({contactId:ge.string().uuid().describe("Contact ID"),relatedEntityId:ge.number().int().describe("Related entity ID"),typeSlug:po.describe("Relationship type slug")}),Pl=p(ge.object({contactId:ge.string().uuid().describe("Contact ID"),relatedEntityId:ge.number().int().optional().describe("Related entity ID filter"),typeSlug:po.optional().describe("Relationship type slug filter"),typeName:ge.string().optional().describe("Relationship type name filter"),createdBefore:ge.string().datetime().optional().describe("List relationships created before this timestamp"),createdOnOrAfter:ge.string().datetime().optional().describe("List relationships created on/after this timestamp"),...y(["Id","ModifiedOn","CreatedOn"])}));function bo(n,a){a.register({name:"crm_contacts_get",domain:"crm",operation:"read",description:"Get a contact by ID",schema:co.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:co.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:Rl.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:jl.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:xl.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:Al.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:uo.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:mo.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:mo.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:Pl.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 hr=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")}),gr=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")}),yr=v.object({key:v.string().optional().describe("External data key"),value:v.string().optional().describe("External data value")}),go=v.object({phoneNumber:v.string().optional().describe("Phone number"),doNotText:v.boolean().optional().describe("Do not text flag")}),yo=v.object({type:v.string().optional().describe("Contact type"),value:v.string().optional().describe("Contact value"),memo:v.string().optional().describe("Contact memo"),phoneSettings:go.optional().describe("Phone settings")}),El=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:hr.optional().describe("Location address"),customFields:v.array(gr).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(yr).optional().describe("External data entries"),contacts:v.array(yo).optional().describe("Location contacts")}),Bl=v.object({id:v.number().int().describe("Customer ID")}),Ll=v.object({id:v.number().int().describe("Customer ID"),noteId:v.number().int().describe("Note ID")}),Ul=v.object({id:v.number().int().describe("Customer ID"),contactId:v.number().int().describe("Contact ID")}),ho=v.object({id:v.number().int().describe("Customer ID"),tagTypeId:v.number().int().describe("Tag type ID")}),Ml=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:hr.optional().describe("Customer address"),customFields:v.array(gr).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(yr).optional().describe("External data entries")}),Fl=v.object({id:v.number().int().describe("Customer ID"),payload:Ml.optional().describe("Customer patch payload")}),Nl=b(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"),...T(),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"),...y(["Id","ModifiedOn","CreatedOn"])}))),zl=b(p(v.object({id:v.number().int().describe("Customer ID")}))),$l=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")}),Gl=v.object({name:v.string().describe("Customer name"),type:v.string().optional().describe("Customer type"),address:hr.optional().describe("Customer address"),customFields:v.array(gr).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(yr).optional().describe("External data entries"),locations:v.array(El).optional().describe("Locations"),contacts:v.array(yo).optional().describe("Contacts")}),ql=p(v.object({id:v.number().int().describe("Customer ID")})),Jl=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:go.optional().describe("Phone settings")}),Wl=b(p(v.object({customerIds:v.string().optional().describe("Comma-delimited customer IDs")}))),Hl=b(p(v.object({...y(["Id","ModifiedOn","CreatedOn"])})));function fo(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:Fl.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:Nl.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:zl.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:$l.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:Gl.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:Ll.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:ql.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:Ul.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:Jl.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:ho.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:Wl.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:ho.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:Hl.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 U}from"zod";var Io=U.enum(["Open","Dismissed","Converted"]),vo=U.object({id:U.number().int().describe("Lead ID")}),To=U.object({campaignId:U.number().int().optional().describe("Campaign ID"),customerId:U.number().int().optional().describe("Customer ID"),locationId:U.number().int().optional().describe("Location ID"),businessUnitId:U.number().int().optional().describe("Business unit ID"),jobTypeId:U.number().int().optional().describe("Job type ID"),source:U.string().optional().describe("Lead source"),summary:U.string().optional().describe("Lead summary"),status:Io.optional().describe("Lead status"),priority:U.string().optional().describe("Lead priority"),firstName:U.string().optional().describe("First name"),lastName:U.string().optional().describe("Last name"),phone:U.string().optional().describe("Phone number"),email:U.string().optional().describe("Email address"),street:U.string().optional().describe("Street"),unit:U.string().optional().describe("Unit"),city:U.string().optional().describe("City"),state:U.string().optional().describe("State"),zip:U.string().optional().describe("Zip code"),country:U.string().optional().describe("Country"),isProspect:U.boolean().optional().describe("Prospect flag"),callReason:U.string().optional().describe("Lead call reason"),value:U.number().optional().describe("Lead value"),externalId:U.string().optional().describe("External ID")}),Vl=U.object({id:U.number().int().describe("Lead ID"),payload:To.optional().describe("Lead patch payload")}),Kl=U.object({payload:To.describe("Lead create payload")}),Zl=U.object({id:U.number().int().describe("Lead ID"),followUpDate:U.string().describe("Follow-up date"),text:U.string().describe("Follow-up text"),pinToTop:U.boolean().describe("Pin follow-up to top")}),Yl=U.object({id:U.number().int().describe("Lead ID"),text:U.string().describe("Note text"),isPinned:U.boolean().optional().describe("Pinned flag")}),Xl=b(p(U.object({id:U.number().int().describe("Lead ID")}))),Ql=b(p(U.object({ids:U.string().optional().describe("Comma-delimited lead IDs"),customerId:U.number().int().optional().describe("Associated customer ID"),isProspect:U.boolean().optional().describe("Filter by prospect state"),withoutCustomer:U.boolean().optional().describe("Filter by missing customer/location"),status:Io.optional().describe("Lead status"),customerCity:U.string().optional().describe("Filter by customer city"),customerState:U.string().optional().describe("Filter by customer state"),customerZip:U.string().optional().describe("Filter by customer zip"),customerCreatedOnOrAfter:U.string().datetime().optional().describe("Customer created on/after timestamp"),customerCreatedBefore:U.string().datetime().optional().describe("Customer created before timestamp"),customerModifiedOnOrAfter:U.string().datetime().optional().describe("Customer modified on/after timestamp"),...y(["Id","ModifiedOn","CreatedOn"]),genPermUrl:U.boolean().optional().describe("Generate permanent URL")}))),eu=U.object({id:U.number().int().optional().describe("Lead form ID")});function So(n,a){a.register({name:"crm_leads_get",domain:"crm",operation:"read",description:"Get a lead by ID",schema:vo.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:Vl.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:Kl.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:Zl.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:Yl.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:Ql.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:vo.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:eu.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 Do=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")}),Co=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")}),ko=I.object({key:I.string().optional().describe("External data key"),value:I.string().optional().describe("External data value")}),tu=I.object({type:I.string().optional().describe("Contact type"),value:I.string().optional().describe("Contact value"),memo:I.string().optional().describe("Contact memo")}),wo=I.object({phoneNumber:I.string().optional().describe("Phone number"),doNotText:I.boolean().optional().describe("Do not text flag")}),nu=I.object({id:I.number().int().describe("Location ID")}),ru=I.object({id:I.number().int().describe("Location ID"),noteId:I.number().int().describe("Note ID")}),au=I.object({id:I.number().int().describe("Location ID"),contactId:I.number().int().describe("Contact ID")}),_o=I.object({id:I.number().int().describe("Location ID"),tagTypeId:I.number().int().describe("Tag type ID")}),ou=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:Do.optional().describe("Address"),customFields:I.array(Co).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(ko).optional().describe("External data entries"),taxZoneId:I.number().int().optional().describe("Tax zone ID")}),iu=I.object({id:I.number().int().describe("Location ID"),payload:ou.optional().describe("Location patch payload")}),su=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:Do.optional().describe("Address"),customFields:I.array(Co).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(ko).optional().describe("External data entries"),contacts:I.array(tu).optional().describe("Location contacts")}),cu=b(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"),...T(),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"),...y(["Id","ModifiedOn","CreatedOn"])}))),du=b(p(I.object({id:I.number().int().describe("Location ID")}))),mu=I.object({id:I.number().int().describe("Location ID"),text:I.string().describe("Note text"),isPinned:I.boolean().optional().describe("Pinned flag")}),pu=p(I.object({id:I.number().int().describe("Location ID")})),lu=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")}),uu=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")}),bu=b(p(I.object({locationIds:I.string().optional().describe("Comma-delimited location IDs")}))),hu=b(p(I.object({...y(["Id","ModifiedOn","CreatedOn"])}))),gu=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(T()));function Oo(n,a){a.register({name:"crm_locations_get",domain:"crm",operation:"read",description:"Get a location by ID",schema:nu.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:iu.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:su.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:cu.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:du.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:mu.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:ru.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:pu.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:lu.shape,handler:async r=>{let e=r;try{let t=e.phoneNumber!==void 0||e.doNotText!==void 0?wo.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:au.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:uu.shape,handler:async r=>{let e=r;try{let t=e.phoneNumber!==void 0||e.doNotText!==void 0?wo.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:bu.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:_o.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:_o.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:hu.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:gu.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 yu=(n,a)=>{ao(n,a),eo(n,a),oo(n,a),so(n,a),bo(n,a),fo(n,a),So(n,a),Oo(n,a)},Ro=yu;import{z as Q}from"zod";var xo=Q.enum(["Scheduled","Dispatched","Working","Hold","Done","Canceled"]);function fu(n){return b(n).extend({createdBefore:Q.string().datetime().optional().describe("Return appointments created before this UTC timestamp"),createdOnOrAfter:Q.string().datetime().optional().describe("Return appointments created on or after this UTC timestamp"),modifiedBefore:Q.string().datetime().optional().describe("Return appointments modified before this UTC timestamp"),modifiedOnOrAfter:Q.string().datetime().optional().describe("Return appointments modified on or after this UTC timestamp")})}var vu=p(fu(Q.object({...y(["Id","ModifiedOn","CreatedOn"]),ids:Q.string().optional().describe("Comma-separated appointment IDs (maximum 50)"),jobId:Q.number().int().optional().describe("Filter by job ID"),projectId:Q.number().int().optional().describe("Filter by project ID"),number:Q.string().optional().describe("Filter by appointment number"),status:xo.optional().describe("Filter by appointment status"),startsOnOrAfter:Q.string().datetime().optional().describe("Return appointments starting on or after this UTC timestamp"),startsBefore:Q.string().datetime().optional().describe("Return appointments starting before this UTC timestamp"),technicianId:Q.number().int().optional().describe("Filter by assigned technician ID"),customerId:Q.number().int().optional().describe("Filter by customer ID"),unused:Q.boolean().optional().describe("Return unused appointments only")}))),jo=Q.object({id:Q.number().int().describe("Appointment ID"),notes:Q.string().describe("Appointment summary notes"),technicianId:Q.number().int().describe("Technician ID for the summary")});function Ao(n,a){a.register({name:"dispatch_appointments_get",domain:"dispatch",operation:"read",description:"Get an appointment by ID",schema:{id:Q.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:Q.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:vu.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:Q.number().int().describe("Job ID"),appointmentNumber:Q.string().describe("Appointment number"),start:Q.string().describe("Appointment start time"),end:Q.string().describe("Appointment end time"),arrivalWindowStart:Q.string().optional().describe("Arrival window start timestamp"),arrivalWindowEnd:Q.string().optional().describe("Arrival window end timestamp"),status:xo.optional().describe("Initial appointment status"),specialInstructions:Q.string().optional().describe("Special instructions for dispatch"),customerId:Q.number().int().describe("Customer ID"),createdById:Q.number().int().describe("User ID creating the appointment"),isConfirmed:Q.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:Q.number().int().describe("Appointment ID"),start:Q.string().optional().describe("Updated appointment start time"),end:Q.string().optional().describe("Updated appointment end time"),arrivalWindowStart:Q.string().optional().describe("Updated arrival window start time"),arrivalWindowEnd:Q.string().optional().describe("Updated arrival window end time"),specialInstructions:Q.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_set_summary",domain:"dispatch",operation:"write",description:"Set an appointment summary. Private preview: only works for accounts with the ST feature enabled.",schema:jo.shape,handler:async r=>{let e=jo.parse(r);try{let t=await n.post(`/tenant/{tenant}/appointments/${e.id}/summaries`,{notes:e.notes,technicianId:e.technicianId});return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_appointments_hold",domain:"dispatch",operation:"write",description:"Put an appointment on hold",schema:{id:Q.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:Q.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:Q.number().int().describe("Appointment ID"),specialInstructions:Q.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:Q.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:Q.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 De}from"zod";var fr=De.object({fromHour:De.number().int().describe("Starting hour of availability block (0-23)"),toHour:De.number().int().describe("Ending hour of availability block (0-23)")});function Iu(n){return b(n).extend({createdBefore:De.string().datetime().optional().describe("Return items created before this UTC timestamp"),createdOnOrAfter:De.string().datetime().optional().describe("Return items created on or after this UTC timestamp"),modifiedBefore:De.string().datetime().optional().describe("Return items modified before this UTC timestamp"),modifiedOnOrAfter:De.string().datetime().optional().describe("Return items modified on or after this UTC timestamp")})}var Tu=p(Iu(De.object({...T()})));function Po(n,a){a.register({name:"dispatch_arrival_windows_create",domain:"dispatch",operation:"write",description:"Create a new arrival window",schema:{start:De.string().describe("Arrival window start time"),duration:De.string().describe("Arrival window duration"),businessUnitIds:De.array(De.number().int().describe("Business unit ID")).min(1).describe("Business units that can use this arrival window"),active:De.boolean().describe("Whether the arrival window is active")},handler:async r=>{let{start:e,duration:t,businessUnitIds:s,active:m}=r;try{let u=await n.post("/tenant/{tenant}/arrival-windows",{start:e,duration:t,businessUnitIds:s,active:m});return i(u)}catch(u){return o(c(u))}}}),a.register({name:"dispatch_arrival_windows_get",domain:"dispatch",operation:"read",description:"Get an arrival window by ID",schema:{id:De.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:Tu.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:De.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:De.boolean().optional().describe("Whether arrival windows are enabled for dispatching"),defaultArrivalWindowId:De.number().int().optional().describe("Default arrival window ID used for scheduling"),weekdays:De.array(fr).optional().describe("Weekday availability blocks in local business hours"),saturday:De.array(fr).optional().describe("Saturday availability blocks in local business hours"),sunday:De.array(fr).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:De.number().int().describe("Arrival window ID"),start:De.string().optional().describe("Arrival window start time"),duration:De.string().optional().describe("Arrival window duration"),businessUnitIds:De.array(De.number().int().describe("Business unit ID")).optional().describe("Business units that can use this arrival window"),active:De.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 Ge}from"zod";function Su(n){return b(n).extend({createdBefore:Ge.string().datetime().optional().describe("Return forms created before this UTC timestamp"),createdOnOrAfter:Ge.string().datetime().optional().describe("Return forms created on or after this UTC timestamp"),modifiedBefore:Ge.string().datetime().optional().describe("Return forms modified before this UTC timestamp"),modifiedOnOrAfter:Ge.string().datetime().optional().describe("Return forms modified on or after this UTC timestamp")})}var wu=p(Su(Ge.object({...T(),...y(["Id","CreatedOn","ModifiedOn","Name"]),hasConditionalLogic:Ge.boolean().optional().describe("Filter forms by conditional logic usage"),hasTriggers:Ge.boolean().optional().describe("Filter forms by trigger usage"),name:Ge.string().optional().describe("Filter by form name"),status:Ge.enum(["Any","Published","Unpublished"]).optional().describe("Filter by form publication status"),ids:Ge.string().optional().describe("Comma-separated form IDs (maximum 50)")}))),_u=p(Ge.object({...T(),...y(["Id","SubmittedOn","CreatedBy"]),formIds:Ge.string().optional().describe("Comma-separated form IDs"),createdById:Ge.number().int().optional().describe("Creator user ID"),status:Ge.enum(["Started","Completed","Any"]).optional().describe("Submission status filter"),submittedOnOrAfter:Ge.string().datetime().optional().describe("Return submissions submitted on or after this UTC timestamp"),submittedBefore:Ge.string().datetime().optional().describe("Return submissions submitted before this UTC timestamp"),ownerType:Ge.enum(["Job","Call","Customer","Location","Equipment","Technician","JobAppointment","Membership","Truck"]).optional().describe("Owner type filter"),owners:Ge.string().optional().describe("Owner query expression used by ServiceTitan submissions endpoint")}));function Eo(n,a){a.register({name:"dispatch_forms_list",domain:"dispatch",operation:"read",description:"List forms",schema:wu.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:_u.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 Jt}from"zod";var Bo=Jt.object({path:Jt.string().optional().describe("Storage path of the image to retrieve")}),Lo=Jt.object({alias:Jt.string().optional().describe("Image alias"),fileName:Jt.string().optional().describe("Image file name"),url:Jt.string().optional().describe("Public image URL")});function Uo(n,a){a.register({name:"dispatch_images_get",domain:"dispatch",operation:"read",description:"Get image metadata by storage path",schema:Bo.shape,handler:async r=>{let e=Bo.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:Lo.shape,handler:async r=>{let e=Lo.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 oe}from"zod";var un=oe.object({id:oe.number().int().describe("Installed equipment ID")}),Mo=oe.object({file:oe.string().describe("Base64-encoded attachment file")}),Fo=oe.object({path:oe.string().optional().describe("Storage path for a previously-uploaded attachment")}),Go=oe.object({active:oe.boolean().optional().describe("Whether the installed equipment is active"),equipmentId:oe.number().int().optional().describe("Equipment catalog ID"),locationId:oe.number().int().optional().describe("Location ID"),customerId:oe.number().int().optional().describe("Customer ID"),invoiceItemId:oe.number().int().optional().describe("Invoice item ID"),name:oe.string().optional().describe("Installed equipment display name"),installedOn:oe.string().optional().describe("Installed date/time in RFC3339 format"),serialNumber:oe.string().optional().describe("Serial number"),barcodeId:oe.string().optional().describe("Barcode ID"),memo:oe.string().optional().describe("Equipment memo"),manufacturer:oe.string().optional().describe("Manufacturer name"),model:oe.string().optional().describe("Model identifier"),cost:oe.number().optional().describe("Acquisition cost"),manufacturerWarrantyStart:oe.string().optional().describe("Manufacturer warranty start date/time in RFC3339 format"),manufacturerWarrantyEnd:oe.string().optional().describe("Manufacturer warranty end date/time in RFC3339 format"),serviceProviderWarrantyStart:oe.string().optional().describe("Service provider warranty start date/time in RFC3339 format"),serviceProviderWarrantyEnd:oe.string().optional().describe("Service provider warranty end date/time in RFC3339 format"),actualReplacementDate:oe.string().optional().describe("Actual replacement date/time in RFC3339 format"),predictedReplacementMonths:oe.number().int().optional().describe("Predicted replacement cadence in months"),predictedReplacementDate:oe.string().optional().describe("Predicted replacement date/time in RFC3339 format")}),No=Go.extend({equipmentId:oe.number().int().describe("Equipment catalog ID"),locationId:oe.number().int().describe("Location ID"),customerId:oe.number().int().describe("Customer ID"),name:oe.string().describe("Installed equipment display name"),installedOn:oe.string().describe("Installed date/time in RFC3339 format")}),zo=un.extend(Go.shape);function Du(n){return b(n).extend({createdBefore:oe.string().datetime().optional().describe("Return items created before this UTC timestamp"),createdOnOrAfter:oe.string().datetime().optional().describe("Return items created on or after this UTC timestamp"),modifiedBefore:oe.string().datetime().optional().describe("Return items modified before this UTC timestamp"),modifiedOnOrAfter:oe.string().datetime().optional().describe("Return items modified on or after this UTC timestamp")})}var $o=p(Du(oe.object({...T(),...y(["Id","ModifiedOn","CreatedOn"]),locationIds:oe.string().optional().describe("Comma-separated location IDs to include"),ids:oe.string().optional().describe("Comma-separated installed equipment IDs (maximum 50)")})));function qo(n,a){a.register({name:"dispatch_installed_equipment_get",domain:"dispatch",operation:"read",description:"Get installed equipment by ID",schema:un.shape,handler:async r=>{let e=un.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:$o.shape,handler:async r=>{let e=$o.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:No.shape,handler:async r=>{let e=No.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:zo.shape,handler:async r=>{let e=zo.parse(r),{id:t,...s}=e;try{let m=d(s),u=await n.patch(`/tenant/{tenant}/installed-equipment/${t}`,Object.keys(m).length>0?m:void 0);return i(u)}catch(m){return o(c(m))}}}),a.register({name:"dispatch_installed_equipment_delete",domain:"dispatch",operation:"delete",description:"Delete installed equipment",schema:un.shape,handler:async r=>{let e=un.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:Mo.shape,handler:async r=>{let e=Mo.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:Fo.shape,handler:async r=>{let e=Fo.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 te}from"zod";var Cu=te.object({key:te.string().describe("External data key"),value:te.string().describe("External data value")}),Ko=te.object({name:te.string().optional().describe("Job type name"),businessUnitIds:te.array(te.number().int()).optional().describe("Business unit IDs associated to this job type"),skills:te.array(te.string()).optional().describe("Skill labels associated to this job type"),tagTypeIds:te.array(te.number().int()).optional().describe("Tag type IDs"),priority:te.string().optional().describe("Default priority"),duration:te.number().optional().describe("Default duration in seconds"),soldThreshold:te.number().optional().describe("Sold threshold value"),class:te.string().optional().describe("Job class"),summary:te.string().optional().describe("Job type summary"),defaultEstimateSoldAction:te.string().optional().describe("Default action when an estimate is sold for this job type"),customFieldTypeIds:te.array(te.number().int()).optional().describe("Custom field type IDs assigned to this job type"),noCharge:te.boolean().optional().describe("Whether this job type is no-charge"),enforceRecurringServiceEventSelection:te.boolean().optional().describe("Require recurring service event selection"),invoiceSignaturesRequired:te.boolean().optional().describe("Whether signatures are required for invoices"),externalData:te.array(Cu).optional().describe("External data entries"),active:te.boolean().optional().describe("Whether this job type is active")}),Jo=Ko.extend({name:te.string().describe("Job type name")}),An=te.object({id:te.number().int().describe("Job type ID")}),Wo=An.extend({externalDataApplicationGuid:te.string().uuid().optional().describe("External data application GUID")}),Ho=An.extend({...Ko.shape,customFieldsUpdateMode:te.enum(["Replace","Merge"]).optional().describe("How to apply customFieldTypeIds. Replace is the ST default and removes assignments not included in customFieldTypeIds; Merge preserves existing assignments and adds new ones.")});function ku(n){return b(n).extend({createdBefore:te.string().datetime().optional().describe("Return items created before this UTC timestamp"),createdOnOrAfter:te.string().datetime().optional().describe("Return items created on or after this UTC timestamp"),modifiedBefore:te.string().datetime().optional().describe("Return items modified before this UTC timestamp"),modifiedOnOrAfter:te.string().datetime().optional().describe("Return items modified on or after this UTC timestamp")})}var Vo=p(ku(te.object({...T(),name:te.string().optional().describe("Filter by job type name"),minDuration:te.number().int().optional().describe("Minimum duration in seconds"),maxDuration:te.number().int().optional().describe("Maximum duration in seconds"),priority:te.string().optional().describe("Priority filter"),ids:te.string().optional().describe("Comma-separated job type IDs (maximum 50)"),orderBy:te.string().optional().describe("Order by field"),orderByDirection:te.string().optional().describe("Order direction (asc/descending)"),externalDataApplicationGuid:te.string().uuid().optional().describe("External data application GUID")})));function Zo(n,a){a.register({name:"dispatch_job_types_get",domain:"dispatch",operation:"read",description:"Get a job type by ID",schema:Wo.shape,handler:async r=>{let e=Wo.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:Vo.shape,handler:async r=>{let e=Vo.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:Jo.shape,handler:async r=>{let e=Jo.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. Warning: customFieldTypeIds uses ST replace semantics unless customFieldsUpdateMode is Merge.",schema:Ho.shape,handler:async r=>{let e=Ho.parse(r),{id:t,...s}=e;try{let m=d(s),u=await n.patch(`/tenant/{tenant}/job-types/${t}`,Object.keys(m).length>0?m:void 0);return i(u)}catch(m){return o(c(m))}}}),a.register({name:"dispatch_job_types_delete",domain:"dispatch",operation:"delete",description:"Delete a job type",schema:An.shape,handler:async r=>{let e=An.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 D}from"zod";var li=D.enum(["Scheduled","Dispatched","InProgress","Hold","Completed","Canceled"]),Ou=D.enum(["Scheduled","Dispatched","Working","Hold","Done","Canceled"]),ui=D.enum(["Low","Normal","High","Urgent"]),Ru=D.object({key:D.string().optional().describe("External data key"),value:D.string().optional().describe("External data value")}),ju=D.object({typeId:D.number().int().optional().describe("Custom field type ID"),name:D.string().optional().describe("Custom field name"),value:D.string().optional().describe("Custom field value")}),vr=D.object({number:D.string().optional().describe("Job number"),projectId:D.number().int().optional().describe("Project ID"),bookingId:D.number().int().optional().describe("Booking ID"),customerId:D.number().int().optional().describe("Customer ID"),locationId:D.number().int().optional().describe("Location ID"),soldById:D.number().int().optional().describe("Selling technician ID"),jobTypeId:D.number().int().optional().describe("Job type ID"),campaignId:D.number().int().optional().describe("Campaign ID"),businessUnitId:D.number().int().optional().describe("Business unit ID"),status:li.optional().describe("Job status"),priority:ui.optional().describe("Job priority"),summary:D.string().optional().describe("Job summary"),noCharge:D.boolean().optional().describe("Whether this job is no-charge"),externalData:D.array(Ru).optional().describe("External data entries"),customFields:D.array(ju).optional().describe("Custom field values"),tagTypeIds:D.array(D.number().int()).optional().describe("Tag type IDs")}),Me=D.object({id:D.number().int().describe("Job ID")}),Yo=Me.extend({externalDataApplicationGuid:D.string().uuid().optional().describe("External data application GUID")}),Xo=Me.extend({...vr.shape,summaryOfWork:D.string().optional().describe("Summary of work completed on the job. Private preview: available for specific accounts only.")}),Pn=Me.extend({equipmentIds:D.array(D.number().int()).min(1).describe("Installed equipment IDs to attach or detach")}),Qo=Me.extend({equipmentId:D.number().int().describe("Installed equipment ID to detach")}),ei=Me.extend({file:D.string().describe("Base64-encoded attachment file"),fileName:D.string().optional().describe("Attachment file name"),contentType:D.string().optional().describe("Attachment content type")}),ti=D.object({id:D.number().int().describe("Job attachment ID")}),ni=Me.extend({text:D.string().describe("Note text")}),ri=Me.extend({message:D.string().describe("Message content")}),ai=D.object({ids:D.string().optional().describe("Comma-separated cancel reason IDs (maximum 50)")});function Ht(n){return b(n).extend({createdBefore:D.string().datetime().optional().describe("Return items created before this UTC timestamp"),createdOnOrAfter:D.string().datetime().optional().describe("Return items created on or after this UTC timestamp"),modifiedBefore:D.string().datetime().optional().describe("Return items modified before this UTC timestamp"),modifiedOnOrAfter:D.string().datetime().optional().describe("Return items modified on or after this UTC timestamp")})}var oi=p(Ht(D.object({...y(["Id","CreatedOn"]),jobId:D.number().int().describe("Job ID")}))),Wt=p(Ht(D.object({...T(),...y(["Id","ModifiedOn","CreatedOn"])}))),ii=p(Ht(D.object({...y(["Id","ModifiedOn","CreatedOn","Priority"]),ids:D.string().optional().describe("Comma-separated job IDs (maximum 50)"),number:D.string().optional().describe("Filter by job number"),projectId:D.number().int().optional().describe("Filter by project ID"),bookingId:D.number().int().optional().describe("Filter by booking ID"),jobStatus:li.optional().describe("Job status filter"),appointmentStatus:Ou.optional().describe("Appointment status filter"),priority:ui.optional().describe("Job priority filter"),firstAppointmentStartsOnOrAfter:D.string().datetime().optional().describe("Return jobs whose first appointment starts on or after this UTC timestamp"),firstAppointmentStartsBefore:D.string().datetime().optional().describe("Return jobs whose first appointment starts before this UTC timestamp"),appointmentStartsOnOrAfter:D.string().datetime().optional().describe("Return jobs with any appointment on or after this UTC timestamp"),appointmentStartsBefore:D.string().datetime().optional().describe("Return jobs with any appointment before this UTC timestamp"),technicianId:D.number().int().optional().describe("Filter by technician ID"),customerId:D.number().int().optional().describe("Filter by customer ID"),locationId:D.number().int().optional().describe("Filter by location ID"),soldById:D.number().int().optional().describe("Filter by selling technician ID"),jobTypeId:D.number().int().optional().describe("Filter by job type ID"),campaignId:D.number().int().optional().describe("Filter by campaign ID"),businessUnitId:D.number().int().optional().describe("Filter by business unit ID"),invoiceId:D.number().int().optional().describe("Filter by invoice ID"),equipmentIds:D.string().optional().describe("Comma-separated installed equipment IDs; returns jobs with at least one attached equipment item"),completedOnOrAfter:D.string().datetime().optional().describe("Return jobs completed on or after this UTC timestamp"),completedBefore:D.string().datetime().optional().describe("Return jobs completed before this UTC timestamp"),tagTypeIds:D.string().optional().describe("Comma-separated tag type IDs"),externalDataApplicationGuid:D.string().uuid().optional().describe("External data application GUID"),externalDataKey:D.string().optional().describe("External data key"),externalDataValues:D.string().optional().describe("External data values (comma-separated, maximum 50)"),hasUnusedAppointments:D.boolean().optional().describe("Return jobs with unused appointments")}))),si=p(D.object({id:D.number().int().describe("Job ID")})),ci=p(D.object({id:D.number().int().describe("Job ID")})),di=p(Ht(D.object({...y(["Id","CreatedOn","ModifiedOn"])}))),mi=p(Ht(D.object({...T(),...y(["Id","ModifiedOn","CreatedOn"]),jobId:D.number().int().describe("Job ID")}))),pi=p(Ht(D.object({...T(),...y(["Id","ModifiedOn","CreatedOn"]),jobIds:D.string().optional().describe("Comma-separated job IDs to include")})));function bi(n,a){a.register({name:"dispatch_jobs_create_attachment",domain:"dispatch",operation:"write",description:"Attach a file to a job",schema:ei.shape,handler:async r=>{let e=ei.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:ti.shape,handler:async r=>{let e=ti.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:oi.shape,handler:async r=>{let e=oi.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:Wt.shape,handler:async r=>{let e=Wt.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:Wt.shape,handler:async r=>{let e=Wt.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:Wt.shape,handler:async r=>{let e=Wt.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:Yo.shape,handler:async r=>{let e=Yo.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:ii.shape,handler:async r=>{let e=ii.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_equipment_get",domain:"dispatch",operation:"read",description:"Get installed equipment IDs attached to a job",schema:Me.shape,handler:async r=>{let e=Me.parse(r);try{let t=await n.get(`/tenant/{tenant}/jobs/${e.id}/equipment`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_jobs_equipment_attach",domain:"dispatch",operation:"write",description:"Attach installed equipment to a job",schema:Pn.shape,handler:async r=>{let e=Pn.parse(r);try{let t=await n.post(`/tenant/{tenant}/jobs/${e.id}/equipment`,{equipmentIds:e.equipmentIds});return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_jobs_equipment_detach_bulk",domain:"dispatch",operation:"delete",description:"Detach one or more installed equipment IDs from a job. Requires confirm: true.",schema:Pn.shape,handler:async r=>{let e=Pn.parse(r);try{let t=await n.deleteWithBody(`/tenant/{tenant}/jobs/${e.id}/equipment`,{equipmentIds:e.equipmentIds});return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_jobs_equipment_detach",domain:"dispatch",operation:"delete",description:"Detach a single installed equipment item from a job. Requires confirm: true.",schema:Qo.shape,handler:async r=>{let e=Qo.parse(r);try{let t=await n.delete(`/tenant/{tenant}/jobs/${e.id}/equipment/${e.equipmentId}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"dispatch_jobs_create",domain:"dispatch",operation:"write",description:"Create a job",schema:vr.shape,handler:async r=>{let e=vr.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:Xo.shape,handler:async r=>{let e=Xo.parse(r),{id:t,...s}=e;try{let m=d(s),u=await n.patch(`/tenant/{tenant}/jobs/${t}`,Object.keys(m).length>0?m:void 0);return i(u)}catch(m){return o(c(m))}}}),a.register({name:"dispatch_jobs_cancel",domain:"dispatch",operation:"write",description:"Cancel a job",schema:Me.shape,handler:async r=>{let e=Me.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:Me.shape,handler:async r=>{let e=Me.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:Me.shape,handler:async r=>{let e=Me.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:Me.shape,handler:async r=>{let e=Me.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:si.shape,handler:async r=>{let e=si.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:ni.shape,handler:async r=>{let e=ni.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:ai.shape,handler:async r=>{let e=ai.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:Me.shape,handler:async r=>{let e=Me.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:ri.shape,handler:async r=>{let e=ri.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:ci.shape,handler:async r=>{let e=ci.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:Me.shape,handler:async r=>{let e=Me.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:di.shape,handler:async r=>{let e=di.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:mi.shape,handler:async r=>{let e=mi.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:pi.shape,handler:async r=>{let e=pi.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 xu=O.object({key:O.string().optional().describe("External data key"),value:O.string().optional().describe("External data value")}),Au=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")}),Ir=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(Au).optional().describe("Custom field values for the project"),externalData:O.array(xu).optional().describe("External data entries"),jobIds:O.array(O.number().int()).optional().describe("Associated job IDs")}),Pt=O.object({id:O.number().int().describe("Project ID")}),hi=Pt.extend(Ir.shape),gi=Pt.extend({text:O.string().describe("Project note text"),isPinned:O.boolean().optional().describe("Whether the note is pinned")}),yi=Pt.extend({message:O.string().describe("Project message content")}),fi=Pt.extend({jobId:O.number().int().describe("Job ID to attach")}),vi=O.object({jobId:O.number().int().describe("Job ID to detach")}),Ii=p(O.object({}));function En(n){return b(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 Ti=p(En(O.object({...y(["Id","ModifiedOn","CreatedOn"])}))),Si=p(En(O.object({...y(["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)")}))),wi=p(O.object({id:O.number().int().describe("Project ID")})),_i=p(En(O.object({...y(["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)")}))),Di=p(En(O.object({...T(),...y(["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)")}))),Vt=O.object({id:O.number().int().describe("Entity ID")}),Ci=Pt.extend({externalDataApplicationGuid:O.string().uuid().optional().describe("External data application GUID")});function ki(n,a){a.register({name:"dispatch_projects_get",domain:"dispatch",operation:"read",description:"Get a project by ID",schema:Ci.shape,handler:async r=>{let e=Ci.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:Si.shape,handler:async r=>{let e=Si.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:Ir.shape,handler:async r=>{let e=Ir.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:hi.shape,handler:async r=>{let e=hi.parse(r),{id:t,...s}=e;try{let m=d(s),u=await n.patch(`/tenant/{tenant}/projects/${t}`,Object.keys(m).length>0?m:void 0);return i(u)}catch(m){return o(c(m))}}}),a.register({name:"dispatch_projects_delete",domain:"dispatch",operation:"delete",description:"Delete a project",schema:Pt.shape,handler:async r=>{let{id:e}=Pt.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:fi.shape,handler:async r=>{let e=fi.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:vi.shape,handler:async r=>{let e=vi.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:wi.shape,handler:async r=>{let e=wi.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:gi.shape,handler:async r=>{let e=gi.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:yi.shape,handler:async r=>{let e=yi.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:Ti.shape,handler:async r=>{let e=Ti.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:Vt.shape,handler:async r=>{let e=Vt.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:Ii.shape,handler:async r=>{let e=Ii.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:Vt.shape,handler:async r=>{let e=Vt.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:_i.shape,handler:async r=>{let e=_i.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:Vt.shape,handler:async r=>{let e=Vt.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:Di.shape,handler:async r=>{let e=Di.parse(r);try{let t=await n.get("/tenant/{tenant}/project-substatuses",d(e));return i(t)}catch(t){return o(c(t))}}})}var Pu=(n,a)=>{Po(n,a),Ao(n,a),bi(n,a),Zo(n,a),ki(n,a),qo(n,a),Uo(n,a),Eo(n,a)},Oi=Pu;import{z as M}from"zod";var Eu=M.object({skuAccount:M.string().optional().describe("SKU account code for the estimate item"),description:M.string().optional().describe("Description of the estimate item"),membershipTypeId:M.number().int().optional().describe("Membership type ID associated with this item"),qty:M.number().optional().describe("Quantity for this estimate item"),unitRate:M.number().optional().describe("Unit sale rate for this estimate item"),unitCost:M.number().optional().describe("Unit cost for this estimate item"),itemGroupName:M.string().optional().describe("Item group display name"),itemGroupRootId:M.number().int().optional().describe("Item group root ID for categorization"),chargeable:M.boolean().optional().describe("Whether this estimate item is chargeable")}),Bu=M.object({name:M.string().optional().describe("External link label"),url:M.string().optional().describe("External link URL")}),Ei=M.object({jobId:M.number().int().optional().describe("Job ID associated with the estimate"),projectId:M.number().int().optional().describe("Project ID associated with the estimate"),locationId:M.number().int().optional().describe("Location ID associated with the estimate"),customerId:M.number().int().optional().describe("Customer ID associated with the estimate"),name:M.string().optional().describe("Human-readable estimate name"),jobNumber:M.string().optional().describe("Job number for estimate matching"),statusValue:M.number().int().optional().describe("Estimate status numeric value"),summary:M.string().optional().describe("Short summary of the estimate"),soldOn:M.string().optional().describe("Date/time when the estimate was sold"),soldBy:M.number().int().optional().describe("User ID who sold the estimate"),active:M.boolean().optional().describe("Whether the estimate is active"),items:M.array(Eu).optional().describe("Estimate line items to include"),externalLinks:M.array(Bu).optional().describe("External links attached to the estimate"),subtotal:M.number().optional().describe("Subtotal amount before taxes"),tax:M.number().optional().describe("Tax amount for the estimate"),businessUnitId:M.number().int().optional().describe("Business unit ID that owns the estimate")}),Ri=M.object({id:M.number().int().describe("Estimate ID")}),ji=b(p(M.object({jobId:M.number().int().optional().describe("Filter by job ID"),projectId:M.number().int().optional().describe("Filter by project ID"),jobNumber:M.string().optional().describe("Filter by job number"),totalGreater:M.number().optional().describe("Filter estimates with totals greater than this amount"),totalLess:M.number().optional().describe("Filter estimates with totals less than this amount"),soldById:M.number().int().optional().describe("Filter by seller user ID"),soldByEmployeeId:M.number().int().optional().describe("Filter by seller employee ID"),ids:M.string().optional().describe("Comma-separated estimate IDs (maximum 50)"),soldAfter:M.string().datetime().optional().describe("Return estimates sold on or after this date/time (UTC)"),soldBefore:M.string().datetime().optional().describe("Return estimates sold before this date/time (UTC)"),status:M.string().optional().describe("Filter by estimate status"),orderBy:M.string().optional().describe("Legacy order by field accepted by ServiceTitan API"),orderByDirection:M.string().optional().describe("Legacy order direction accepted by ServiceTitan API"),locationId:M.number().int().optional().describe("Filter by location ID")}).extend(T()).extend(y(["Id","CreatedOn","ModifiedOn","SoldOn","Total"])))),xi=Ei,Ai=Ei.extend({id:M.number().int().describe("Estimate ID")}),Kt=M.object({id:M.number().int().describe("Estimate ID")}),Pi=M.object({from:M.string().optional().describe("Continuation token or custom date to begin export"),includeRecentChanges:M.boolean().optional().describe("Include recent changes (may include duplicates)")});function Bi(n,a){a.register({name:"estimates_get",domain:"estimates",operation:"read",description:"Get a single estimate by ID",schema:Ri.shape,handler:async r=>{let{id:e}=Ri.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:ji.shape,handler:async r=>{let e=ji.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:xi.shape,handler:async r=>{let e=xi.parse(r),{statusValue:t,...s}=e;try{let m=d({...s,status:t===void 0?void 0:{value:t}}),u=await n.post("/tenant/{tenant}/estimates",m);return i(u)}catch(m){return o(c(m))}}}),a.register({name:"estimates_update",domain:"estimates",operation:"write",description:"Update an existing estimate",schema:Ai.shape,handler:async r=>{let e=Ai.parse(r),{id:t,statusValue:s,...m}=e;try{let u=d({...m,status:s===void 0?void 0:{value:s}}),S=await n.put(`/tenant/{tenant}/estimates/${t}`,u);return i(S)}catch(u){return o(c(u))}}}),a.register({name:"estimates_sell",domain:"estimates",operation:"write",description:"Mark an estimate as sold",schema:Kt.shape,handler:async r=>{let{id:e}=Kt.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:Kt.shape,handler:async r=>{let{id:e}=Kt.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:Kt.shape,handler:async r=>{let{id:e}=Kt.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:Pi.shape,handler:async r=>{let e=Pi.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 qe}from"zod";var Lu=qe.object({skuAccount:qe.string().optional().describe("SKU account code for the estimate item"),description:qe.string().optional().describe("Description of the estimate item"),membershipTypeId:qe.number().int().optional().describe("Membership type ID associated with this item"),qty:qe.number().optional().describe("Quantity for the estimate item"),unitRate:qe.number().optional().describe("Unit sale rate for the estimate item"),unitCost:qe.number().optional().describe("Unit cost for the estimate item"),itemGroupName:qe.string().optional().describe("Item group display name"),itemGroupRootId:qe.number().int().optional().describe("Item group root ID for categorization"),chargeable:qe.boolean().optional().describe("Whether this item is chargeable")}),Li=b(p(qe.object({estimateId:qe.number().int().optional().describe("Filter by estimate ID"),ids:qe.string().optional().describe("Comma-separated estimate item IDs (maximum 50)")}).extend(T()))),Ui=Lu.extend({id:qe.number().int().describe("Estimate ID")}),Mi=qe.object({id:qe.number().int().describe("Estimate ID"),itemId:qe.number().int().describe("Estimate item ID")});function Fi(n,a){a.register({name:"estimates_items_list",domain:"estimates",operation:"read",description:"List estimate items with optional filters",schema:Li.shape,handler:async r=>{let e=Li.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:Ui.shape,handler:async r=>{let e=Ui.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:Mi.shape,handler:async r=>{let{id:e,itemId:t}=Mi.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))}}})}import{z}from"zod";var pt=z.object({id:z.number().int().describe("Template ID")}),Hi=z.object({id:z.number().int().nullable().optional().describe("Existing template item ID to update; omit or null to create a new item"),skuId:z.number().int().describe("Pricebook SKU ID"),skuType:z.enum(["Service","Material","Equipment","PriceModifier"]).describe("Pricebook SKU type"),description:z.string().nullable().optional().describe("Item description"),quantity:z.number().describe("Item quantity"),unitPrice:z.number().nullable().optional().describe("Unit price. Required by ServiceTitan for Static estimate templates."),isAddOn:z.boolean().describe("Whether the item is an add-on"),chargeable:z.boolean().nullable().optional().describe("Whether the item is chargeable"),allowDiscounts:z.boolean().nullable().optional().describe("Whether discounts are allowed for the item"),unitCost:z.number().nullable().optional().describe("Unit cost"),memo:z.string().nullable().optional().describe("Item memo"),parentItemId:z.number().int().nullable().optional().describe("Parent item ID"),itemGroupParentId:z.number().int().nullable().optional().describe("Item group parent ID"),itemGroupName:z.string().nullable().optional().describe("Item group name"),projectLabels:z.string().nullable().optional().describe("Project labels. Empty string clears labels; null leaves labels unchanged.")}),Ni=b(p(z.object({...T()}))),Vi=z.object({name:z.string().optional().describe("Estimate template name"),internalName:z.string().optional().describe("Internal estimate template name"),summary:z.string().nullable().optional().describe("Template summary. For PATCH, omit or null to leave unchanged."),mode:z.enum(["Dynamic","Static"]).optional().describe("Estimate template mode"),active:z.boolean().optional().describe("Whether the template is active"),businessUnitId:z.number().int().nullable().optional().describe("Business unit ID. For PATCH, omit or null to leave unchanged."),items:z.array(Hi).optional().describe("Template items. For PATCH, providing this list replaces all existing items; omit to preserve.")}),zi=Vi.extend({name:z.string().describe("Estimate template name"),internalName:z.string().describe("Internal estimate template name"),mode:z.enum(["Dynamic","Static"]).describe("Estimate template mode"),items:z.array(Hi).describe("Template items")}),$i=pt.extend(Vi.shape),Ki=z.object({proposalTypeOptionId:z.number().int().describe("Proposal type option ID"),estimateTemplateId:z.number().int().describe("Estimate template ID"),order:z.number().int().describe("Assignment display order")}),Uu={proposalTypeId:z.number().int().optional().describe("Filter by proposal type ID")},Gi=b(p(z.object({...T(),...Uu}))),Zi=z.object({name:z.string().optional().describe("Proposal template name"),description:z.string().nullable().optional().describe("Proposal template description. For PATCH, omit or null to leave unchanged."),proposalTypeId:z.number().int().optional().describe("Proposal type ID"),status:z.enum(["Publish","Draft"]).optional().describe("Proposal template status"),active:z.boolean().optional().describe("Whether the template is active"),businessUnitIds:z.array(z.number().int()).optional().describe("Business unit IDs. For PATCH, providing this list replaces all existing assignments; empty list clears all."),estimateAssignments:z.array(Ki).optional().describe("Estimate assignments. For PATCH, providing this list replaces all existing assignments; empty list clears all.")}),qi=Zi.extend({name:z.string().describe("Proposal template name"),proposalTypeId:z.number().int().describe("Proposal type ID"),estimateAssignments:z.array(Ki).describe("Estimate assignments")}),Ji=pt.extend(Zi.shape),Wi=z.object({...T()});function Yi(n,a){a.register({name:"estimates_estimate_templates_list",domain:"estimates",operation:"read",description:"List estimate templates",schema:Ni.shape,handler:async r=>{let e=Ni.parse(r);try{let t=await n.get("/tenant/{tenant}/estimate-templates",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"estimates_estimate_templates_get",domain:"estimates",operation:"read",description:"Get an estimate template by ID",schema:pt.shape,handler:async r=>{let e=pt.parse(r);try{let t=await n.get(`/tenant/{tenant}/estimate-templates/${e.id}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"estimates_estimate_templates_create",domain:"estimates",operation:"write",description:"Create an estimate template",schema:zi.shape,handler:async r=>{let e=zi.parse(r);try{let t=await n.post("/tenant/{tenant}/estimate-templates",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"estimates_estimate_templates_update",domain:"estimates",operation:"write",description:"Update an estimate template. Warning: items are full-replace when provided; omit items to preserve existing template items.",schema:$i.shape,handler:async r=>{let e=$i.parse(r),{id:t,...s}=e;try{let m=d(s),u=await n.patch(`/tenant/{tenant}/estimate-templates/${t}`,Object.keys(m).length>0?m:void 0);return i(u)}catch(m){return o(c(m))}}}),a.register({name:"estimates_estimate_templates_delete",domain:"estimates",operation:"delete",description:"Delete an estimate template by ID",schema:pt.shape,handler:async r=>{let e=pt.parse(r);try{let t=await n.delete(`/tenant/{tenant}/estimate-templates/${e.id}`);return i(t)}catch(t){return o(c(t))}}})}function Xi(n,a){a.register({name:"estimates_proposal_templates_list",domain:"estimates",operation:"read",description:"List proposal templates",schema:Gi.shape,handler:async r=>{let e=Gi.parse(r);try{let t=await n.get("/tenant/{tenant}/proposal-templates",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"estimates_proposal_templates_get",domain:"estimates",operation:"read",description:"Get a proposal template by ID",schema:pt.shape,handler:async r=>{let e=pt.parse(r);try{let t=await n.get(`/tenant/{tenant}/proposal-templates/${e.id}`);return i(t)}catch(t){return o(c(t))}}}),a.register({name:"estimates_proposal_templates_create",domain:"estimates",operation:"write",description:"Create a proposal template",schema:qi.shape,handler:async r=>{let e=qi.parse(r);try{let t=await n.post("/tenant/{tenant}/proposal-templates",d(e));return i(t)}catch(t){return o(c(t))}}}),a.register({name:"estimates_proposal_templates_update",domain:"estimates",operation:"write",description:"Update a proposal template. Warning: businessUnitIds and estimateAssignments are full-replace when provided; omit them to preserve existing assignments.",schema:Ji.shape,handler:async r=>{let e=Ji.parse(r),{id:t,...s}=e;try{let m=d(s),u=await n.patch(`/tenant/{tenant}/proposal-templates/${t}`,Object.keys(m).length>0?m:void 0);return i(u)}catch(m){return o(c(m))}}}),a.register({name:"estimates_proposal_templates_delete",domain:"estimates",operation:"delete",description:"Delete a proposal template by ID",schema:pt.shape,handler:async r=>{let e=pt.parse(r);try{let t=await n.delete(`/tenant/{tenant}/proposal-templates/${e.id}`);return i(t)}catch(t){return o(c(t))}}})}function Qi(n,a){a.register({name:"estimates_proposal_types_list",domain:"estimates",operation:"read",description:"List proposal types",schema:Wi.shape,handler:async r=>{let e=Wi.parse(r);try{let t=await n.get("/tenant/{tenant}/proposal-types",d(e));return i(t)}catch(t){return o(c(t))}}})}var Mu=(n,a)=>{Bi(n,a),Fi(n,a),Yi(n,a),Xi(n,a),Qi(n,a)},es=Mu;import{z as Bn}from"zod";var ts={from:Bn.string().optional().describe("Continuation token or date string for incremental export"),includeRecentChanges:Bn.boolean().optional().describe("Include recent changes not yet committed")},Fu={...ts,modifiedBefore:Bn.string().optional().describe("Filter: modified before this date (ISO 8601)"),modifiedOnOrAfter:Bn.string().optional().describe("Filter: modified on or after this date (ISO 8601)")};function $(n,a,r,e,t,s=ts){n.register({name:r,domain:"export",operation:"read",description:e,schema:s,handler:async m=>{try{let u=await a.get(t,d(m));return i(u)}catch(u){return o(u instanceof Error?u.message:String(u))}}})}function ns(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 Nu=(n,a)=>{ns(n,a)},rs=Nu;import{z as hn}from"zod";import{z as Le}from"zod";var as={warn(n,a){if(a){console.warn(n,a);return}console.warn(n)}};function bn(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function zu(n){return Array.isArray(n)?n.filter(bn):bn(n)&&Array.isArray(n.data)?n.data.filter(bn):[]}function $u(n){return bn(n)&&n.hasMore===!0}function lt(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 Gu(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 qu(n,a){let r=a.split("."),e=n;for(let t of r){if(!bn(e))return;e=e[t]}return e}function it(n,a){for(let r of a){let e=qu(n,r);if(e!=null)return e}}function os(n){let a=n.filter(r=>r!==null).join(" ").trim();return a.length>0?a:null}function is(n){return n.trim().toLowerCase().replace(/\s+/g," ")}function Tr(n){return Gu(it(n,["id","technicianId","businessUnitId","paymentTypeId","membershipTypeId"]))}function ss(n,a){let r=lt(it(n,["name","displayName","fullName"]));if(r)return r;let e=os([lt(it(n,["firstName"])),lt(it(n,["lastName"]))]);if(e)return e;let t=lt(it(n,["nickname"]));return t||(a===void 0?"Unknown Technician":`Technician ${a}`)}function Ju(n,a){let r=lt(it(n,["name","displayName"]));return r||(a===void 0?"Unknown Business Unit":`Business Unit ${a}`)}function Wu(n){let a=new Set,r=Tr(n)??void 0,e=t=>{if(!t)return;let s=is(t);s.length>0&&a.add(s)};return e(ss(n,r)),e(os([lt(it(n,["firstName"])),lt(it(n,["lastName"]))])),e(lt(it(n,["firstName"]))),e(lt(it(n,["lastName"]))),e(lt(it(n,["nickname"]))),[...a]}async function Ln(n,a,r={},e=50,t=as){let s=[];for(let m=1;m<=e;m+=1){let u=await n.get(a,{...r,page:m,pageSize:500,includeTotal:!0}),S=zu(u);s.push(...S);let X=$u(u);if(m===e&&X&&S.length>0&&t.warn("Reference data cache truncated at max pages, some records may be missing",{maxPages:e,endpoint:a}),!X||S.length===0)break}return s}var Sr=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}`)}},wr=class{constructor(a=18e5,r=as){this.logger=r;this.cache=new Sr(a)}cache;inFlight=new Map;clear(){this.cache.clear(),this.inFlight.clear()}async getTechnicians(a,r){return this.getOrLoad("technicians",()=>Ln(a,"/tenant/{tenant}/technicians",{active:"Any"},50,this.logger),r)}async getBusinessUnits(a,r){return this.getOrLoad("business-units",()=>Ln(a,"/tenant/{tenant}/business-units",{active:"Any"},50,this.logger),r)}async getPaymentTypes(a,r){return this.getOrLoad("payment-types",()=>Ln(a,"/tenant/{tenant}/payment-types",{active:"Any"},50,this.logger),r)}async getMembershipTypes(a,r){return this.getOrLoad("membership-types",()=>Ln(a,"/tenant/{tenant}/membership-types",{active:"Any"},50,this.logger),r)}async getTechnicianName(a,r){let t=(await this.getTechnicians(a)).find(s=>Tr(s)===r);return t?ss(t,r):`Technician ${r}`}async getBusinessUnitName(a,r){let t=(await this.getBusinessUnits(a)).find(s=>Tr(s)===r);return t?Ju(t,r):`Business Unit ${r}`}async findTechniciansByName(a,r){let e=is(r);return e.length===0?[]:(await this.getTechnicians(a)).filter(s=>Wu(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(u=>(this.cache.set(a,u,e),this.inFlight.delete(a),u)).catch(u=>{throw this.inFlight.delete(a),u});return this.inFlight.set(a,m),m}},jt=new wr;function cs(n){return{data:n,count:n.length}}async function ut(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=cs(await jt.getBusinessUnits(n));for(let s of[m=>m===e,m=>m.startsWith(e),m=>m.includes(e)]){let m=t.data.find(u=>{let S=_r(u)?.toLowerCase();return S?s(S):!1});if(m){let u=ds(m),S=_r(m);return u!==void 0?{id:u,resolvedName:S??void 0}:{id:void 0,resolvedName:void 0}}}return{id:void 0,resolvedName:void 0}}async function Un(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=cs(await jt.findTechniciansByName(n,r));if(e.count>0){let t=ds(e.data[0]),s=_r(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 ds(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 _r(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 ms=Le.object({startDate:Le.string().describe("Start date (YYYY-MM-DD)"),endDate:Le.string().describe("End date (YYYY-MM-DD)"),businessUnitId:Le.number().int().optional().describe("Filter by business unit ID"),businessUnitName:Le.string().optional().describe("Filter by business unit name (resolved via cache, e.g. 'HVAC'). Alternative to businessUnitId."),includeCollections:Le.boolean().optional().default(!1).describe("Include payment/collections data (totalCollected, outstanding). Adds ~20s latency due to payment pagination. Default: false."),includeProductivityMetrics:Le.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.")}),Je={Name:0,CompletedRevenue:1,OpportunityJobAverage:2,OpportunityConversionRate:3,Opportunity:4,ConvertedJobs:5,CustomerSatisfaction:6,AdjustmentRevenue:7,TotalRevenue:8,NonJobRevenue:9},Ce={Name:0,RevenuePerHour:1,BillableEfficiency:2,Upsold:3,TasksPerOpportunity:4,OptionsPerOpportunity:5,RecallsCaused:6,AdjustmentRevenue:7,TotalRevenue:8,NonJobRevenue:9},Pe={Name:0,TotalSales:1,ClosedAverageSale:2,CloseRate:3,SalesOpportunity:4,OptionsPerOpportunity:5,AdjustmentRevenue:6,TotalRevenue:7,NonJobRevenue:8},Cr=Le.string().trim().min(1),je=Le.union([Le.number().finite(),Le.string().trim().refine(n=>Number.isFinite(Number.parseFloat(n)),"Expected a numeric string")]),ps=[{index:Je.Name,name:"Name",schema:Cr},{index:Je.CompletedRevenue,name:"CompletedRevenue",schema:je},{index:Je.OpportunityConversionRate,name:"OpportunityConversionRate",schema:je},{index:Je.Opportunity,name:"Opportunity",schema:je},{index:Je.ConvertedJobs,name:"ConvertedJobs",schema:je},{index:Je.AdjustmentRevenue,name:"AdjustmentRevenue",schema:je},{index:Je.TotalRevenue,name:"TotalRevenue",schema:je},{index:Je.NonJobRevenue,name:"NonJobRevenue",schema:je}],ls=[{index:Ce.Name,name:"Name",schema:Cr},{index:Ce.RevenuePerHour,name:"RevenuePerHour",schema:je},{index:Ce.BillableEfficiency,name:"BillableEfficiency",schema:je},{index:Ce.Upsold,name:"Upsold",schema:je},{index:Ce.TasksPerOpportunity,name:"TasksPerOpportunity",schema:je},{index:Ce.OptionsPerOpportunity,name:"OptionsPerOpportunity",schema:je},{index:Ce.RecallsCaused,name:"RecallsCaused",schema:je},{index:Ce.AdjustmentRevenue,name:"AdjustmentRevenue",schema:je},{index:Ce.TotalRevenue,name:"TotalRevenue",schema:je},{index:Ce.NonJobRevenue,name:"NonJobRevenue",schema:je}],us=[{index:Pe.Name,name:"Name",schema:Cr},{index:Pe.TotalSales,name:"TotalSales",schema:je},{index:Pe.ClosedAverageSale,name:"ClosedAverageSale",schema:je},{index:Pe.CloseRate,name:"CloseRate",schema:je},{index:Pe.SalesOpportunity,name:"SalesOpportunity",schema:je},{index:Pe.OptionsPerOpportunity,name:"OptionsPerOpportunity",schema:je},{index:Pe.AdjustmentRevenue,name:"AdjustmentRevenue",schema:je},{index:Pe.TotalRevenue,name:"TotalRevenue",schema:je},{index:Pe.NonJobRevenue,name:"NonJobRevenue",schema:je}],Hu=Le.object({name:Le.string().trim().min(1).optional()}).passthrough().required({name:!0});function Vu(){return{data:[],count:0}}function Mn(){return{fields:[],...Vu()}}function kr(n,a){let r=Le.array(Le.unknown()).superRefine((e,t)=>{for(let s of n){if(s.index>=e.length){t.addIssue({code:Le.ZodIssueCode.custom,message:`Missing required row index ${s.index} (${s.name})`});continue}s.schema.safeParse(e[s.index]).success||t.addIssue({code:Le.ZodIssueCode.custom,message:`Invalid value for ${s.name}`})}});return Le.object({fields:Le.array(Hu).optional(),data:Le.array(r).optional(),count:Le.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:Le.ZodIssueCode.custom,message:`Expected field ${s.name} at index ${s.index}`})})}var Ku=kr(ps,{requireFieldMetadata:!0}),Zu=kr(ls,{requireFieldMetadata:!0}),Yu=kr(us,{requireFieldMetadata:!0});function Xu(n){return n.map(a=>a.name).join(", ")}function Or(n,a){return new Error(`Report ${n} response structure changed \u2014 expected fields: ${Xu(a)}`)}function Qu(n){let a=Ku.safeParse(n);if(!a.success)throw Or(175,ps);return a.data}function eb(n){let a=Zu.safeParse(n);if(!a.success)throw Or(177,ls);return a.data}function tb(n){let a=Yu.safeParse(n);if(!a.success)throw Or(179,us);return a.data}function bs(n){let a=Qu(n);return{data:a.data,count:a.data.length}}function hs(n){return h(pe(bs(n).data,a=>f(a[Je.TotalRevenue])),2)}function nb(n){let a=eb(n);return{data:a.data,count:a.data.length}}function rb(n){let a=tb(n);return{data:a.data,count:a.data.length}}function ab(n){let a=bs(n).data,r=[];for(let e of a){let t=f(e[Je.TotalRevenue]),s=f(e[Je.CompletedRevenue]);t===0&&s===0||r.push({name:String(e[Je.Name]??"Unknown"),totalRevenue:h(t,2),completedRevenue:h(s,2),nonJobRevenue:h(f(e[Je.NonJobRevenue]),2),adjustmentRevenue:h(f(e[Je.AdjustmentRevenue]),2),opportunities:Math.round(f(e[Je.Opportunity])),convertedJobs:Math.round(f(e[Je.ConvertedJobs])),conversionRate:h(f(e[Je.OpportunityConversionRate])*100,1)})}return r.sort((e,t)=>t.totalRevenue-e.totalRevenue)}function ob(n){return f(n[Ce.RevenuePerHour])!==0||f(n[Ce.BillableEfficiency])!==0||f(n[Ce.Upsold])!==0||f(n[Ce.TasksPerOpportunity])!==0||f(n[Ce.OptionsPerOpportunity])!==0||f(n[Ce.RecallsCaused])!==0||f(n[Ce.AdjustmentRevenue])!==0||f(n[Ce.TotalRevenue])!==0||f(n[Ce.NonJobRevenue])!==0}function ib(n){let a=nb(n).data,r=[];for(let e of a)ob(e)&&r.push({name:String(e[Ce.Name]??"Unknown"),productivity:{revenuePerHour:h(f(e[Ce.RevenuePerHour]),2),billableEfficiency:h(f(e[Ce.BillableEfficiency]),3),upsold:h(f(e[Ce.Upsold]),2),tasksPerOpportunity:h(f(e[Ce.TasksPerOpportunity]),2),optionsPerOpportunity:h(f(e[Ce.OptionsPerOpportunity]),2),recallsCaused:Math.round(f(e[Ce.RecallsCaused]))}});return r}function sb(n){return f(n[Pe.TotalSales])!==0||f(n[Pe.ClosedAverageSale])!==0||f(n[Pe.CloseRate])!==0||f(n[Pe.SalesOpportunity])!==0||f(n[Pe.OptionsPerOpportunity])!==0||f(n[Pe.AdjustmentRevenue])!==0||f(n[Pe.TotalRevenue])!==0||f(n[Pe.NonJobRevenue])!==0}function cb(n){let a=rb(n).data,r=[];for(let e of a)sb(e)&&r.push({name:String(e[Pe.Name]??"Unknown"),sales:{totalSales:h(f(e[Pe.TotalSales]),2),closedAvgSale:h(f(e[Pe.ClosedAverageSale]),2),closeRate:h(f(e[Pe.CloseRate])*100,1),salesOpportunity:Math.round(f(e[Pe.SalesOpportunity])),optionsPerOpportunity:h(f(e[Pe.OptionsPerOpportunity]),2)}});return r}function gs(n){return n.trim().toLowerCase()}function Dr(n){return new Map(n.map(a=>[gs(a.name),a]))}function db(n,a,r){let e=Dr(n),t=Dr(a),s=Dr(r),m=new Set([...n.map(u=>u.name),...a.map(u=>u.name),...r.map(u=>u.name)]);return Array.from(m).map(u=>{let S=gs(u),X=e.get(S),B=X?{...X}:{name:u,totalRevenue:0,completedRevenue:0,nonJobRevenue:0,adjustmentRevenue:0,opportunities:0,convertedJobs:0,conversionRate:0},H=t.get(S);H&&(B.productivity=H.productivity);let G=s.get(S);return G&&(B.sales=G.sales),B}).sort((u,S)=>S.totalRevenue-u.totalRevenue||u.name.localeCompare(S.name))}function mb(n){return n.productivity!==void 0}function pb(n){return n.sales!==void 0}function Et(n,a,r=2){return h(me(pe(n,a),n.length),r)}function lb(n){let a=n.amount??n.total??n.paymentAmount;return f(a)}function ys(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:ms.shape,handler:async r=>{try{let e=ms.parse(r),t=[],s=await ut(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 u=[{name:"From",value:e.startDate},{name:"To",value:e.endDate}];m!==void 0&&u.push({name:"BusinessUnitIds",value:String(m)});let{startIso:S,endIso:X}=Xe(e.startDate,e.endDate,a.timezone),B=[re(t,"Revenue report (Report 175)",()=>n.post("/tenant/{tenant}/report-category/business-unit-dashboard/reports/175/data",{parameters:u}),Mn()),e.includeProductivityMetrics?re(t,"Productivity report (Report 177)",()=>n.post("/tenant/{tenant}/report-category/business-unit-dashboard/reports/177/data",{parameters:u}),Mn()):Promise.resolve(Mn()),re(t,"Sales report (Report 179)",()=>n.post("/tenant/{tenant}/report-category/business-unit-dashboard/reports/179/data",{parameters:u}),Mn()),e.includeCollections?re(t,"Payment data",()=>Rt(n,"/tenant/{tenant}/payments",{paidOnAfter:S,paidOnBefore:X,businessUnitIds:m===void 0?void 0:String(m)}),[]):Promise.resolve([])],[H,G,_,V]=await Promise.all(B),le=ab(H),ve=ib(G),he=cb(_),ue=db(le,ve,he),Se=h(pe(ue,N=>N.totalRevenue),2),Re=h(pe(ue,N=>N.completedRevenue),2),Ue=h(pe(ue,N=>N.nonJobRevenue),2),C=h(pe(ue,N=>N.adjustmentRevenue),2),ee=ue.reduce((N,Ve)=>N+Ve.opportunities,0),j=ue.reduce((N,Ve)=>N+Ve.convertedJobs,0),L=h(me(Re,j),2),ie=h(me(j,ee)*100,1),E=ue.filter(mb),we=ue.filter(pb),$e=e.includeCollections?h(pe(V,lb),2):void 0,Ye=$e!==void 0?h(Se-$e,2):void 0,ze={period:{start:e.startDate,end:e.endDate},totalRevenue:Se,revenueBreakdown:{completedRevenue:Re,nonJobRevenue:Ue,adjustmentRevenue:C},productivity:{averageRevenuePerHour:Et(E,N=>N.productivity.revenuePerHour,2),averageBillableEfficiency:Et(E,N=>N.productivity.billableEfficiency,3),totalUpsold:h(pe(E,N=>N.productivity.upsold),2),averageTasksPerOpportunity:Et(E,N=>N.productivity.tasksPerOpportunity,2),averageOptionsPerOpportunity:Et(E,N=>N.productivity.optionsPerOpportunity,2),totalRecallsCaused:E.reduce((N,Ve)=>N+Ve.productivity.recallsCaused,0)},sales:{totalSales:h(pe(we,N=>N.sales.totalSales),2),averageClosedAvgSale:Et(we,N=>N.sales.closedAvgSale,2),averageCloseRate:Et(we,N=>N.sales.closeRate,1),totalSalesOpportunity:we.reduce((N,Ve)=>N+Ve.sales.salesOpportunity,0),averageOptionsPerOpportunity:Et(we,N=>N.sales.optionsPerOpportunity,2)},totalCollected:$e,outstanding:Ye,avgTicket:L,totalOpportunities:ee,totalConvertedJobs:j,overallConversionRate:ie,byBusinessUnit:ue};return t.length>0&&(ze._warnings=t),i(ze,{shape:!0})}catch(e){return o(g(e))}}})}var fs=hn.object({startDate:hn.string().describe("Start date (YYYY-MM-DD)"),endDate:hn.string().describe("End date (YYYY-MM-DD)"),campaignId:hn.number().int().optional().describe("Single campaign (omit for all)"),limit:hn.number().int().min(1).max(50).optional().describe("Max campaigns to analyze (default 20, max 50).")}),rt={Name:0,LeadGenerationOpportunity:1,LeadsSet:2,LeadConversionRate:3,AverageLeadSale:4,ReplacementOpportunity:5,ReplacementLeadsSet:6,ReplacementLeadConversionRate:7,MembershipSales:8,AdjustmentRevenue:9,TotalRevenue:10,NonJobRevenue:11},ub="Per-campaign revenue unavailable (ServiceTitan invoices API does not support campaign-level filtering). Total period revenue shown in totals only.";function bb(n){return f(Ae(n,["id","campaignId"]))}function hb(n,a){return se(Ae(n,["name","campaignName"]))??`Campaign ${a}`}function gb(n){return Math.round(f(Ae(n,["campaignId","campaign.id","leadCall.campaign.id"])))}function vs(n){let a=new Map;for(let r of n){let e=gb(r);e<=0||a.set(e,(a.get(e)??0)+1)}return a}function yb(n){return!Fe(n)||!Array.isArray(n.data)?[]:n.data.filter(Array.isArray)}function fb(n){return n.leadGenerationOpportunity!==0||n.leadsSet!==0||n.replacementOpportunity!==0||n.replacementLeadsSet!==0||n.membershipSales!==0||n.totalRevenue!==0}function vb(n){let a=yb(n),r=[];for(let e of a){let t={name:se(e[rt.Name])??"Unknown",leadGenerationOpportunity:Math.round(f(e[rt.LeadGenerationOpportunity])),leadsSet:Math.round(f(e[rt.LeadsSet])),leadConversionRate:h(f(e[rt.LeadConversionRate]),3),averageLeadSale:h(f(e[rt.AverageLeadSale]),2),replacementOpportunity:Math.round(f(e[rt.ReplacementOpportunity])),replacementLeadsSet:Math.round(f(e[rt.ReplacementLeadsSet])),replacementLeadConversionRate:h(f(e[rt.ReplacementLeadConversionRate]),3),membershipSales:h(f(e[rt.MembershipSales]),2),adjustmentRevenue:h(f(e[rt.AdjustmentRevenue]),2),totalRevenue:h(f(e[rt.TotalRevenue]),2),nonJobRevenue:h(f(e[rt.NonJobRevenue]),2)};fb(t)&&r.push(t)}return r}function Is(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:fs.shape,handler:async r=>{try{let e=fs.parse(r),{startIso:t,endIso:s}=Xe(e.startDate,e.endDate,a.timezone),m=[],u=e.limit??20,[S,X,B,H,G]=await Promise.all([re(m,"Campaign data",()=>mt(n,"/tenant/{tenant}/campaigns",{ids:e.campaignId===void 0?void 0:String(e.campaignId),active:e.campaignId===void 0?"Any":void 0}),[]),re(m,"Call data",()=>mt(n,"/v3/tenant/{tenant}/calls",{createdOnOrAfter:t,createdBefore:s,active:"Any"}),[]),re(m,"Booking data",()=>Rt(n,"/tenant/{tenant}/bookings",{createdOnOrAfter:t,createdBefore:s}),[]),re(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),re(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)]),_=S.length>0?S:e.campaignId===void 0?[]:[{id:e.campaignId,name:`Campaign ${e.campaignId}`}],V=vs(X),le=vs(B),ve=G?vb(G):[],he=[];for(let j of _){let L=bb(j);if(L<=0)continue;let ie=hb(j,L),E=V.get(L)??0,we=le.get(L)??0;he.push({id:L,name:ie,calls:E,bookings:we,conversionRate:h(me(we,E),3),revenue:0,revenuePerCall:0})}he.sort((j,L)=>L.calls+L.bookings-(j.calls+j.bookings));let ue=he.length,Se=he.length>u?he.slice(0,u):he;he.length>u&&m.push(`Limited to ${u} of ${ue} campaigns. Use 'limit' param to increase (max 50) or 'campaignId' for a specific campaign.`),m.push(ub);let Re=Se.reduce((j,L)=>j+L.calls,0),Ue=Se.reduce((j,L)=>j+L.bookings,0),C=H===null?0:hs(H),ee={period:{start:e.startDate,end:e.endDate},campaigns:Se,totals:{calls:Re,bookings:Ue,conversionRate:h(me(Ue,Re),3),revenue:C},leadGeneration:ve};return he.length>u&&(ee.totalsNote="Revenue represents the full period; calls and bookings reflect only the top N listed campaigns."),m.length>0&&(ee._warnings=m),i(ee,{shape:!0})}catch(e){return o(g(e))}}})}import{z as gn}from"zod";var Ts=gn.object({startDate:gn.string().describe("Start date (YYYY-MM-DD)"),endDate:gn.string().describe("End date (YYYY-MM-DD)"),businessUnitId:gn.number().int().optional().describe("Filter by business unit ID"),businessUnitName:gn.string().optional().describe("Filter by business unit name (resolved via cache, e.g. 'HVAC'). Alternative to businessUnitId.")}),Bt={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 Ib(n){return!Fe(n)||!Array.isArray(n.data)?[]:n.data.filter(Array.isArray)}function Rr(n){return n.trim().toLowerCase()}function jr(n,a){return a.some(r=>n.includes(r))}function bt(n,a,r=2){let e=n.reduce((t,s)=>t+a(s),0);return h(me(e,n.length),r)}function Tb(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 Sb(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 Ss(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);Xe(e.startDate,e.endDate,a.timezone);let t=[],s=await ut(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 u=[{name:"DateType",value:"Job Completion Date"},{name:"From",value:e.startDate},{name:"To",value:e.endDate}];m!==void 0&&u.push({name:"BusinessUnitId",value:String(m)});let S=await re(t,"CSR performance report (Report 162)",()=>n.post("/tenant/{tenant}/report-category/operations/reports/162/data",{parameters:u}),null),X=S?Ib(S):[],B=new Map;for(let _ of X){let V=se(_[Bt.BookedBy])??"Unassigned",le=Rr(V),ve=f(_[Bt.Total]),he=(se(_[Bt.JobStatus])??"").toLowerCase(),ue=se(_[Bt.InvoiceNumber]),Se=se(_[Bt.Campaign])??"Unattributed",Re=se(_[Bt.CampaignCategory]),Ue=se(_[Bt.JobType])??"Unknown",C=B.get(le)??{name:V,jobsBooked:0,totalRevenue:0,completedJobs:0,invoicedJobs:0,canceledJobs:0,openJobs:0,campaigns:new Map,jobTypes:new Map};C.jobsBooked+=1,C.totalRevenue+=ve,jr(he,["cancel"])?C.canceledJobs+=1:jr(he,["complete","done"])?C.completedJobs+=1:C.openJobs+=1,(ue||jr(he,["invoice"]))&&(C.invoicedJobs+=1);let ee=Rr(Se),j=C.campaigns.get(ee)??{name:Se,category:Re,jobs:0,revenue:0};j.jobs+=1,j.revenue+=ve,j.category===null&&(j.category=Re),C.campaigns.set(ee,j);let L=Rr(Ue),ie=C.jobTypes.get(L)??{name:Ue,jobs:0,revenue:0};ie.jobs+=1,ie.revenue+=ve,C.jobTypes.set(L,ie),B.set(le,C)}let H=Array.from(B.values()).map(_=>({name:_.name,jobsBooked:_.jobsBooked,totalRevenue:h(_.totalRevenue,2),avgTicket:h(me(_.totalRevenue,_.jobsBooked),2),topCampaigns:Tb(_.campaigns),jobTypes:Sb(_.jobTypes),conversionMetrics:{completedJobs:_.completedJobs,invoicedJobs:_.invoicedJobs,canceledJobs:_.canceledJobs,openJobs:_.openJobs,completionRate:h(me(_.completedJobs,_.jobsBooked)*100,1),invoiceRate:h(me(_.invoicedJobs,_.jobsBooked)*100,1),cancellationRate:h(me(_.canceledJobs,_.jobsBooked)*100,1)}})).sort((_,V)=>V.totalRevenue-_.totalRevenue||V.jobsBooked-_.jobsBooked),G={period:{start:e.startDate,end:e.endDate},csrs:H,teamAverages:{jobsBooked:bt(H,_=>_.jobsBooked,2),totalRevenue:bt(H,_=>_.totalRevenue,2),avgTicket:bt(H,_=>_.avgTicket,2),completedJobs:bt(H,_=>_.conversionMetrics.completedJobs,2),invoicedJobs:bt(H,_=>_.conversionMetrics.invoicedJobs,2),canceledJobs:bt(H,_=>_.conversionMetrics.canceledJobs,2),openJobs:bt(H,_=>_.conversionMetrics.openJobs,2),completionRate:bt(H,_=>_.conversionMetrics.completionRate,1),invoiceRate:bt(H,_=>_.conversionMetrics.invoiceRate,1),cancellationRate:bt(H,_=>_.conversionMetrics.cancellationRate,1)}};return t.length>0&&(G._warnings=t),i(G,{shape:!0})}catch(e){return o(g(e))}}})}import{z as yn}from"zod";var ws=yn.object({startDate:yn.string().describe("Start date (YYYY-MM-DD)"),endDate:yn.string().describe("End date (YYYY-MM-DD)"),businessUnitId:yn.number().int().optional().describe("Filter by business unit ID"),businessUnitName:yn.string().optional().describe("Filter by business unit name (resolved via cache, e.g. 'HVAC'). Alternative to businessUnitId.")}),Fn={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},Nn={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 Ds(n){return!Fe(n)||!Array.isArray(n.data)?[]:n.data.filter(Array.isArray)}function xr(n){return n.trim().toLowerCase()}function wb(n){let a=Ds(n),r=new Map,e=[];for(let t of a){let s={invoiceNumber:se(t[Fn.InvoiceNumber])??"",amount:h(f(t[Fn.Amount]),2),businessUnit:se(t[Fn.BusinessUnit])??"Unknown",technician:se(t[Fn.Technician])??"Unassigned"},m=xr(s.invoiceNumber);if(m.length===0){e.push(s);continue}r.has(m)||r.set(m,s)}return[...r.values(),...e]}function _b(n){let a=Ds(n),r=new Map,e=[];for(let t of a){let s={invoiceNumber:se(t[Nn.InvoiceNumber])??"",amount:h(f(t[Nn.Amount]),2),businessUnit:se(t[Nn.BusinessUnit])??"Unknown",technician:se(t[Nn.Technician])??"Unassigned"},m=xr(s.invoiceNumber);if(m.length===0){e.push(s);continue}r.has(m)||r.set(m,s)}return[...r.values(),...e]}function _s(n,a){let r=new Map;for(let e of n){let t=a(e),s=xr(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 Cs(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:ws.shape,handler:async r=>{try{let e=ws.parse(r);Xe(e.startDate,e.endDate,a.timezone);let t=[],s=await ut(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 u=[{name:"From",value:e.startDate},{name:"To",value:e.endDate}];m!==void 0&&u.push({name:"BusinessUnitIds",value:String(m)});let[S,X]=await Promise.all([re(t,"Invoices sent report (Report 2281)",()=>n.post("/tenant/{tenant}/report-category/operations/reports/2281/data",{parameters:u}),null),re(t,"Invoices not sent report (Report 2282)",()=>n.post("/tenant/{tenant}/report-category/operations/reports/2282/data",{parameters:u}),null)]),B=S?wb(S):[],H=new Set(B.map(ie=>ie.invoiceNumber.trim().toLowerCase()).filter(ie=>ie.length>0)),_=(X?_b(X):[]).filter(ie=>{let E=ie.invoiceNumber.trim().toLowerCase();return E.length===0||!H.has(E)}),V=B.length,le=_.length,ve=V+le,he=h(pe(B,ie=>ie.amount),2),ue=h(pe(_,ie=>ie.amount),2),Se=h(me(V,ve)*100,1),Re=_s(_,ie=>ie.businessUnit),Ue=_s(_,ie=>ie.technician),C=Re[0],ee=Ue[0],j=le===0?[`All ${V} invoices in the period were sent.`]:[`${V} of ${ve} invoices were sent (${Se}%).`,C?`${C.name} has ${C.count} unsent invoices totaling $${mn(C.amount)}.`:"No business unit breakdown available for unsent invoices.",ee?`${ee.name} owns ${ee.count} unsent invoices totaling $${mn(ee.amount)}.`:"No technician breakdown available for unsent invoices."],L={period:{start:e.startDate,end:e.endDate},sentCount:V,notSentCount:le,sendRate:Se,totalAmountSent:he,totalAmountNotSent:ue,notSentBreakdown:{byBusinessUnit:Re,byTechnician:Ue},highlights:j};return t.length>0&&(L._warnings=t),i(L,{shape:!0})}catch(e){return o(g(e))}}})}import{z as Lt}from"zod";var ks=Lt.object({startDate:Lt.string().describe("Start date (YYYY-MM-DD)"),endDate:Lt.string().describe("End date (YYYY-MM-DD)"),businessUnitId:Lt.number().int().optional().describe("Filter by business unit ID"),businessUnitName:Lt.string().optional().describe("Filter by business unit name (resolved via cache, e.g. 'HVAC'). Alternative to businessUnitId."),technicianId:Lt.number().int().optional().describe("Filter by technician ID"),technicianName:Lt.string().optional().describe("Filter by technician name (resolved via cache, e.g. 'John'). Alternative to technicianId.")}),Ut={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 Db(n){return!Fe(n)||!Array.isArray(n.data)?[]:n.data.filter(Array.isArray)}function Ar(n){return n.trim().toLowerCase()}function Pr(n,a,r){return n+a+r}function Cb(n){return n.totalHours!==0||n.grossPay!==0}function Os(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:ks.shape,handler:async r=>{try{let e=ks.parse(r);Xe(e.startDate,e.endDate,a.timezone);let t=[],s=await ut(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 u=await Un(n,e.technicianId,e.technicianName),S=u.id;e.technicianName&&!S&&t.push(`Technician "${e.technicianName}" not found. Showing all technicians.`),u.resolvedName&&t.push(`Resolved "${e.technicianName}" \u2192 ${u.resolvedName} (ID: ${S})`);let X=[{name:"From",value:e.startDate},{name:"To",value:e.endDate}];m!==void 0&&X.push({name:"BusinessUnitId",value:String(m)}),S!==void 0&&X.push({name:"TechnicianId",value:String(S)});let B=await re(t,"Labor cost report (Report 166)",()=>n.post("/tenant/{tenant}/report-category/accounting/reports/166/data",{parameters:X}),null),H=B?Db(B):[],G=new Map,_=new Map;for(let C of H){let ee=se(C[Ut.EmployeeName])??"Unknown Employee",j=se(C[Ut.Activity])??"Unknown Activity",L=se(C[Ut.EmployeeBusinessUnit])??"Unknown",ie=f(C[Ut.RegularHours]),E=f(C[Ut.OvertimeHours]),we=f(C[Ut.DoubleOvertimeHours]),$e=f(C[Ut.GrossPay]),Ye=Pr(ie,E,we),ze=Ar(ee),N=G.get(ze)??{name:ee,businessUnits:new Set,regularHours:0,overtimeHours:0,doubleOvertimeHours:0,grossPay:0,activities:new Map};N.businessUnits.add(L),N.regularHours+=ie,N.overtimeHours+=E,N.doubleOvertimeHours+=we,N.grossPay+=$e;let Ve=Ar(j),ft=N.activities.get(Ve)??{activity:j,entries:0,hours:0,grossPay:0};ft.entries+=1,ft.hours+=Ye,ft.grossPay+=$e,N.activities.set(Ve,ft),G.set(ze,N);let At=Ar(L),tt=_.get(At)??{name:L,employees:new Set,regularHours:0,overtimeHours:0,doubleOvertimeHours:0,grossPay:0};tt.employees.add(ee),tt.regularHours+=ie,tt.overtimeHours+=E,tt.doubleOvertimeHours+=we,tt.grossPay+=$e,_.set(At,tt)}let V=Array.from(G.values()).map(C=>{let ee=Pr(C.regularHours,C.overtimeHours,C.doubleOvertimeHours);return{name:C.name,businessUnits:Array.from(C.businessUnits).sort((j,L)=>j.localeCompare(L)),totalHours:h(ee,2),regularHours:h(C.regularHours,2),overtimeHours:h(C.overtimeHours,2),doubleOvertimeHours:h(C.doubleOvertimeHours,2),grossPay:h(C.grossPay,2),avgHourlyRate:h(me(C.grossPay,ee),2),activityBreakdown:Array.from(C.activities.values()).map(j=>({activity:j.activity,entries:j.entries,hours:h(j.hours,2),grossPay:h(j.grossPay,2),avgHourlyRate:h(me(j.grossPay,j.hours),2)})).sort((j,L)=>L.grossPay-j.grossPay||L.hours-j.hours)}}).filter(Cb).sort((C,ee)=>ee.grossPay-C.grossPay||ee.totalHours-C.totalHours),le=Array.from(_.values()).map(C=>{let ee=Pr(C.regularHours,C.overtimeHours,C.doubleOvertimeHours),j=C.overtimeHours+C.doubleOvertimeHours;return{name:C.name,employeeCount:C.employees.size,totalHours:h(ee,2),regularHours:h(C.regularHours,2),overtimeHours:h(C.overtimeHours,2),doubleOvertimeHours:h(C.doubleOvertimeHours,2),grossPay:h(C.grossPay,2),avgHourlyRate:h(me(C.grossPay,ee),2),overtimePercent:h(me(j,ee)*100,1)}}).sort((C,ee)=>ee.grossPay-C.grossPay||ee.totalHours-C.totalHours),ve=h(pe(V,C=>C.grossPay),2),he=h(pe(V,C=>C.totalHours),2),ue=h(pe(V,C=>C.regularHours),2),Se=h(pe(V,C=>C.overtimeHours),2),Re=h(pe(V,C=>C.doubleOvertimeHours),2),Ue={period:{start:e.startDate,end:e.endDate},totalGrossPay:ve,totalHours:he,regularHours:ue,overtimeHours:Se,doubleOvertimeHours:Re,avgHourlyRate:h(me(ve,he),2),overtimePercent:h(me(Se+Re,he)*100,1),employees:V,byBusinessUnit:le};return t.length>0&&(Ue._warnings=t),i(Ue,{shape:!0})}catch(e){return o(g(e))}}})}import{z as Er}from"zod";var Rs=Er.object({type:Er.enum(["technicians","business-units","payment-types","membership-types"]).describe("Type of reference data to look up"),search:Er.string().optional().describe("Search by name (partial match). Omit to list all.")});function kb(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 Ob(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 Rb(n){return typeof n.active=="boolean"?n.active:!0}function jb(n){let a=[];for(let r of n){let e=kb(r),t=Ob(r);e!==void 0&&t!==null&&a.push({id:e,name:t,active:Rb(r)})}return a.sort((r,e)=>r.name.localeCompare(e.name))}function xb(n,a){let r=a.trim().toLowerCase();return r.length===0?n:n.filter(e=>e.name.toLowerCase().includes(r))}function js(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:Rs.shape,handler:async r=>{try{let e=Rs.parse(r),t;switch(e.type){case"technicians":t=await jt.getTechnicians(n);break;case"business-units":t=await jt.getBusinessUnits(n);break;case"payment-types":t=await jt.getPaymentTypes(n);break;case"membership-types":t=await jt.getMembershipTypes(n);break}let s=jb(t);return e.search&&(s=xb(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 zn}from"zod";var xs=zn.object({startDate:zn.string().describe("Start date (YYYY-MM-DD)"),endDate:zn.string().describe("End date (YYYY-MM-DD)"),includeServiceRevenue:zn.boolean().optional().default(!1).describe("Include totalServiceRevenue from invoice pagination (adds ~1-2s latency). Default: false.")}),vt={Name:0,Suspended:1,Canceled:2,Expired:3,Deleted:4,Renewed:5,Reactivated:6,NewSales:7,ActiveAtEnd:8},$n={Name:0,Opportunities:1,Converted:2,ConversionRate:3};function As(n){return!Fe(n)||!Array.isArray(n.data)?[]:n.data.filter(Array.isArray)}function ht(n){return Math.round(f(n))}function Ab(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=As(n),r=[];for(let e of a){let t={name:se(e[vt.Name])??"Unknown",suspended:ht(e[vt.Suspended]),canceled:ht(e[vt.Canceled]),expired:ht(e[vt.Expired]),deleted:ht(e[vt.Deleted]),renewed:ht(e[vt.Renewed]),reactivated:ht(e[vt.Reactivated]),newSales:ht(e[vt.NewSales]),activeAtEnd:ht(e[vt.ActiveAtEnd])};Ab(t)&&r.push(t)}return r}function Eb(n){let a=As(n),r=[];for(let e of a){let t=ht(e[$n.Opportunities]),s=ht(e[$n.Converted]);t===0&&s===0||r.push({name:se(e[$n.Name])??"Unknown",opportunities:t,converted:s,conversionRate:h(f(e[$n.ConversionRate])*100,1)})}return r.sort((e,t)=>t.opportunities-e.opportunities||t.converted-e.converted)}function Bb(n){return f(Ae(n,["total","amount","invoiceTotal"]))}function Ps(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:xs.shape,handler:async r=>{try{let e=xs.parse(r),{startIso:t,endIso:s}=Xe(e.startDate,e.endDate,a.timezone),m=[],u=[{name:"From",value:e.startDate},{name:"To",value:e.endDate}],S=[re(m,"Membership summary report (Report 182)",()=>n.post("/tenant/{tenant}/report-category/marketing/reports/182/data",{parameters:u}),null),re(m,"Business unit memberships report (Report 178)",()=>n.post("/tenant/{tenant}/report-category/business-unit-dashboard/reports/178/data",{parameters:u}),null),e.includeServiceRevenue?re(m,"Invoice data",()=>Rt(n,"/tenant/{tenant}/invoices",{invoicedOnOrAfter:t,invoicedOnBefore:s}),[]):Promise.resolve([])],[X,B,H]=await Promise.all(S),G=X?Pb(X):[],_=B?Eb(B):[],V=e.includeServiceRevenue?h(pe(H,Bb),2):null,le=Math.round(pe(G,E=>E.activeAtEnd)),ve=Math.round(pe(G,E=>E.newSales)),he=Math.round(pe(G,E=>E.canceled)),ue=Math.round(pe(G,E=>E.expired)),Se=Math.round(pe(G,E=>E.renewed)),Re=Math.round(pe(G,E=>E.suspended)),Ue=Math.round(pe(G,E=>E.reactivated)),C=Math.round(pe(G,E=>E.deleted)),ee=Math.round(pe(_,E=>E.opportunities)),j=Math.round(pe(_,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,we)=>we.activeAtEnd-E.activeAtEnd),ie={period:{start:e.startDate,end:e.endDate},activeMemberships:le,newSignups:ve,cancellations:he,expirations:ue,renewals:Se,suspended:Re,reactivated:Ue,deleted:C,retentionRate:h(me(le,le+he),3),totalServiceRevenue:V,conversionTotals:{opportunities:ee,converted:j,conversionRate:h(me(j,ee)*100,1)},conversionByBusinessUnit:_,membershipTypes:L};return m.length>0&&(ie._warnings=m),i(ie,{shape:!0})}catch(e){return o(g(e))}}})}import{z as Es}from"zod";var Br=Es.object({date:Es.string().optional().describe("Date to snapshot (YYYY-MM-DD, defaults to today)")}),Lr=20,Zt={JobNumber:0,ScheduledDate:1,CustomerName:2,LocationAddress:7,JobType:10,AssignedTechnicians:11};function Lb(n){return f(Ae(n,["total","amount","invoiceTotal"]))}function Ub(n){return f(Ae(n,["amount","total","paymentAmount"]))}function Mb(n){return f(Ae(n,["total","amount","subtotal"]))}function fn(n,a){return a.some(r=>n.includes(r))}function Bs(n){let a=Ae(n,["leadCall.callType"]);return typeof a=="string"?a.trim().toLowerCase():""}function Fb(n){return Bs(n)==="booked"||Ae(n,["booked","isBooked","bookingCreated"])===!0?!0:Ae(n,["bookingId","jobId"])!==void 0}function Nb(n){let a=Bs(n);if(a==="missed"||a==="abandoned"||Ae(n,["missed","isMissed","unanswered"])===!0)return!0;let r=qt(n,["statusValue"]);return r.includes("missed")||r.includes("noanswer")||r.includes("unanswered")||r.includes("abandoned")}function zb(n){return!Fe(n)||!Array.isArray(n.data)?[]:n.data.filter(Array.isArray)}function $b(n){let a=zb(n),r=[];for(let e of a)r.push({jobNumber:se(e[Zt.JobNumber])??"Unknown",scheduledDate:se(e[Zt.ScheduledDate])??"",customerName:se(e[Zt.CustomerName])??"Unknown",locationAddress:se(e[Zt.LocationAddress])??"Unknown",jobType:se(e[Zt.JobType])??"Unknown",assignedTechnicians:se(e[Zt.AssignedTechnicians])??"Unassigned"});return r}function Gb(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 Ls(n,a){a.register({name:"intel_daily_snapshot",domain:"intelligence",operation:"read",cacheTtlMs:6e4,cacheKeyParams:r=>{let e=Br.parse(r);return{...e,date:e.date??pr(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:Br.shape,handler:async r=>{try{let t=Br.parse(r).date??pr(a.timezone),{startIso:s,endIso:m,nextDate:u,nextDayStartIso:S}=Aa(t,a.timezone),X=u,B=[],H=await re(B,"Appointment data",()=>mt(n,"/tenant/{tenant}/appointments",{startsOnOrAfter:s,startsBefore:S}),[]),G=await re(B,"Job data",()=>mt(n,"/tenant/{tenant}/jobs",{appointmentStartsOnOrAfter:s,appointmentStartsBefore:S}),[]),_=await re(B,"Invoice data",()=>mt(n,"/tenant/{tenant}/invoices",{invoicedOnOrAfter:s,invoicedOnBefore:m}),[]),V=await re(B,"Payment data",()=>mt(n,"/tenant/{tenant}/payments",{paidOnAfter:s,paidOnBefore:m}),[]),le=await re(B,"Estimate data",()=>mt(n,"/tenant/{tenant}/estimates",{soldAfter:s,soldBefore:m,status:"Sold"}),[]),ve=await re(B,"Call data",()=>mt(n,"/v3/tenant/{tenant}/calls",{createdOnOrAfter:s,createdBefore:m,active:"Any"}),[]),he=await re(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),ue=0,Se=0;for(let ce of H){let ct=qt(ce,["statusValue"]);fn(ct,["done","completed"])?ue+=1:fn(ct,["working","inprogress","dispatched","hold"])&&(Se+=1)}let Re=H.length,Ue=Math.max(Re-ue-Se,0),C=0,ee=0,j=0;for(let ce of G){let ct=qt(ce,["statusValue"]);fn(ct,["completed","done"])?C+=1:fn(ct,["inprogress","working","dispatched","hold"])?ee+=1:fn(ct,["canceled","cancelled"])&&(j+=1)}let L=h(pe(_,Lb),2),ie=h(pe(V,Ub),2),E=h(pe(le,Mb),2),we=ve.length,$e=ve.filter(Fb).length,Ye=ve.filter(Nb).length,ze=he?$b(he):[],N=ze.slice(0,Lr),Ve=Gb(ze),ft=Math.round(me(ue,Re)*100);ze.length>Lr&&B.push(`Upcoming jobs list truncated to ${Lr} of ${ze.length} jobs.`);let At=[`${ue} of ${Re} appointments completed (${ft}%)`,Ye>0?`${Ye} missed calls today may need follow-up`:"No missed calls recorded today",`${ze.length} ${ze.length===1?"job":"jobs"} scheduled for tomorrow`,`$${mn(E)} in estimates sold`],tt={date:t,appointments:{total:Re,completed:ue,inProgress:Se,pending:Ue},jobs:{total:G.length,completed:C,inProgress:ee,canceled:j},revenue:{invoiced:L,collected:ie,estimatesSold:E},calls:{total:we,booked:$e,missed:Ye},upcomingJobs:{total:ze.length,breakdownByJobType:Ve,jobs:N},highlights:At};return B.length>0&&(tt._warnings=B),i(tt,{shape:!0})}catch(e){return o(g(e))}}})}import{z as Gn}from"zod";var Us=Gn.object({startDate:Gn.string().optional().describe("Filter estimates created after this date"),endDate:Gn.string().optional().describe("Filter estimates created before this date"),soldById:Gn.number().int().optional().describe("Filter by salesperson/technician")}),Mt={Name:0,TotalSales:1,ClosedAverageSale:2,CloseRate:3,SalesOpportunity:4,OptionsPerOpportunity:5,TechnicianId:6,AdjustmentRevenue:7,CompletedRevenueWithAdjustments:8};function qb(n){return!Fe(n)||!Array.isArray(n.data)?[]:n.data.filter(Array.isArray)}function Jb(n){return n.totalSales!==0||n.salesOpportunity!==0||n.closeRate!==0}function Wb(n){let a=qb(n),r=[];for(let e of a){let t=Math.round(f(e[Mt.TechnicianId]));if(t<=0)continue;let s={id:t,name:se(e[Mt.Name])??`Technician ${t}`,totalSales:h(f(e[Mt.TotalSales]),2),closedAverageSale:h(f(e[Mt.ClosedAverageSale]),2),closeRate:h(f(e[Mt.CloseRate])*100,1),salesOpportunity:Math.round(f(e[Mt.SalesOpportunity])),optionsPerOpportunity:h(f(e[Mt.OptionsPerOpportunity]),2)};Jb(s)&&r.push(s)}return r}function Hb(n){return f(Ae(n,["total","amount","subtotal"]))}function Vb(n){let a=qt(n,["statusValue"]);return a.includes("sold")||a.includes("accepted")||Ae(n,["soldOn","soldDate"])!==void 0?"sold":a.includes("dismiss")||a.includes("reject")||a.includes("cancel")?"dismissed":"open"}function Ms(n){return lr(Ae(n,["createdOn","createdAt","createdDate"]))}function Kb(n){return lr(Ae(n,["soldOn","soldDate"]))}function Zb(n){let a=se(Ae(n,["customerName","name","locationName"]));return a||(se(Ae(n,["customer.name","customer.displayName"]))??"Unknown")}function Fs(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:Us.shape,handler:async r=>{try{let e=Us.parse(r),t=[],s=a.timezone,m=e.startDate===void 0?void 0:Rn(e.startDate,!1,s),u=e.endDate===void 0?void 0:Rn(e.endDate,!0,s),[S,X]=await Promise.all([re(t,"Estimate data",()=>Rt(n,"/tenant/{tenant}/estimates",{createdOnOrAfter:m,createdBefore:u,soldById:e.soldById}),[]),re(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=Wb(X),H=e.soldById===void 0?B:B.filter(j=>j.id===e.soldById),G=e.endDate===void 0?new Date:new Date(Rn(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}},le=[],ve=[];for(let j of S){let L=Vb(j),ie=Hb(j);if(_[L].count+=1,_[L].value+=ie,L==="sold"){let ze=Ms(j),N=Kb(j);ze&&N&&ve.push(ur(ze,N,s));continue}if(L!=="open")continue;let E=Ms(j),we=E?ur(E,G,s):0,$e="30+";we<=7?$e="0-7":we<=14?$e="8-14":we<=30&&($e="15-30");let Ye=V[$e];Ye.count+=1,Ye.value+=ie,we>30&&le.push({id:f(Ae(j,["id","estimateId"])),customer:Zb(j),value:h(ie,2),daysOld:we})}let he=ve.length===0?0:h(me(ve.reduce((j,L)=>j+L,0),ve.length),1),ue=h(H.reduce((j,L)=>j+L.totalSales,0),2),Se=H.reduce((j,L)=>j+L.salesOpportunity,0),Re=h(H.reduce((j,L)=>j+L.totalSales*L.closedAverageSale,0),2),Ue=h(me(ue,Se)*100,1),C=h(me(Re,ue),2),ee={totalEstimates:S.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(me(_.sold.count,S.length),3),averageDaysToClose:he,salesFunnel:{totalSales:ue,averageCloseRate:Ue,totalOpportunities:Se,averageClosedSale:C,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:le.sort((j,L)=>L.daysOld!==j.daysOld?L.daysOld-j.daysOld:L.value-j.value).slice(0,25)};return t.length>0&&(ee._warnings=t),i(ee,{shape:!0})}catch(e){return o(g(e))}}})}import{z as It}from"zod";var Ns=It.object({startDate:It.string().describe("Start date (YYYY-MM-DD)"),endDate:It.string().describe("End date (YYYY-MM-DD)"),technicianId:It.number().int().optional().describe("Single technician (omit for all)"),technicianName:It.string().optional().describe("Single technician by name (resolved via cache, e.g. 'John'). Alternative to technicianId."),businessUnitId:It.number().int().optional().describe("Filter by business unit"),businessUnitName:It.string().optional().describe("Filter by business unit name (resolved via cache, e.g. 'HVAC'). Alternative to businessUnitId."),limit:It.number().int().min(1).max(50).optional().describe("Max technicians to analyze (default 25, max 50)"),includeExtendedMetrics:It.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.")}),xt={Name:0,CompletedRevenue:1,OpportunityJobAverage:2,OpportunityConversionRate:3,Opportunity:4,ConvertedJobs:5,CustomerSatisfaction:6,TechnicianId:7},Yt={Name:0,RevenuePerHour:1,BillableEfficiency:2,Upsold:3,RecallsCaused:6,TechnicianId:7},Ft={Name:0,ReplacementOpportunity:1,LeadsSet:2,AverageLeadSale:3,ReplacementLeadConversionRate:4,ReplacementLeadsSold:5,TotalLeadSales:6,AverageReplacementLeadSale:7,TechnicianId:8},vn={Name:0,MembershipOpportunities:1,MembershipsSold:2,MembershipConversionRate:3,TechnicianId:4,AdjustmentRevenue:5,CompletedRevenueWithAdjustments:6},In={Name:0,TechnicianBusinessUnit:1,TotalSalesFromTgl:2,ClosedAverageSaleFromTgl:3,CloseRateFromTgl:4,OptionsPerOpportunityFromTgl:5,TechnicianBusinessUnitId:6,TechnicianDivision:7,PaidTimeByBusinessUnit:8,AdjustmentRevenue:9,CompletedRevenueWithAdjustments:10,TechnicianId:11},Tn={Name:0,TotalSalesFromMarketingLeads:1,ClosedAverageSaleFromMarketingLeads:2,CloseRateFromMarketingLeads:3,OptionsPerOpportunityFromMarketingLeads:4,TechnicianId:5,AdjustmentRevenue:6,CompletedRevenueWithAdjustments:7};function Xt(n){return!Fe(n)||!Array.isArray(n.data)?[]:n.data.filter(Array.isArray)}function Qt(n){return Math.round(f(n))}function en(n,a){return se(n)??`Technician ${a}`}function Yb(n){return{replacementOpps:n?.replacementOpps??0,leadsSet:n?.leadsSet??0,avgLeadSale:n?.avgLeadSale??0,conversionRate:n?.conversionRate??0,totalLeadSales:n?.totalLeadSales??0}}function Xb(n){return{opportunities:n?.opportunities??0,sold:n?.sold??0,conversionRate:n?.conversionRate??0}}function zs(n){return{totalSales:n?.totalSales??0,avgSale:n?.avgSale??0,closeRate:n?.closeRate??0}}function Qb(n){let a=Xt(n),r=[];for(let e of a){let t=Qt(e[xt.TechnicianId]);t<=0||r.push({id:t,name:en(e[xt.Name],t),revenue:h(f(e[xt.CompletedRevenue]),2),averageTicket:h(f(e[xt.OpportunityJobAverage]),2),opportunities:Math.round(f(e[xt.Opportunity])),convertedJobs:Math.round(f(e[xt.ConvertedJobs])),conversionRate:h(f(e[xt.OpportunityConversionRate])*100,1),customerSatisfaction:h(f(e[xt.CustomerSatisfaction]),2)})}return r}function eh(n){let a=Xt(n),r=[];for(let e of a){let t=Qt(e[Yt.TechnicianId]);t<=0||r.push({id:t,name:en(e[Yt.Name],t),revenuePerHour:h(f(e[Yt.RevenuePerHour]),2),billableEfficiency:h(f(e[Yt.BillableEfficiency]),3),recallsCaused:Math.round(f(e[Yt.RecallsCaused])),upsold:h(f(e[Yt.Upsold]),2)})}return r}function $s(n){return n.replacementOpps!==0||n.leadsSet!==0||n.avgLeadSale!==0||n.conversionRate!==0||n.totalLeadSales!==0}function Gs(n){return n.opportunities!==0||n.sold!==0||n.conversionRate!==0}function qn(n){return n.totalSales!==0||n.avgSale!==0||n.closeRate!==0}function th(n){let a=Xt(n),r=[];for(let e of a){let t=Qt(e[Ft.TechnicianId]);if(t<=0)continue;let s={id:t,name:en(e[Ft.Name],t),replacementOpps:Math.round(f(e[Ft.ReplacementOpportunity])),leadsSet:Math.round(f(e[Ft.LeadsSet])),avgLeadSale:h(f(e[Ft.AverageLeadSale]),2),conversionRate:h(f(e[Ft.ReplacementLeadConversionRate])*100,1),totalLeadSales:h(f(e[Ft.TotalLeadSales]),2)};$s(s)&&r.push(s)}return r}function nh(n){let a=Xt(n),r=[];for(let e of a){let t=Qt(e[vn.TechnicianId]);if(t<=0)continue;let s={id:t,name:en(e[vn.Name],t),opportunities:Math.round(f(e[vn.MembershipOpportunities])),sold:Math.round(f(e[vn.MembershipsSold])),conversionRate:h(f(e[vn.MembershipConversionRate])*100,1)};Gs(s)&&r.push(s)}return r}function rh(n){let a=Xt(n),r=[];for(let e of a){let t=Qt(e[In.TechnicianId]);if(t<=0)continue;let s={id:t,name:en(e[In.Name],t),totalSales:h(f(e[In.TotalSalesFromTgl]),2),avgSale:h(f(e[In.ClosedAverageSaleFromTgl]),2),closeRate:h(f(e[In.CloseRateFromTgl])*100,1)};qn(s)&&r.push(s)}return r}function ah(n){let a=Xt(n),r=[];for(let e of a){let t=Qt(e[Tn.TechnicianId]);if(t<=0)continue;let s={id:t,name:en(e[Tn.Name],t),totalSales:h(f(e[Tn.TotalSalesFromMarketingLeads]),2),avgSale:h(f(e[Tn.ClosedAverageSaleFromMarketingLeads]),2),closeRate:h(f(e[Tn.CloseRateFromMarketingLeads])*100,1)};qn(s)&&r.push(s)}return r}function oh(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||$s(n.leadGeneration)||Gs(n.memberships)||qn(n.salesFromTechLeads)||qn(n.salesFromMarketingLeads)}function ke(n,a,r=2){let e=n.reduce((t,s)=>t+a(s),0);return h(me(e,n.length),r)}function qs(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:Ns.shape,handler:async r=>{try{let e=Ns.parse(r),{start:t,end:s}=Xe(e.startDate,e.endDate,a.timezone),m=Pa(t,s,a.timezone),u=[],S=e.limit??25,X=await Un(n,e.technicianId,e.technicianName),B=X.id;e.technicianName&&!B&&u.push(`Technician "${e.technicianName}" not found. Showing all technicians.`),X.resolvedName&&u.push(`Resolved "${e.technicianName}" \u2192 ${X.resolvedName} (ID: ${B})`);let H=await ut(n,e.businessUnitId,e.businessUnitName),G=H.id;e.businessUnitName&&!G&&u.push(`Business unit "${e.businessUnitName}" not found. Showing all business units.`),H.resolvedName&&u.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}],le=[{name:"From",value:e.startDate},{name:"To",value:e.endDate}],ve=[{name:"From",value:e.startDate},{name:"To",value:e.endDate}],he=[{name:"From",value:e.startDate},{name:"To",value:e.endDate}],ue=[{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)}),le.push({name:"BusinessUnitId",value:String(G)}),ve.push({name:"BusinessUnitIds",value:String(G)}),he.push({name:"BusinessUnitIds",value:String(G)}),ue.push({name:"BusinessUnitIds",value:String(G)}));let[Se,Re,Ue,C,ee,j]=await Promise.all([re(u,"Technician revenue report (Report 168)",()=>n.post("/tenant/{tenant}/report-category/technician-dashboard/reports/168/data",{parameters:_}),null),re(u,"Technician productivity report (Report 170)",()=>n.post("/tenant/{tenant}/report-category/technician-dashboard/reports/170/data",{parameters:V}),null),re(u,"Technician lead generation report (Report 169)",()=>n.post("/tenant/{tenant}/report-category/technician-dashboard/reports/169/data",{parameters:le}),null),e.includeExtendedMetrics?re(u,"Technician memberships report (Report 171)",()=>n.post("/tenant/{tenant}/report-category/technician-dashboard/reports/171/data",{parameters:ve}),null):Promise.resolve(null),e.includeExtendedMetrics?re(u,"Technician sales from tech leads report (Report 173)",()=>n.post("/tenant/{tenant}/report-category/technician-dashboard/reports/173/data",{parameters:he}),null):Promise.resolve(null),e.includeExtendedMetrics?re(u,"Technician sales from marketing leads report (Report 174)",()=>n.post("/tenant/{tenant}/report-category/technician-dashboard/reports/174/data",{parameters:ue}),null):Promise.resolve(null)]),L=Qb(Se),ie=eh(Re),E=th(Ue),we=nh(C),$e=rh(ee),Ye=ah(j);B!==void 0&&(L=L.filter(w=>w.id===B),ie=ie.filter(w=>w.id===B),E=E.filter(w=>w.id===B),we=we.filter(w=>w.id===B),$e=$e.filter(w=>w.id===B),Ye=Ye.filter(w=>w.id===B));let ze=new Map(L.map(w=>[w.id,w])),N=new Map(ie.map(w=>[w.id,w])),Ve=new Map(E.map(w=>[w.id,w])),ft=new Map(we.map(w=>[w.id,w])),At=new Map($e.map(w=>[w.id,w])),tt=new Map(Ye.map(w=>[w.id,w])),ce=[],ct=new Set([...ze.keys(),...N.keys(),...Ve.keys(),...ft.keys(),...At.keys(),...tt.keys()]);B!==void 0&&ct.forEach(w=>{w!==B&&ct.delete(w)});for(let w of ct){let Ot=ze.get(w),sn=N.get(w),ia=Ve.get(w),sa=ft.get(w),ca=At.get(w),da=tt.get(w),ma=Ot?.convertedJobs??0,Nm=h(me(ma,m),2),pa={id:w,name:Ot?.name??sn?.name??ia?.name??sa?.name??ca?.name??da?.name??`Technician ${w}`,jobsCompleted:ma,revenue:Ot?.revenue??0,averageTicket:Ot?.averageTicket??0,opportunities:Ot?.opportunities??0,convertedJobs:Ot?.convertedJobs??0,conversionRate:Ot?.conversionRate??0,customerSatisfaction:Ot?.customerSatisfaction??0,revenuePerHour:sn?.revenuePerHour??0,billableEfficiency:sn?.billableEfficiency??0,recallsCaused:sn?.recallsCaused??0,upsold:sn?.upsold??0,jobsPerDay:Nm,leadGeneration:Yb(ia),memberships:Xb(sa),salesFromTechLeads:zs(ca),salesFromMarketingLeads:zs(da)};oh(pa)&&ce.push(pa)}let Um=ce.length,Mm={jobsCompleted:ke(ce,w=>w.jobsCompleted,2),revenue:ke(ce,w=>w.revenue,2),averageTicket:ke(ce,w=>w.averageTicket,2),opportunities:ke(ce,w=>w.opportunities,2),convertedJobs:ke(ce,w=>w.convertedJobs,2),conversionRate:ke(ce,w=>w.conversionRate,1),customerSatisfaction:ke(ce,w=>w.customerSatisfaction,2),revenuePerHour:ke(ce,w=>w.revenuePerHour,2),billableEfficiency:ke(ce,w=>w.billableEfficiency,3),recallsCaused:ke(ce,w=>w.recallsCaused,2),upsold:ke(ce,w=>w.upsold,2),jobsPerDay:ke(ce,w=>w.jobsPerDay,2),leadGeneration:{replacementOpps:ke(ce,w=>w.leadGeneration.replacementOpps,2),leadsSet:ke(ce,w=>w.leadGeneration.leadsSet,2),avgLeadSale:ke(ce,w=>w.leadGeneration.avgLeadSale,2),conversionRate:ke(ce,w=>w.leadGeneration.conversionRate,1),totalLeadSales:ke(ce,w=>w.leadGeneration.totalLeadSales,2)},memberships:{opportunities:ke(ce,w=>w.memberships.opportunities,2),sold:ke(ce,w=>w.memberships.sold,2),conversionRate:ke(ce,w=>w.memberships.conversionRate,1)},salesFromTechLeads:{totalSales:ke(ce,w=>w.salesFromTechLeads.totalSales,2),avgSale:ke(ce,w=>w.salesFromTechLeads.avgSale,2),closeRate:ke(ce,w=>w.salesFromTechLeads.closeRate,1)},salesFromMarketingLeads:{totalSales:ke(ce,w=>w.salesFromMarketingLeads.totalSales,2),avgSale:ke(ce,w=>w.salesFromMarketingLeads.avgSale,2),closeRate:ke(ce,w=>w.salesFromMarketingLeads.closeRate,1)}},Fm=ce.length>S?ce.slice(0,S):ce;ce.length>S&&u.push(`Limited to ${S} of ${Um} technicians. Use 'limit' param to increase (max 50) or 'technicianId' for a specific tech.`);let oa={period:{start:e.startDate,end:e.endDate},technicians:Fm,teamAverages:Mm};return u.length>0&&(oa._warnings=u),i(oa,{shape:!0})}catch(e){return o(g(e))}}})}function ih(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,u=s.cacheKeyParams??(S=>S);s={...s,handler:async S=>Ra(s.name,u(S),()=>m(S),s.cacheTtlMs)}}return r.register(s)}:Reflect.get(r,e,t)}})}var sh=(n,a)=>{let r=ih(a);js(n,r),ys(n,r),qs(n,r),Ps(n,r),Fs(n,r),Is(n,r),Ls(n,r),Ss(n,r),Os(n,r),Cs(n,r)},Js=sh;import{z as Tt}from"zod";var Ur=Tt.object({from:Tt.number().optional().describe("Starting value for this markup range"),to:Tt.number().optional().describe("Ending value for this markup range"),percent:Tt.number().optional().describe("Markup percentage for this range")}),Jn=Tt.object({id:Tt.number().int().describe("Purchase order markup ID")}),Ws=Ur.extend({id:Tt.number().int().describe("Purchase order markup ID")}),Hs=b(p(Tt.object({ids:Tt.string().optional().describe("Comma-separated purchase order markup IDs (maximum 50)")}).extend(y(["Id","From","To","Percent"]))));function Vs(n,a){a.register({name:"inventory_purchase_order_markups_create",domain:"inventory",operation:"write",description:"Create a purchase order markup",schema:Ur.shape,handler:async r=>{let e=Ur.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:Jn.shape,handler:async r=>{let{id:e}=Jn.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:Hs.shape,handler:async r=>{let e=Hs.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:Ws.shape,handler:async r=>{let e=Ws.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:Jn.shape,handler:async r=>{let{id:e}=Jn.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 Qs=A.enum(["Pending","Sent","PartiallyReceived","Received","Exported","Canceled"]),ch=A.enum(["PendingApproval","Approved","Rejected"]),Ks=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")}),dh=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")}),mh=A.object({name:A.string().optional().describe("External link label"),url:A.string().optional().describe("External link URL")}),Mr=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:Qs.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:Ks.optional().describe("Shipping address for the purchase order"),billTo:Ks.optional().describe("Billing address for the purchase order"),items:A.array(dh).optional().describe("Purchase order line items"),externalLinks:A.array(mh).optional().describe("External links associated with the PO")}),Wn=A.object({id:A.number().int().describe("Purchase order ID")}),Zs=Mr.extend({id:A.number().int().describe("Purchase order ID")}),Ys=b(p(A.object({ids:A.string().optional().describe("Comma-separated purchase order IDs (maximum 50)"),status:Qs.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(y(["Id","ModifiedOn","CreatedOn"])))),Xs=b(p(A.object({ids:A.string().optional().describe("Comma-separated purchase order request IDs (maximum 50)"),requestStatus:ch.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(y(["Id","ModifiedOn","CreatedOn"])))),Hn=A.object({id:A.number().int().describe("Purchase order request ID")});function ec(n,a){a.register({name:"inventory_purchase_orders_create",domain:"inventory",operation:"write",description:"Create a purchase order",schema:Mr.shape,handler:async r=>{let e=Mr.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:Wn.shape,handler:async r=>{let{id:e}=Wn.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:Ys.shape,handler:async r=>{let e=Ys.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:Xs.shape,handler:async r=>{let e=Xs.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:Zs.shape,handler:async r=>{let e=Zs.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:Wn.shape,handler:async r=>{let{id:e}=Wn.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:Hn.shape,handler:async r=>{let{id:e}=Hn.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:Hn.shape,handler:async r=>{let{id:e}=Hn.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 St}from"zod";var Fr=St.object({name:St.string().optional().describe("Purchase order type name"),active:St.boolean().optional().describe("Whether the purchase order type is active"),color:St.string().optional().describe("Color code used for this purchase order type"),memo:St.string().optional().describe("Internal note for this purchase order type")}),UT=St.object({id:St.number().int().describe("Purchase order type ID")}),tc=Fr.extend({id:St.number().int().describe("Purchase order type ID")}),nc=b(p(St.object({}).extend(T()).extend(y(["Id","ModifiedOn","CreatedOn"]))));function rc(n,a){a.register({name:"inventory_purchase_order_types_create",domain:"inventory",operation:"write",description:"Create a purchase order type",schema:Fr.shape,handler:async r=>{let e=Fr.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:tc.shape,handler:async r=>{let e=tc.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:nc.shape,handler:async r=>{let e=nc.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 ph=F.union([F.string(),F.number(),F.boolean(),F.null()]),cc=F.object({}).catchall(ph).describe("Custom field key/value map"),lh=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")}),uh=F.object({name:F.string().optional().describe("External link label"),url:F.string().optional().describe("External link URL")}),ac=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(lh).optional().describe("Receipt line items"),externalLinks:F.array(uh).optional().describe("External links for this receipt"),customFields:cc.optional().describe("Receipt custom fields")}),oc=F.object({id:F.number().int().describe("Receipt ID")}),ic=b(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(T()).extend(y(["Id","ModifiedOn","CreatedOn"])))),sc=F.object({customFields:cc.describe("Custom fields payload")});function dc(n,a){a.register({name:"inventory_receipts_create",domain:"inventory",operation:"write",description:"Create a receipt",schema:ac.shape,handler:async r=>{let e=ac.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:oc.shape,handler:async r=>{let{id:e}=oc.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:ic.shape,handler:async r=>{let e=ic.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:sc.shape,handler:async r=>{let e=sc.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 x}from"zod";var bh=x.union([x.string(),x.number(),x.boolean(),x.null()]),gc=x.object({}).catchall(bh).describe("Custom field key/value map"),hh=x.object({skuId:x.number().int().optional().describe("SKU ID for this return item"),skuCode:x.string().optional().describe("SKU code for this return item"),description:x.string().optional().describe("Return item description"),quantity:x.number().optional().describe("Return quantity"),unitCost:x.number().optional().describe("Unit cost"),inventoryLocationId:x.number().int().optional().describe("Inventory location ID"),purchaseOrderItemId:x.number().int().optional().describe("Purchase order item ID"),taxCodeId:x.number().int().optional().describe("Tax code ID")}),gh=x.object({name:x.string().optional().describe("External link label"),url:x.string().optional().describe("External link URL")}),Nr=x.object({number:x.string().optional().describe("Return number"),referenceNumber:x.string().optional().describe("Reference number"),returnDate:x.string().optional().describe("Return date/time"),vendorId:x.number().int().optional().describe("Vendor ID"),jobId:x.number().int().optional().describe("Job ID"),purchaseOrderId:x.number().int().optional().describe("Purchase order ID"),batchId:x.number().int().optional().describe("Batch ID"),businessUnitId:x.number().int().optional().describe("Business unit ID"),inventoryLocationId:x.number().int().optional().describe("Inventory location ID"),returnTypeId:x.number().int().optional().describe("Return type ID"),status:x.string().optional().describe("Return status"),syncStatus:x.string().optional().describe("Sync status"),active:x.boolean().optional().describe("Whether return is active"),summary:x.string().optional().describe("Return summary"),memo:x.string().optional().describe("Return memo"),items:x.array(hh).optional().describe("Return line items"),externalLinks:x.array(gh).optional().describe("External links for this return"),customFields:gc.optional().describe("Return custom fields")}),mc=x.object({id:x.number().int().describe("Return ID")}),pc=Nr.extend({id:x.number().int().describe("Return ID")}),lc=b(p(x.object({ids:x.string().optional().describe("Comma-separated return IDs (maximum 50)"),number:x.string().optional().describe("Return number filter"),referenceNumber:x.string().optional().describe("Reference number filter"),jobId:x.number().int().optional().describe("Job ID filter"),purchaseOrderId:x.number().int().optional().describe("Purchase order ID filter"),batchId:x.number().int().optional().describe("Batch ID filter"),vendorIds:x.string().optional().describe("Comma-separated vendor IDs"),businessUnitIds:x.string().optional().describe("Comma-separated business unit IDs"),inventoryLocationIds:x.string().optional().describe("Comma-separated inventory location IDs"),syncStatuses:x.string().optional().describe("Comma-separated sync statuses"),customFieldsFields:x.record(x.string()).optional().describe("Custom field name/value filters"),customFieldsOperator:x.enum(["And","Or"]).optional().describe("Operator for custom field filters"),returnDateOnOrAfter:x.string().datetime().optional().describe("Return date on or after this UTC timestamp"),returnDateBefore:x.string().datetime().optional().describe("Return date before this UTC timestamp"),externalDataApplicationGuid:x.string().uuid().optional().describe("External data application GUID"),externalDataKey:x.string().optional().describe("External data key"),externalDataValues:x.string().optional().describe("External data values")}).extend(T()).extend(y(["Id","ModifiedOn","CreatedOn"])))),uc=x.object({customFields:gc.describe("Custom fields payload")}),zr=x.object({name:x.string().optional().describe("Return type name"),active:x.boolean().optional().describe("Whether the return type is active"),color:x.string().optional().describe("Color code for display"),memo:x.string().optional().describe("Internal note")}),bc=zr.extend({id:x.number().int().describe("Return type ID")}),hc=b(p(x.object({activeOnly:x.boolean().optional().describe("When true, return only active return types"),name:x.string().optional().describe("Return type name filter")}).extend(y(["Id","ModifiedOn","CreatedOn"]))));function yc(n,a){a.register({name:"inventory_returns_create",domain:"inventory",operation:"write",description:"Create a return",schema:Nr.shape,handler:async r=>{let e=Nr.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:uc.shape,handler:async r=>{let e=uc.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:pc.shape,handler:async r=>{let e=pc.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:mc.shape,handler:async r=>{let{id:e}=mc.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:lc.shape,handler:async r=>{let e=lc.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:zr.shape,handler:async r=>{let e=zr.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:bc.shape,handler:async r=>{let e=bc.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:hc.shape,handler:async r=>{let e=hc.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 yh=J.union([J.string(),J.number(),J.boolean(),J.null()]),Tc=J.object({}).catchall(yh).describe("Custom field key/value map"),fh=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")}),vh=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(fh).optional().describe("Transfer line items"),customFields:Tc.optional().describe("Transfer custom fields")}),fc=vh.extend({id:J.number().int().describe("Transfer ID")}),vc=b(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(y(["Id","ModifiedOn","CreatedOn"])))),Ic=J.object({customFields:Tc.describe("Custom fields payload")});function Sc(n,a){a.register({name:"inventory_transfers_update_custom_fields",domain:"inventory",operation:"write",description:"Update transfer custom fields",schema:Ic.shape,handler:async r=>{let e=Ic.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:fc.shape,handler:async r=>{let e=fc.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:vc.shape,handler:async r=>{let e=vc.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 be}from"zod";var wc=be.object({street:be.string().optional().describe("Street address line"),unit:be.string().optional().describe("Address unit or suite"),city:be.string().optional().describe("Address city"),state:be.string().optional().describe("Address state or province"),postalCode:be.string().optional().describe("Address postal code"),country:be.string().optional().describe("Address country")}),$r=be.object({name:be.string().optional().describe("Vendor name"),code:be.string().optional().describe("Vendor internal code"),contactName:be.string().optional().describe("Primary vendor contact name"),phone:be.string().optional().describe("Vendor phone number"),email:be.string().optional().describe("Vendor email address"),website:be.string().optional().describe("Vendor website URL"),accountNumber:be.string().optional().describe("Vendor account number"),taxId:be.string().optional().describe("Vendor tax ID"),memo:be.string().optional().describe("Internal vendor memo"),active:be.boolean().optional().describe("Whether the vendor is active"),address:wc.optional().describe("Vendor mailing address"),remitToAddress:wc.optional().describe("Vendor remit-to address"),businessUnitIds:be.array(be.number().int().describe("Business unit ID associated with this vendor")).optional().describe("Business units associated with this vendor")}),Ih=be.object({id:be.number().int().describe("Vendor ID")}),_c=Ih.extend({externalDataApplicationGuid:be.string().uuid().optional().describe("External data application GUID for lookup"),externalDataKey:be.string().optional().describe("External data key used with externalDataValues"),externalDataValues:be.string().optional().describe("External data values used with externalDataKey")}),Dc=$r.extend({id:be.number().int().describe("Vendor ID")}),Cc=b(p(be.object({ids:be.array(be.number().int().describe("Vendor ID to include")).optional().describe("Collection of vendor IDs to filter by"),externalDataApplicationGuid:be.string().uuid().optional().describe("External data application GUID for lookup"),externalDataKey:be.string().optional().describe("External data key used with externalDataValues"),externalDataValues:be.string().optional().describe("External data values used with externalDataKey")}).extend(T()).extend(y(["Id","ModifiedOn","CreatedOn"]))));function kc(n,a){a.register({name:"inventory_vendors_create",domain:"inventory",operation:"write",description:"Create a vendor",schema:$r.shape,handler:async r=>{let e=$r.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:_c.shape,handler:async r=>{let e=_c.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:Cc.shape,handler:async r=>{let e=Cc.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:Dc.shape,handler:async r=>{let e=Dc.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 Th=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")}),Sh=fe.object({key:fe.string().optional().describe("External data key"),value:fe.string().optional().describe("External data value")}),wh=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:Th.optional().describe("Warehouse address"),externalData:fe.array(Sh).optional().describe("External data entries")}),Oc=wh.extend({id:fe.number().int().describe("Warehouse ID")}),Rc=b(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(T()).extend(y(["Id","ModifiedOn","CreatedOn"]))));function jc(n,a){a.register({name:"inventory_warehouses_update",domain:"inventory",operation:"write",description:"Update a warehouse",schema:Oc.shape,handler:async r=>{let e=Oc.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:Rc.shape,handler:async r=>{let e=Rc.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 _h=(n,a)=>{ec(n,a),rc(n,a),Vs(n,a),yc(n,a),Sc(n,a),kc(n,a),jc(n,a),dc(n,a)},xc=_h;import{z as Z}from"zod";var Gr=Z.string().regex(/^[a-zA-Z0-9_-]+$/,"Must contain only alphanumeric characters, hyphens, and underscores"),Dh=Z.object({payload:Z.object({}).passthrough().optional().describe("Attribution payload")}),Ch=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")})),kh=p(Z.object({ids:Z.string().optional().describe("Comma-delimited rate sheet IDs"),searchTerm:Z.string().optional().describe("Search term"),...T()})),Oh=Z.object({rateSheetId:Z.number().int().describe("Rate sheet ID"),payload:Z.object({}).passthrough().describe("Rate sheet update payload")}),Rh=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")})),lS=Z.object({id:Gr.describe("Scheduler ID")}),jh=Z.object({id:Gr.describe("Scheduler ID"),sessionCreatedOnOrAfter:Z.string().datetime().describe("Session created on or after timestamp"),sessionCreatedBefore:Z.string().datetime().describe("Session created before timestamp")}),xh=b(p(Z.object({}))),Ah=b(p(Z.object({id:Gr.describe("Scheduler ID")})));function tn(n){return n&&n.length>0?n.join(","):void 0}function Vn(n,a,r){a.register({name:r.name,domain:"marketing",operation:"write",description:r.description,schema:Dh.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 Ac(n,a){Vn(n,a,{name:"marketing_external_call_attributions_create",description:"Create external call attributions",path:"/tenant/{tenant}/external-call-attributions"}),Vn(n,a,{name:"marketing_scheduled_job_attributions_create",description:"Create scheduled job attributions",path:"/tenant/{tenant}/job-attributions"}),Vn(n,a,{name:"marketing_web_booking_attributions_create",description:"Create web booking attributions",path:"/tenant/{tenant}/web-booking-attributions"}),Vn(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:Ch.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:kh.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:Oh.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:Rh.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:tn(e.responseTypes),locationIds:tn(e.locationIds),sources:tn(e.sources),reviewStatuses:tn(e.reviewStatuses),technicianIds:tn(e.technicianIds),campaignIds:tn(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:xh.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:jh.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:Ah.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 de}from"zod";var qr=de.object({id:de.number().int().describe("Call ID")}),Ph=de.object({id:de.number().int().describe("Call ID"),payload:de.object({}).passthrough().describe("Call update payload")}),Eh=p(b(de.object({...T(),ids:de.string().optional().describe("Comma-delimited call IDs"),createdAfter:de.string().datetime().optional().describe("Created after UTC timestamp"),modifiedAfter:de.string().datetime().optional().describe("Modified after UTC timestamp"),campaignId:de.number().int().optional().describe("Campaign ID"),agentId:de.number().int().optional().describe("Agent ID"),minDuration:de.number().int().optional().describe("Minimum duration in seconds"),phoneNumberCalled:de.string().optional().describe("Phone number called"),callerPhoneNumber:de.string().optional().describe("Caller phone number"),agentName:de.string().optional().describe("Agent name"),agentIsExternal:de.boolean().optional().describe("Whether agent is external"),agentExternalId:de.number().int().optional().describe("Agent external ID"),...y(["Id","CreatedOn","ModifiedOn"])}))),Bh=p(de.object({modifiedBefore:de.string().datetime().optional().describe("Modified before UTC timestamp"),modifiedOnOrAfter:de.string().datetime().optional().describe("Modified on or after UTC timestamp"),createdOnOrAfter:de.string().datetime().optional().describe("Created on or after UTC timestamp"),modifiedAfter:de.string().datetime().optional().describe("Modified after UTC timestamp"),minDuration:de.number().int().optional().describe("Minimum duration in seconds"),phoneNumberCalled:de.string().optional().describe("Phone number called"),campaignId:de.number().int().optional().describe("Campaign ID"),agentId:de.number().int().optional().describe("Agent ID"),agentName:de.string().optional().describe("Agent name"),agentIsExternal:de.boolean().optional().describe("Whether agent is external"),agentExternalId:de.number().int().optional().describe("Agent external ID"),orderBy:de.enum(["Id","CreatedOn","ModifiedOn","createdOn","modifiedOn"]).optional().describe("Field used for ordering"),orderByDirection:de.enum(["asc","desc"]).optional().describe("Sort direction"),activeOnly:de.boolean().optional().describe("Return only active calls"),createdAfter:de.string().datetime().optional().describe("Created after UTC timestamp"),createdBefore:de.string().datetime().optional().describe("Created before UTC timestamp"),ids:de.array(de.number().int()).optional().describe("Specific call IDs")}));function Pc(n,a){a.register({name:"marketing_calls_v3_list",domain:"marketing",operation:"read",description:"List calls from v3 calls endpoint",schema:Eh.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:qr.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:qr.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:qr.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:Bh.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 We}from"zod";var Bc=We.object({year:We.number().int().optional().describe("Cost year"),month:We.number().int().optional().describe("Cost month"),dailyCost:We.number().optional().describe("Daily cost"),campaignId:We.number().int().optional().describe("Campaign ID")}),Lh=Bc.extend({year:We.number().int().describe("Cost year"),month:We.number().int().describe("Cost month"),dailyCost:We.number().describe("Daily cost"),campaignId:We.number().int().describe("Campaign ID")}),Ec=We.object({id:We.number().int().describe("Campaign cost ID")}),Uh=We.object({id:We.number().int().describe("Campaign cost ID"),payload:Bc.optional().describe("Campaign cost update payload")}),Mh=p(We.object({year:We.number().int().optional().describe("Cost year"),month:We.number().int().optional().describe("Cost month"),campaignId:We.number().int().optional().describe("Campaign ID"),...y(["Id","Date"])}));function Fh(n,a,r,e){a.register({name:r,domain:"marketing",operation:"read",description:e,schema:Mh.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 Lc(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:Lh.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:Ec.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:Uh.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:Ec.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 xe}from"zod";var Uc=xe.object({name:xe.string().optional().describe("Campaign name"),active:xe.boolean().optional().describe("Campaign active flag"),source:xe.string().optional().describe("Campaign source"),otherSource:xe.string().optional().describe("Other campaign source"),businessUnit:xe.string().optional().describe("Business unit"),medium:xe.string().optional().describe("Campaign medium"),otherMedium:xe.string().optional().describe("Other campaign medium"),campaignPhoneNumbers:xe.array(xe.string()).optional().describe("Campaign phone numbers")}).passthrough(),Nh=xe.object({payload:Uc.extend({name:xe.string().describe("Campaign name")})}),zh=xe.object({id:xe.number().int().describe("Campaign ID")}),$h=xe.object({id:xe.number().int().describe("Campaign ID"),payload:Uc.describe("Campaign update payload")}),Gh=p(b(xe.object({...T(),ids:xe.string().optional().describe("Comma-delimited campaign IDs"),name:xe.string().optional().describe("Campaign name filter"),campaignPhoneNumber:xe.string().optional().describe("Campaign phone number filter"),...y(["Id","Name","CreatedOn","ModifiedOn"])}))),qh=p(xe.object({id:xe.number().int().describe("Campaign ID"),year:xe.number().int().optional().describe("Cost year"),month:xe.number().int().optional().describe("Cost month"),...y(["Id","Date"])}));function Mc(n,a){a.register({name:"marketing_campaigns_create",domain:"marketing",operation:"write",description:"Create a campaign",schema:Nh.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:zh.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:Gh.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:$h.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:qh.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 gt}from"zod";var Fc=gt.object({contact_numbers:gt.array(gt.string()).optional().describe("Phone numbers to opt out (legacy naming)"),contactNumbers:gt.array(gt.string()).optional().describe("Phone numbers to opt out")}),DS=Fc.refine(n=>!!(n.contact_numbers??n.contactNumbers),{message:"Provide contact_numbers or contactNumbers"}),Nc=gt.object({contact_numbers:gt.array(gt.string()).optional().describe("Phone numbers to lookup (legacy naming)"),contactNumbers:gt.array(gt.string()).optional().describe("Phone numbers to lookup")}),CS=Nc.refine(n=>!!(n.contact_numbers??n.contactNumbers),{message:"Provide contact_numbers or contactNumbers"});function Jh(n){return n.contact_numbers??n.contactNumbers??[]}function Wh(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 Hh(n,a,r,e){a.register({name:r,domain:"marketing",operation:"write",description:e,schema:Fc.shape,handler:async t=>{let s=t;try{let m=await n.post("/v3/tenant/{tenant}/optinouts/optouts",{contactNumbers:Jh(s)});return i(m)}catch(m){return o(c(m))}}})}function Vh(n,a,r,e){a.register({name:r,domain:"marketing",operation:"write",description:e,schema:Nc.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 zc(n,a){Wh(n,a,"marketing_opt_in_outs_list","List all opt-out records"),Hh(n,a,"marketing_opt_in_outs_create","Create opt-out records for phone numbers"),Vh(n,a,"marketing_opt_in_outs_lookup_create","Lookup opt-out records for phone numbers")}import{z as st}from"zod";var Kh=st.object({email:st.string().email().describe("Suppression email address")}),Zh=st.object({email:st.string().email().describe("Email address to suppress"),group_id:st.number().int().optional().describe("Suppression group ID"),reason:st.string().optional().describe("Suppression reason")}),Yh=st.object({email:st.string().email().optional().describe("Email address to unsuppress"),group_id:st.number().int().optional().describe("Suppression group ID"),reason:st.string().optional().describe("Unsuppression reason")}),Xh=p(st.object({}));function Qh(n,a,r,e){a.register({name:r,domain:"marketing",operation:"read",description:e,schema:Xh.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 $c(n,a){Qh(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:Yh.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:Zh.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 eg=(n,a)=>{Ac(n,a),Lc(n,a),Mc(n,a),Pc(n,a),zc(n,a),$c(n,a)},Gc=eg;import{z as Oe}from"zod";var Hc=Oe.enum(["Active","Suspended","Expired","Canceled","Deleted"]),Vc=Oe.enum(["OneTime","Monthly","EveryOtherMonth","Quarterly","BiAnnual","Annual"]),tg=Oe.object({typeId:Oe.number().int().optional().describe("Custom field type ID"),value:Oe.string().optional().describe("Custom field value")}),Jr=Oe.object({customerId:Oe.number().int().optional().describe("Customer ID for membership sale"),locationId:Oe.number().int().optional().describe("Location ID for membership sale"),membershipTypeId:Oe.number().int().optional().describe("Membership type ID to sell"),soldOn:Oe.string().optional().describe("Date/time when the membership was sold"),soldById:Oe.number().int().optional().describe("User ID who sold the membership"),campaignId:Oe.number().int().optional().describe("Campaign ID attributed to the sale"),businessUnitId:Oe.number().int().optional().describe("Business unit ID associated with the membership"),duration:Oe.number().int().optional().describe("Membership duration in months for fixed-term memberships"),billingFrequency:Vc.optional().describe("Billing frequency for recurring membership billing"),active:Oe.boolean().optional().describe("Whether the membership is active"),autoRenew:Oe.boolean().optional().describe("Whether the membership auto-renews"),memo:Oe.string().optional().describe("Internal memo for the membership"),customFields:Oe.array(tg).optional().describe("Custom field values for the membership")}),qc=b(p(Oe.object({ids:Oe.string().optional().describe("Comma-separated membership IDs (maximum 50)"),customerIds:Oe.string().optional().describe("Comma-separated customer IDs"),status:Hc.optional().describe("Filter by membership status"),duration:Oe.number().int().optional().describe("Filter by membership duration in months"),billingFrequency:Vc.optional().describe("Filter by membership billing frequency")}).extend(T()))),Kn=Oe.object({id:Oe.number().int().describe("Customer membership ID")}),Jc=Jr.extend({id:Oe.number().int().describe("Customer membership ID"),status:Hc.optional().describe("Updated membership status value")}),Wc=b(p(Oe.object({}).extend(y(["Id","Name","CreatedOn","ModifiedOn"]))));function Kc(n,a){a.register({name:"memberships_list",domain:"memberships",operation:"read",description:"List customer memberships",schema:qc.shape,handler:async r=>{let e=qc.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:Wc.shape,handler:async r=>{let e=Wc.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:Kn.shape,handler:async r=>{let{id:e}=Kn.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:Jr.shape,handler:async r=>{let e=Jr.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:Jc.shape,handler:async r=>{let e=Jc.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:Kn.shape,handler:async r=>{let{id:e}=Kn.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 ye}from"zod";var ng=ye.enum(["NotAttempted","Unreachable","Contacted","Won","Dismissed"]),rg=ye.enum(["Weekly","Monthly","Seasonal","Daily","NthWeekdayOfMonth"]),ag=ye.enum(["Continuous","NumberOfVisits"]),og=ye.object({membershipId:ye.number().int().optional().describe("Customer membership ID associated with this recurring service"),locationId:ye.number().int().optional().describe("Location ID for this recurring service"),recurringServiceTypeId:ye.number().int().optional().describe("Recurring service type ID"),summary:ye.string().optional().describe("Short summary for the recurring service"),startDate:ye.string().optional().describe("Recurring service start date"),endDate:ye.string().optional().describe("Recurring service end date"),nextServiceDate:ye.string().optional().describe("Next scheduled service date for this recurring service"),active:ye.boolean().optional().describe("Whether the recurring service is active"),autoRenew:ye.boolean().optional().describe("Whether the recurring service auto-renews")}),Zc=ye.object({id:ye.number().int().describe("Recurring service ID")}),Yc=og.extend({id:ye.number().int().describe("Recurring service ID")}),Xc=b(p(ye.object({ids:ye.string().optional().describe("Comma-separated recurring service IDs (maximum 50)"),membershipIds:ye.string().optional().describe("Comma-separated customer membership IDs"),locationIds:ye.string().optional().describe("Comma-separated location IDs")}).extend(T()))),Zn=ye.object({id:ye.number().int().describe("Recurring service event ID")}),Qc=b(p(ye.object({ids:ye.string().optional().describe("Comma-separated recurring service event IDs (maximum 50)"),locationId:ye.number().int().optional().describe("Filter by location ID"),jobId:ye.number().int().optional().describe("Filter by job ID"),status:ng.optional().describe("Filter by recurring service event follow-up status")}))),ed=ye.object({id:ye.number().int().describe("Recurring service type ID")}),td=b(p(ye.object({ids:ye.string().optional().describe("Comma-separated recurring service type IDs (maximum 50)"),membershipTypeId:ye.number().int().optional().describe("Filter by membership type ID"),recurrenceType:rg.optional().describe("Filter by recurrence type"),durationType:ag.optional().describe("Filter by duration type")}).extend(T()).extend(y(["Id","Name","CreatedOn","ModifiedOn"]))));function nd(n,a){a.register({name:"memberships_recurring_services_get",domain:"memberships",operation:"read",description:"Get a recurring service by ID",schema:Zc.shape,handler:async r=>{let{id:e}=Zc.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:Xc.shape,handler:async r=>{let e=Xc.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:Yc.shape,handler:async r=>{let e=Yc.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:Qc.shape,handler:async r=>{let e=Qc.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:Zn.shape,handler:async r=>{let{id:e}=Zn.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:Zn.shape,handler:async r=>{let{id:e}=Zn.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:ed.shape,handler:async r=>{let{id:e}=ed.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:td.shape,handler:async r=>{let e=td.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 Nt}from"zod";var ig=Nt.enum(["Draft","Sent","Rejected","Accepted","Activated","Canceled","Expired","AutoRenew"]),rd=Nt.object({id:Nt.number().int().describe("Service agreement ID")}),ad=b(p(Nt.object({ids:Nt.string().optional().describe("Comma-separated service agreement IDs (maximum 50)"),customerIds:Nt.string().optional().describe("Comma-separated customer IDs"),businessUnitIds:Nt.string().optional().describe("Comma-separated business unit IDs"),status:ig.optional().describe("Filter by service agreement status")}).extend(y(["Id","Name","CreatedOn","ModifiedOn","StartDate","EndDate"]))));function od(n,a){a.register({name:"memberships_service_agreements_list",domain:"memberships",operation:"read",description:"List service agreements",schema:ad.shape,handler:async r=>{let e=ad.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:rd.shape,handler:async r=>{let{id:e}=rd.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 $t}from"zod";var sg=$t.enum(["OneTime","Monthly","EveryOtherMonth","Quarterly","BiAnnual","Annual"]),zt=$t.object({id:$t.number().int().describe("Membership type ID")}),id=b(p($t.object({ids:$t.string().optional().describe("Comma-separated membership type IDs (maximum 50)"),duration:$t.number().int().optional().describe("Filter by membership duration in months"),billingFrequency:sg.optional().describe("Filter by billing frequency"),includeDurationBilling:$t.boolean().optional().describe("Include duration billing items in each result")}).extend(T()))),sd=zt.extend(T());function cd(n,a){a.register({name:"memberships_types_get",domain:"memberships",operation:"read",description:"Get a membership type by ID",schema:zt.shape,handler:async r=>{let{id:e}=zt.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:id.shape,handler:async r=>{let e=id.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:zt.shape,handler:async r=>{let{id:e}=zt.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:zt.shape,handler:async r=>{let{id:e}=zt.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:sd.shape,handler:async r=>{let e=sd.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 cg=(n,a)=>{Kc(n,a),cd(n,a),nd(n,a),od(n,a)},dd=cg;import{z as wt}from"zod";var dg=wt.object({}).passthrough(),mg=wt.object({payload:dg.describe("Payroll adjustment create payload")}),pg=wt.object({id:wt.number().int().describe("Payroll adjustment ID"),employeeType:wt.enum(["Technician","Employee"]).optional().describe("Employee type")}),lg=p(wt.object({employeeIds:wt.string().optional().describe("Comma-delimited employee IDs"),postedOnOrAfter:wt.string().datetime().optional().describe("Filter adjustments posted on or after this UTC timestamp"),postedOnOrBefore:wt.string().datetime().optional().describe("Filter adjustments posted on or before this UTC timestamp")}));function md(n,a){a.register({name:"payroll_payroll_adjustments_create",domain:"payroll",operation:"write",description:"Create a payroll adjustment",schema:mg.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:pg.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:lg.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 Ne}from"zod";var ug=Ne.object({name:Ne.string().describe("Gross pay item name"),description:Ne.string().optional().describe("Gross pay item description"),amount:Ne.number().describe("Gross pay amount"),is_active:Ne.boolean().optional().describe("Whether the gross pay item is active")}),bg=Ne.object({name:Ne.string().optional().describe("Gross pay item name"),description:Ne.string().optional().describe("Gross pay item description"),amount:Ne.number().optional().describe("Gross pay amount"),is_active:Ne.boolean().optional().describe("Whether the gross pay item is active")}).passthrough(),hg=Ne.object({id:Ne.number().int().describe("Gross pay item ID"),payload:bg.describe("Gross pay item update payload")}),gg=Ne.object({id:Ne.number().int().describe("Gross pay item ID")}),yg=p(Ne.object({employeeType:Ne.enum(["Technician","Employee"]).optional().describe("Employee type"),employeeId:Ne.number().int().optional().describe("Employee ID"),payrollIds:Ne.string().optional().describe("Comma-delimited payroll IDs"),dateOnOrAfter:Ne.string().datetime().optional().describe("Filter items on or after this UTC timestamp"),dateOnOrBefore:Ne.string().datetime().optional().describe("Filter items on or before this UTC timestamp")}));function pd(n,a){a.register({name:"payroll_gross_pay_items_create",domain:"payroll",operation:"write",description:"Create a gross pay item",schema:ug.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:hg.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:gg.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:yg.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 et}from"zod";var fg=et.enum(["Pending","Expired","Approved","Paid","Locked"]),ld=et.enum(["Technician","Employee"]),vg=et.enum(["True","Any","False"]),Wr=et.object({startedOnOrAfter:et.string().datetime().optional().describe("Filter payrolls started on or after this UTC timestamp"),endedOnOrBefore:et.string().datetime().optional().describe("Filter payrolls ended on or before this UTC timestamp"),modifiedBefore:et.string().datetime().optional().describe("Filter payrolls modified before this UTC timestamp"),modifiedOnOrAfter:et.string().datetime().optional().describe("Filter payrolls modified on or after this UTC timestamp"),approvedOnOrAfter:et.string().datetime().optional().describe("Filter payrolls approved on or after this UTC timestamp"),status:fg.optional().describe("Payroll status"),active:vg.optional().describe("Active filter")}),Ig=p(Wr.extend({employeeType:ld.optional().describe("Employee type")})),Tg=et.object({id:et.number().int().describe("Payroll ID"),employeeType:ld.optional().describe("Optional employee type filter")}),Sg=p(Wr.extend({technicianId:et.number().int().describe("Technician ID")})),wg=p(Wr.extend({employeeId:et.number().int().describe("Employee ID")}));function ud(n,a){a.register({name:"payroll_payrolls_list",domain:"payroll",operation:"read",description:"List payroll periods",schema:Ig.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:Tg.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:Sg.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:wg.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 Ee}from"zod";var _g=Ee.enum(["Technician","Employee"]),yd=Ee.object({employeeId:Ee.number().int().optional().describe("Linked employee ID"),active:Ee.boolean().optional().describe("Whether payroll settings are active"),payType:Ee.string().optional().describe("Pay type value"),payRate:Ee.number().optional().describe("Primary pay rate"),hourlyRate:Ee.number().optional().describe("Hourly pay rate"),overtimeRate:Ee.number().optional().describe("Overtime rate"),overtimeMultiplier:Ee.number().optional().describe("Overtime multiplier"),doubleTimeMultiplier:Ee.number().optional().describe("Double-time multiplier"),regularHoursPerWeek:Ee.number().optional().describe("Regular hours per week"),dailyOvertimeThresholdMinutes:Ee.number().int().optional().describe("Daily overtime threshold in minutes"),weeklyOvertimeThresholdMinutes:Ee.number().int().optional().describe("Weekly overtime threshold in minutes"),timesheetCodeId:Ee.number().int().optional().describe("Timesheet code ID"),laborWageTypeId:Ee.number().int().optional().describe("Labor wage type ID"),externalPayrollId:Ee.string().optional().describe("External payroll identifier"),startDate:Ee.string().optional().describe("Payroll setting start date/time"),endDate:Ee.string().optional().describe("Payroll setting end date/time")}).passthrough(),Hr=Ee.object({employeeId:Ee.number().int().describe("Employee ID")}),Vr=Ee.object({technicianId:Ee.number().int().describe("Technician ID")}),bd=Hr.extend({payload:yd.optional().describe("Employee payroll settings payload")}),hd=Vr.extend({payload:yd.optional().describe("Technician payroll settings payload")}),gd=b(p(Ee.object({employeeType:_g.optional().describe("Employee type"),...T()})));function fd(n,a){a.register({name:"payroll_payroll_settings_employee_get",domain:"payroll",operation:"read",description:"Get payroll settings for an employee",schema:Hr.shape,handler:async r=>{let e=Hr.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:bd.shape,handler:async r=>{let e=bd.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:gd.shape,handler:async r=>{let e=gd.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:Vr.shape,handler:async r=>{let e=Vr.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:hd.shape,handler:async r=>{let e=hd.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 Dg=p(b(W.object({...T(),...y(["Id","ModifiedOn","CreatedOn"])}))),Cg=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(),kg=W.object({jobId:W.number().int().describe("Job ID"),payload:Td.optional().describe("Optional payload for job timesheet creation")}),Og=p(b(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"),...y(["Id","ModifiedOn","CreatedOn"])}))),Rg=p(b(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"),...y(["Id","ModifiedOn","CreatedOn"])}))),jg=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")}),xg=p(b(W.object({employeeId:W.number().int().optional().describe("Employee ID"),employeeType:W.enum(["Technician","Employee"]).optional().describe("Employee type"),...T(),...y(["Id","ModifiedOn","CreatedOn"])}))),Yn=W.object({id:W.number().int().describe("Non-job timesheet ID")}),Sd=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(),vd=Sd,Id=Sd.extend({id:W.number().int().describe("Non-job timesheet ID")});function wd(n,a){a.register({name:"payroll_timesheet_codes_get",domain:"payroll",operation:"read",description:"Get a timesheet code by ID",schema:Cg.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:Dg.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:vd.shape,handler:async r=>{let e=vd.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:Yn.shape,handler:async r=>{let e=Yn.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:kg.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:Og.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:Rg.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:jg.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:xg.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:Id.shape,handler:async r=>{let e=Id.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:Yn.shape,handler:async r=>{let e=Yn.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 Ag=(n,a)=>{ud(n,a),fd(n,a),wd(n,a),pd(n,a),md(n,a)},_d=Ag;import{z as ne}from"zod";var Pg=ne.object({key:ne.string().describe("External data key"),value:ne.string().describe("External data value")}).describe("External data entry"),Eg=ne.object({street:ne.string().optional().describe("Street address"),unit:ne.string().optional().describe("Address unit/suite"),city:ne.string().optional().describe("City"),state:ne.string().optional().describe("State/province"),zip:ne.string().optional().describe("Postal code"),country:ne.string().optional().describe("Country")}).describe("Employee address"),Bg=ne.object({name:ne.string().optional().describe("Emergency contact name"),relationship:ne.string().optional().describe("Emergency contact relationship"),phoneNumber:ne.string().optional().describe("Emergency contact phone number")}).describe("Emergency contact details"),Rd=ne.object({firstName:ne.string().optional().describe("Employee first name"),middleName:ne.string().optional().describe("Employee middle name"),lastName:ne.string().optional().describe("Employee last name"),nickname:ne.string().optional().describe("Employee nickname"),employeeNumber:ne.string().optional().describe("Employee number/code"),email:ne.string().optional().describe("Primary email address"),phoneNumber:ne.string().optional().describe("Primary phone number"),mobilePhoneNumber:ne.string().optional().describe("Mobile phone number"),active:ne.boolean().optional().describe("Whether the employee is active"),userId:ne.number().int().optional().describe("Associated user ID"),userRoleId:ne.number().int().optional().describe("Associated user role ID"),businessUnitId:ne.number().int().optional().describe("Default business unit ID"),technicianId:ne.number().int().optional().describe("Associated technician ID"),hireDate:ne.string().optional().describe("Hire date/time in RFC3339 format"),terminationDate:ne.string().optional().describe("Termination date/time in RFC3339 format"),address:Eg.optional().describe("Employee mailing address"),emergencyContact:Bg.optional().describe("Emergency contact"),externalData:ne.array(Pg).optional().describe("External data entries")}).passthrough(),Sn=ne.object({id:ne.number().int().describe("Employee ID")}),Dd=ne.object({body:Rd.optional().describe("Employee create payload")}),Cd=Sn.extend({body:Rd.optional().describe("Employee update payload")}),kd=b(p(ne.object({...T(),ids:ne.string().optional().describe("Comma-separated employee IDs (max 50)"),userIds:ne.string().optional().describe("Comma-separated user IDs (max 50)"),name:ne.string().optional().describe("Filter employees by name (case-insensitive contains)")}))),Od=ne.object({from:ne.string().optional().describe("Continuation token from previous response or custom start date"),includeRecentChanges:ne.boolean().optional().describe("Prioritize recent changes in the export stream")});function jd(n,a){a.register({name:"people_employees_create",domain:"people",operation:"write",description:"Create an employee",schema:Dd.shape,handler:async r=>{let e=Dd.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:Sn.shape,handler:async r=>{let{id:e}=Sn.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:kd.shape,handler:async r=>{let e=kd.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:Cd.shape,handler:async r=>{let{id:e,body:t}=Cd.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:Sn.shape,handler:async r=>{let{id:e}=Sn.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:Od.shape,handler:async r=>{let e=Od.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 at}from"zod";var Lg=at.object({recordedOn:at.string().datetime().describe("UTC timestamp when the GPS ping was recorded"),latitude:at.number().describe("Latitude in decimal degrees"),longitude:at.number().describe("Longitude in decimal degrees"),speed:at.number().optional().describe("Speed reported by the source device"),heading:at.number().optional().describe("Heading in degrees from true north"),accuracy:at.number().optional().describe("GPS horizontal accuracy in meters"),technicianId:at.number().int().optional().describe("Related technician ID"),vehicleId:at.number().int().optional().describe("Related vehicle ID"),providerTechnicianId:at.string().optional().describe("Technician identifier from the provider system")});function xd(n,a){a.register({name:"people_gps_create",domain:"people",operation:"write",description:"Submit GPS pings from an external provider",schema:{gpsProvider:at.string().regex(/^[A-Za-z0-9_-]+$/,"GPS provider must be alphanumeric, hyphens, or underscores").describe("GPS provider identifier"),pings:at.array(Lg).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 R}from"zod";var Ug=R.object({key:R.string().optional().describe("External data key"),value:R.string().optional().describe("External data value")}),Kr=R.object({name:R.string().optional().describe("Technician display name"),firstName:R.string().optional().describe("Technician first name"),lastName:R.string().optional().describe("Technician last name"),nickname:R.string().optional().describe("Technician nickname"),employeeId:R.number().int().optional().describe("Related employee ID"),userId:R.number().int().optional().describe("Related user ID"),userRoleId:R.number().int().optional().describe("Related user role ID"),employeeNumber:R.string().optional().describe("Technician employee number"),mobilePhoneNumber:R.string().optional().describe("Mobile phone number"),businessUnitId:R.number().int().optional().describe("Default business unit ID"),active:R.boolean().optional().describe("Whether the technician is active"),color:R.string().optional().describe("Schedule display color"),laborWageTypeId:R.number().int().optional().describe("Labor wage type ID"),laborCostPerHour:R.number().optional().describe("Labor cost per hour"),memo:R.string().optional().describe("Internal note"),externalData:R.array(Ug).optional().describe("External data entries")}),Xn=R.object({id:R.number().int().describe("Technician ID")}),Ad=Kr.extend({id:R.number().int().describe("Technician ID")}),Pd=b(p(R.object({ids:R.string().optional().describe("Comma-separated technician IDs (maximum 50)"),userIds:R.string().optional().describe("Comma-separated user IDs (maximum 50)"),name:R.string().optional().describe("Filter technicians by name (case-insensitive contains)"),...T()}))),Zr=R.enum(["Normal","OnCall","TimeOff"]),Mg=R.enum(["Never","Daily","Weekly","Monthly"]),Ed=R.object({technicianIds:R.array(R.number().int()).min(1).describe("Technician IDs to assign the shift to (one or more)"),start:R.string().datetime().describe("Shift start timestamp (ISO UTC)"),end:R.string().datetime().describe("Shift end timestamp (ISO UTC)"),body:R.string().describe("Shift body / description (required by ST API)"),repeatType:Mg.describe("Repeat type. Use 'Never' for a single shift; 'Daily'/'Weekly'/'Monthly' for recurrence (then `repeatEndOn` is required)."),repeatEndOn:R.string().datetime().optional().describe("End date for recurrence (required when repeatType != 'Never')"),shiftType:Zr.optional().describe("Shift type. Default 'Normal'."),title:R.string().optional().describe("Shift title"),note:R.string().optional().describe("Shift note"),active:R.boolean().optional().describe("Whether the shift is active"),timesheetCodeId:R.number().int().optional().describe("Timesheet code ID")}),Qn=R.object({id:R.number().int().describe("Technician shift ID")}),Bd=b(p(R.object({startsOnOrAfter:R.string().datetime().optional().describe("Return shifts starting on or after this UTC timestamp"),endsOnOrBefore:R.string().datetime().optional().describe("Return shifts ending on or before this UTC timestamp"),shiftType:Zr.optional().describe("Shift type filter"),technicianId:R.number().int().optional().describe("Technician ID filter"),titleContains:R.string().optional().describe("Filter shifts by title substring"),noteContains:R.string().optional().describe("Filter shifts by note substring")}).extend(T()).extend(y(["Id","CreatedOn","ModifiedOn"])))),Ld=R.object({id:R.number().int().describe("Technician shift ID"),shiftType:Zr.optional().describe("Shift type"),title:R.string().optional().describe("Shift title"),note:R.string().optional().describe("Shift note"),active:R.boolean().optional().describe("Whether the shift is active"),technicianId:R.number().int().optional().describe("Technician ID"),start:R.string().datetime().optional().describe("Shift start timestamp"),end:R.string().datetime().optional().describe("Shift end timestamp"),timesheetCodeId:R.number().int().optional().describe("Timesheet code ID")}),Ud=R.object({ids:R.array(R.number().int()).min(1).describe("IDs of technician shifts to delete")}),Md=p(R.object({fromUtc:R.string().datetime().describe("Start of filtering period in UTC"),toUtc:R.string().datetime().describe("End of filtering period in UTC"),performanceSegmentationType:R.enum(["Campaign","AdGroup","Keyword"]).describe("Performance segmentation type")}));function Fd(n,a){a.register({name:"people_technicians_create",domain:"people",operation:"write",description:"Create a technician",schema:Kr.shape,handler:async r=>{let e=Kr.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:Xn.shape,handler:async r=>{let e=Xn.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:Pd.shape,handler:async r=>{let e=Pd.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:Ad.shape,handler:async r=>{let e=Ad.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:Xn.shape,handler:async r=>{let e=Xn.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:R.number().int().describe("Technician ID"),jobId:R.number().int().describe("Job ID")},handler:async r=>{let{technicianId:e,jobId:t}=R.object({technicianId:R.number().int(),jobId:R.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:Ed.shape,handler:async r=>{let e=Ed.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:Qn.shape,handler:async r=>{let e=Qn.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:Bd.shape,handler:async r=>{let e=Bd.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:Qn.shape,handler:async r=>{let e=Qn.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:Ld.shape,handler:async r=>{let e=Ld.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:Ud.shape,handler:async r=>{let e=Ud.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:Md.shape,handler:async r=>{let e=Md.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 Te}from"zod";var Fg=Te.object({key:Te.string().optional().describe("External data key"),value:Te.string().optional().describe("External data value")}),Ng=Te.object({name:Te.string().optional().describe("Truck display name"),number:Te.string().optional().describe("Truck number/code"),description:Te.string().optional().describe("Truck description"),active:Te.boolean().optional().describe("Whether the truck is active"),businessUnitId:Te.number().int().optional().describe("Business unit ID"),employeeId:Te.number().int().optional().describe("Assigned employee ID"),technicianId:Te.number().int().optional().describe("Assigned technician ID"),inventoryLocationId:Te.number().int().optional().describe("Inventory location ID"),warehouseId:Te.number().int().optional().describe("Warehouse ID"),licensePlate:Te.string().optional().describe("License plate"),vin:Te.string().optional().describe("Vehicle identification number"),make:Te.string().optional().describe("Vehicle make"),model:Te.string().optional().describe("Vehicle model"),year:Te.number().int().optional().describe("Vehicle model year"),color:Te.string().optional().describe("Vehicle color"),memo:Te.string().optional().describe("Internal note"),externalData:Te.array(Fg).optional().describe("External data entries")}),Nd=Ng.extend({id:Te.number().int().describe("Truck ID")}),zd=b(p(Te.object({ids:Te.string().optional().describe("Comma-separated truck IDs (maximum 50)"),externalDataApplicationGuid:Te.string().uuid().optional().describe("External data application GUID"),externalDataKey:Te.string().optional().describe("External data key"),externalDataValues:Te.string().optional().describe("External data values")}).extend(T()).extend(y(["Id","ModifiedOn","CreatedOn"]))));function $d(n,a){a.register({name:"people_trucks_update",domain:"people",operation:"write",description:"Update a truck",schema:Nd.shape,handler:async r=>{let e=Nd.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:zd.shape,handler:async r=>{let e=zd.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 zg=(n,a)=>{jd(n,a),Fd(n,a),$d(n,a),xd(n,a)},Gd=zg;import{z as l}from"zod";var tr=l.object({key:l.string().describe("External data key"),value:l.string().describe("External data value")}),Yr=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")}),nr=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")}),rr=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(Yr.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(tr.describe("External data entry")).optional().describe("External data entries")}),qd=l.object({cost:l.number().optional().describe("Vendor subaccount cost"),accountName:l.string().optional().describe("Vendor subaccount name")}),er=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:qd.optional().describe("Primary vendor subaccount"),otherSubAccounts:l.array(qd.describe("Additional vendor subaccount")).optional().describe("Additional vendor subaccounts")}),Xr=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:er.optional().describe("Primary vendor"),otherVendors:l.array(er.describe("Additional vendor")).optional().describe("Additional vendors"),categories:l.array(l.number().int().describe("Category ID")).optional().describe("Category IDs"),assets:l.array(Yr.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(tr.describe("External data entry")).optional().describe("External data entries"),businessUnitId:l.number().int().optional().describe("Business unit ID")}),Qr=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(tr.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")}),ea=Qr.partial().describe("Service update payload"),ta=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(Yr.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(tr.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")}),na=ta.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:er.optional().describe("Primary vendor"),otherVendors:l.array(er.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"),$g=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:ea.optional().describe("Service payload"),material:na.optional().describe("Material payload"),equipment:Xr.optional().describe("Equipment payload"),category:nr.partial().optional().describe("Category payload"),discountAndFee:rr.partial().optional().describe("Discount and fee payload")}),ra=l.object({operations:l.array($g.describe("Bulk operation")).min(1).describe("Bulk operations to process")});function Jd(n,a){a.register({name:"pricebook_bulk_create",domain:"pricebook",operation:"write",description:"Create or import bulk pricebook operations",schema:{body:ra.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:ra.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 wn}from"zod";var Gg=b(p(wn.object({...y(["Id","Name"]),...T(),categoryType:wn.enum(["Services","Materials"]).optional().describe("Category type filter")}))),qg=nr.partial().describe("Category update payload");function Wd(n,a){a.register({name:"pricebook_categories_create",domain:"pricebook",operation:"write",description:"Create a pricebook category",schema:{body:nr.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:wn.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:Gg.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:wn.number().int().describe("Category ID"),body:qg},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:wn.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 _t}from"zod";var Jg=rr.partial().describe("Discount and fee update payload"),Wg=b(p(_t.object({...y(["Id","Code","DisplayName","CreatedOn","ModifiedOn","Price","MemberPrice","AddOnPrice","AddOnMemberPrice","MaterialsCost","PrimaryVendor","Cost","Manufacturer","Priority"]),...T(),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 Hd(n,a){a.register({name:"pricebook_discounts_fees_get",domain:"pricebook",operation:"read",description:"Get a discount or fee by ID",schema:{id:_t.number().int().describe("Discount/Fee 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}/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:rr.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:_t.number().int().describe("Discount/Fee ID"),body:Jg},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:_t.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 Dt}from"zod";var Hg=b(p(Dt.object({...y(["Id","Code","DisplayName","CreatedOn","ModifiedOn","Price","MemberPrice","AddOnPrice","AddOnMemberPrice","MaterialsCost","PrimaryVendor","Cost","Manufacturer","Priority"]),...T(),ids:Dt.string().optional().describe("Comma-separated IDs (max 50)"),externalDataApplicationGuid:Dt.string().uuid().optional().describe("External data application GUID"),externalDataKey:Dt.string().optional().describe("External data key filter"),externalDataValues:Dt.string().optional().describe("External data values filter")})));function Vd(n,a){a.register({name:"pricebook_equipment_list",domain:"pricebook",operation:"read",description:"List equipment pricebook items",schema:Hg.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:Dt.number().int().describe("Equipment ID"),externalDataApplicationGuid:Dt.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:Dt.number().int().describe("Equipment ID"),body:Xr.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:Dt.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 Be}from"zod";var Vg=b(p(Be.object({...y(["Id","Code","DisplayName","CreatedOn","ModifiedOn","Price","MemberPrice","AddOnPrice","AddOnMemberPrice","MaterialsCost","PrimaryVendor","Cost","Manufacturer","Priority"]),...T(),ids:Be.string().optional().describe("Comma-separated IDs (max 50)"),isOtherDirectCost:Be.boolean().optional().describe("Filter by other direct cost materials"),costTypeIds:Be.string().optional().describe("Comma-separated cost type IDs"),externalDataApplicationGuid:Be.string().uuid().optional().describe("External data application GUID"),externalDataKey:Be.string().optional().describe("External data key filter"),externalDataValues:Be.string().optional().describe("External data values filter")}))),Kg=p(Be.object({sort:Be.string().optional().describe("Sort expression for markups (+Field or -Field)")})),Zg=Be.object({from:Be.number().describe("Start value for the markup range"),to:Be.number().describe("End value for the markup range"),percent:Be.number().describe("Markup percentage")}),Yg=Be.object({from:Be.number().optional().describe("Start value for the markup range"),to:Be.number().optional().describe("End value for the markup range"),percent:Be.number().optional().describe("Markup percentage")});function Kd(n,a){a.register({name:"pricebook_materials_create",domain:"pricebook",operation:"write",description:"Create a material pricebook item",schema:{body:ta.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:Be.number().int().describe("Material ID"),externalDataApplicationGuid:Be.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:Vg.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:Be.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:Kg.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:Zg.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:Be.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:Be.number().int().describe("Material markup ID"),body:Yg.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:Be.number().int().describe("Material ID"),body:na.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 Ct}from"zod";var Xg=b(p(Ct.object({...y(["Id","Code","DisplayName","CreatedOn","ModifiedOn","Price","MemberPrice","AddOnPrice","AddOnMemberPrice","MaterialsCost","PrimaryVendor","Cost","Manufacturer","Priority"]),...T(),ids:Ct.string().optional().describe("Comma-separated IDs (max 50)"),externalDataApplicationGuid:Ct.string().uuid().optional().describe("External data application GUID"),externalDataKey:Ct.string().optional().describe("External data key filter"),externalDataValues:Ct.string().optional().describe("External data values filter")})));function Zd(n,a){a.register({name:"pricebook_services_get",domain:"pricebook",operation:"read",description:"Get a service by ID",schema:{id:Ct.number().int().describe("Service ID"),externalDataApplicationGuid:Ct.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:Xg.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:Qr.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:Ct.number().int().describe("Service ID"),body:ea},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:Ct.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 Qg=(n,a)=>{Wd(n,a),Hd(n,a),Vd(n,a),Kd(n,a),Zd(n,a),Jd(n,a)},Yd=Qg;import{z as Xd}from"zod";var ey=p(Xd.object({dynamicSetId:Xd.string().describe("Dynamic set ID from report metadata")}));function Qd(n,a){a.register({name:"reporting_dynamic_value_sets_get",domain:"reporting",operation:"read",description:"Get values from a dynamic value set",schema:ey.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 ty}from"zod";var ny=p(ty.object({}));function em(n,a){a.register({name:"reporting_report_categories_list",domain:"reporting",operation:"read",description:"List report categories",schema:ny.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 Qe}from"zod";var ry=p(Qe.object({reportCategory:Qe.string().describe("Report category ID")})),ay=Qe.object({name:Qe.string().describe("Parameter name (from report definition)"),value:Qe.string().describe("Parameter value")}),oy=Qe.object({reportCategory:Qe.string().describe("Report category ID"),reportId:Qe.number().int().describe("Report ID"),parameters:Qe.array(ay).optional().describe("Report parameters (name/value pairs from report definition)"),page:Qe.number().int().optional().describe("Page number (starts at 1)"),pageSize:Qe.number().int().min(1).max(25e3).optional().describe("Records per page"),includeTotal:Qe.boolean().optional().describe("Include total count")});function tm(n,a){a.register({name:"reporting_reports_list",domain:"reporting",operation:"read",description:"List reports in a report category",schema:ry.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:Qe.string().describe("Report category ID"),reportId:Qe.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:oy.shape,handler:async r=>{let{reportCategory:e,reportId:t,parameters:s,...m}=r;try{let u=await n.post(`/tenant/{tenant}/report-category/${e}/reports/${t}/data`,s?{parameters:s}:{},d(m));return i(u)}catch(u){return o(c(u))}}})}var iy=(n,a)=>{Qd(n,a),em(n,a),tm(n,a)},nm=iy;import{z as Ke}from"zod";var sy=Ke.object({appointmentId:Ke.number().int().describe("Appointment ID to assign"),technicianId:Ke.number().int().describe("Technician ID to assign")});function cy(n){return b(n).extend({createdBefore:Ke.string().datetime().optional().describe("Return items created before this UTC timestamp"),createdOnOrAfter:Ke.string().datetime().optional().describe("Return items created on or after this UTC timestamp"),modifiedBefore:Ke.string().datetime().optional().describe("Return items modified before this UTC timestamp"),modifiedOnOrAfter:Ke.string().datetime().optional().describe("Return items modified on or after this UTC timestamp")})}var dy=p(cy(Ke.object({...T(),...y(["Id","CreatedOn","ModifiedOn"]),ids:Ke.string().optional().describe("Comma-separated assignment IDs (maximum 50)"),appointmentIds:Ke.string().optional().describe("Comma-separated appointment IDs (maximum 50)"),jobId:Ke.number().int().optional().describe("Return assignments for a job ID")})));function rm(n,a){a.register({name:"scheduling_appointment_assignments_assign_technicians",domain:"scheduling",operation:"write",description:"Assign technicians to appointments",schema:{assignments:Ke.array(sy).optional().describe("Appointment/technician assignment items"),overrideExisting:Ke.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:Ke.array(Ke.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:dy.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 nn}from"zod";var aa=nn.object({fromHour:nn.number().int().describe("Starting hour (0-23)"),toHour:nn.number().int().describe("Ending hour (0-23)")});function am(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:nn.array(aa).optional().describe("Weekday hour ranges to configure"),saturday:nn.array(aa).optional().describe("Saturday hour ranges to configure"),sunday:nn.array(aa).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 kt}from"zod";var om=kt.object({startsOnOrAfter:kt.string().datetime().describe("UTC start of search window (ISO datetime, e.g. 2026-05-01T12:00:00Z)"),endsOnOrBefore:kt.string().datetime().describe("UTC end of search window (ISO datetime)"),businessUnitIds:kt.array(kt.number().int()).min(1).describe("One or more business unit IDs to query"),skillBasedAvailability:kt.boolean().describe("Whether to apply skill-based availability filtering. Required by ST. Pass false to skip skill filtering."),jobTypeId:kt.number().int().optional().describe("Optional job type ID. If set, ST also requires `args` \u2014 see below. Omit both for general capacity-by-BU queries."),args:kt.record(kt.unknown()).optional().describe("Per-job-type arguments (required when jobTypeId is set). Shape varies by tenant configuration.")}).passthrough();function im(n,a){a.register({name:"scheduling_capacity_calculate",domain:"scheduling",operation:"write",description:"Calculate available time slots for scheduling. Returns arrival windows with technician availability for the given business unit(s) within the time window. Note: this is a POST that does not mutate state; it is flagged 'write' due to the HTTP verb.",schema:om.shape,handler:async r=>{let e=om.parse(r);try{let t=await n.post("/tenant/{tenant}/capacity",e);return i(t)}catch(t){return o(c(t))}}})}import{z as Y}from"zod";function my(n){return b(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 py={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")},ly=p(my(Y.object({...y(["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 sm(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:ly.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:py,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 yt}from"zod";function uy(n){return b(n).extend({createdBefore:yt.string().datetime().optional().describe("Return teams created before this UTC timestamp"),createdOnOrAfter:yt.string().datetime().optional().describe("Return teams created on or after this UTC timestamp"),modifiedBefore:yt.string().datetime().optional().describe("Return teams modified before this UTC timestamp"),modifiedOnOrAfter:yt.string().datetime().optional().describe("Return teams modified on or after this UTC timestamp")})}var by=p(uy(yt.object({...y(["Id","CreatedOn","ModifiedOn"]),includeInactive:yt.boolean().optional().describe("Whether to include inactive teams")})));function cm(n,a){a.register({name:"scheduling_teams_list",domain:"scheduling",operation:"read",description:"List teams",schema:by.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:yt.string().describe("Team name"),active:yt.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:yt.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:yt.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 rn}from"zod";function hy(n){return b(n).extend({createdBefore:rn.string().datetime().optional().describe("Return zones created before this UTC timestamp"),createdOnOrAfter:rn.string().datetime().optional().describe("Return zones created on or after this UTC timestamp"),modifiedBefore:rn.string().datetime().optional().describe("Return zones modified before this UTC timestamp"),modifiedOnOrAfter:rn.string().datetime().optional().describe("Return zones modified on or after this UTC timestamp")})}var gy=p(hy(rn.object({...T(),...y(["Id","CreatedOn","ModifiedOn"])})));function dm(n,a){a.register({name:"scheduling_zones_get",domain:"scheduling",operation:"read",description:"Get a zone by ID",schema:{id:rn.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:gy.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 yy=(n,a)=>{rm(n,a),am(n,a),im(n,a),sm(n,a),cm(n,a),dm(n,a)},mm=yy;import{z as ot}from"zod";var pm=ot.object({id:ot.number().int().describe("Activity code ID")}),lm=ot.object({id:ot.number().int().describe("Activity category ID")}),um=ot.object({id:ot.number().int().describe("Activity type ID")}),bm=b(p(ot.object({...T(),...y(["Id","ModifiedOn","CreatedOn"])}))),hm=b(p(ot.object({...T(),...y(["Id","ModifiedOn","CreatedOn"])}))),gm=b(p(ot.object({...T(),...y(["Id","ModifiedOn","CreatedOn"])}))),an=ot.object({from:ot.string().optional().describe("Continuation token from previous response or custom start date"),includeRecentChanges:ot.boolean().optional().describe("Prioritize recent changes in the export stream")});function ym(n,a){a.register({name:"settings_activity_codes_get",domain:"settings",operation:"read",description:"Get an activity code by ID",schema:pm.shape,handler:async r=>{let{id:e}=pm.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:bm.shape,handler:async r=>{let e=bm.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:an.shape,handler:async r=>{let e=an.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:lm.shape,handler:async r=>{let{id:e}=lm.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:hm.shape,handler:async r=>{let e=hm.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:an.shape,handler:async r=>{let e=an.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:um.shape,handler:async r=>{let{id:e}=um.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:gm.shape,handler:async r=>{let e=gm.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:an.shape,handler:async r=>{let e=an.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 Ze}from"zod";var fy=Ze.object({name:Ze.string().optional().describe("Business unit name"),description:Ze.string().optional().describe("Business unit description"),active:Ze.boolean().optional().describe("Whether the business unit is active"),externalData:Ze.array(Ze.object({key:Ze.string().describe("External data key"),value:Ze.string().describe("External data value")}).describe("External data entry")).optional().describe("External data entries")}),vy=b(p(Ze.object({...T(),ids:Ze.string().optional().describe("Comma-separated IDs (max 50)"),name:Ze.string().optional().describe("Business unit name filter"),externalDataApplicationGuid:Ze.string().uuid().optional().describe("External data application GUID")})));function fm(n,a){a.register({name:"settings_business_units_get",domain:"settings",operation:"read",description:"Get a business unit by ID",schema:{id:Ze.number().int().describe("Business unit ID"),externalDataApplicationGuid:Ze.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:vy.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:Ze.number().int().describe("Business unit ID"),body:fy.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 He}from"zod";var Iy=He.object({key:He.string().describe("External data key"),value:He.string().describe("External data value")}).describe("External data entry"),_n=He.object({id:He.number().int().describe("Tag type ID")}),wm=He.object({name:He.string().describe("Tag type name"),description:He.string().optional().describe("Tag type description"),active:He.boolean().optional().describe("Whether the tag type is active"),color:He.string().optional().describe("Tag type color value"),displayOrder:He.number().int().optional().describe("Display order for this tag type"),externalData:He.array(Iy).optional().describe("External data entries")}),Ty=wm.partial(),vm=He.object({body:wm.describe("Tag type create payload")}),Im=_n.extend({body:Ty.describe("Tag type update payload")}),Tm=b(p(He.object({...T(),...y(["Id","ModifiedOn","CreatedOn"])}))),Sm=He.object({from:He.string().optional().describe("Continuation token from previous response or custom start date"),includeRecentChanges:He.boolean().optional().describe("Prioritize recent changes in the export stream")});function _m(n,a){a.register({name:"settings_tag_types_get",domain:"settings",operation:"read",description:"Get a tag type by ID",schema:_n.shape,handler:async r=>{let{id:e}=_n.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:Tm.shape,handler:async r=>{let e=Tm.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:vm.shape,handler:async r=>{let e=vm.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:Im.shape,handler:async r=>{let{id:e,body:t}=Im.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:_n.shape,handler:async r=>{let{id:e}=_n.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:Sm.shape,handler:async r=>{let e=Sm.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 Dm=P.object({id:P.number().int().describe("Task ID"),includeSubtasks:P.boolean().optional().describe("Include subtasks in the response")}),Cm=b(p(P.object({...T(),...y(["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")}))),km=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")}),Om=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 Rm(n,a){a.register({name:"settings_tasks_get",domain:"settings",operation:"read",description:"Get a task by ID",schema:Dm.shape,handler:async r=>{let e=Dm.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:Cm.shape,handler:async r=>{let e=Cm.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:km.shape,handler:async r=>{let e=km.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:Om.shape,handler:async r=>{let e=Om.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 on}from"zod";var jm=p(on.object({...T(),ids:on.string().optional().describe("Comma-separated role IDs (max 50)"),name:on.string().optional().describe("Role name filter"),createdBefore:on.string().datetime().optional().describe("Created date upper bound (UTC)"),createdOnOrAfter:on.string().datetime().optional().describe("Created date lower bound (UTC)"),employeeType:on.enum(["None","Employee","Technician","All"]).optional().describe("Filter roles by employee type")}));function xm(n,a){a.register({name:"settings_user_roles_list",domain:"settings",operation:"read",description:"List user roles",schema:jm.shape,handler:async r=>{let e=jm.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 Sy=(n,a)=>{fm(n,a),_m(n,a),ym(n,a),Rm(n,a),xm(n,a)},Am=Sy;var wy=[["accounting",Qa],["crm",Ro],["dispatch",Oi],["estimates",es],["export",rs],["intelligence",Js],["inventory",xc],["marketing",Gc],["memberships",dd],["payroll",_d],["people",Gd],["pricebook",Yd],["reporting",nm],["scheduling",mm],["settings",Am]];async function MD(n,a){for(let[r,e]of wy)n.registerDomain(r,e)}var Pm={debug:10,info:20,warn:30,error:40},Em=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 Pm[a]>=Pm[this.level]}};import{z as Bm}from"zod";var Lm=class{constructor(a,r,e,t=new Dn(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??Bm.boolean().optional().default(!1).describe("Set to true to confirm this potentially destructive action")}:r?{...a.schema,_confirmed:a.schema._confirmed??Bm.boolean().optional().describe("Set to true to confirm this write operation")}:a.schema,u=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 le=await u(_,B);return s&&this.auditLogger.log(this.buildAuditEntry(a,_,!le.isError,le)),le}catch(le){throw s&&this.auditLogger.log(this.buildAuditEntry(a,_,!1,void 0,le instanceof Error?le.message:String(le))),le}}}}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 u=this.normalizeCaller(m);if(u)return u}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:ar(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{Dn as a,Oy as b,Ry as c,i as d,Ta as e,Ly as f,MD as g,Em as h,Lm as i};