@tableau/mcp-server 1.12.4 → 1.13.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/index.js CHANGED
@@ -1,20 +1,20 @@
1
1
  #!/usr/bin/env node
2
- var Ca=Object.defineProperty;var Ra=(t,e)=>{for(var r in e)Ca(t,r,{get:e[r],enumerable:!0})};import{StdioServerTransport as lm}from"@modelcontextprotocol/sdk/server/stdio.js";import cm from"dotenv";import{existsSync as ka}from"fs";import{join as Pa}from"path";import{fileURLToPath as Da}from"url";var jr=["list-datasources","list-workbooks","list-views","query-datasource","get-datasource-metadata","get-workbook","get-view-data","get-view-image","list-all-pulse-metric-definitions","list-pulse-metric-definitions-from-definition-ids","list-pulse-metrics-from-metric-definition-id","list-pulse-metrics-from-metric-ids","list-pulse-metric-subscriptions","generate-pulse-metric-value-insight-bundle","search-content"],xa=["datasource","workbook","view","pulse","content-exploration"],Vr={datasource:["list-datasources","get-datasource-metadata","query-datasource"],workbook:["list-workbooks","get-workbook"],view:["list-views","get-view-data","get-view-image"],pulse:["list-all-pulse-metric-definitions","list-pulse-metric-definitions-from-definition-ids","list-pulse-metrics-from-metric-definition-id","list-pulse-metrics-from-metric-ids","list-pulse-metric-subscriptions","generate-pulse-metric-value-insight-bundle"],"content-exploration":["search-content"]};function Br(t){return!!jr.find(e=>e===t)}function zr(t){return!!xa.find(e=>e===t)}var Ia=["stdio","http"];function ni(t){return!!Ia.find(e=>e===t)}function ce(t,e){if(!t)throw new Error(e||"Invariant Violation")}var La=Da(new URL(".",import.meta.url)),Oa=10*60*1e3,ai=60*60*1e3,li=30*24*60*60*1e3,Ma=365.25*24*60*60*1e3,Na=["pat","direct-trust","oauth"];function Fa(t){return!!Na.find(e=>e===t)}var Hr=class{auth;server;transport;sslKey;sslCert;httpPort;corsOriginConfig;trustProxyConfig;siteName;patName;patValue;jwtSubClaim;connectedAppClientId;connectedAppSecretId;connectedAppSecretValue;jwtAdditionalPayload;datasourceCredentials;defaultLogLevel;disableLogMasking;includeTools;excludeTools;maxResultLimit;disableQueryDatasourceFilterValidation;disableMetadataApiRequests;disableSessionManagement;enableServerLogging;serverLogDirectory;boundedContext;tableauServerVersionCheckIntervalInHours;oauth;constructor(){let e=Va(process.env),{AUTH:r,SERVER:o,SITE_NAME:i,TRANSPORT:n,SSL_KEY:s,SSL_CERT:a,HTTP_PORT_ENV_VAR_NAME:c,CORS_ORIGIN_CONFIG:l,TRUST_PROXY_CONFIG:u,PAT_NAME:p,PAT_VALUE:g,JWT_SUB_CLAIM:b,CONNECTED_APP_CLIENT_ID:f,CONNECTED_APP_SECRET_ID:y,CONNECTED_APP_SECRET_VALUE:w,JWT_ADDITIONAL_PAYLOAD:v,DATASOURCE_CREDENTIALS:D,DEFAULT_LOG_LEVEL:A,DISABLE_LOG_MASKING:x,INCLUDE_TOOLS:R,EXCLUDE_TOOLS:j,MAX_RESULT_LIMIT:F,DISABLE_QUERY_DATASOURCE_FILTER_VALIDATION:ae,DISABLE_METADATA_API_REQUESTS:pe,DISABLE_SESSION_MANAGEMENT:Ae,ENABLE_SERVER_LOGGING:_e,SERVER_LOG_DIRECTORY:se,INCLUDE_PROJECT_IDS:le,INCLUDE_DATASOURCE_IDS:$,INCLUDE_WORKBOOK_IDS:J,TABLEAU_SERVER_VERSION_CHECK_INTERVAL_IN_HOURS:Se,DANGEROUSLY_DISABLE_OAUTH:S,OAUTH_ISSUER:_,OAUTH_JWE_PRIVATE_KEY:z,OAUTH_JWE_PRIVATE_KEY_PATH:K,OAUTH_JWE_PRIVATE_KEY_PASSPHRASE:U,OAUTH_REDIRECT_URI:te,OAUTH_CLIENT_ID_SECRET_PAIRS:me,OAUTH_AUTHORIZATION_CODE_TIMEOUT_MS:Y,OAUTH_ACCESS_TOKEN_TIMEOUT_MS:re,OAUTH_REFRESH_TOKEN_TIMEOUT_MS:er}=e;if(this.siteName=i??"",this.sslKey=s?.trim()??"",this.sslCert=a?.trim()??"",this.httpPort=At(e[c?.trim()||"PORT"],{defaultValue:3927,minValue:1,maxValue:65535}),this.corsOriginConfig=qa(l?.trim()??""),this.trustProxyConfig=ja(u?.trim()??""),this.datasourceCredentials=D??"",this.defaultLogLevel=A??"debug",this.disableLogMasking=x==="true",this.disableQueryDatasourceFilterValidation=ae==="true",this.disableMetadataApiRequests=pe==="true",this.disableSessionManagement=Ae==="true",this.enableServerLogging=_e==="true",this.serverLogDirectory=se||Pa(La,"logs"),this.boundedContext={projectIds:Wr(le),datasourceIds:Wr($),workbookIds:Wr(J)},this.boundedContext.projectIds?.size===0)throw new Error("When set, the environment variable INCLUDE_PROJECT_IDS must have at least one value");if(this.boundedContext.datasourceIds?.size===0)throw new Error("When set, the environment variable INCLUDE_DATASOURCE_IDS must have at least one value");if(this.boundedContext.workbookIds?.size===0)throw new Error("When set, the environment variable INCLUDE_WORKBOOK_IDS must have at least one value");this.tableauServerVersionCheckIntervalInHours=At(Se,{defaultValue:1,minValue:1,maxValue:24*7});let Le=S==="true";if(this.oauth={enabled:Le?!1:!!_,issuer:_??"",redirectUri:te||(_?`${_}/Callback`:""),jwePrivateKey:z??"",jwePrivateKeyPath:K??"",jwePrivateKeyPassphrase:U||void 0,authzCodeTimeoutMs:At(Y,{defaultValue:Oa,minValue:0,maxValue:ai}),accessTokenTimeoutMs:At(re,{defaultValue:ai,minValue:0,maxValue:li}),refreshTokenTimeoutMs:At(er,{defaultValue:li,minValue:0,maxValue:Ma}),clientIdSecretPairs:me?me.split(",").reduce((Ye,fe)=>{let[ii,si]=fe.split(":");return ii&&si&&(Ye[ii]=si),Ye},{}):null},this.auth=Fa(r)?r:this.oauth.enabled?"oauth":"pat",this.transport=ni(n)?n:this.oauth.enabled?"http":"stdio",this.transport==="http"&&!Le&&!this.oauth.issuer)throw new Error('OAUTH_ISSUER must be set when TRANSPORT is "http" unless DANGEROUSLY_DISABLE_OAUTH is "true"');if(this.auth==="oauth"){if(Le)throw new Error('When AUTH is "oauth", DANGEROUSLY_DISABLE_OAUTH cannot be "true"');if(!this.oauth.issuer)throw new Error('When AUTH is "oauth", OAUTH_ISSUER must be set')}else ce(o,"The environment variable SERVER is not set"),Ua(o);if(this.oauth.enabled){if(ce(this.oauth.redirectUri,"The environment variable OAUTH_REDIRECT_URI is not set"),!this.oauth.jwePrivateKey&&!this.oauth.jwePrivateKeyPath)throw new Error("One of the environment variables: OAUTH_JWE_PRIVATE_KEY_PATH or OAUTH_JWE_PRIVATE_KEY must be set");if(this.oauth.jwePrivateKey&&this.oauth.jwePrivateKeyPath)throw new Error("Only one of the environment variables: OAUTH_JWE_PRIVATE_KEY or OAUTH_JWE_PRIVATE_KEY_PATH must be set");if(this.oauth.jwePrivateKeyPath&&process.env.TABLEAU_MCP_TEST!=="true"&&!ka(this.oauth.jwePrivateKeyPath))throw new Error(`OAuth JWE private key path does not exist: ${this.oauth.jwePrivateKeyPath}`);if(this.transport==="stdio")throw new Error('TRANSPORT must be "http" when OAUTH_ISSUER is set')}let Q=F?parseInt(F):NaN;if(this.maxResultLimit=isNaN(Q)||Q<=0?null:Q,this.includeTools=R?R.split(",").flatMap(Ye=>{let fe=Ye.trim();return Br(fe)?fe:zr(fe)?Vr[fe]:[]}):[],this.excludeTools=j?j.split(",").flatMap(Ye=>{let fe=Ye.trim();return Br(fe)?fe:zr(fe)?Vr[fe]:[]}):[],this.includeTools.length>0&&this.excludeTools.length>0)throw new Error("Cannot include and exclude tools simultaneously");this.auth==="pat"?(ce(p,"The environment variable PAT_NAME is not set"),ce(g,"The environment variable PAT_VALUE is not set")):this.auth==="direct-trust"&&(ce(b,"The environment variable JWT_SUB_CLAIM is not set"),ce(f,"The environment variable CONNECTED_APP_CLIENT_ID is not set"),ce(y,"The environment variable CONNECTED_APP_SECRET_ID is not set"),ce(w,"The environment variable CONNECTED_APP_SECRET_VALUE is not set")),this.server=o??"",this.patName=p??"",this.patValue=g??"",this.jwtSubClaim=b??"",this.connectedAppClientId=f??"",this.connectedAppSecretId=y??"",this.connectedAppSecretValue=w??"",this.jwtAdditionalPayload=v||"{}"}};function Ua(t){if(!t.startsWith("https://"))throw new Error(`The environment variable SERVER must start with "https://": ${t}`);try{let e=new URL(t)}catch(e){let r=e instanceof Error?e.message:String(e);throw new Error(`The environment variable SERVER is not a valid URL: ${t} -- ${r}`)}}function qa(t){if(!t)return!0;if(t.match(/^true|false$/i))return t.toLowerCase()==="true";if(t==="*")return"*";if(t.startsWith("[")&&t.endsWith("]"))try{return JSON.parse(t).map(r=>new URL(r).origin)}catch{throw new Error(`The environment variable CORS_ORIGIN_CONFIG is not a valid array of URLs: ${t}`)}try{return new URL(t).origin}catch{throw new Error(`The environment variable CORS_ORIGIN_CONFIG is not a valid URL: ${t}`)}}function ja(t){return t?t.match(/^true|false$/i)?t.toLowerCase()==="true":t.match(/^\d+$/)?parseInt(t,10):t:null}function Wr(t){return t===void 0?null:new Set(t.trim().split(",").map(e=>e.trim()).filter(Boolean))}function Va(t){return Object.entries(t).reduce((e,[r,o])=>(o?.startsWith("${user_config.")?e[r]="":e[r]=o,e),{})}function At(t,{defaultValue:e,minValue:r,maxValue:o}={defaultValue:0,minValue:Number.NEGATIVE_INFINITY,maxValue:Number.POSITIVE_INFINITY}){if(!t)return e;let i=parseFloat(t);return isNaN(i)||r!==void 0&&i<r||o!==void 0&&i>o?e:i}var E=()=>new Hr;var Gr=["debug","info","notice","warning","error","critical","alert","emergency"],Et="debug",ci;function ui(t){return!!Gr.find(e=>e===t)}var Xe=(t,e,{silent:r=!1}={})=>{Et!==e&&(Et=e,r||ue.notice(t,`Logging level set to: ${e}`))},di=t=>{ci=t},ue={debug:ve("debug"),info:ve("info"),notice:ve("notice"),warning:ve("warning"),error:ve("error"),critical:ve("critical"),alert:ve("alert"),emergency:ve("emergency")},Oe=(t=Et)=>Gr.indexOf(t)>=Gr.indexOf(Et),Me=t=>{process.env.TABLEAU_MCP_TEST!=="true"&&(t=t.endsWith(`
2
+ var Ka=Object.defineProperty;var Ja=(t,e)=>{for(var r in e)Ka(t,r,{get:e[r],enumerable:!0})};import{StdioServerTransport as Zm}from"@modelcontextprotocol/sdk/server/stdio.js";import Xm from"dotenv";import{existsSync as Xa}from"fs";import{join as el}from"path";import{fileURLToPath as tl}from"url";var Jr=["list-datasources","list-workbooks","list-views","query-datasource","get-datasource-metadata","get-workbook","get-view-data","get-view-image","list-all-pulse-metric-definitions","list-pulse-metric-definitions-from-definition-ids","list-pulse-metrics-from-metric-definition-id","list-pulse-metrics-from-metric-ids","list-pulse-metric-subscriptions","generate-pulse-metric-value-insight-bundle","search-content"],Ya=["datasource","workbook","view","pulse","content-exploration"],Yr={datasource:["list-datasources","get-datasource-metadata","query-datasource"],workbook:["list-workbooks","get-workbook"],view:["list-views","get-view-data","get-view-image"],pulse:["list-all-pulse-metric-definitions","list-pulse-metric-definitions-from-definition-ids","list-pulse-metrics-from-metric-definition-id","list-pulse-metrics-from-metric-ids","list-pulse-metric-subscriptions","generate-pulse-metric-value-insight-bundle"],"content-exploration":["search-content"]};function Zr(t){return!!Jr.find(e=>e===t)}function Xr(t){return!!Ya.find(e=>e===t)}var Za=["stdio","http"];function wi(t){return!!Za.find(e=>e===t)}function ce(t,e){if(!t)throw new Error(e||"Invariant Violation")}var rl=tl(new URL(".",import.meta.url)),ro=10*60*1e3,Ai=60*60*1e3,Ei=24*60*60*1e3,Si=30*24*60*60*1e3,ol=365.25*24*60*60*1e3,il=["pat","direct-trust","oauth"];function sl(t){return!!il.find(e=>e===t)}var to=class{auth;server;transport;sslKey;sslCert;httpPort;corsOriginConfig;trustProxyConfig;siteName;patName;patValue;jwtSubClaim;connectedAppClientId;connectedAppSecretId;connectedAppSecretValue;jwtAdditionalPayload;datasourceCredentials;defaultLogLevel;disableLogMasking;includeTools;excludeTools;maxResultLimit;disableQueryDatasourceValidationRequests;disableMetadataApiRequests;disableSessionManagement;enableServerLogging;serverLogDirectory;boundedContext;tableauServerVersionCheckIntervalInHours;oauth;constructor(){let e=cl(process.env),{AUTH:r,SERVER:o,SITE_NAME:i,TRANSPORT:n,SSL_KEY:s,SSL_CERT:a,HTTP_PORT_ENV_VAR_NAME:l,CORS_ORIGIN_CONFIG:c,TRUST_PROXY_CONFIG:u,PAT_NAME:p,PAT_VALUE:g,JWT_SUB_CLAIM:b,CONNECTED_APP_CLIENT_ID:m,CONNECTED_APP_SECRET_ID:y,CONNECTED_APP_SECRET_VALUE:T,JWT_ADDITIONAL_PAYLOAD:v,DATASOURCE_CREDENTIALS:P,DEFAULT_LOG_LEVEL:S,DISABLE_LOG_MASKING:C,INCLUDE_TOOLS:x,EXCLUDE_TOOLS:q,MAX_RESULT_LIMIT:F,DISABLE_QUERY_DATASOURCE_VALIDATION_REQUESTS:te,DISABLE_METADATA_API_REQUESTS:pe,DISABLE_SESSION_MANAGEMENT:Se,ENABLE_SERVER_LOGGING:ve,SERVER_LOG_DIRECTORY:ne,INCLUDE_PROJECT_IDS:le,INCLUDE_DATASOURCE_IDS:G,INCLUDE_WORKBOOK_IDS:J,TABLEAU_SERVER_VERSION_CHECK_INTERVAL_IN_HOURS:Ce,DANGEROUSLY_DISABLE_OAUTH:_,OAUTH_ISSUER:E,OAUTH_JWE_PRIVATE_KEY:W,OAUTH_JWE_PRIVATE_KEY_PATH:K,OAUTH_JWE_PRIVATE_KEY_PASSPHRASE:j,OAUTH_REDIRECT_URI:re,OAUTH_CLIENT_ID_SECRET_PAIRS:me,OAUTH_CIMD_DNS_SERVERS:Z,OAUTH_AUTHORIZATION_CODE_TIMEOUT_MS:oe,OAUTH_ACCESS_TOKEN_TIMEOUT_MS:tr,OAUTH_REFRESH_TOKEN_TIMEOUT_MS:St}=e;if(this.siteName=i??"",this.sslKey=s?.trim()??"",this.sslCert=a?.trim()??"",this.httpPort=Et(e[l?.trim()||"PORT"],{defaultValue:3927,minValue:1,maxValue:65535}),this.corsOriginConfig=al(c?.trim()??""),this.trustProxyConfig=ll(u?.trim()??""),this.datasourceCredentials=P??"",this.defaultLogLevel=S??"debug",this.disableLogMasking=C==="true",this.disableQueryDatasourceValidationRequests=te==="true",this.disableMetadataApiRequests=pe==="true",this.disableSessionManagement=Se==="true",this.enableServerLogging=ve==="true",this.serverLogDirectory=ne||el(rl,"logs"),this.boundedContext={projectIds:eo(le),datasourceIds:eo(G),workbookIds:eo(J)},this.boundedContext.projectIds?.size===0)throw new Error("When set, the environment variable INCLUDE_PROJECT_IDS must have at least one value");if(this.boundedContext.datasourceIds?.size===0)throw new Error("When set, the environment variable INCLUDE_DATASOURCE_IDS must have at least one value");if(this.boundedContext.workbookIds?.size===0)throw new Error("When set, the environment variable INCLUDE_WORKBOOK_IDS must have at least one value");this.tableauServerVersionCheckIntervalInHours=Et(Ce,{defaultValue:1,minValue:1,maxValue:24*7});let Q=_==="true";if(this.oauth={enabled:Q?!1:!!E,issuer:E??"",redirectUri:re||(E?`${E}/Callback`:""),jwePrivateKey:W??"",jwePrivateKeyPath:K??"",jwePrivateKeyPassphrase:j||void 0,dnsServers:Z?Z.split(",").map(Re=>Re.trim()):["1.1.1.1","1.0.0.1"],authzCodeTimeoutMs:Et(oe,{defaultValue:ro,minValue:0,maxValue:Ai}),accessTokenTimeoutMs:Et(tr,{defaultValue:Ai,minValue:0,maxValue:Si}),refreshTokenTimeoutMs:Et(St,{defaultValue:Si,minValue:0,maxValue:ol}),clientIdSecretPairs:me?me.split(",").reduce((Re,fe)=>{let[bi,Ti]=fe.split(":");return bi&&Ti&&(Re[bi]=Ti),Re},{}):null},this.auth=sl(r)?r:this.oauth.enabled?"oauth":"pat",this.transport=wi(n)?n:this.oauth.enabled?"http":"stdio",this.transport==="http"&&!Q&&!this.oauth.issuer)throw new Error('OAUTH_ISSUER must be set when TRANSPORT is "http" unless DANGEROUSLY_DISABLE_OAUTH is "true"');if(this.auth==="oauth"){if(Q)throw new Error('When AUTH is "oauth", DANGEROUSLY_DISABLE_OAUTH cannot be "true"');if(!this.oauth.issuer)throw new Error('When AUTH is "oauth", OAUTH_ISSUER must be set')}else ce(o,"The environment variable SERVER is not set"),nl(o);if(this.oauth.enabled){if(ce(this.oauth.redirectUri,"The environment variable OAUTH_REDIRECT_URI is not set"),!this.oauth.jwePrivateKey&&!this.oauth.jwePrivateKeyPath)throw new Error("One of the environment variables: OAUTH_JWE_PRIVATE_KEY_PATH or OAUTH_JWE_PRIVATE_KEY must be set");if(this.oauth.jwePrivateKey&&this.oauth.jwePrivateKeyPath)throw new Error("Only one of the environment variables: OAUTH_JWE_PRIVATE_KEY or OAUTH_JWE_PRIVATE_KEY_PATH must be set");if(this.oauth.jwePrivateKeyPath&&process.env.TABLEAU_MCP_TEST!=="true"&&!Xa(this.oauth.jwePrivateKeyPath))throw new Error(`OAuth JWE private key path does not exist: ${this.oauth.jwePrivateKeyPath}`);if(this.transport==="stdio")throw new Error('TRANSPORT must be "http" when OAUTH_ISSUER is set')}let Kr=F?parseInt(F):NaN;if(this.maxResultLimit=isNaN(Kr)||Kr<=0?null:Kr,this.includeTools=x?x.split(",").flatMap(Re=>{let fe=Re.trim();return Zr(fe)?fe:Xr(fe)?Yr[fe]:[]}):[],this.excludeTools=q?q.split(",").flatMap(Re=>{let fe=Re.trim();return Zr(fe)?fe:Xr(fe)?Yr[fe]:[]}):[],this.includeTools.length>0&&this.excludeTools.length>0)throw new Error("Cannot include and exclude tools simultaneously");this.auth==="pat"?(ce(p,"The environment variable PAT_NAME is not set"),ce(g,"The environment variable PAT_VALUE is not set")):this.auth==="direct-trust"&&(ce(b,"The environment variable JWT_SUB_CLAIM is not set"),ce(m,"The environment variable CONNECTED_APP_CLIENT_ID is not set"),ce(y,"The environment variable CONNECTED_APP_SECRET_ID is not set"),ce(T,"The environment variable CONNECTED_APP_SECRET_VALUE is not set")),this.server=o??"",this.patName=p??"",this.patValue=g??"",this.jwtSubClaim=b??"",this.connectedAppClientId=m??"",this.connectedAppSecretId=y??"",this.connectedAppSecretValue=T??"",this.jwtAdditionalPayload=v||"{}"}};function nl(t){if(!t.startsWith("https://"))throw new Error(`The environment variable SERVER must start with "https://": ${t}`);try{let e=new URL(t)}catch(e){let r=e instanceof Error?e.message:String(e);throw new Error(`The environment variable SERVER is not a valid URL: ${t} -- ${r}`)}}function al(t){if(!t)return!0;if(t.match(/^true|false$/i))return t.toLowerCase()==="true";if(t==="*")return"*";if(t.startsWith("[")&&t.endsWith("]"))try{return JSON.parse(t).map(r=>new URL(r).origin)}catch{throw new Error(`The environment variable CORS_ORIGIN_CONFIG is not a valid array of URLs: ${t}`)}try{return new URL(t).origin}catch{throw new Error(`The environment variable CORS_ORIGIN_CONFIG is not a valid URL: ${t}`)}}function ll(t){return t?t.match(/^true|false$/i)?t.toLowerCase()==="true":t.match(/^\d+$/)?parseInt(t,10):t:null}function eo(t){return t===void 0?null:new Set(t.trim().split(",").map(e=>e.trim()).filter(Boolean))}function cl(t){return Object.entries(t).reduce((e,[r,o])=>(o?.startsWith("${user_config.")?e[r]="":e[r]=o,e),{})}function Et(t,{defaultValue:e,minValue:r,maxValue:o}={defaultValue:0,minValue:Number.NEGATIVE_INFINITY,maxValue:Number.POSITIVE_INFINITY}){if(!t)return e;let i=parseFloat(t);return isNaN(i)||r!==void 0&&i<r||o!==void 0&&i>o?e:i}var A=()=>new to;var oo=["debug","info","notice","warning","error","critical","alert","emergency"],_t="debug",_i;function vi(t){return!!oo.find(e=>e===t)}var et=(t,e,{silent:r=!1}={})=>{_t!==e&&(_t=e,r||ue.notice(t,`Logging level set to: ${e}`))},Ci=t=>{_i=t},ue={debug:xe("debug"),info:xe("info"),notice:xe("notice"),warning:xe("warning"),error:xe("error"),critical:xe("critical"),alert:xe("alert"),emergency:xe("emergency")},Ue=(t=_t)=>oo.indexOf(t)>=oo.indexOf(_t),Fe=t=>{process.env.TABLEAU_MCP_TEST!=="true"&&(t=t.endsWith(`
3
3
  `)?t:`${t}
4
- `,process.stderr.write(t))},pi=({requestId:t,toolName:e,args:r,username:o})=>({type:"tool",requestId:t,...o?{username:o}:{},tool:{name:e,...r!==void 0?{args:r}:{}}});function ve(t){return async(e,r,{logger:o,requestId:i}={logger:e.name})=>{if(ci?.log({message:r,level:t,logger:o}),!!Oe(t))return e.server.notification({method:"notifications/message",params:{level:t,logger:o,data:JSON.stringify({timestamp:new Date().toISOString(),currentLogLevel:Et,message:r},null,2)}},{relatedRequestId:i})}}import{appendFile as Ba}from"node:fs/promises";import{existsSync as za,mkdirSync as Wa}from"fs";import{join as Ha}from"path";function W(t){if(t instanceof Error)return t.message;try{return JSON.stringify(t)??"undefined"}catch{return`${t}`}}var tr=class{_logDirectory;_fileMutexes=new Map;constructor({logDirectory:e}){this._logDirectory=e,za(this._logDirectory)||Wa(this._logDirectory,{recursive:!0})}async log(e){let r=new Date().toISOString(),o=`${new Date(new Date().setMinutes(0,0,0)).toISOString().replace(/[:.]/g,"-")}.log`,i=Ha(this._logDirectory,o),n=i,a=(this._fileMutexes.get(n)??Promise.resolve()).then(async()=>{try{await Ba(i,JSON.stringify({timestamp:r,...e})+`
5
- `)}catch(c){Me(`Failed to write to log file ${i}: ${W(c)}`)}});this._fileMutexes.set(n,a),a.finally(()=>{this._fileMutexes.get(n)===a&&this._fileMutexes.delete(n)}),await a}};import{McpServer as kp}from"@modelcontextprotocol/sdk/server/mcp.js";import{SetLevelRequestSchema as Pp}from"@modelcontextprotocol/sdk/types.js";var mi={name:"@tableau/mcp-server",description:"An MCP server for Tableau, providing a suite of tools that will make it easier for developers to build AI applications that integrate with Tableau.",version:"1.12.4",repository:{type:"git",url:"git+https://github.com/tableau/tableau-mcp.git"},homepage:"https://github.com/tableau/tableau-mcp",bugs:"https://github.com/tableau/tableau-mcp/issues",author:"Tableau",type:"module",license:"Apache-2.0",keywords:["tableau","mcp"],bin:{"tableau-mcp-server":"./build/index.js"},scripts:{":build":"npx rimraf ./build && esbuild src/index.ts --bundle --packages=external --platform=node --format=esm --minify --outdir=build --sourcemap",":build:dev":"npx rimraf ./build && esbuild src/index.ts --bundle --packages=external --platform=node --format=esm --outdir=build --sourcemap",build:"run-s :build exec-perms","build:dev":"run-s :build:dev exec-perms","build:watch":"npm run :build:dev -- --watch","build:docker":"docker build -t tableau-mcp .",":build:mcpb":"npx -y @anthropic-ai/mcpb pack . tableau-mcp.mcpb","build:mcpb":"run-s build:manifest:script build:manifest :build:mcpb","build:manifest":"node build/scripts/createClaudeMcpBundleManifest.mjs","build:manifest:script":"esbuild src/scripts/createClaudeMcpBundleManifest.ts --bundle --platform=node --format=esm --outdir=build/scripts --sourcemap=inline --out-extension:.js=.mjs","start:http":"node build/index.js","start:http:docker":"docker run -p 3927:3927 -i --rm --env-file env.list tableau-mcp",lint:"npm exec eslint",inspect:"npx @modelcontextprotocol/inspector --config config.json --server tableau",":inspect:http":"npx @modelcontextprotocol/inspector --config config.http.json --server tableau","inspect:http":"run-p start:http :inspect:http","inspect:docker":"npx @modelcontextprotocol/inspector --config config.docker.json --server tableau","inspect:docker:http":"run-p start:http:docker :inspect:http","build:inspect":"run-s build inspect","build:inspect:docker":"run-s build:docker inspect:docker","build:inspect:docker:http":"run-s build:docker inspect:docker:http","exec-perms":"shx chmod +x build/*.js",test:"vitest --config ./vitest.config.ts","test:e2e":"vitest --config ./vitest.config.e2e.ts","test:eval":"vitest --config ./vitest.config.eval.ts","test:oauth":"vitest --config ./vitest.config.oauth.ts",coverage:"vitest run --config ./vitest.config.ts --coverage","version:major":"npm version major --no-git-tag-version","version:minor":"npm version minor --no-git-tag-version","version:patch":"npm version patch --no-git-tag-version"},dependencies:{"@modelcontextprotocol/sdk":"^1.12.1","@zodios/core":"^10.9.6",cors:"^2.8.5",dotenv:"^16.5.0",express:"^5.1.0","fast-levenshtein":"^3.0.0",jose:"^6.0.12","ts-results-es":"^5.0.1",zod:"^3.24.3","zod-validation-error":"^4.0.1"},devDependencies:{"@anthropic-ai/mcpb":"^1.0.0","@eslint/eslintrc":"^3.3.1","@eslint/js":"^9.25.1","@modelcontextprotocol/inspector":"^0.16.6","@openai/agents":"^0.1.9","@types/cors":"^2.8.19","@types/eslint__js":"^8.42.3","@types/express":"^5.0.3","@types/fast-levenshtein":"^0.0.1","@types/node":"^22.15.3","@types/supertest":"^6.0.3","@typescript-eslint/eslint-plugin":"^8.31.1","@typescript-eslint/parser":"^8.31.1","@vitest/coverage-v8":"^3.1.3",esbuild:"^0.25.5",eslint:"^9.25.1","eslint-config-prettier":"^10.1.2","eslint-plugin-prettier":"^5.2.6","eslint-plugin-simple-import-sort":"^12.1.1","npm-run-all":"^4.1.5",openai:"^5.23.2",prettier:"^3.5.3",rimraf:"^6.0.1",shx:"^0.4.0",supertest:"^7.1.4",typescript:"^5.8.3","typescript-eslint":"^8.31.1",vitest:"^3.1.3"},engines:{node:">=22.7.5"}};import{Ok as xd}from"ts-results-es";import{z as hn}from"zod";import{Err as fi,Ok as $a}from"ts-results-es";var hi=t=>{let e=bi(t);if(e.isErr())return t;let r=e.value;return Oe("debug")?(r.data?.credentials&&(r.data.credentials="<redacted>"),Array.isArray(r?.data?.datasource?.connections)&&r.data.datasource.connections.forEach(i=>{i.connectionUsername="<redacted>",i.connectionPassword="<redacted>"}),r.headers?.["X-Tableau-Auth"]&&(r.headers["X-Tableau-Auth"]="<redacted>"),r.params?.user_id&&(r.params.user_id="<redacted>")):(delete r.data,delete r.headers,delete r.params),r},gi=t=>{let e=bi(t);if(e.isErr())return t;let r=e.value;return Oe("debug")?r.data?.credentials&&(r.data.credentials="<redacted>"):(delete r.data,delete r.headers),r};function bi(t){try{return $a(structuredClone(t))}catch(e){if(e instanceof Error)return fi(e);let r=W(e);return Me(`Could not clone object, notification may not be sanitized! Error: ${r}`),fi(new Error(r))}}function rr(t){return{method:t.method??"UNKNOWN METHOD",url:t.url??"UNKNOWN URL",headers:t.headers,data:t.data,params:t.params}}function or(t){return{url:t.config.url??"UNKNOWN URL",status:t.status,headers:t.headers,data:t.data}}import{Zodios as Ai}from"@zodios/core";import{randomUUID as Qa}from"node:crypto";import{SignJWT as Ka}from"jose";async function yi({username:t,connectedApp:e,scopes:r,additionalPayload:o}){let i={alg:"HS256",typ:"JWT",kid:e.secretId},n={jti:Qa(),iss:e.clientId,aud:"tableau",sub:t,scp:[...r],iat:Math.floor(Date.now()/1e3)-5,exp:Math.floor(Date.now()/1e3)+5*60,...o};return await new Ka(n).setProtectedHeader(i).sign(new TextEncoder().encode(e.secretValue))}import{makeApi as Ja,makeEndpoint as Ti}from"@zodios/core";import{z as ye}from"zod";import{z as Ne}from"zod";var wi=Ne.object({credentials:Ne.object({site:Ne.object({id:Ne.string()}),user:Ne.object({id:Ne.string()}),token:Ne.string()})});var Za=ye.object({credentials:ye.object({site:ye.object({contentUrl:ye.string()})}).and(ye.object({personalAccessTokenName:ye.string(),personalAccessTokenSecret:ye.string()}).or(ye.object({jwt:ye.string()})))}),Ya=Ti({method:"post",path:"/auth/signin",alias:"signIn",description:"Signs in with Tableau credentials.",response:wi,parameters:[{name:"credentials",type:"Body",schema:Za}]}),Xa=Ti({method:"post",path:"/auth/signout",alias:"signOut",description:"Signs you out of the current session. This call invalidates the authentication token that is created by a call to Sign In.",response:ye.void()}),el=Ja([Ya,Xa]),$r=[...el];var Fe=class{_apiClient;constructor(e){this._apiClient=e}get interceptors(){return this._apiClient.axios.interceptors}};var H=class extends Fe{_creds;get authHeader(){if(!this._creds)throw new Error("Authenticate by calling signIn() first");return{headers:{"X-Tableau-Auth":this._creds.token}}}get userId(){if(!this._creds)throw new Error("Authenticate by calling signIn() first");return this._creds.user.id}constructor(e,r){super(e),this._creds=r}};var _t=class extends Fe{constructor(e){super(new Ai(e,$r))}signIn=async e=>(await this._apiClient.signIn({credentials:{site:{contentUrl:e.siteName},...await(async()=>{switch(e.type){case"pat":return{personalAccessTokenName:e.patName,personalAccessTokenSecret:e.patValue};case"direct-trust":return{jwt:await yi({username:e.username,connectedApp:{clientId:e.clientId,secretId:e.secretId,secretValue:e.secretValue},scopes:e.scopes,additionalPayload:e.additionalPayload})}}})()}})).credentials},ir=class extends H{constructor(e,r){super(new Ai(e,$r),r)}signOut=async()=>{await this._apiClient.signOut(void 0,{...this.authHeader})}};import{Zodios as al}from"@zodios/core";import{makeApi as ol,makeEndpoint as il}from"@zodios/core";import{z as et}from"zod";import{z as k}from"zod";var tl=k.enum(["hitsTotal","hitsSmallSpanTotal","hitsMediumSpanTotal","hitsLargeSpanTotal","downstreamWorkbookCount"]),Ei=k.array(k.object({method:tl,sortDirection:k.enum(["asc","desc"]).default("asc").optional()})).nonempty(),_i=k.enum(["lens","datasource","virtualconnection","collection","project","flow","datarole","table","database","view","workbook"]),Si=k.union([k.array(k.string().datetime()).nonempty(),k.object({startDate:k.string().datetime(),endDate:k.string().datetime().optional()}).strict(),k.object({startDate:k.string().datetime().optional(),endDate:k.string().datetime()}).strict()]),Qr=k.object({contentTypes:k.array(_i).nonempty(),ownerIds:k.array(k.number().int()).nonempty(),modifiedTime:Si}).partial(),vi=k.union([Qr.extend({contentTypes:k.array(_i).nonempty()}).strict(),Qr.extend({ownerIds:k.array(k.number().int()).nonempty()}).strict(),Qr.extend({modifiedTime:Si}).strict()]),rl=k.object({uri:k.string(),content:k.record(k.string(),k.unknown())}),Ci=k.object({next:k.string(),prev:k.string(),pageIndex:k.number().int(),startIndex:k.number().int(),total:k.number().int(),limit:k.number().int(),items:k.array(rl)}).partial();var sl=il({method:"get",path:"/search",alias:"searchContent",description:"Searches across all supported content types for objects relevant to the search expression specified in the querystring of the request URI.",parameters:[{name:"terms",type:"Query",schema:et.string().optional()},{name:"page",type:"Query",schema:et.number().int().optional()},{name:"limit",type:"Query",schema:et.number().int().optional()},{name:"order_by",type:"Query",schema:et.string().optional()},{name:"filter",type:"Query",schema:et.string().optional()}],response:et.object({hits:Ci})}),nl=ol([sl]),Ri=[...nl];var St=class extends H{constructor(e,r){super(new al(e,Ri),r)}searchContent=async e=>(Object.entries(e).forEach(([o,i])=>{i===void 0&&delete e[o]}),(await this._apiClient.searchContent({queries:e,...this.authHeader})).hits)};import{Zodios as pl}from"@zodios/core";import{makeApi as ll,makeEndpoint as Ii}from"@zodios/core";import{z as qe}from"zod";import{z as nr}from"zod";import{z as Kr}from"zod";var sr=Kr.object({name:Kr.string(),id:Kr.string()});var Jr=nr.object({id:nr.string(),name:nr.string(),description:nr.string().optional(),project:sr});import{z as Ue}from"zod";var tt=Ue.object({pageNumber:Ue.coerce.number(),pageSize:Ue.coerce.number(),totalAvailable:Ue.coerce.number()}),Sf=Ue.object({next_page_token:Ue.string().optional(),total_available:Ue.coerce.number().optional()});import{z as xi}from"zod";var rt=[{name:"pageSize",type:"Query",schema:xi.number().optional(),description:"The number of items to return in one response. The minimum is 1. The maximum is 1000. The default is 100."},{name:"pageNumber",type:"Query",schema:xi.number().optional(),description:"The offset for paging. The default is 1."}];var cl=Ii({method:"get",path:"/sites/:siteId/datasources",alias:"listDatasources",description:"Returns a list of published data sources on the specified site. Supports a filter string as a query parameter in the format field:operator:value.",parameters:[...rt,{name:"siteId",type:"Path",schema:qe.string()},{name:"filter",type:"Query",schema:qe.string().optional(),description:"Filter string in the format field:operator:value (e.g., name:eq:Project Views)"}],response:qe.object({pagination:tt,datasources:qe.object({datasource:qe.optional(qe.array(Jr))})})}),ul=Ii({method:"get",path:"/sites/:siteId/datasources/:datasourceId",alias:"queryDatasource",description:"Returns information about the specified data source.",response:qe.object({datasource:Jr})}),dl=ll([cl,ul]),ki=[...dl];var vt=class extends H{constructor(e,r){super(new pl(e,ki),r)}listDatasources=async({siteId:e,filter:r,pageSize:o,pageNumber:i})=>{let n=await this._apiClient.listDatasources({params:{siteId:e},queries:{filter:r,pageSize:o,pageNumber:i},...this.authHeader});return{pagination:n.pagination,datasources:n.datasources.datasource??[]}};queryDatasource=async({siteId:e,datasourceId:r})=>(await this._apiClient.queryDatasource({params:{siteId:e,datasourceId:r},...this.authHeader})).datasource};import{Zodios as yl}from"@zodios/core";import{makeApi as ml,makeEndpoint as fl}from"@zodios/core";import{z as P}from"zod";var hl=P.object({data:P.object({publishedDatasources:P.array(P.object({name:P.string().nullable(),description:P.string().nullable(),owner:P.object({name:P.string().nullable()}),fields:P.array(P.object({name:P.string(),isHidden:P.boolean().nullable(),description:P.string().nullable(),descriptionInherited:P.array(P.object({attribute:P.string(),value:P.string().nullable()}).nullable()).nullable(),fullyQualifiedName:P.string(),__typename:P.string(),dataCategory:P.string().nullish(),role:P.string().nullish(),dataType:P.string().nullish(),defaultFormat:P.string().nullish(),semanticRole:P.string().nullish(),aggregation:P.string().nullish(),aggregationParam:P.string().nullish(),formula:P.string().nullish(),isAutoGenerated:P.boolean().nullish(),hasUserReference:P.boolean().nullish(),binSize:P.number().nullish(),hasOther:P.boolean().nullish(),delimiter:P.string().nullish(),combinationType:P.string().nullish()}))}))})}),gl=fl({method:"post",path:"/graphql",alias:"graphql",response:hl,parameters:[{name:"query",type:"Body",schema:P.object({query:P.string()})}]}),bl=ml([gl]),Pi=[...bl];var Ct=class extends H{constructor(e,r){super(new yl(e,Pi),r)}graphql=async e=>await this._apiClient.graphql({query:e},{...this.authHeader})};import{Zodios as Su}from"@zodios/core";import{Err as qs,Ok as vu}from"ts-results-es";function Rt(t,e){return function(){return t.apply(e,arguments)}}var{toString:wl}=Object.prototype,{getPrototypeOf:Yr}=Object,{iterator:lr,toStringTag:Li}=Symbol,cr=(t=>e=>{let r=wl.call(e);return t[r]||(t[r]=r.slice(8,-1).toLowerCase())})(Object.create(null)),he=t=>(t=t.toLowerCase(),e=>cr(e)===t),ur=t=>e=>typeof e===t,{isArray:it}=Array,ot=ur("undefined");function xt(t){return t!==null&&!ot(t)&&t.constructor!==null&&!ot(t.constructor)&&oe(t.constructor.isBuffer)&&t.constructor.isBuffer(t)}var Oi=he("ArrayBuffer");function Tl(t){let e;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?e=ArrayBuffer.isView(t):e=t&&t.buffer&&Oi(t.buffer),e}var Al=ur("string"),oe=ur("function"),Mi=ur("number"),It=t=>t!==null&&typeof t=="object",El=t=>t===!0||t===!1,ar=t=>{if(cr(t)!=="object")return!1;let e=Yr(t);return(e===null||e===Object.prototype||Object.getPrototypeOf(e)===null)&&!(Li in t)&&!(lr in t)},_l=t=>{if(!It(t)||xt(t))return!1;try{return Object.keys(t).length===0&&Object.getPrototypeOf(t)===Object.prototype}catch{return!1}},Sl=he("Date"),vl=he("File"),Cl=he("Blob"),Rl=he("FileList"),xl=t=>It(t)&&oe(t.pipe),Il=t=>{let e;return t&&(typeof FormData=="function"&&t instanceof FormData||oe(t.append)&&((e=cr(t))==="formdata"||e==="object"&&oe(t.toString)&&t.toString()==="[object FormData]"))},kl=he("URLSearchParams"),[Pl,Dl,Ll,Ol]=["ReadableStream","Request","Response","Headers"].map(he),Ml=t=>t.trim?t.trim():t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function kt(t,e,{allOwnKeys:r=!1}={}){if(t===null||typeof t>"u")return;let o,i;if(typeof t!="object"&&(t=[t]),it(t))for(o=0,i=t.length;o<i;o++)e.call(null,t[o],o,t);else{if(xt(t))return;let n=r?Object.getOwnPropertyNames(t):Object.keys(t),s=n.length,a;for(o=0;o<s;o++)a=n[o],e.call(null,t[a],a,t)}}function Ni(t,e){if(xt(t))return null;e=e.toLowerCase();let r=Object.keys(t),o=r.length,i;for(;o-- >0;)if(i=r[o],e===i.toLowerCase())return i;return null}var je=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,Fi=t=>!ot(t)&&t!==je;function Zr(){let{caseless:t,skipUndefined:e}=Fi(this)&&this||{},r={},o=(i,n)=>{let s=t&&Ni(r,n)||n;ar(r[s])&&ar(i)?r[s]=Zr(r[s],i):ar(i)?r[s]=Zr({},i):it(i)?r[s]=i.slice():(!e||!ot(i))&&(r[s]=i)};for(let i=0,n=arguments.length;i<n;i++)arguments[i]&&kt(arguments[i],o);return r}var Nl=(t,e,r,{allOwnKeys:o}={})=>(kt(e,(i,n)=>{r&&oe(i)?t[n]=Rt(i,r):t[n]=i},{allOwnKeys:o}),t),Fl=t=>(t.charCodeAt(0)===65279&&(t=t.slice(1)),t),Ul=(t,e,r,o)=>{t.prototype=Object.create(e.prototype,o),t.prototype.constructor=t,Object.defineProperty(t,"super",{value:e.prototype}),r&&Object.assign(t.prototype,r)},ql=(t,e,r,o)=>{let i,n,s,a={};if(e=e||{},t==null)return e;do{for(i=Object.getOwnPropertyNames(t),n=i.length;n-- >0;)s=i[n],(!o||o(s,t,e))&&!a[s]&&(e[s]=t[s],a[s]=!0);t=r!==!1&&Yr(t)}while(t&&(!r||r(t,e))&&t!==Object.prototype);return e},jl=(t,e,r)=>{t=String(t),(r===void 0||r>t.length)&&(r=t.length),r-=e.length;let o=t.indexOf(e,r);return o!==-1&&o===r},Vl=t=>{if(!t)return null;if(it(t))return t;let e=t.length;if(!Mi(e))return null;let r=new Array(e);for(;e-- >0;)r[e]=t[e];return r},Bl=(t=>e=>t&&e instanceof t)(typeof Uint8Array<"u"&&Yr(Uint8Array)),zl=(t,e)=>{let o=(t&&t[lr]).call(t),i;for(;(i=o.next())&&!i.done;){let n=i.value;e.call(t,n[0],n[1])}},Wl=(t,e)=>{let r,o=[];for(;(r=t.exec(e))!==null;)o.push(r);return o},Hl=he("HTMLFormElement"),Gl=t=>t.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(r,o,i){return o.toUpperCase()+i}),Di=(({hasOwnProperty:t})=>(e,r)=>t.call(e,r))(Object.prototype),$l=he("RegExp"),Ui=(t,e)=>{let r=Object.getOwnPropertyDescriptors(t),o={};kt(r,(i,n)=>{let s;(s=e(i,n,t))!==!1&&(o[n]=s||i)}),Object.defineProperties(t,o)},Ql=t=>{Ui(t,(e,r)=>{if(oe(t)&&["arguments","caller","callee"].indexOf(r)!==-1)return!1;let o=t[r];if(oe(o)){if(e.enumerable=!1,"writable"in e){e.writable=!1;return}e.set||(e.set=()=>{throw Error("Can not rewrite read-only method '"+r+"'")})}})},Kl=(t,e)=>{let r={},o=i=>{i.forEach(n=>{r[n]=!0})};return it(t)?o(t):o(String(t).split(e)),r},Jl=()=>{},Zl=(t,e)=>t!=null&&Number.isFinite(t=+t)?t:e;function Yl(t){return!!(t&&oe(t.append)&&t[Li]==="FormData"&&t[lr])}var Xl=t=>{let e=new Array(10),r=(o,i)=>{if(It(o)){if(e.indexOf(o)>=0)return;if(xt(o))return o;if(!("toJSON"in o)){e[i]=o;let n=it(o)?[]:{};return kt(o,(s,a)=>{let c=r(s,i+1);!ot(c)&&(n[a]=c)}),e[i]=void 0,n}}return o};return r(t,0)},ec=he("AsyncFunction"),tc=t=>t&&(It(t)||oe(t))&&oe(t.then)&&oe(t.catch),qi=((t,e)=>t?setImmediate:e?((r,o)=>(je.addEventListener("message",({source:i,data:n})=>{i===je&&n===r&&o.length&&o.shift()()},!1),i=>{o.push(i),je.postMessage(r,"*")}))(`axios@${Math.random()}`,[]):r=>setTimeout(r))(typeof setImmediate=="function",oe(je.postMessage)),rc=typeof queueMicrotask<"u"?queueMicrotask.bind(je):typeof process<"u"&&process.nextTick||qi,oc=t=>t!=null&&oe(t[lr]),d={isArray:it,isArrayBuffer:Oi,isBuffer:xt,isFormData:Il,isArrayBufferView:Tl,isString:Al,isNumber:Mi,isBoolean:El,isObject:It,isPlainObject:ar,isEmptyObject:_l,isReadableStream:Pl,isRequest:Dl,isResponse:Ll,isHeaders:Ol,isUndefined:ot,isDate:Sl,isFile:vl,isBlob:Cl,isRegExp:$l,isFunction:oe,isStream:xl,isURLSearchParams:kl,isTypedArray:Bl,isFileList:Rl,forEach:kt,merge:Zr,extend:Nl,trim:Ml,stripBOM:Fl,inherits:Ul,toFlatObject:ql,kindOf:cr,kindOfTest:he,endsWith:jl,toArray:Vl,forEachEntry:zl,matchAll:Wl,isHTMLForm:Hl,hasOwnProperty:Di,hasOwnProp:Di,reduceDescriptors:Ui,freezeMethods:Ql,toObjectSet:Kl,toCamelCase:Gl,noop:Jl,toFiniteNumber:Zl,findKey:Ni,global:je,isContextDefined:Fi,isSpecCompliantForm:Yl,toJSONObject:Xl,isAsyncFn:ec,isThenable:tc,setImmediate:qi,asap:rc,isIterable:oc};function st(t,e,r,o,i){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack,this.message=t,this.name="AxiosError",e&&(this.code=e),r&&(this.config=r),o&&(this.request=o),i&&(this.response=i,this.status=i.status?i.status:null)}d.inherits(st,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:d.toJSONObject(this.config),code:this.code,status:this.status}}});var ji=st.prototype,Vi={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach(t=>{Vi[t]={value:t}});Object.defineProperties(st,Vi);Object.defineProperty(ji,"isAxiosError",{value:!0});st.from=(t,e,r,o,i,n)=>{let s=Object.create(ji);d.toFlatObject(t,s,function(u){return u!==Error.prototype},l=>l!=="isAxiosError");let a=t&&t.message?t.message:"Error",c=e==null&&t?t.code:e;return st.call(s,a,c,r,o,i),t&&s.cause==null&&Object.defineProperty(s,"cause",{value:t,configurable:!0}),s.name=t&&t.name||"Error",n&&Object.assign(s,n),s};var T=st;import ic from"form-data";var dr=ic;function Xr(t){return d.isPlainObject(t)||d.isArray(t)}function zi(t){return d.endsWith(t,"[]")?t.slice(0,-2):t}function Bi(t,e,r){return t?t.concat(e).map(function(i,n){return i=zi(i),!r&&n?"["+i+"]":i}).join(r?".":""):e}function sc(t){return d.isArray(t)&&!t.some(Xr)}var nc=d.toFlatObject(d,{},null,function(e){return/^is[A-Z]/.test(e)});function ac(t,e,r){if(!d.isObject(t))throw new TypeError("target must be an object");e=e||new(dr||FormData),r=d.toFlatObject(r,{metaTokens:!0,dots:!1,indexes:!1},!1,function(y,w){return!d.isUndefined(w[y])});let o=r.metaTokens,i=r.visitor||u,n=r.dots,s=r.indexes,c=(r.Blob||typeof Blob<"u"&&Blob)&&d.isSpecCompliantForm(e);if(!d.isFunction(i))throw new TypeError("visitor must be a function");function l(f){if(f===null)return"";if(d.isDate(f))return f.toISOString();if(d.isBoolean(f))return f.toString();if(!c&&d.isBlob(f))throw new T("Blob is not supported. Use a Buffer instead.");return d.isArrayBuffer(f)||d.isTypedArray(f)?c&&typeof Blob=="function"?new Blob([f]):Buffer.from(f):f}function u(f,y,w){let v=f;if(f&&!w&&typeof f=="object"){if(d.endsWith(y,"{}"))y=o?y:y.slice(0,-2),f=JSON.stringify(f);else if(d.isArray(f)&&sc(f)||(d.isFileList(f)||d.endsWith(y,"[]"))&&(v=d.toArray(f)))return y=zi(y),v.forEach(function(A,x){!(d.isUndefined(A)||A===null)&&e.append(s===!0?Bi([y],x,n):s===null?y:y+"[]",l(A))}),!1}return Xr(f)?!0:(e.append(Bi(w,y,n),l(f)),!1)}let p=[],g=Object.assign(nc,{defaultVisitor:u,convertValue:l,isVisitable:Xr});function b(f,y){if(!d.isUndefined(f)){if(p.indexOf(f)!==-1)throw Error("Circular reference detected in "+y.join("."));p.push(f),d.forEach(f,function(v,D){(!(d.isUndefined(v)||v===null)&&i.call(e,v,d.isString(D)?D.trim():D,y,g))===!0&&b(v,y?y.concat(D):[D])}),p.pop()}}if(!d.isObject(t))throw new TypeError("data must be an object");return b(t),e}var Ce=ac;function Wi(t){let e={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(t).replace(/[!'()~]|%20|%00/g,function(o){return e[o]})}function Hi(t,e){this._pairs=[],t&&Ce(t,this,e)}var Gi=Hi.prototype;Gi.append=function(e,r){this._pairs.push([e,r])};Gi.toString=function(e){let r=e?function(o){return e.call(this,o,Wi)}:Wi;return this._pairs.map(function(i){return r(i[0])+"="+r(i[1])},"").join("&")};var $i=Hi;function lc(t){return encodeURIComponent(t).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+")}function Ve(t,e,r){if(!e)return t;let o=r&&r.encode||lc;d.isFunction(r)&&(r={serialize:r});let i=r&&r.serialize,n;if(i?n=i(e,r):n=d.isURLSearchParams(e)?e.toString():new $i(e,r).toString(o),n){let s=t.indexOf("#");s!==-1&&(t=t.slice(0,s)),t+=(t.indexOf("?")===-1?"?":"&")+n}return t}var eo=class{constructor(){this.handlers=[]}use(e,r,o){return this.handlers.push({fulfilled:e,rejected:r,synchronous:o?o.synchronous:!1,runWhen:o?o.runWhen:null}),this.handlers.length-1}eject(e){this.handlers[e]&&(this.handlers[e]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(e){d.forEach(this.handlers,function(o){o!==null&&e(o)})}},to=eo;var nt={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1};import uc from"crypto";import cc from"url";var Qi=cc.URLSearchParams;var ro="abcdefghijklmnopqrstuvwxyz",Ki="0123456789",Ji={DIGIT:Ki,ALPHA:ro,ALPHA_DIGIT:ro+ro.toUpperCase()+Ki},dc=(t=16,e=Ji.ALPHA_DIGIT)=>{let r="",{length:o}=e,i=new Uint32Array(t);uc.randomFillSync(i);for(let n=0;n<t;n++)r+=e[i[n]%o];return r},Zi={isNode:!0,classes:{URLSearchParams:Qi,FormData:dr,Blob:typeof Blob<"u"&&Blob||null},ALPHABET:Ji,generateString:dc,protocols:["http","https","file","data"]};var so={};Ra(so,{hasBrowserEnv:()=>io,hasStandardBrowserEnv:()=>pc,hasStandardBrowserWebWorkerEnv:()=>mc,navigator:()=>oo,origin:()=>fc});var io=typeof window<"u"&&typeof document<"u",oo=typeof navigator=="object"&&navigator||void 0,pc=io&&(!oo||["ReactNative","NativeScript","NS"].indexOf(oo.product)<0),mc=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",fc=io&&window.location.href||"http://localhost";var L={...so,...Zi};function no(t,e){return Ce(t,new L.classes.URLSearchParams,{visitor:function(r,o,i,n){return L.isNode&&d.isBuffer(r)?(this.append(o,r.toString("base64")),!1):n.defaultVisitor.apply(this,arguments)},...e})}function hc(t){return d.matchAll(/\w+|\[(\w*)]/g,t).map(e=>e[0]==="[]"?"":e[1]||e[0])}function gc(t){let e={},r=Object.keys(t),o,i=r.length,n;for(o=0;o<i;o++)n=r[o],e[n]=t[n];return e}function bc(t){function e(r,o,i,n){let s=r[n++];if(s==="__proto__")return!0;let a=Number.isFinite(+s),c=n>=r.length;return s=!s&&d.isArray(i)?i.length:s,c?(d.hasOwnProp(i,s)?i[s]=[i[s],o]:i[s]=o,!a):((!i[s]||!d.isObject(i[s]))&&(i[s]=[]),e(r,o,i[s],n)&&d.isArray(i[s])&&(i[s]=gc(i[s])),!a)}if(d.isFormData(t)&&d.isFunction(t.entries)){let r={};return d.forEachEntry(t,(o,i)=>{e(hc(o),i,r,0)}),r}return null}var pr=bc;function yc(t,e,r){if(d.isString(t))try{return(e||JSON.parse)(t),d.trim(t)}catch(o){if(o.name!=="SyntaxError")throw o}return(r||JSON.stringify)(t)}var ao={transitional:nt,adapter:["xhr","http","fetch"],transformRequest:[function(e,r){let o=r.getContentType()||"",i=o.indexOf("application/json")>-1,n=d.isObject(e);if(n&&d.isHTMLForm(e)&&(e=new FormData(e)),d.isFormData(e))return i?JSON.stringify(pr(e)):e;if(d.isArrayBuffer(e)||d.isBuffer(e)||d.isStream(e)||d.isFile(e)||d.isBlob(e)||d.isReadableStream(e))return e;if(d.isArrayBufferView(e))return e.buffer;if(d.isURLSearchParams(e))return r.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),e.toString();let a;if(n){if(o.indexOf("application/x-www-form-urlencoded")>-1)return no(e,this.formSerializer).toString();if((a=d.isFileList(e))||o.indexOf("multipart/form-data")>-1){let c=this.env&&this.env.FormData;return Ce(a?{"files[]":e}:e,c&&new c,this.formSerializer)}}return n||i?(r.setContentType("application/json",!1),yc(e)):e}],transformResponse:[function(e){let r=this.transitional||ao.transitional,o=r&&r.forcedJSONParsing,i=this.responseType==="json";if(d.isResponse(e)||d.isReadableStream(e))return e;if(e&&d.isString(e)&&(o&&!this.responseType||i)){let s=!(r&&r.silentJSONParsing)&&i;try{return JSON.parse(e,this.parseReviver)}catch(a){if(s)throw a.name==="SyntaxError"?T.from(a,T.ERR_BAD_RESPONSE,this,null,this.response):a}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:L.classes.FormData,Blob:L.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};d.forEach(["delete","get","head","post","put","patch"],t=>{ao.headers[t]={}});var at=ao;var wc=d.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),Yi=t=>{let e={},r,o,i;return t&&t.split(`
6
- `).forEach(function(s){i=s.indexOf(":"),r=s.substring(0,i).trim().toLowerCase(),o=s.substring(i+1).trim(),!(!r||e[r]&&wc[r])&&(r==="set-cookie"?e[r]?e[r].push(o):e[r]=[o]:e[r]=e[r]?e[r]+", "+o:o)}),e};var Xi=Symbol("internals");function Pt(t){return t&&String(t).trim().toLowerCase()}function mr(t){return t===!1||t==null?t:d.isArray(t)?t.map(mr):String(t)}function Tc(t){let e=Object.create(null),r=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g,o;for(;o=r.exec(t);)e[o[1]]=o[2];return e}var Ac=t=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(t.trim());function lo(t,e,r,o,i){if(d.isFunction(o))return o.call(this,e,r);if(i&&(e=r),!!d.isString(e)){if(d.isString(o))return e.indexOf(o)!==-1;if(d.isRegExp(o))return o.test(e)}}function Ec(t){return t.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(e,r,o)=>r.toUpperCase()+o)}function _c(t,e){let r=d.toCamelCase(" "+e);["get","set","has"].forEach(o=>{Object.defineProperty(t,o+r,{value:function(i,n,s){return this[o].call(this,e,i,n,s)},configurable:!0})})}var lt=class{constructor(e){e&&this.set(e)}set(e,r,o){let i=this;function n(a,c,l){let u=Pt(c);if(!u)throw new Error("header name must be a non-empty string");let p=d.findKey(i,u);(!p||i[p]===void 0||l===!0||l===void 0&&i[p]!==!1)&&(i[p||c]=mr(a))}let s=(a,c)=>d.forEach(a,(l,u)=>n(l,u,c));if(d.isPlainObject(e)||e instanceof this.constructor)s(e,r);else if(d.isString(e)&&(e=e.trim())&&!Ac(e))s(Yi(e),r);else if(d.isObject(e)&&d.isIterable(e)){let a={},c,l;for(let u of e){if(!d.isArray(u))throw TypeError("Object iterator must return a key-value pair");a[l=u[0]]=(c=a[l])?d.isArray(c)?[...c,u[1]]:[c,u[1]]:u[1]}s(a,r)}else e!=null&&n(r,e,o);return this}get(e,r){if(e=Pt(e),e){let o=d.findKey(this,e);if(o){let i=this[o];if(!r)return i;if(r===!0)return Tc(i);if(d.isFunction(r))return r.call(this,i,o);if(d.isRegExp(r))return r.exec(i);throw new TypeError("parser must be boolean|regexp|function")}}}has(e,r){if(e=Pt(e),e){let o=d.findKey(this,e);return!!(o&&this[o]!==void 0&&(!r||lo(this,this[o],o,r)))}return!1}delete(e,r){let o=this,i=!1;function n(s){if(s=Pt(s),s){let a=d.findKey(o,s);a&&(!r||lo(o,o[a],a,r))&&(delete o[a],i=!0)}}return d.isArray(e)?e.forEach(n):n(e),i}clear(e){let r=Object.keys(this),o=r.length,i=!1;for(;o--;){let n=r[o];(!e||lo(this,this[n],n,e,!0))&&(delete this[n],i=!0)}return i}normalize(e){let r=this,o={};return d.forEach(this,(i,n)=>{let s=d.findKey(o,n);if(s){r[s]=mr(i),delete r[n];return}let a=e?Ec(n):String(n).trim();a!==n&&delete r[n],r[a]=mr(i),o[a]=!0}),this}concat(...e){return this.constructor.concat(this,...e)}toJSON(e){let r=Object.create(null);return d.forEach(this,(o,i)=>{o!=null&&o!==!1&&(r[i]=e&&d.isArray(o)?o.join(", "):o)}),r}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([e,r])=>e+": "+r).join(`
7
- `)}getSetCookie(){return this.get("set-cookie")||[]}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(e){return e instanceof this?e:new this(e)}static concat(e,...r){let o=new this(e);return r.forEach(i=>o.set(i)),o}static accessor(e){let o=(this[Xi]=this[Xi]={accessors:{}}).accessors,i=this.prototype;function n(s){let a=Pt(s);o[a]||(_c(i,s),o[a]=!0)}return d.isArray(e)?e.forEach(n):n(e),this}};lt.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);d.reduceDescriptors(lt.prototype,({value:t},e)=>{let r=e[0].toUpperCase()+e.slice(1);return{get:()=>t,set(o){this[r]=o}}});d.freezeMethods(lt);var V=lt;function Dt(t,e){let r=this||at,o=e||r,i=V.from(o.headers),n=o.data;return d.forEach(t,function(a){n=a.call(r,n,i.normalize(),e?e.status:void 0)}),i.normalize(),n}function Lt(t){return!!(t&&t.__CANCEL__)}function es(t,e,r){T.call(this,t??"canceled",T.ERR_CANCELED,e,r),this.name="CanceledError"}d.inherits(es,T,{__CANCEL__:!0});var ne=es;function we(t,e,r){let o=r.config.validateStatus;!r.status||!o||o(r.status)?t(r):e(new T("Request failed with status code "+r.status,[T.ERR_BAD_REQUEST,T.ERR_BAD_RESPONSE][Math.floor(r.status/100)-4],r.config,r.request,r))}function co(t){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(t)}function uo(t,e){return e?t.replace(/\/?\/$/,"")+"/"+e.replace(/^\/+/,""):t}function Be(t,e,r){let o=!co(e);return t&&(o||r==!1)?uo(t,e):e}import Fc from"proxy-from-env";import Uc from"http";import qc from"https";import jc from"util";import Vc from"follow-redirects";import Re from"zlib";var ze="1.12.1";function Ot(t){let e=/^([-+\w]{1,25})(:?\/\/|:)/.exec(t);return e&&e[1]||""}var Sc=/^(?:([^;]+);)?(?:[^;]+;)?(base64|),([\s\S]*)$/;function po(t,e,r){let o=r&&r.Blob||L.classes.Blob,i=Ot(t);if(e===void 0&&o&&(e=!0),i==="data"){t=i.length?t.slice(i.length+1):t;let n=Sc.exec(t);if(!n)throw new T("Invalid URL",T.ERR_INVALID_URL);let s=n[1],a=n[2],c=n[3],l=Buffer.from(decodeURIComponent(c),a?"base64":"utf8");if(e){if(!o)throw new T("Blob is not supported",T.ERR_NOT_SUPPORT);return new o([l],{type:s})}return l}throw new T("Unsupported protocol "+i,T.ERR_NOT_SUPPORT)}import dt from"stream";import vc from"stream";var mo=Symbol("internals"),fo=class extends vc.Transform{constructor(e){e=d.toFlatObject(e,{maxRate:0,chunkSize:64*1024,minChunkSize:100,timeWindow:500,ticksRate:2,samplesCount:15},null,(o,i)=>!d.isUndefined(i[o])),super({readableHighWaterMark:e.chunkSize});let r=this[mo]={timeWindow:e.timeWindow,chunkSize:e.chunkSize,maxRate:e.maxRate,minChunkSize:e.minChunkSize,bytesSeen:0,isCaptured:!1,notifiedBytesLoaded:0,ts:Date.now(),bytes:0,onReadCallback:null};this.on("newListener",o=>{o==="progress"&&(r.isCaptured||(r.isCaptured=!0))})}_read(e){let r=this[mo];return r.onReadCallback&&r.onReadCallback(),super._read(e)}_transform(e,r,o){let i=this[mo],n=i.maxRate,s=this.readableHighWaterMark,a=i.timeWindow,c=1e3/a,l=n/c,u=i.minChunkSize!==!1?Math.max(i.minChunkSize,l*.01):0,p=(b,f)=>{let y=Buffer.byteLength(b);i.bytesSeen+=y,i.bytes+=y,i.isCaptured&&this.emit("progress",i.bytesSeen),this.push(b)?process.nextTick(f):i.onReadCallback=()=>{i.onReadCallback=null,process.nextTick(f)}},g=(b,f)=>{let y=Buffer.byteLength(b),w=null,v=s,D,A=0;if(n){let x=Date.now();(!i.ts||(A=x-i.ts)>=a)&&(i.ts=x,D=l-i.bytes,i.bytes=D<0?-D:0,A=0),D=l-i.bytes}if(n){if(D<=0)return setTimeout(()=>{f(null,b)},a-A);D<v&&(v=D)}v&&y>v&&y-v>u&&(w=b.subarray(v),b=b.subarray(0,v)),p(b,w?()=>{process.nextTick(f,null,w)}:f)};g(e,function b(f,y){if(f)return o(f);y?g(y,b):o(null)})}},ho=fo;import{EventEmitter as Bc}from"events";import Rc from"util";import{Readable as xc}from"stream";var{asyncIterator:ts}=Symbol,Cc=async function*(t){t.stream?yield*t.stream():t.arrayBuffer?yield await t.arrayBuffer():t[ts]?yield*t[ts]():yield t},fr=Cc;var Ic=L.ALPHABET.ALPHA_DIGIT+"-_",Mt=typeof TextEncoder=="function"?new TextEncoder:new Rc.TextEncoder,We=`\r
8
- `,kc=Mt.encode(We),Pc=2,go=class{constructor(e,r){let{escapeName:o}=this.constructor,i=d.isString(r),n=`Content-Disposition: form-data; name="${o(e)}"${!i&&r.name?`; filename="${o(r.name)}"`:""}${We}`;i?r=Mt.encode(String(r).replace(/\r?\n|\r\n?/g,We)):n+=`Content-Type: ${r.type||"application/octet-stream"}${We}`,this.headers=Mt.encode(n+We),this.contentLength=i?r.byteLength:r.size,this.size=this.headers.byteLength+this.contentLength+Pc,this.name=e,this.value=r}async*encode(){yield this.headers;let{value:e}=this;d.isTypedArray(e)?yield e:yield*fr(e),yield kc}static escapeName(e){return String(e).replace(/[\r\n"]/g,r=>({"\r":"%0D","\n":"%0A",'"':"%22"})[r])}},Dc=(t,e,r)=>{let{tag:o="form-data-boundary",size:i=25,boundary:n=o+"-"+L.generateString(i,Ic)}=r||{};if(!d.isFormData(t))throw TypeError("FormData instance required");if(n.length<1||n.length>70)throw Error("boundary must be 10-70 characters long");let s=Mt.encode("--"+n+We),a=Mt.encode("--"+n+"--"+We),c=a.byteLength,l=Array.from(t.entries()).map(([p,g])=>{let b=new go(p,g);return c+=b.size,b});c+=s.byteLength*l.length,c=d.toFiniteNumber(c);let u={"Content-Type":`multipart/form-data; boundary=${n}`};return Number.isFinite(c)&&(u["Content-Length"]=c),e&&e(u),xc.from(async function*(){for(let p of l)yield s,yield*p.encode();yield a}())},rs=Dc;import Lc from"stream";var bo=class extends Lc.Transform{__transform(e,r,o){this.push(e),o()}_transform(e,r,o){if(e.length!==0&&(this._transform=this.__transform,e[0]!==120)){let i=Buffer.alloc(2);i[0]=120,i[1]=156,this.push(i,r)}this.__transform(e,r,o)}},os=bo;var Oc=(t,e)=>d.isAsyncFn(t)?function(...r){let o=r.pop();t.apply(this,r).then(i=>{try{e?o(null,...e(i)):o(null,i)}catch(n){o(n)}},o)}:t,is=Oc;function Mc(t,e){t=t||10;let r=new Array(t),o=new Array(t),i=0,n=0,s;return e=e!==void 0?e:1e3,function(c){let l=Date.now(),u=o[n];s||(s=l),r[i]=c,o[i]=l;let p=n,g=0;for(;p!==i;)g+=r[p++],p=p%t;if(i=(i+1)%t,i===n&&(n=(n+1)%t),l-s<e)return;let b=u&&l-u;return b?Math.round(g*1e3/b):void 0}}var ss=Mc;function Nc(t,e){let r=0,o=1e3/e,i,n,s=(l,u=Date.now())=>{r=u,i=null,n&&(clearTimeout(n),n=null),t(...l)};return[(...l)=>{let u=Date.now(),p=u-r;p>=o?s(l,u):(i=l,n||(n=setTimeout(()=>{n=null,s(i)},o-p)))},()=>i&&s(i)]}var ns=Nc;var Ee=(t,e,r=3)=>{let o=0,i=ss(50,250);return ns(n=>{let s=n.loaded,a=n.lengthComputable?n.total:void 0,c=s-o,l=i(c),u=s<=a;o=s;let p={loaded:s,total:a,progress:a?s/a:void 0,bytes:c,rate:l||void 0,estimated:l&&a&&u?(a-s)/l:void 0,event:n,lengthComputable:a!=null,[e?"download":"upload"]:!0};t(p)},r)},ct=(t,e)=>{let r=t!=null;return[o=>e[0]({lengthComputable:r,total:t,loaded:o}),e[1]]},ut=t=>(...e)=>d.asap(()=>t(...e));function yo(t){if(!t||typeof t!="string"||!t.startsWith("data:"))return 0;let e=t.indexOf(",");if(e<0)return 0;let r=t.slice(5,e),o=t.slice(e+1);if(/;base64/i.test(r)){let n=o.length,s=o.length;for(let g=0;g<s;g++)if(o.charCodeAt(g)===37&&g+2<s){let b=o.charCodeAt(g+1),f=o.charCodeAt(g+2);(b>=48&&b<=57||b>=65&&b<=70||b>=97&&b<=102)&&(f>=48&&f<=57||f>=65&&f<=70||f>=97&&f<=102)&&(n-=2,g+=2)}let a=0,c=s-1,l=g=>g>=2&&o.charCodeAt(g-2)===37&&o.charCodeAt(g-1)===51&&(o.charCodeAt(g)===68||o.charCodeAt(g)===100);c>=0&&(o.charCodeAt(c)===61?(a++,c--):l(c)&&(a++,c-=3)),a===1&&c>=0&&(o.charCodeAt(c)===61||l(c))&&a++;let p=Math.floor(n/4)*3-(a||0);return p>0?p:0}return Buffer.byteLength(o,"utf8")}var as={flush:Re.constants.Z_SYNC_FLUSH,finishFlush:Re.constants.Z_SYNC_FLUSH},zc={flush:Re.constants.BROTLI_OPERATION_FLUSH,finishFlush:Re.constants.BROTLI_OPERATION_FLUSH},ls=d.isFunction(Re.createBrotliDecompress),{http:Wc,https:Hc}=Vc,Gc=/https:?/,cs=L.protocols.map(t=>t+":"),us=(t,[e,r])=>(t.on("end",r).on("error",r),e);function $c(t,e){t.beforeRedirects.proxy&&t.beforeRedirects.proxy(t),t.beforeRedirects.config&&t.beforeRedirects.config(t,e)}function ps(t,e,r){let o=e;if(!o&&o!==!1){let i=Fc.getProxyForUrl(r);i&&(o=new URL(i))}if(o){if(o.username&&(o.auth=(o.username||"")+":"+(o.password||"")),o.auth){(o.auth.username||o.auth.password)&&(o.auth=(o.auth.username||"")+":"+(o.auth.password||""));let n=Buffer.from(o.auth,"utf8").toString("base64");t.headers["Proxy-Authorization"]="Basic "+n}t.headers.host=t.hostname+(t.port?":"+t.port:"");let i=o.hostname||o.host;t.hostname=i,t.host=i,t.port=o.port,t.path=r,o.protocol&&(t.protocol=o.protocol.includes(":")?o.protocol:`${o.protocol}:`)}t.beforeRedirects.proxy=function(n){ps(n,e,n.href)}}var Qc=typeof process<"u"&&d.kindOf(process)==="process",Kc=t=>new Promise((e,r)=>{let o,i,n=(c,l)=>{i||(i=!0,o&&o(c,l))},s=c=>{n(c),e(c)},a=c=>{n(c,!0),r(c)};t(s,a,c=>o=c).catch(a)}),Jc=({address:t,family:e})=>{if(!d.isString(t))throw TypeError("address must be a string");return{address:t,family:e||(t.indexOf(".")<0?6:4)}},ds=(t,e)=>Jc(d.isObject(t)?t:{address:t,family:e}),ms=Qc&&function(e){return Kc(async function(o,i,n){let{data:s,lookup:a,family:c}=e,{responseType:l,responseEncoding:u}=e,p=e.method.toUpperCase(),g,b=!1,f;if(a){let S=is(a,_=>d.isArray(_)?_:[_]);a=(_,z,K)=>{S(_,z,(U,te,me)=>{if(U)return K(U);let Y=d.isArray(te)?te.map(re=>ds(re)):[ds(te,me)];z.all?K(U,Y):K(U,Y[0].address,Y[0].family)})}}let y=new Bc,w=()=>{e.cancelToken&&e.cancelToken.unsubscribe(v),e.signal&&e.signal.removeEventListener("abort",v),y.removeAllListeners()};n((S,_)=>{g=!0,_&&(b=!0,w())});function v(S){y.emit("abort",!S||S.type?new ne(null,e,f):S)}y.once("abort",i),(e.cancelToken||e.signal)&&(e.cancelToken&&e.cancelToken.subscribe(v),e.signal&&(e.signal.aborted?v():e.signal.addEventListener("abort",v)));let D=Be(e.baseURL,e.url,e.allowAbsoluteUrls),A=new URL(D,L.hasBrowserEnv?L.origin:void 0),x=A.protocol||cs[0];if(x==="data:"){if(e.maxContentLength>-1){let _=String(e.url||D||"");if(yo(_)>e.maxContentLength)return i(new T("maxContentLength size of "+e.maxContentLength+" exceeded",T.ERR_BAD_RESPONSE,e))}let S;if(p!=="GET")return we(o,i,{status:405,statusText:"method not allowed",headers:{},config:e});try{S=po(e.url,l==="blob",{Blob:e.env&&e.env.Blob})}catch(_){throw T.from(_,T.ERR_BAD_REQUEST,e)}return l==="text"?(S=S.toString(u),(!u||u==="utf8")&&(S=d.stripBOM(S))):l==="stream"&&(S=dt.Readable.from(S)),we(o,i,{data:S,status:200,statusText:"OK",headers:new V,config:e})}if(cs.indexOf(x)===-1)return i(new T("Unsupported protocol "+x,T.ERR_BAD_REQUEST,e));let R=V.from(e.headers).normalize();R.set("User-Agent","axios/"+ze,!1);let{onUploadProgress:j,onDownloadProgress:F}=e,ae=e.maxRate,pe,Ae;if(d.isSpecCompliantForm(s)){let S=R.getContentType(/boundary=([-_\w\d]{10,70})/i);s=rs(s,_=>{R.set(_)},{tag:`axios-${ze}-boundary`,boundary:S&&S[1]||void 0})}else if(d.isFormData(s)&&d.isFunction(s.getHeaders)){if(R.set(s.getHeaders()),!R.hasContentLength())try{let S=await jc.promisify(s.getLength).call(s);Number.isFinite(S)&&S>=0&&R.setContentLength(S)}catch{}}else if(d.isBlob(s)||d.isFile(s))s.size&&R.setContentType(s.type||"application/octet-stream"),R.setContentLength(s.size||0),s=dt.Readable.from(fr(s));else if(s&&!d.isStream(s)){if(!Buffer.isBuffer(s))if(d.isArrayBuffer(s))s=Buffer.from(new Uint8Array(s));else if(d.isString(s))s=Buffer.from(s,"utf-8");else return i(new T("Data after transformation must be a string, an ArrayBuffer, a Buffer, or a Stream",T.ERR_BAD_REQUEST,e));if(R.setContentLength(s.length,!1),e.maxBodyLength>-1&&s.length>e.maxBodyLength)return i(new T("Request body larger than maxBodyLength limit",T.ERR_BAD_REQUEST,e))}let _e=d.toFiniteNumber(R.getContentLength());d.isArray(ae)?(pe=ae[0],Ae=ae[1]):pe=Ae=ae,s&&(j||pe)&&(d.isStream(s)||(s=dt.Readable.from(s,{objectMode:!1})),s=dt.pipeline([s,new ho({maxRate:d.toFiniteNumber(pe)})],d.noop),j&&s.on("progress",us(s,ct(_e,Ee(ut(j),!1,3)))));let se;if(e.auth){let S=e.auth.username||"",_=e.auth.password||"";se=S+":"+_}if(!se&&A.username){let S=A.username,_=A.password;se=S+":"+_}se&&R.delete("authorization");let le;try{le=Ve(A.pathname+A.search,e.params,e.paramsSerializer).replace(/^\?/,"")}catch(S){let _=new Error(S.message);return _.config=e,_.url=e.url,_.exists=!0,i(_)}R.set("Accept-Encoding","gzip, compress, deflate"+(ls?", br":""),!1);let $={path:le,method:p,headers:R.toJSON(),agents:{http:e.httpAgent,https:e.httpsAgent},auth:se,protocol:x,family:c,beforeRedirect:$c,beforeRedirects:{}};!d.isUndefined(a)&&($.lookup=a),e.socketPath?$.socketPath=e.socketPath:($.hostname=A.hostname.startsWith("[")?A.hostname.slice(1,-1):A.hostname,$.port=A.port,ps($,e.proxy,x+"//"+A.hostname+(A.port?":"+A.port:"")+$.path));let J,Se=Gc.test($.protocol);if($.agent=Se?e.httpsAgent:e.httpAgent,e.transport?J=e.transport:e.maxRedirects===0?J=Se?qc:Uc:(e.maxRedirects&&($.maxRedirects=e.maxRedirects),e.beforeRedirect&&($.beforeRedirects.config=e.beforeRedirect),J=Se?Hc:Wc),e.maxBodyLength>-1?$.maxBodyLength=e.maxBodyLength:$.maxBodyLength=1/0,e.insecureHTTPParser&&($.insecureHTTPParser=e.insecureHTTPParser),f=J.request($,function(_){if(f.destroyed)return;let z=[_],K=+_.headers["content-length"];if(F||Ae){let re=new ho({maxRate:d.toFiniteNumber(Ae)});F&&re.on("progress",us(re,ct(K,Ee(ut(F),!0,3)))),z.push(re)}let U=_,te=_.req||f;if(e.decompress!==!1&&_.headers["content-encoding"])switch((p==="HEAD"||_.statusCode===204)&&delete _.headers["content-encoding"],(_.headers["content-encoding"]||"").toLowerCase()){case"gzip":case"x-gzip":case"compress":case"x-compress":z.push(Re.createUnzip(as)),delete _.headers["content-encoding"];break;case"deflate":z.push(new os),z.push(Re.createUnzip(as)),delete _.headers["content-encoding"];break;case"br":ls&&(z.push(Re.createBrotliDecompress(zc)),delete _.headers["content-encoding"])}U=z.length>1?dt.pipeline(z,d.noop):z[0];let me=dt.finished(U,()=>{me(),w()}),Y={status:_.statusCode,statusText:_.statusMessage,headers:new V(_.headers),config:e,request:te};if(l==="stream")Y.data=U,we(o,i,Y);else{let re=[],er=0;U.on("data",function(Q){re.push(Q),er+=Q.length,e.maxContentLength>-1&&er>e.maxContentLength&&(b=!0,U.destroy(),i(new T("maxContentLength size of "+e.maxContentLength+" exceeded",T.ERR_BAD_RESPONSE,e,te)))}),U.on("aborted",function(){if(b)return;let Q=new T("stream has been aborted",T.ERR_BAD_RESPONSE,e,te);U.destroy(Q),i(Q)}),U.on("error",function(Q){f.destroyed||i(T.from(Q,null,e,te))}),U.on("end",function(){try{let Q=re.length===1?re[0]:Buffer.concat(re);l!=="arraybuffer"&&(Q=Q.toString(u),(!u||u==="utf8")&&(Q=d.stripBOM(Q))),Y.data=Q}catch(Q){return i(T.from(Q,null,e,Y.request,Y))}we(o,i,Y)})}y.once("abort",re=>{U.destroyed||(U.emit("error",re),U.destroy())})}),y.once("abort",S=>{i(S),f.destroy(S)}),f.on("error",function(_){i(T.from(_,null,e,f))}),f.on("socket",function(_){_.setKeepAlive(!0,1e3*60)}),e.timeout){let S=parseInt(e.timeout,10);if(Number.isNaN(S)){i(new T("error trying to parse `config.timeout` to int",T.ERR_BAD_OPTION_VALUE,e,f));return}f.setTimeout(S,function(){if(g)return;let z=e.timeout?"timeout of "+e.timeout+"ms exceeded":"timeout exceeded",K=e.transitional||nt;e.timeoutErrorMessage&&(z=e.timeoutErrorMessage),i(new T(z,K.clarifyTimeoutError?T.ETIMEDOUT:T.ECONNABORTED,e,f)),v()})}if(d.isStream(s)){let S=!1,_=!1;s.on("end",()=>{S=!0}),s.once("error",z=>{_=!0,f.destroy(z)}),s.on("close",()=>{!S&&!_&&v(new ne("Request stream has been aborted",e,f))}),s.pipe(f)}else f.end(s)})};var fs=L.hasStandardBrowserEnv?((t,e)=>r=>(r=new URL(r,L.origin),t.protocol===r.protocol&&t.host===r.host&&(e||t.port===r.port)))(new URL(L.origin),L.navigator&&/(msie|trident)/i.test(L.navigator.userAgent)):()=>!0;var hs=L.hasStandardBrowserEnv?{write(t,e,r,o,i,n){let s=[t+"="+encodeURIComponent(e)];d.isNumber(r)&&s.push("expires="+new Date(r).toGMTString()),d.isString(o)&&s.push("path="+o),d.isString(i)&&s.push("domain="+i),n===!0&&s.push("secure"),document.cookie=s.join("; ")},read(t){let e=document.cookie.match(new RegExp("(^|;\\s*)("+t+")=([^;]*)"));return e?decodeURIComponent(e[3]):null},remove(t){this.write(t,"",Date.now()-864e5)}}:{write(){},read(){return null},remove(){}};var gs=t=>t instanceof V?{...t}:t;function ge(t,e){e=e||{};let r={};function o(l,u,p,g){return d.isPlainObject(l)&&d.isPlainObject(u)?d.merge.call({caseless:g},l,u):d.isPlainObject(u)?d.merge({},u):d.isArray(u)?u.slice():u}function i(l,u,p,g){if(d.isUndefined(u)){if(!d.isUndefined(l))return o(void 0,l,p,g)}else return o(l,u,p,g)}function n(l,u){if(!d.isUndefined(u))return o(void 0,u)}function s(l,u){if(d.isUndefined(u)){if(!d.isUndefined(l))return o(void 0,l)}else return o(void 0,u)}function a(l,u,p){if(p in e)return o(l,u);if(p in t)return o(void 0,l)}let c={url:n,method:n,data:n,baseURL:s,transformRequest:s,transformResponse:s,paramsSerializer:s,timeout:s,timeoutMessage:s,withCredentials:s,withXSRFToken:s,adapter:s,responseType:s,xsrfCookieName:s,xsrfHeaderName:s,onUploadProgress:s,onDownloadProgress:s,decompress:s,maxContentLength:s,maxBodyLength:s,beforeRedirect:s,transport:s,httpAgent:s,httpsAgent:s,cancelToken:s,socketPath:s,responseEncoding:s,validateStatus:a,headers:(l,u,p)=>i(gs(l),gs(u),p,!0)};return d.forEach(Object.keys({...t,...e}),function(u){let p=c[u]||i,g=p(t[u],e[u],u);d.isUndefined(g)&&p!==a||(r[u]=g)}),r}var hr=t=>{let e=ge({},t),{data:r,withXSRFToken:o,xsrfHeaderName:i,xsrfCookieName:n,headers:s,auth:a}=e;if(e.headers=s=V.from(s),e.url=Ve(Be(e.baseURL,e.url,e.allowAbsoluteUrls),t.params,t.paramsSerializer),a&&s.set("Authorization","Basic "+btoa((a.username||"")+":"+(a.password?unescape(encodeURIComponent(a.password)):""))),d.isFormData(r)){if(L.hasStandardBrowserEnv||L.hasStandardBrowserWebWorkerEnv)s.setContentType(void 0);else if(d.isFunction(r.getHeaders)){let c=r.getHeaders(),l=["content-type","content-length"];Object.entries(c).forEach(([u,p])=>{l.includes(u.toLowerCase())&&s.set(u,p)})}}if(L.hasStandardBrowserEnv&&(o&&d.isFunction(o)&&(o=o(e)),o||o!==!1&&fs(e.url))){let c=i&&n&&hs.read(n);c&&s.set(i,c)}return e};var Zc=typeof XMLHttpRequest<"u",bs=Zc&&function(t){return new Promise(function(r,o){let i=hr(t),n=i.data,s=V.from(i.headers).normalize(),{responseType:a,onUploadProgress:c,onDownloadProgress:l}=i,u,p,g,b,f;function y(){b&&b(),f&&f(),i.cancelToken&&i.cancelToken.unsubscribe(u),i.signal&&i.signal.removeEventListener("abort",u)}let w=new XMLHttpRequest;w.open(i.method.toUpperCase(),i.url,!0),w.timeout=i.timeout;function v(){if(!w)return;let A=V.from("getAllResponseHeaders"in w&&w.getAllResponseHeaders()),R={data:!a||a==="text"||a==="json"?w.responseText:w.response,status:w.status,statusText:w.statusText,headers:A,config:t,request:w};we(function(F){r(F),y()},function(F){o(F),y()},R),w=null}"onloadend"in w?w.onloadend=v:w.onreadystatechange=function(){!w||w.readyState!==4||w.status===0&&!(w.responseURL&&w.responseURL.indexOf("file:")===0)||setTimeout(v)},w.onabort=function(){w&&(o(new T("Request aborted",T.ECONNABORTED,t,w)),w=null)},w.onerror=function(x){let R=x&&x.message?x.message:"Network Error",j=new T(R,T.ERR_NETWORK,t,w);j.event=x||null,o(j),w=null},w.ontimeout=function(){let x=i.timeout?"timeout of "+i.timeout+"ms exceeded":"timeout exceeded",R=i.transitional||nt;i.timeoutErrorMessage&&(x=i.timeoutErrorMessage),o(new T(x,R.clarifyTimeoutError?T.ETIMEDOUT:T.ECONNABORTED,t,w)),w=null},n===void 0&&s.setContentType(null),"setRequestHeader"in w&&d.forEach(s.toJSON(),function(x,R){w.setRequestHeader(R,x)}),d.isUndefined(i.withCredentials)||(w.withCredentials=!!i.withCredentials),a&&a!=="json"&&(w.responseType=i.responseType),l&&([g,f]=Ee(l,!0),w.addEventListener("progress",g)),c&&w.upload&&([p,b]=Ee(c),w.upload.addEventListener("progress",p),w.upload.addEventListener("loadend",b)),(i.cancelToken||i.signal)&&(u=A=>{w&&(o(!A||A.type?new ne(null,t,w):A),w.abort(),w=null)},i.cancelToken&&i.cancelToken.subscribe(u),i.signal&&(i.signal.aborted?u():i.signal.addEventListener("abort",u)));let D=Ot(i.url);if(D&&L.protocols.indexOf(D)===-1){o(new T("Unsupported protocol "+D+":",T.ERR_BAD_REQUEST,t));return}w.send(n||null)})};var Yc=(t,e)=>{let{length:r}=t=t?t.filter(Boolean):[];if(e||r){let o=new AbortController,i,n=function(l){if(!i){i=!0,a();let u=l instanceof Error?l:this.reason;o.abort(u instanceof T?u:new ne(u instanceof Error?u.message:u))}},s=e&&setTimeout(()=>{s=null,n(new T(`timeout ${e} of ms exceeded`,T.ETIMEDOUT))},e),a=()=>{t&&(s&&clearTimeout(s),s=null,t.forEach(l=>{l.unsubscribe?l.unsubscribe(n):l.removeEventListener("abort",n)}),t=null)};t.forEach(l=>l.addEventListener("abort",n));let{signal:c}=o;return c.unsubscribe=()=>d.asap(a),c}},ys=Yc;var Xc=function*(t,e){let r=t.byteLength;if(!e||r<e){yield t;return}let o=0,i;for(;o<r;)i=o+e,yield t.slice(o,i),o=i},eu=async function*(t,e){for await(let r of tu(t))yield*Xc(r,e)},tu=async function*(t){if(t[Symbol.asyncIterator]){yield*t;return}let e=t.getReader();try{for(;;){let{done:r,value:o}=await e.read();if(r)break;yield o}}finally{await e.cancel()}},wo=(t,e,r,o)=>{let i=eu(t,e),n=0,s,a=c=>{s||(s=!0,o&&o(c))};return new ReadableStream({async pull(c){try{let{done:l,value:u}=await i.next();if(l){a(),c.close();return}let p=u.byteLength;if(r){let g=n+=p;r(g)}c.enqueue(new Uint8Array(u))}catch(l){throw a(l),l}},cancel(c){return a(c),i.return()}},{highWaterMark:2})};var ws=64*1024,{isFunction:gr}=d,_s=(({fetch:t,Request:e,Response:r})=>({fetch:t,Request:e,Response:r}))(d.global),{ReadableStream:Ts,TextEncoder:As}=d.global,Es=(t,...e)=>{try{return!!t(...e)}catch{return!1}},ru=t=>{let{fetch:e,Request:r,Response:o}=Object.assign({},_s,t),i=gr(e),n=gr(r),s=gr(o);if(!i)return!1;let a=i&&gr(Ts),c=i&&(typeof As=="function"?(f=>y=>f.encode(y))(new As):async f=>new Uint8Array(await new r(f).arrayBuffer())),l=n&&a&&Es(()=>{let f=!1,y=new r(L.origin,{body:new Ts,method:"POST",get duplex(){return f=!0,"half"}}).headers.has("Content-Type");return f&&!y}),u=s&&a&&Es(()=>d.isReadableStream(new o("").body)),p={stream:u&&(f=>f.body)};i&&["text","arrayBuffer","blob","formData","stream"].forEach(f=>{!p[f]&&(p[f]=(y,w)=>{let v=y&&y[f];if(v)return v.call(y);throw new T(`Response type '${f}' is not supported`,T.ERR_NOT_SUPPORT,w)})});let g=async f=>{if(f==null)return 0;if(d.isBlob(f))return f.size;if(d.isSpecCompliantForm(f))return(await new r(L.origin,{method:"POST",body:f}).arrayBuffer()).byteLength;if(d.isArrayBufferView(f)||d.isArrayBuffer(f))return f.byteLength;if(d.isURLSearchParams(f)&&(f=f+""),d.isString(f))return(await c(f)).byteLength},b=async(f,y)=>{let w=d.toFiniteNumber(f.getContentLength());return w??g(y)};return async f=>{let{url:y,method:w,data:v,signal:D,cancelToken:A,timeout:x,onDownloadProgress:R,onUploadProgress:j,responseType:F,headers:ae,withCredentials:pe="same-origin",fetchOptions:Ae}=hr(f);F=F?(F+"").toLowerCase():"text";let _e=ys([D,A&&A.toAbortSignal()],x),se=null,le=_e&&_e.unsubscribe&&(()=>{_e.unsubscribe()}),$;try{if(j&&l&&w!=="get"&&w!=="head"&&($=await b(ae,v))!==0){let K=new r(y,{method:"POST",body:v,duplex:"half"}),U;if(d.isFormData(v)&&(U=K.headers.get("content-type"))&&ae.setContentType(U),K.body){let[te,me]=ct($,Ee(ut(j)));v=wo(K.body,ws,te,me)}}d.isString(pe)||(pe=pe?"include":"omit");let J=n&&"credentials"in r.prototype,Se={...Ae,signal:_e,method:w.toUpperCase(),headers:ae.normalize().toJSON(),body:v,duplex:"half",credentials:J?pe:void 0};se=n&&new r(y,Se);let S=await(n?e(se,Ae):e(y,Se)),_=u&&(F==="stream"||F==="response");if(u&&(R||_&&le)){let K={};["status","statusText","headers"].forEach(Y=>{K[Y]=S[Y]});let U=d.toFiniteNumber(S.headers.get("content-length")),[te,me]=R&&ct(U,Ee(ut(R),!0))||[];S=new o(wo(S.body,ws,te,()=>{me&&me(),le&&le()}),K)}F=F||"text";let z=await p[d.findKey(p,F)||"text"](S,f);return!_&&le&&le(),await new Promise((K,U)=>{we(K,U,{data:z,headers:V.from(S.headers),status:S.status,statusText:S.statusText,config:f,request:se})})}catch(J){throw le&&le(),J&&J.name==="TypeError"&&/Load failed|fetch/i.test(J.message)?Object.assign(new T("Network Error",T.ERR_NETWORK,f,se),{cause:J.cause||J}):T.from(J,J&&J.code,f,se)}}},ou=new Map,To=t=>{let e=d.merge.call({skipUndefined:!0},_s,t?t.env:null),{fetch:r,Request:o,Response:i}=e,n=[o,i,r],s=n.length,a=s,c,l,u=ou;for(;a--;)c=n[a],l=u.get(c),l===void 0&&u.set(c,l=a?new Map:ru(e)),u=l;return l},zb=To();var Ao={http:ms,xhr:bs,fetch:{get:To}};d.forEach(Ao,(t,e)=>{if(t){try{Object.defineProperty(t,"name",{value:e})}catch{}Object.defineProperty(t,"adapterName",{value:e})}});var Ss=t=>`- ${t}`,su=t=>d.isFunction(t)||t===null||t===!1,br={getAdapter:(t,e)=>{t=d.isArray(t)?t:[t];let{length:r}=t,o,i,n={};for(let s=0;s<r;s++){o=t[s];let a;if(i=o,!su(o)&&(i=Ao[(a=String(o)).toLowerCase()],i===void 0))throw new T(`Unknown adapter '${a}'`);if(i&&(d.isFunction(i)||(i=i.get(e))))break;n[a||"#"+s]=i}if(!i){let s=Object.entries(n).map(([c,l])=>`adapter ${c} `+(l===!1?"is not supported by the environment":"is not available in the build")),a=r?s.length>1?`since :
9
- `+s.map(Ss).join(`
10
- `):" "+Ss(s[0]):"as no adapter specified";throw new T("There is no suitable adapter to dispatch the request "+a,"ERR_NOT_SUPPORT")}return i},adapters:Ao};function Eo(t){if(t.cancelToken&&t.cancelToken.throwIfRequested(),t.signal&&t.signal.aborted)throw new ne(null,t)}function yr(t){return Eo(t),t.headers=V.from(t.headers),t.data=Dt.call(t,t.transformRequest),["post","put","patch"].indexOf(t.method)!==-1&&t.headers.setContentType("application/x-www-form-urlencoded",!1),br.getAdapter(t.adapter||at.adapter,t)(t).then(function(o){return Eo(t),o.data=Dt.call(t,t.transformResponse,o),o.headers=V.from(o.headers),o},function(o){return Lt(o)||(Eo(t),o&&o.response&&(o.response.data=Dt.call(t,t.transformResponse,o.response),o.response.headers=V.from(o.response.headers))),Promise.reject(o)})}var wr={};["object","boolean","number","function","string","symbol"].forEach((t,e)=>{wr[t]=function(o){return typeof o===t||"a"+(e<1?"n ":" ")+t}});var vs={};wr.transitional=function(e,r,o){function i(n,s){return"[Axios v"+ze+"] Transitional option '"+n+"'"+s+(o?". "+o:"")}return(n,s,a)=>{if(e===!1)throw new T(i(s," has been removed"+(r?" in "+r:"")),T.ERR_DEPRECATED);return r&&!vs[s]&&(vs[s]=!0,console.warn(i(s," has been deprecated since v"+r+" and will be removed in the near future"))),e?e(n,s,a):!0}};wr.spelling=function(e){return(r,o)=>(console.warn(`${o} is likely a misspelling of ${e}`),!0)};function nu(t,e,r){if(typeof t!="object")throw new T("options must be an object",T.ERR_BAD_OPTION_VALUE);let o=Object.keys(t),i=o.length;for(;i-- >0;){let n=o[i],s=e[n];if(s){let a=t[n],c=a===void 0||s(a,n,t);if(c!==!0)throw new T("option "+n+" must be "+c,T.ERR_BAD_OPTION_VALUE);continue}if(r!==!0)throw new T("Unknown option "+n,T.ERR_BAD_OPTION)}}var Nt={assertOptions:nu,validators:wr};var Te=Nt.validators,pt=class{constructor(e){this.defaults=e||{},this.interceptors={request:new to,response:new to}}async request(e,r){try{return await this._request(e,r)}catch(o){if(o instanceof Error){let i={};Error.captureStackTrace?Error.captureStackTrace(i):i=new Error;let n=i.stack?i.stack.replace(/^.+\n/,""):"";try{o.stack?n&&!String(o.stack).endsWith(n.replace(/^.+\n.+\n/,""))&&(o.stack+=`
11
- `+n):o.stack=n}catch{}}throw o}}_request(e,r){typeof e=="string"?(r=r||{},r.url=e):r=e||{},r=ge(this.defaults,r);let{transitional:o,paramsSerializer:i,headers:n}=r;o!==void 0&&Nt.assertOptions(o,{silentJSONParsing:Te.transitional(Te.boolean),forcedJSONParsing:Te.transitional(Te.boolean),clarifyTimeoutError:Te.transitional(Te.boolean)},!1),i!=null&&(d.isFunction(i)?r.paramsSerializer={serialize:i}:Nt.assertOptions(i,{encode:Te.function,serialize:Te.function},!0)),r.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?r.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:r.allowAbsoluteUrls=!0),Nt.assertOptions(r,{baseUrl:Te.spelling("baseURL"),withXsrfToken:Te.spelling("withXSRFToken")},!0),r.method=(r.method||this.defaults.method||"get").toLowerCase();let s=n&&d.merge(n.common,n[r.method]);n&&d.forEach(["delete","get","head","post","put","patch","common"],f=>{delete n[f]}),r.headers=V.concat(s,n);let a=[],c=!0;this.interceptors.request.forEach(function(y){typeof y.runWhen=="function"&&y.runWhen(r)===!1||(c=c&&y.synchronous,a.unshift(y.fulfilled,y.rejected))});let l=[];this.interceptors.response.forEach(function(y){l.push(y.fulfilled,y.rejected)});let u,p=0,g;if(!c){let f=[yr.bind(this),void 0];for(f.unshift(...a),f.push(...l),g=f.length,u=Promise.resolve(r);p<g;)u=u.then(f[p++],f[p++]);return u}g=a.length;let b=r;for(p=0;p<g;){let f=a[p++],y=a[p++];try{b=f(b)}catch(w){y.call(this,w);break}}try{u=yr.call(this,b)}catch(f){return Promise.reject(f)}for(p=0,g=l.length;p<g;)u=u.then(l[p++],l[p++]);return u}getUri(e){e=ge(this.defaults,e);let r=Be(e.baseURL,e.url,e.allowAbsoluteUrls);return Ve(r,e.params,e.paramsSerializer)}};d.forEach(["delete","get","head","options"],function(e){pt.prototype[e]=function(r,o){return this.request(ge(o||{},{method:e,url:r,data:(o||{}).data}))}});d.forEach(["post","put","patch"],function(e){function r(o){return function(n,s,a){return this.request(ge(a||{},{method:e,headers:o?{"Content-Type":"multipart/form-data"}:{},url:n,data:s}))}}pt.prototype[e]=r(),pt.prototype[e+"Form"]=r(!0)});var Ft=pt;var _o=class t{constructor(e){if(typeof e!="function")throw new TypeError("executor must be a function.");let r;this.promise=new Promise(function(n){r=n});let o=this;this.promise.then(i=>{if(!o._listeners)return;let n=o._listeners.length;for(;n-- >0;)o._listeners[n](i);o._listeners=null}),this.promise.then=i=>{let n,s=new Promise(a=>{o.subscribe(a),n=a}).then(i);return s.cancel=function(){o.unsubscribe(n)},s},e(function(n,s,a){o.reason||(o.reason=new ne(n,s,a),r(o.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){if(this.reason){e(this.reason);return}this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;let r=this._listeners.indexOf(e);r!==-1&&this._listeners.splice(r,1)}toAbortSignal(){let e=new AbortController,r=o=>{e.abort(o)};return this.subscribe(r),e.signal.unsubscribe=()=>this.unsubscribe(r),e.signal}static source(){let e;return{token:new t(function(i){e=i}),cancel:e}}},Cs=_o;function So(t){return function(r){return t.apply(null,r)}}function vo(t){return d.isObject(t)&&t.isAxiosError===!0}var Co={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(Co).forEach(([t,e])=>{Co[e]=t});var Rs=Co;function xs(t){let e=new Ft(t),r=Rt(Ft.prototype.request,e);return d.extend(r,Ft.prototype,e,{allOwnKeys:!0}),d.extend(r,e,null,{allOwnKeys:!0}),r.create=function(i){return xs(ge(t,i))},r}var G=xs(at);G.Axios=Ft;G.CanceledError=ne;G.CancelToken=Cs;G.isCancel=Lt;G.VERSION=ze;G.toFormData=Ce;G.AxiosError=T;G.Cancel=G.CanceledError;G.all=function(e){return Promise.all(e)};G.spread=So;G.isAxiosError=vo;G.mergeConfig=ge;G.AxiosHeaders=V;G.formToJSON=t=>pr(d.isHTMLForm(t)?new FormData(t):t);G.getAdapter=br.getAdapter;G.HttpStatusCode=Rs;G.default=G;var Is=G;var{Axios:qy,AxiosError:jy,CanceledError:Vy,isCancel:By,CancelToken:zy,VERSION:Wy,all:Hy,Cancel:Gy,isAxiosError:xe,spread:$y,toFormData:Qy,AxiosHeaders:Ky,HttpStatusCode:Jy,formToJSON:Zy,getAdapter:Yy,mergeConfig:Xy}=Is;import{makeApi as gu,makeEndpoint as mt}from"@zodios/core";import{z as M}from"zod";import{z as h}from"zod";var au=h.object({name:h.string(),description:h.string(),id:h.string(),schema_version:h.string(),metric_version:h.coerce.number(),definition_version:h.coerce.number(),last_updated_user:h.object({id:h.string()}).optional()}),lu=h.object({id:h.string()}),ks=h.object({field:h.string(),operator:h.string(),categorical_values:h.array(h.object({string_value:h.string().optional(),bool_value:h.boolean().optional(),null_value:h.string().optional()}))}),Tr=h.object({measure:h.object({field:h.string(),aggregation:h.string()}),time_dimension:h.object({field:h.string()}),filters:h.array(ks)}),cu=h.object({datasource:lu,basic_specification:Tr.optional(),viz_state_specification:h.object({viz_state_string:h.string()}).optional(),is_running_total:h.boolean()}),Ps=h.object({allowed_dimensions:h.array(h.string()),allowed_granularities:h.array(h.string()),offset_from_today:h.number()}),Ds=h.object({filters:h.array(ks),measurement_period:h.object({granularity:h.string(),range:h.string()}),comparison:h.object({comparison:h.string()})}),Ls=h.object({target:h.object({value:h.number()}).optional()}),Ar=h.object({id:h.string(),specification:Ds,definition_id:h.string(),is_default:h.boolean(),schema_version:h.string(),metric_version:h.coerce.number(),goals:Ls.optional(),is_followed:h.boolean(),datasource_luid:h.string()}),Os=h.object({type:h.string(),number_units:h.object({singular_noun:h.string(),plural_noun:h.string()}),sentiment_type:h.string(),row_level_id_field:h.object({identifier_col:h.string()}),row_level_entity_names:h.object({entity_name_singular:h.string().optional(),entity_name_plural:h.string().optional()}),row_level_name_field:h.object({name_col:h.string()}),currency_code:h.string()}),Ms=h.object({settings:h.array(h.object({type:h.string(),disabled:h.boolean()}))}),uu=h.object({comparisons:h.array(h.object({compare_config:h.object({comparison:h.string()}),index:h.coerce.number()}))}),du=h.array(h.object({basic_specification:Tr.optional(),threshold_basic_specification:Tr.optional(),threshold_viz_state_specification:h.object({viz_state_string:h.string()}).optional(),viz_state_specification:h.object({viz_state_string:h.string()}).optional(),minimum_granularity:h.string(),benchmark_sentiment_type:h.string(),name:h.string()})),Ro=h.object({metadata:au,specification:cu,extension_options:Ps,metrics:h.array(Ar),total_metrics:h.coerce.number(),representation_options:Os,insights_options:Ms,comparisons:uu,datasource_goals:du}),Ns=h.object({id:h.string(),metric_id:h.string()}),pu=h.enum(["LANGUAGE_UNSPECIFIED","LANGUAGE_DE_DE","LANGUAGE_EN_US","LANGUAGE_EN_GB","LANGUAGE_ES_ES","LANGUAGE_FR_FR","LANGUAGE_FR_CA","LANGUAGE_GA_IE","LANGUAGE_IT_IT","LANGUAGE_JA_JP","LANGUAGE_KO_KR","LANGUAGE_NL_NL","LANGUAGE_PT_BR","LANGUAGE_SV_SE","LANGUAGE_TH_TH","LANGUAGE_ZH_CN","LANGUAGE_ZH_TW"]),mu=h.enum(["LOCALE_UNSPECIFIED","LOCALE_AR_AE","LOCALE_AR_BH","LOCALE_AR_DZ","LOCALE_AR_EG","LOCALE_AR_IQ","LOCALE_AR_JO","LOCALE_AR_KW","LOCALE_AR_LB","LOCALE_AR_LY","LOCALE_AR_MA","LOCALE_AR_OM","LOCALE_AR_QA","LOCALE_AR_SA","LOCALE_AR_SD","LOCALE_AR_SY","LOCALE_AR_TN","LOCALE_AR_YE","LOCALE_BE_BY","LOCALE_BG_BG","LOCALE_CA_ES","LOCALE_CS_CZ","LOCALE_DA_DK","LOCALE_DE_AT","LOCALE_DE_CH","LOCALE_DE_DE","LOCALE_DE_LU","LOCALE_EL_CY","LOCALE_EL_GR","LOCALE_EN_AU","LOCALE_EN_CA","LOCALE_EN_GB","LOCALE_EN_IE","LOCALE_EN_IN","LOCALE_EN_MT","LOCALE_EN_NZ","LOCALE_EN_PH","LOCALE_EN_SG","LOCALE_EN_US","LOCALE_EN_ZA","LOCALE_ES_AR","LOCALE_ES_BO","LOCALE_ES_CL","LOCALE_ES_CO","LOCALE_ES_CR","LOCALE_ES_DO","LOCALE_ES_EC","LOCALE_ES_ES","LOCALE_ES_GT","LOCALE_ES_HN","LOCALE_ES_MX","LOCALE_ES_NI","LOCALE_ES_PA","LOCALE_ES_PE","LOCALE_ES_PR","LOCALE_ES_PY","LOCALE_ES_SV","LOCALE_ES_US","LOCALE_ES_UY","LOCALE_ES_VE","LOCALE_ET_EE","LOCALE_FI_FI","LOCALE_FR_BE","LOCALE_FR_CA","LOCALE_FR_CH","LOCALE_FR_FR","LOCALE_FR_LU","LOCALE_GA_IE","LOCALE_HE_IL","LOCALE_HI_IN","LOCALE_HR_HR","LOCALE_HU_HU","LOCALE_ID_ID","LOCALE_IN_ID","LOCALE_IS_IS","LOCALE_IT_CH","LOCALE_IT_IT","LOCALE_IW_IL","LOCALE_JA_JP","LOCALE_KO_KR","LOCALE_LT_LT","LOCALE_LV_LV","LOCALE_MK_MK","LOCALE_MS_MY","LOCALE_MT_MT","LOCALE_NL_BE","LOCALE_NL_NL","LOCALE_NB_NO","LOCALE_NO_NO","LOCALE_PL_PL","LOCALE_PT_BR","LOCALE_PT_PT","LOCALE_RO_RO","LOCALE_RU_RU","LOCALE_SK_SK","LOCALE_SL_SI","LOCALE_SQ_AL","LOCALE_SR_BA","LOCALE_SR_ME","LOCALE_SR_RS","LOCALE_SV_SE","LOCALE_TH_TH","LOCALE_TR_TR","LOCALE_UK_UA","LOCALE_VI_VN","LOCALE_ZH_CN","LOCALE_ZH_HK","LOCALE_ZH_SG","LOCALE_ZH_TW"]),fu=h.enum(["OUTPUT_FORMAT_UNSPECIFIED","OUTPUT_FORMAT_HTML","OUTPUT_FORMAT_TEXT"]),Er=h.object({bundle_request:h.object({version:h.number(),options:h.object({output_format:fu,time_zone:h.string(),language:pu,locale:mu}),input:h.object({metadata:h.object({name:h.string().nonempty(),metric_id:h.string().nonempty(),definition_id:h.string().nonempty()}),metric:h.object({definition:h.object({datasource:h.object({id:h.string()}),basic_specification:Tr,is_running_total:h.boolean()}),metric_specification:Ds,extension_options:Ps,representation_options:Os,insights_options:Ms,goals:Ls.optional()})})})}),hu=h.object({type:h.string(),insights:h.array(h.object({result:h.object({type:h.string(),version:h.number(),content:h.string().optional(),markup:h.string().optional(),viz:h.any().optional(),facts:h.any().optional(),characterization:h.string().optional(),question:h.string(),score:h.number()}),insight_type:h.string()})),summaries:h.array(h.object({result:h.object({id:h.string(),markup:h.string().optional(),viz:h.any().optional(),generation_id:h.string(),timestamp:h.string().optional(),last_attempted_timestamp:h.string().optional()})}))}),Fs=h.object({bundle_response:h.object({result:h.object({insight_groups:h.array(hu),has_errors:h.boolean(),characterization:h.string()})})}),_r=["ban","springboard","basic","detail"],He=["DEFINITION_VIEW_BASIC","DEFINITION_VIEW_FULL","DEFINITION_VIEW_DEFAULT"];var bu=mt({method:"get",path:"/pulse/definitions",alias:"listAllPulseMetricDefinitions",description:"Returns a list of all published Pulse Metric Definitions on the specified site.",parameters:[{name:"view",type:"Query",schema:M.optional(M.enum(He)),description:`The range of metrics to return for a definition. The default is 'DEFINITION_VIEW_BASIC' if not specified.
4
+ `,process.stderr.write(t))},Ri=({requestId:t,toolName:e,args:r,username:o})=>({type:"tool",requestId:t,...o?{username:o}:{},tool:{name:e,...r!==void 0?{args:r}:{}}});function xe(t){return async(e,r,{logger:o,requestId:i}={logger:e.name})=>{if(_i?.log({message:r,level:t,logger:o}),!!Ue(t))return e.server.notification({method:"notifications/message",params:{level:t,logger:o,data:JSON.stringify({timestamp:new Date().toISOString(),currentLogLevel:_t,message:r},null,2)}},{relatedRequestId:i})}}import{appendFile as ul}from"node:fs/promises";import{existsSync as dl,mkdirSync as pl}from"fs";import{join as ml}from"path";function V(t){if(t instanceof Error)return t.message;try{return JSON.stringify(t)??"undefined"}catch{return`${t}`}}var rr=class{_logDirectory;_fileMutexes=new Map;constructor({logDirectory:e}){this._logDirectory=e,dl(this._logDirectory)||pl(this._logDirectory,{recursive:!0})}async log(e){let r=new Date().toISOString(),o=`${new Date(new Date().setMinutes(0,0,0)).toISOString().replace(/[:.]/g,"-")}.log`,i=ml(this._logDirectory,o),n=i,a=(this._fileMutexes.get(n)??Promise.resolve()).then(async()=>{try{await ul(i,JSON.stringify({timestamp:r,...e})+`
5
+ `)}catch(l){Fe(`Failed to write to log file ${i}: ${V(l)}`)}});this._fileMutexes.set(n,a),a.finally(()=>{this._fileMutexes.get(n)===a&&this._fileMutexes.delete(n)}),await a}};import{McpServer as ym}from"@modelcontextprotocol/sdk/server/mcp.js";import{SetLevelRequestSchema as bm}from"@modelcontextprotocol/sdk/types.js";var xi={name:"@tableau/mcp-server",description:"An MCP server for Tableau, providing a suite of tools that will make it easier for developers to build AI applications that integrate with Tableau.",version:"1.13.1",repository:{type:"git",url:"git+https://github.com/tableau/tableau-mcp.git"},homepage:"https://github.com/tableau/tableau-mcp",bugs:"https://github.com/tableau/tableau-mcp/issues",author:"Tableau",type:"module",license:"Apache-2.0",keywords:["tableau","mcp"],bin:{"tableau-mcp-server":"./build/index.js"},scripts:{":build":"npx rimraf ./build && esbuild src/index.ts --bundle --packages=external --platform=node --format=esm --minify --outdir=build --sourcemap",":build:dev":"npx rimraf ./build && esbuild src/index.ts --bundle --packages=external --platform=node --format=esm --outdir=build --sourcemap",build:"run-s :build exec-perms","build:dev":"run-s :build:dev exec-perms","build:watch":"npm run :build:dev -- --watch","build:docker":"docker build -t tableau-mcp .",":build:mcpb":"npx -y @anthropic-ai/mcpb pack . tableau-mcp.mcpb","build:mcpb":"run-s build:manifest:script build:manifest :build:mcpb","build:manifest":"node build/scripts/createClaudeMcpBundleManifest.mjs","build:manifest:script":"esbuild src/scripts/createClaudeMcpBundleManifest.ts --bundle --platform=node --format=esm --outdir=build/scripts --sourcemap=inline --out-extension:.js=.mjs","start:http":"node build/index.js","start:http:docker":"docker run -p 3927:3927 -i --rm --env-file env.list tableau-mcp",lint:"npm exec eslint",inspect:"npx @modelcontextprotocol/inspector --config config.json --server tableau",":inspect:http":"npx @modelcontextprotocol/inspector --config config.http.json --server tableau","inspect:http":"run-p start:http :inspect:http","inspect:docker":"npx @modelcontextprotocol/inspector --config config.docker.json --server tableau","inspect:docker:http":"run-p start:http:docker :inspect:http","build:inspect":"run-s build inspect","build:inspect:docker":"run-s build:docker inspect:docker","build:inspect:docker:http":"run-s build:docker inspect:docker:http","exec-perms":"shx chmod +x build/*.js",test:"vitest --config ./vitest.config.ts","test:e2e":"vitest --config ./vitest.config.e2e.ts","test:eval":"vitest --config ./vitest.config.eval.ts","test:oauth":"vitest --config ./vitest.config.oauth.ts",coverage:"vitest run --config ./vitest.config.ts --coverage","version:major":"npm version major --no-git-tag-version","version:minor":"npm version minor --no-git-tag-version","version:patch":"npm version patch --no-git-tag-version"},dependencies:{"@modelcontextprotocol/sdk":"^1.12.1","@zodios/core":"^10.9.6","axios-retry":"^4.5.0",cors:"^2.8.5",dotenv:"^16.5.0",express:"^5.1.0","fast-levenshtein":"^3.0.0",jose:"^6.0.12",ssrfcheck:"^1.2.0","ts-results-es":"^5.0.1",zod:"^3.24.3","zod-validation-error":"^4.0.1"},devDependencies:{"@anthropic-ai/mcpb":"^1.0.0","@eslint/eslintrc":"^3.3.1","@eslint/js":"^9.25.1","@modelcontextprotocol/inspector":"^0.16.6","@openai/agents":"^0.1.9","@types/cors":"^2.8.19","@types/eslint__js":"^8.42.3","@types/express":"^5.0.3","@types/fast-levenshtein":"^0.0.1","@types/node":"^22.15.3","@types/supertest":"^6.0.3","@typescript-eslint/eslint-plugin":"^8.31.1","@typescript-eslint/parser":"^8.31.1","@vitest/coverage-v8":"^3.1.3",esbuild:"^0.25.5",eslint:"^9.25.1","eslint-config-prettier":"^10.1.2","eslint-plugin-prettier":"^5.2.6","eslint-plugin-simple-import-sort":"^12.1.1","npm-run-all":"^4.1.5",openai:"^5.23.2",prettier:"^3.5.3",rimraf:"^6.0.1",shx:"^0.4.0",supertest:"^7.1.4",typescript:"^5.8.3","typescript-eslint":"^8.31.1",vitest:"^3.1.3"},engines:{node:">=22.7.5"}};import{Ok as ap}from"ts-results-es";import{z as In}from"zod";import{Err as Ii,Ok as hl}from"ts-results-es";var Pi=t=>{let e=ki(t);if(e.isErr())return t;let r=e.value;return Ue("debug")?(r.data?.credentials&&(r.data.credentials="<redacted>"),Array.isArray(r?.data?.datasource?.connections)&&r.data.datasource.connections.forEach(i=>{i.connectionUsername="<redacted>",i.connectionPassword="<redacted>"}),r.headers?.["X-Tableau-Auth"]&&(r.headers["X-Tableau-Auth"]="<redacted>"),r.params?.user_id&&(r.params.user_id="<redacted>")):(delete r.data,delete r.headers,delete r.params),r},Di=t=>{let e=ki(t);if(e.isErr())return t;let r=e.value;return Ue("debug")?r.data?.credentials&&(r.data.credentials="<redacted>"):(delete r.data,delete r.headers),r};function ki(t){try{return hl(structuredClone(t))}catch(e){if(e instanceof Error)return Ii(e);let r=V(e);return Fe(`Could not clone object, notification may not be sanitized! Error: ${r}`),Ii(new Error(r))}}function or(t){return{method:t.method??"UNKNOWN METHOD",url:t.url??"UNKNOWN URL",headers:t.headers,data:t.data,params:t.params}}function ir(t){return{url:t.config.url??"UNKNOWN URL",status:t.status,headers:t.headers,data:t.data}}import{Zodios as Ni}from"@zodios/core";import{randomUUID as gl}from"node:crypto";import{SignJWT as yl}from"jose";async function Li({username:t,connectedApp:e,scopes:r,additionalPayload:o}){let i={alg:"HS256",typ:"JWT",kid:e.secretId},n={jti:gl(),iss:e.clientId,aud:"tableau",sub:t,scp:[...r],iat:Math.floor(Date.now()/1e3)-5,exp:Math.floor(Date.now()/1e3)+5*60,...o};return await new yl(n).setProtectedHeader(i).sign(new TextEncoder().encode(e.secretValue))}import{makeApi as bl,makeEndpoint as Oi}from"@zodios/core";import{z as Te}from"zod";import{z as qe}from"zod";var Mi=qe.object({credentials:qe.object({site:qe.object({id:qe.string()}),user:qe.object({id:qe.string()}),token:qe.string()})});var Tl=Te.object({credentials:Te.object({site:Te.object({contentUrl:Te.string()})}).and(Te.object({personalAccessTokenName:Te.string(),personalAccessTokenSecret:Te.string()}).or(Te.object({jwt:Te.string()})))}),wl=Oi({method:"post",path:"/auth/signin",alias:"signIn",description:"Signs in with Tableau credentials.",response:Mi,parameters:[{name:"credentials",type:"Body",schema:Tl}]}),Al=Oi({method:"post",path:"/auth/signout",alias:"signOut",description:"Signs you out of the current session. This call invalidates the authentication token that is created by a call to Sign In.",response:Te.void()}),Sl=bl([wl,Al]),io=[...Sl];var Ee=class{_apiClient;constructor(e){this._apiClient=e}get interceptors(){return this._apiClient.axios.interceptors}};var H=class extends Ee{_creds;get authHeader(){if(!this._creds)throw new Error("Authenticate by calling signIn() first");return{headers:{"X-Tableau-Auth":this._creds.token}}}get userId(){if(!this._creds)throw new Error("Authenticate by calling signIn() first");return this._creds.user.id}constructor(e,r){super(e),this._creds=r}};var sr=class extends Ee{constructor(e){super(new Ni(e,io))}signIn=async e=>(await this._apiClient.signIn({credentials:{site:{contentUrl:e.siteName},...await(async()=>{switch(e.type){case"pat":return{personalAccessTokenName:e.patName,personalAccessTokenSecret:e.patValue};case"direct-trust":return{jwt:await Li({username:e.username,connectedApp:{clientId:e.clientId,secretId:e.secretId,secretValue:e.secretValue},scopes:e.scopes,additionalPayload:e.additionalPayload})}}})()}})).credentials},nr=class extends H{constructor(e,r){super(new Ni(e,io),r)}signOut=async()=>{await this._apiClient.signOut(void 0,{...this.authHeader})}};import{Zodios as Il}from"@zodios/core";import{makeApi as vl,makeEndpoint as Cl}from"@zodios/core";import{z as tt}from"zod";import{z as k}from"zod";var El=k.enum(["hitsTotal","hitsSmallSpanTotal","hitsMediumSpanTotal","hitsLargeSpanTotal","downstreamWorkbookCount"]),Ui=k.array(k.object({method:El,sortDirection:k.enum(["asc","desc"]).default("asc").optional()})).nonempty(),Fi=k.enum(["lens","datasource","virtualconnection","collection","project","flow","datarole","table","database","view","workbook"]),qi=k.union([k.array(k.string().datetime()).nonempty(),k.object({startDate:k.string().datetime(),endDate:k.string().datetime().optional()}).strict(),k.object({startDate:k.string().datetime().optional(),endDate:k.string().datetime()}).strict()]),so=k.object({contentTypes:k.array(Fi).nonempty(),ownerIds:k.array(k.number().int()).nonempty(),modifiedTime:qi}).partial(),ji=k.union([so.extend({contentTypes:k.array(Fi).nonempty()}).strict(),so.extend({ownerIds:k.array(k.number().int()).nonempty()}).strict(),so.extend({modifiedTime:qi}).strict()]),_l=k.object({uri:k.string(),content:k.record(k.string(),k.unknown())}),Vi=k.object({next:k.string(),prev:k.string(),pageIndex:k.number().int(),startIndex:k.number().int(),total:k.number().int(),limit:k.number().int(),items:k.array(_l)}).partial();var Rl=Cl({method:"get",path:"/search",alias:"searchContent",description:"Searches across all supported content types for objects relevant to the search expression specified in the querystring of the request URI.",parameters:[{name:"terms",type:"Query",schema:tt.string().optional()},{name:"page",type:"Query",schema:tt.number().int().optional()},{name:"limit",type:"Query",schema:tt.number().int().optional()},{name:"order_by",type:"Query",schema:tt.string().optional()},{name:"filter",type:"Query",schema:tt.string().optional()}],response:tt.object({hits:Vi})}),xl=vl([Rl]),Bi=[...xl];var vt=class extends H{constructor(e,r){super(new Il(e,Bi),r)}searchContent=async e=>(Object.entries(e).forEach(([o,i])=>{i===void 0&&delete e[o]}),(await this._apiClient.searchContent({queries:e,...this.authHeader})).hits)};import{Zodios as Ml}from"@zodios/core";import{makeApi as Pl,makeEndpoint as Wi}from"@zodios/core";import{z as Ve}from"zod";import{z as lr}from"zod";import{z as no}from"zod";var ar=no.object({name:no.string(),id:no.string()});var ao=lr.object({id:lr.string(),name:lr.string(),description:lr.string().optional(),project:ar});import{z as je}from"zod";var rt=je.object({pageNumber:je.coerce.number(),pageSize:je.coerce.number(),totalAvailable:je.coerce.number()}),fh=je.object({next_page_token:je.string().optional(),total_available:je.coerce.number().optional()});import{z as zi}from"zod";var ot=[{name:"pageSize",type:"Query",schema:zi.number().optional(),description:"The number of items to return in one response. The minimum is 1. The maximum is 1000. The default is 100."},{name:"pageNumber",type:"Query",schema:zi.number().optional(),description:"The offset for paging. The default is 1."}];var Dl=Wi({method:"get",path:"/sites/:siteId/datasources",alias:"listDatasources",description:"Returns a list of published data sources on the specified site. Supports a filter string as a query parameter in the format field:operator:value.",parameters:[...ot,{name:"siteId",type:"Path",schema:Ve.string()},{name:"filter",type:"Query",schema:Ve.string().optional(),description:"Filter string in the format field:operator:value (e.g., name:eq:Project Views)"}],response:Ve.object({pagination:rt,datasources:Ve.object({datasource:Ve.optional(Ve.array(ao))})})}),kl=Wi({method:"get",path:"/sites/:siteId/datasources/:datasourceId",alias:"queryDatasource",description:"Returns information about the specified data source.",response:Ve.object({datasource:ao})}),Ll=Pl([Dl,kl]),Hi=[...Ll];var Ct=class extends H{constructor(e,r){super(new Ml(e,Hi),r)}listDatasources=async({siteId:e,filter:r,pageSize:o,pageNumber:i})=>{let n=await this._apiClient.listDatasources({params:{siteId:e},queries:{filter:r,pageSize:o,pageNumber:i},...this.authHeader});return{pagination:n.pagination,datasources:n.datasources.datasource??[]}};queryDatasource=async({siteId:e,datasourceId:r})=>(await this._apiClient.queryDatasource({params:{siteId:e,datasourceId:r},...this.authHeader})).datasource};import{Zodios as jl}from"@zodios/core";import{makeApi as Ol,makeEndpoint as Nl}from"@zodios/core";import{z as L}from"zod";var Ul=L.object({data:L.object({publishedDatasources:L.array(L.object({name:L.string().nullable(),description:L.string().nullable(),owner:L.object({name:L.string().nullable()}),fields:L.array(L.object({name:L.string(),isHidden:L.boolean().nullable(),description:L.string().nullable(),descriptionInherited:L.array(L.object({attribute:L.string(),value:L.string().nullable()}).nullable()).nullable(),fullyQualifiedName:L.string(),__typename:L.string(),dataCategory:L.string().nullish(),role:L.string().nullish(),dataType:L.string().nullish(),defaultFormat:L.string().nullish(),semanticRole:L.string().nullish(),aggregation:L.string().nullish(),aggregationParam:L.string().nullish(),formula:L.string().nullish(),isAutoGenerated:L.boolean().nullish(),hasUserReference:L.boolean().nullish(),binSize:L.number().nullish(),hasOther:L.boolean().nullish(),delimiter:L.string().nullish(),combinationType:L.string().nullish()}))}))})}),Fl=Nl({method:"post",path:"/graphql",alias:"graphql",response:Ul,parameters:[{name:"query",type:"Body",schema:L.object({query:L.string()})}]}),ql=Ol([Fl]),$i=[...ql];var Rt=class extends H{constructor(e,r){super(new jl(e,$i),r)}graphql=async e=>await this._apiClient.graphql({query:e},{...this.authHeader})};import{Zodios as $u}from"@zodios/core";import{Err as Xs,Ok as Gu}from"ts-results-es";function xt(t,e){return function(){return t.apply(e,arguments)}}var{toString:Vl}=Object.prototype,{getPrototypeOf:co}=Object,{iterator:ur,toStringTag:Qi}=Symbol,dr=(t=>e=>{let r=Vl.call(e);return t[r]||(t[r]=r.slice(8,-1).toLowerCase())})(Object.create(null)),he=t=>(t=t.toLowerCase(),e=>dr(e)===t),pr=t=>e=>typeof e===t,{isArray:st}=Array,it=pr("undefined");function It(t){return t!==null&&!it(t)&&t.constructor!==null&&!it(t.constructor)&&ie(t.constructor.isBuffer)&&t.constructor.isBuffer(t)}var Ki=he("ArrayBuffer");function Bl(t){let e;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?e=ArrayBuffer.isView(t):e=t&&t.buffer&&Ki(t.buffer),e}var zl=pr("string"),ie=pr("function"),Ji=pr("number"),Pt=t=>t!==null&&typeof t=="object",Wl=t=>t===!0||t===!1,cr=t=>{if(dr(t)!=="object")return!1;let e=co(t);return(e===null||e===Object.prototype||Object.getPrototypeOf(e)===null)&&!(Qi in t)&&!(ur in t)},Hl=t=>{if(!Pt(t)||It(t))return!1;try{return Object.keys(t).length===0&&Object.getPrototypeOf(t)===Object.prototype}catch{return!1}},$l=he("Date"),Gl=he("File"),Ql=he("Blob"),Kl=he("FileList"),Jl=t=>Pt(t)&&ie(t.pipe),Yl=t=>{let e;return t&&(typeof FormData=="function"&&t instanceof FormData||ie(t.append)&&((e=dr(t))==="formdata"||e==="object"&&ie(t.toString)&&t.toString()==="[object FormData]"))},Zl=he("URLSearchParams"),[Xl,ec,tc,rc]=["ReadableStream","Request","Response","Headers"].map(he),oc=t=>t.trim?t.trim():t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function Dt(t,e,{allOwnKeys:r=!1}={}){if(t===null||typeof t>"u")return;let o,i;if(typeof t!="object"&&(t=[t]),st(t))for(o=0,i=t.length;o<i;o++)e.call(null,t[o],o,t);else{if(It(t))return;let n=r?Object.getOwnPropertyNames(t):Object.keys(t),s=n.length,a;for(o=0;o<s;o++)a=n[o],e.call(null,t[a],a,t)}}function Yi(t,e){if(It(t))return null;e=e.toLowerCase();let r=Object.keys(t),o=r.length,i;for(;o-- >0;)if(i=r[o],e===i.toLowerCase())return i;return null}var Be=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,Zi=t=>!it(t)&&t!==Be;function lo(){let{caseless:t,skipUndefined:e}=Zi(this)&&this||{},r={},o=(i,n)=>{let s=t&&Yi(r,n)||n;cr(r[s])&&cr(i)?r[s]=lo(r[s],i):cr(i)?r[s]=lo({},i):st(i)?r[s]=i.slice():(!e||!it(i))&&(r[s]=i)};for(let i=0,n=arguments.length;i<n;i++)arguments[i]&&Dt(arguments[i],o);return r}var ic=(t,e,r,{allOwnKeys:o}={})=>(Dt(e,(i,n)=>{r&&ie(i)?t[n]=xt(i,r):t[n]=i},{allOwnKeys:o}),t),sc=t=>(t.charCodeAt(0)===65279&&(t=t.slice(1)),t),nc=(t,e,r,o)=>{t.prototype=Object.create(e.prototype,o),t.prototype.constructor=t,Object.defineProperty(t,"super",{value:e.prototype}),r&&Object.assign(t.prototype,r)},ac=(t,e,r,o)=>{let i,n,s,a={};if(e=e||{},t==null)return e;do{for(i=Object.getOwnPropertyNames(t),n=i.length;n-- >0;)s=i[n],(!o||o(s,t,e))&&!a[s]&&(e[s]=t[s],a[s]=!0);t=r!==!1&&co(t)}while(t&&(!r||r(t,e))&&t!==Object.prototype);return e},lc=(t,e,r)=>{t=String(t),(r===void 0||r>t.length)&&(r=t.length),r-=e.length;let o=t.indexOf(e,r);return o!==-1&&o===r},cc=t=>{if(!t)return null;if(st(t))return t;let e=t.length;if(!Ji(e))return null;let r=new Array(e);for(;e-- >0;)r[e]=t[e];return r},uc=(t=>e=>t&&e instanceof t)(typeof Uint8Array<"u"&&co(Uint8Array)),dc=(t,e)=>{let o=(t&&t[ur]).call(t),i;for(;(i=o.next())&&!i.done;){let n=i.value;e.call(t,n[0],n[1])}},pc=(t,e)=>{let r,o=[];for(;(r=t.exec(e))!==null;)o.push(r);return o},mc=he("HTMLFormElement"),fc=t=>t.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(r,o,i){return o.toUpperCase()+i}),Gi=(({hasOwnProperty:t})=>(e,r)=>t.call(e,r))(Object.prototype),hc=he("RegExp"),Xi=(t,e)=>{let r=Object.getOwnPropertyDescriptors(t),o={};Dt(r,(i,n)=>{let s;(s=e(i,n,t))!==!1&&(o[n]=s||i)}),Object.defineProperties(t,o)},gc=t=>{Xi(t,(e,r)=>{if(ie(t)&&["arguments","caller","callee"].indexOf(r)!==-1)return!1;let o=t[r];if(ie(o)){if(e.enumerable=!1,"writable"in e){e.writable=!1;return}e.set||(e.set=()=>{throw Error("Can not rewrite read-only method '"+r+"'")})}})},yc=(t,e)=>{let r={},o=i=>{i.forEach(n=>{r[n]=!0})};return st(t)?o(t):o(String(t).split(e)),r},bc=()=>{},Tc=(t,e)=>t!=null&&Number.isFinite(t=+t)?t:e;function wc(t){return!!(t&&ie(t.append)&&t[Qi]==="FormData"&&t[ur])}var Ac=t=>{let e=new Array(10),r=(o,i)=>{if(Pt(o)){if(e.indexOf(o)>=0)return;if(It(o))return o;if(!("toJSON"in o)){e[i]=o;let n=st(o)?[]:{};return Dt(o,(s,a)=>{let l=r(s,i+1);!it(l)&&(n[a]=l)}),e[i]=void 0,n}}return o};return r(t,0)},Sc=he("AsyncFunction"),Ec=t=>t&&(Pt(t)||ie(t))&&ie(t.then)&&ie(t.catch),es=((t,e)=>t?setImmediate:e?((r,o)=>(Be.addEventListener("message",({source:i,data:n})=>{i===Be&&n===r&&o.length&&o.shift()()},!1),i=>{o.push(i),Be.postMessage(r,"*")}))(`axios@${Math.random()}`,[]):r=>setTimeout(r))(typeof setImmediate=="function",ie(Be.postMessage)),_c=typeof queueMicrotask<"u"?queueMicrotask.bind(Be):typeof process<"u"&&process.nextTick||es,vc=t=>t!=null&&ie(t[ur]),d={isArray:st,isArrayBuffer:Ki,isBuffer:It,isFormData:Yl,isArrayBufferView:Bl,isString:zl,isNumber:Ji,isBoolean:Wl,isObject:Pt,isPlainObject:cr,isEmptyObject:Hl,isReadableStream:Xl,isRequest:ec,isResponse:tc,isHeaders:rc,isUndefined:it,isDate:$l,isFile:Gl,isBlob:Ql,isRegExp:hc,isFunction:ie,isStream:Jl,isURLSearchParams:Zl,isTypedArray:uc,isFileList:Kl,forEach:Dt,merge:lo,extend:ic,trim:oc,stripBOM:sc,inherits:nc,toFlatObject:ac,kindOf:dr,kindOfTest:he,endsWith:lc,toArray:cc,forEachEntry:dc,matchAll:pc,isHTMLForm:mc,hasOwnProperty:Gi,hasOwnProp:Gi,reduceDescriptors:Xi,freezeMethods:gc,toObjectSet:yc,toCamelCase:fc,noop:bc,toFiniteNumber:Tc,findKey:Yi,global:Be,isContextDefined:Zi,isSpecCompliantForm:wc,toJSONObject:Ac,isAsyncFn:Sc,isThenable:Ec,setImmediate:es,asap:_c,isIterable:vc};function nt(t,e,r,o,i){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack,this.message=t,this.name="AxiosError",e&&(this.code=e),r&&(this.config=r),o&&(this.request=o),i&&(this.response=i,this.status=i.status?i.status:null)}d.inherits(nt,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:d.toJSONObject(this.config),code:this.code,status:this.status}}});var ts=nt.prototype,rs={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach(t=>{rs[t]={value:t}});Object.defineProperties(nt,rs);Object.defineProperty(ts,"isAxiosError",{value:!0});nt.from=(t,e,r,o,i,n)=>{let s=Object.create(ts);d.toFlatObject(t,s,function(u){return u!==Error.prototype},c=>c!=="isAxiosError");let a=t&&t.message?t.message:"Error",l=e==null&&t?t.code:e;return nt.call(s,a,l,r,o,i),t&&s.cause==null&&Object.defineProperty(s,"cause",{value:t,configurable:!0}),s.name=t&&t.name||"Error",n&&Object.assign(s,n),s};var w=nt;import Cc from"form-data";var mr=Cc;function uo(t){return d.isPlainObject(t)||d.isArray(t)}function is(t){return d.endsWith(t,"[]")?t.slice(0,-2):t}function os(t,e,r){return t?t.concat(e).map(function(i,n){return i=is(i),!r&&n?"["+i+"]":i}).join(r?".":""):e}function Rc(t){return d.isArray(t)&&!t.some(uo)}var xc=d.toFlatObject(d,{},null,function(e){return/^is[A-Z]/.test(e)});function Ic(t,e,r){if(!d.isObject(t))throw new TypeError("target must be an object");e=e||new(mr||FormData),r=d.toFlatObject(r,{metaTokens:!0,dots:!1,indexes:!1},!1,function(y,T){return!d.isUndefined(T[y])});let o=r.metaTokens,i=r.visitor||u,n=r.dots,s=r.indexes,l=(r.Blob||typeof Blob<"u"&&Blob)&&d.isSpecCompliantForm(e);if(!d.isFunction(i))throw new TypeError("visitor must be a function");function c(m){if(m===null)return"";if(d.isDate(m))return m.toISOString();if(d.isBoolean(m))return m.toString();if(!l&&d.isBlob(m))throw new w("Blob is not supported. Use a Buffer instead.");return d.isArrayBuffer(m)||d.isTypedArray(m)?l&&typeof Blob=="function"?new Blob([m]):Buffer.from(m):m}function u(m,y,T){let v=m;if(m&&!T&&typeof m=="object"){if(d.endsWith(y,"{}"))y=o?y:y.slice(0,-2),m=JSON.stringify(m);else if(d.isArray(m)&&Rc(m)||(d.isFileList(m)||d.endsWith(y,"[]"))&&(v=d.toArray(m)))return y=is(y),v.forEach(function(S,C){!(d.isUndefined(S)||S===null)&&e.append(s===!0?os([y],C,n):s===null?y:y+"[]",c(S))}),!1}return uo(m)?!0:(e.append(os(T,y,n),c(m)),!1)}let p=[],g=Object.assign(xc,{defaultVisitor:u,convertValue:c,isVisitable:uo});function b(m,y){if(!d.isUndefined(m)){if(p.indexOf(m)!==-1)throw Error("Circular reference detected in "+y.join("."));p.push(m),d.forEach(m,function(v,P){(!(d.isUndefined(v)||v===null)&&i.call(e,v,d.isString(P)?P.trim():P,y,g))===!0&&b(v,y?y.concat(P):[P])}),p.pop()}}if(!d.isObject(t))throw new TypeError("data must be an object");return b(t),e}var Ie=Ic;function ss(t){let e={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(t).replace(/[!'()~]|%20|%00/g,function(o){return e[o]})}function ns(t,e){this._pairs=[],t&&Ie(t,this,e)}var as=ns.prototype;as.append=function(e,r){this._pairs.push([e,r])};as.toString=function(e){let r=e?function(o){return e.call(this,o,ss)}:ss;return this._pairs.map(function(i){return r(i[0])+"="+r(i[1])},"").join("&")};var ls=ns;function Pc(t){return encodeURIComponent(t).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+")}function ze(t,e,r){if(!e)return t;let o=r&&r.encode||Pc;d.isFunction(r)&&(r={serialize:r});let i=r&&r.serialize,n;if(i?n=i(e,r):n=d.isURLSearchParams(e)?e.toString():new ls(e,r).toString(o),n){let s=t.indexOf("#");s!==-1&&(t=t.slice(0,s)),t+=(t.indexOf("?")===-1?"?":"&")+n}return t}var po=class{constructor(){this.handlers=[]}use(e,r,o){return this.handlers.push({fulfilled:e,rejected:r,synchronous:o?o.synchronous:!1,runWhen:o?o.runWhen:null}),this.handlers.length-1}eject(e){this.handlers[e]&&(this.handlers[e]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(e){d.forEach(this.handlers,function(o){o!==null&&e(o)})}},mo=po;var at={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1};import kc from"crypto";import Dc from"url";var cs=Dc.URLSearchParams;var fo="abcdefghijklmnopqrstuvwxyz",us="0123456789",ds={DIGIT:us,ALPHA:fo,ALPHA_DIGIT:fo+fo.toUpperCase()+us},Lc=(t=16,e=ds.ALPHA_DIGIT)=>{let r="",{length:o}=e,i=new Uint32Array(t);kc.randomFillSync(i);for(let n=0;n<t;n++)r+=e[i[n]%o];return r},ps={isNode:!0,classes:{URLSearchParams:cs,FormData:mr,Blob:typeof Blob<"u"&&Blob||null},ALPHABET:ds,generateString:Lc,protocols:["http","https","file","data"]};var yo={};Ja(yo,{hasBrowserEnv:()=>go,hasStandardBrowserEnv:()=>Mc,hasStandardBrowserWebWorkerEnv:()=>Oc,navigator:()=>ho,origin:()=>Nc});var go=typeof window<"u"&&typeof document<"u",ho=typeof navigator=="object"&&navigator||void 0,Mc=go&&(!ho||["ReactNative","NativeScript","NS"].indexOf(ho.product)<0),Oc=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",Nc=go&&window.location.href||"http://localhost";var O={...yo,...ps};function bo(t,e){return Ie(t,new O.classes.URLSearchParams,{visitor:function(r,o,i,n){return O.isNode&&d.isBuffer(r)?(this.append(o,r.toString("base64")),!1):n.defaultVisitor.apply(this,arguments)},...e})}function Uc(t){return d.matchAll(/\w+|\[(\w*)]/g,t).map(e=>e[0]==="[]"?"":e[1]||e[0])}function Fc(t){let e={},r=Object.keys(t),o,i=r.length,n;for(o=0;o<i;o++)n=r[o],e[n]=t[n];return e}function qc(t){function e(r,o,i,n){let s=r[n++];if(s==="__proto__")return!0;let a=Number.isFinite(+s),l=n>=r.length;return s=!s&&d.isArray(i)?i.length:s,l?(d.hasOwnProp(i,s)?i[s]=[i[s],o]:i[s]=o,!a):((!i[s]||!d.isObject(i[s]))&&(i[s]=[]),e(r,o,i[s],n)&&d.isArray(i[s])&&(i[s]=Fc(i[s])),!a)}if(d.isFormData(t)&&d.isFunction(t.entries)){let r={};return d.forEachEntry(t,(o,i)=>{e(Uc(o),i,r,0)}),r}return null}var fr=qc;function jc(t,e,r){if(d.isString(t))try{return(e||JSON.parse)(t),d.trim(t)}catch(o){if(o.name!=="SyntaxError")throw o}return(r||JSON.stringify)(t)}var To={transitional:at,adapter:["xhr","http","fetch"],transformRequest:[function(e,r){let o=r.getContentType()||"",i=o.indexOf("application/json")>-1,n=d.isObject(e);if(n&&d.isHTMLForm(e)&&(e=new FormData(e)),d.isFormData(e))return i?JSON.stringify(fr(e)):e;if(d.isArrayBuffer(e)||d.isBuffer(e)||d.isStream(e)||d.isFile(e)||d.isBlob(e)||d.isReadableStream(e))return e;if(d.isArrayBufferView(e))return e.buffer;if(d.isURLSearchParams(e))return r.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),e.toString();let a;if(n){if(o.indexOf("application/x-www-form-urlencoded")>-1)return bo(e,this.formSerializer).toString();if((a=d.isFileList(e))||o.indexOf("multipart/form-data")>-1){let l=this.env&&this.env.FormData;return Ie(a?{"files[]":e}:e,l&&new l,this.formSerializer)}}return n||i?(r.setContentType("application/json",!1),jc(e)):e}],transformResponse:[function(e){let r=this.transitional||To.transitional,o=r&&r.forcedJSONParsing,i=this.responseType==="json";if(d.isResponse(e)||d.isReadableStream(e))return e;if(e&&d.isString(e)&&(o&&!this.responseType||i)){let s=!(r&&r.silentJSONParsing)&&i;try{return JSON.parse(e,this.parseReviver)}catch(a){if(s)throw a.name==="SyntaxError"?w.from(a,w.ERR_BAD_RESPONSE,this,null,this.response):a}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:O.classes.FormData,Blob:O.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};d.forEach(["delete","get","head","post","put","patch"],t=>{To.headers[t]={}});var lt=To;var Vc=d.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),ms=t=>{let e={},r,o,i;return t&&t.split(`
6
+ `).forEach(function(s){i=s.indexOf(":"),r=s.substring(0,i).trim().toLowerCase(),o=s.substring(i+1).trim(),!(!r||e[r]&&Vc[r])&&(r==="set-cookie"?e[r]?e[r].push(o):e[r]=[o]:e[r]=e[r]?e[r]+", "+o:o)}),e};var fs=Symbol("internals");function kt(t){return t&&String(t).trim().toLowerCase()}function hr(t){return t===!1||t==null?t:d.isArray(t)?t.map(hr):String(t)}function Bc(t){let e=Object.create(null),r=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g,o;for(;o=r.exec(t);)e[o[1]]=o[2];return e}var zc=t=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(t.trim());function wo(t,e,r,o,i){if(d.isFunction(o))return o.call(this,e,r);if(i&&(e=r),!!d.isString(e)){if(d.isString(o))return e.indexOf(o)!==-1;if(d.isRegExp(o))return o.test(e)}}function Wc(t){return t.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(e,r,o)=>r.toUpperCase()+o)}function Hc(t,e){let r=d.toCamelCase(" "+e);["get","set","has"].forEach(o=>{Object.defineProperty(t,o+r,{value:function(i,n,s){return this[o].call(this,e,i,n,s)},configurable:!0})})}var ct=class{constructor(e){e&&this.set(e)}set(e,r,o){let i=this;function n(a,l,c){let u=kt(l);if(!u)throw new Error("header name must be a non-empty string");let p=d.findKey(i,u);(!p||i[p]===void 0||c===!0||c===void 0&&i[p]!==!1)&&(i[p||l]=hr(a))}let s=(a,l)=>d.forEach(a,(c,u)=>n(c,u,l));if(d.isPlainObject(e)||e instanceof this.constructor)s(e,r);else if(d.isString(e)&&(e=e.trim())&&!zc(e))s(ms(e),r);else if(d.isObject(e)&&d.isIterable(e)){let a={},l,c;for(let u of e){if(!d.isArray(u))throw TypeError("Object iterator must return a key-value pair");a[c=u[0]]=(l=a[c])?d.isArray(l)?[...l,u[1]]:[l,u[1]]:u[1]}s(a,r)}else e!=null&&n(r,e,o);return this}get(e,r){if(e=kt(e),e){let o=d.findKey(this,e);if(o){let i=this[o];if(!r)return i;if(r===!0)return Bc(i);if(d.isFunction(r))return r.call(this,i,o);if(d.isRegExp(r))return r.exec(i);throw new TypeError("parser must be boolean|regexp|function")}}}has(e,r){if(e=kt(e),e){let o=d.findKey(this,e);return!!(o&&this[o]!==void 0&&(!r||wo(this,this[o],o,r)))}return!1}delete(e,r){let o=this,i=!1;function n(s){if(s=kt(s),s){let a=d.findKey(o,s);a&&(!r||wo(o,o[a],a,r))&&(delete o[a],i=!0)}}return d.isArray(e)?e.forEach(n):n(e),i}clear(e){let r=Object.keys(this),o=r.length,i=!1;for(;o--;){let n=r[o];(!e||wo(this,this[n],n,e,!0))&&(delete this[n],i=!0)}return i}normalize(e){let r=this,o={};return d.forEach(this,(i,n)=>{let s=d.findKey(o,n);if(s){r[s]=hr(i),delete r[n];return}let a=e?Wc(n):String(n).trim();a!==n&&delete r[n],r[a]=hr(i),o[a]=!0}),this}concat(...e){return this.constructor.concat(this,...e)}toJSON(e){let r=Object.create(null);return d.forEach(this,(o,i)=>{o!=null&&o!==!1&&(r[i]=e&&d.isArray(o)?o.join(", "):o)}),r}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([e,r])=>e+": "+r).join(`
7
+ `)}getSetCookie(){return this.get("set-cookie")||[]}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(e){return e instanceof this?e:new this(e)}static concat(e,...r){let o=new this(e);return r.forEach(i=>o.set(i)),o}static accessor(e){let o=(this[fs]=this[fs]={accessors:{}}).accessors,i=this.prototype;function n(s){let a=kt(s);o[a]||(Hc(i,s),o[a]=!0)}return d.isArray(e)?e.forEach(n):n(e),this}};ct.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);d.reduceDescriptors(ct.prototype,({value:t},e)=>{let r=e[0].toUpperCase()+e.slice(1);return{get:()=>t,set(o){this[r]=o}}});d.freezeMethods(ct);var B=ct;function Lt(t,e){let r=this||lt,o=e||r,i=B.from(o.headers),n=o.data;return d.forEach(t,function(a){n=a.call(r,n,i.normalize(),e?e.status:void 0)}),i.normalize(),n}function Mt(t){return!!(t&&t.__CANCEL__)}function hs(t,e,r){w.call(this,t??"canceled",w.ERR_CANCELED,e,r),this.name="CanceledError"}d.inherits(hs,w,{__CANCEL__:!0});var ae=hs;function we(t,e,r){let o=r.config.validateStatus;!r.status||!o||o(r.status)?t(r):e(new w("Request failed with status code "+r.status,[w.ERR_BAD_REQUEST,w.ERR_BAD_RESPONSE][Math.floor(r.status/100)-4],r.config,r.request,r))}function Ao(t){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(t)}function So(t,e){return e?t.replace(/\/?\/$/,"")+"/"+e.replace(/^\/+/,""):t}function We(t,e,r){let o=!Ao(e);return t&&(o||r==!1)?So(t,e):e}import su from"proxy-from-env";import nu from"http";import au from"https";import lu from"util";import cu from"follow-redirects";import Pe from"zlib";var He="1.12.1";function Ot(t){let e=/^([-+\w]{1,25})(:?\/\/|:)/.exec(t);return e&&e[1]||""}var $c=/^(?:([^;]+);)?(?:[^;]+;)?(base64|),([\s\S]*)$/;function Eo(t,e,r){let o=r&&r.Blob||O.classes.Blob,i=Ot(t);if(e===void 0&&o&&(e=!0),i==="data"){t=i.length?t.slice(i.length+1):t;let n=$c.exec(t);if(!n)throw new w("Invalid URL",w.ERR_INVALID_URL);let s=n[1],a=n[2],l=n[3],c=Buffer.from(decodeURIComponent(l),a?"base64":"utf8");if(e){if(!o)throw new w("Blob is not supported",w.ERR_NOT_SUPPORT);return new o([c],{type:s})}return c}throw new w("Unsupported protocol "+i,w.ERR_NOT_SUPPORT)}import pt from"stream";import Gc from"stream";var _o=Symbol("internals"),vo=class extends Gc.Transform{constructor(e){e=d.toFlatObject(e,{maxRate:0,chunkSize:64*1024,minChunkSize:100,timeWindow:500,ticksRate:2,samplesCount:15},null,(o,i)=>!d.isUndefined(i[o])),super({readableHighWaterMark:e.chunkSize});let r=this[_o]={timeWindow:e.timeWindow,chunkSize:e.chunkSize,maxRate:e.maxRate,minChunkSize:e.minChunkSize,bytesSeen:0,isCaptured:!1,notifiedBytesLoaded:0,ts:Date.now(),bytes:0,onReadCallback:null};this.on("newListener",o=>{o==="progress"&&(r.isCaptured||(r.isCaptured=!0))})}_read(e){let r=this[_o];return r.onReadCallback&&r.onReadCallback(),super._read(e)}_transform(e,r,o){let i=this[_o],n=i.maxRate,s=this.readableHighWaterMark,a=i.timeWindow,l=1e3/a,c=n/l,u=i.minChunkSize!==!1?Math.max(i.minChunkSize,c*.01):0,p=(b,m)=>{let y=Buffer.byteLength(b);i.bytesSeen+=y,i.bytes+=y,i.isCaptured&&this.emit("progress",i.bytesSeen),this.push(b)?process.nextTick(m):i.onReadCallback=()=>{i.onReadCallback=null,process.nextTick(m)}},g=(b,m)=>{let y=Buffer.byteLength(b),T=null,v=s,P,S=0;if(n){let C=Date.now();(!i.ts||(S=C-i.ts)>=a)&&(i.ts=C,P=c-i.bytes,i.bytes=P<0?-P:0,S=0),P=c-i.bytes}if(n){if(P<=0)return setTimeout(()=>{m(null,b)},a-S);P<v&&(v=P)}v&&y>v&&y-v>u&&(T=b.subarray(v),b=b.subarray(0,v)),p(b,T?()=>{process.nextTick(m,null,T)}:m)};g(e,function b(m,y){if(m)return o(m);y?g(y,b):o(null)})}},Co=vo;import{EventEmitter as uu}from"events";import Kc from"util";import{Readable as Jc}from"stream";var{asyncIterator:gs}=Symbol,Qc=async function*(t){t.stream?yield*t.stream():t.arrayBuffer?yield await t.arrayBuffer():t[gs]?yield*t[gs]():yield t},gr=Qc;var Yc=O.ALPHABET.ALPHA_DIGIT+"-_",Nt=typeof TextEncoder=="function"?new TextEncoder:new Kc.TextEncoder,$e=`\r
8
+ `,Zc=Nt.encode($e),Xc=2,Ro=class{constructor(e,r){let{escapeName:o}=this.constructor,i=d.isString(r),n=`Content-Disposition: form-data; name="${o(e)}"${!i&&r.name?`; filename="${o(r.name)}"`:""}${$e}`;i?r=Nt.encode(String(r).replace(/\r?\n|\r\n?/g,$e)):n+=`Content-Type: ${r.type||"application/octet-stream"}${$e}`,this.headers=Nt.encode(n+$e),this.contentLength=i?r.byteLength:r.size,this.size=this.headers.byteLength+this.contentLength+Xc,this.name=e,this.value=r}async*encode(){yield this.headers;let{value:e}=this;d.isTypedArray(e)?yield e:yield*gr(e),yield Zc}static escapeName(e){return String(e).replace(/[\r\n"]/g,r=>({"\r":"%0D","\n":"%0A",'"':"%22"})[r])}},eu=(t,e,r)=>{let{tag:o="form-data-boundary",size:i=25,boundary:n=o+"-"+O.generateString(i,Yc)}=r||{};if(!d.isFormData(t))throw TypeError("FormData instance required");if(n.length<1||n.length>70)throw Error("boundary must be 10-70 characters long");let s=Nt.encode("--"+n+$e),a=Nt.encode("--"+n+"--"+$e),l=a.byteLength,c=Array.from(t.entries()).map(([p,g])=>{let b=new Ro(p,g);return l+=b.size,b});l+=s.byteLength*c.length,l=d.toFiniteNumber(l);let u={"Content-Type":`multipart/form-data; boundary=${n}`};return Number.isFinite(l)&&(u["Content-Length"]=l),e&&e(u),Jc.from(async function*(){for(let p of c)yield s,yield*p.encode();yield a}())},ys=eu;import tu from"stream";var xo=class extends tu.Transform{__transform(e,r,o){this.push(e),o()}_transform(e,r,o){if(e.length!==0&&(this._transform=this.__transform,e[0]!==120)){let i=Buffer.alloc(2);i[0]=120,i[1]=156,this.push(i,r)}this.__transform(e,r,o)}},bs=xo;var ru=(t,e)=>d.isAsyncFn(t)?function(...r){let o=r.pop();t.apply(this,r).then(i=>{try{e?o(null,...e(i)):o(null,i)}catch(n){o(n)}},o)}:t,Ts=ru;function ou(t,e){t=t||10;let r=new Array(t),o=new Array(t),i=0,n=0,s;return e=e!==void 0?e:1e3,function(l){let c=Date.now(),u=o[n];s||(s=c),r[i]=l,o[i]=c;let p=n,g=0;for(;p!==i;)g+=r[p++],p=p%t;if(i=(i+1)%t,i===n&&(n=(n+1)%t),c-s<e)return;let b=u&&c-u;return b?Math.round(g*1e3/b):void 0}}var ws=ou;function iu(t,e){let r=0,o=1e3/e,i,n,s=(c,u=Date.now())=>{r=u,i=null,n&&(clearTimeout(n),n=null),t(...c)};return[(...c)=>{let u=Date.now(),p=u-r;p>=o?s(c,u):(i=c,n||(n=setTimeout(()=>{n=null,s(i)},o-p)))},()=>i&&s(i)]}var As=iu;var _e=(t,e,r=3)=>{let o=0,i=ws(50,250);return As(n=>{let s=n.loaded,a=n.lengthComputable?n.total:void 0,l=s-o,c=i(l),u=s<=a;o=s;let p={loaded:s,total:a,progress:a?s/a:void 0,bytes:l,rate:c||void 0,estimated:c&&a&&u?(a-s)/c:void 0,event:n,lengthComputable:a!=null,[e?"download":"upload"]:!0};t(p)},r)},ut=(t,e)=>{let r=t!=null;return[o=>e[0]({lengthComputable:r,total:t,loaded:o}),e[1]]},dt=t=>(...e)=>d.asap(()=>t(...e));function Io(t){if(!t||typeof t!="string"||!t.startsWith("data:"))return 0;let e=t.indexOf(",");if(e<0)return 0;let r=t.slice(5,e),o=t.slice(e+1);if(/;base64/i.test(r)){let n=o.length,s=o.length;for(let g=0;g<s;g++)if(o.charCodeAt(g)===37&&g+2<s){let b=o.charCodeAt(g+1),m=o.charCodeAt(g+2);(b>=48&&b<=57||b>=65&&b<=70||b>=97&&b<=102)&&(m>=48&&m<=57||m>=65&&m<=70||m>=97&&m<=102)&&(n-=2,g+=2)}let a=0,l=s-1,c=g=>g>=2&&o.charCodeAt(g-2)===37&&o.charCodeAt(g-1)===51&&(o.charCodeAt(g)===68||o.charCodeAt(g)===100);l>=0&&(o.charCodeAt(l)===61?(a++,l--):c(l)&&(a++,l-=3)),a===1&&l>=0&&(o.charCodeAt(l)===61||c(l))&&a++;let p=Math.floor(n/4)*3-(a||0);return p>0?p:0}return Buffer.byteLength(o,"utf8")}var Ss={flush:Pe.constants.Z_SYNC_FLUSH,finishFlush:Pe.constants.Z_SYNC_FLUSH},du={flush:Pe.constants.BROTLI_OPERATION_FLUSH,finishFlush:Pe.constants.BROTLI_OPERATION_FLUSH},Es=d.isFunction(Pe.createBrotliDecompress),{http:pu,https:mu}=cu,fu=/https:?/,_s=O.protocols.map(t=>t+":"),vs=(t,[e,r])=>(t.on("end",r).on("error",r),e);function hu(t,e){t.beforeRedirects.proxy&&t.beforeRedirects.proxy(t),t.beforeRedirects.config&&t.beforeRedirects.config(t,e)}function Rs(t,e,r){let o=e;if(!o&&o!==!1){let i=su.getProxyForUrl(r);i&&(o=new URL(i))}if(o){if(o.username&&(o.auth=(o.username||"")+":"+(o.password||"")),o.auth){(o.auth.username||o.auth.password)&&(o.auth=(o.auth.username||"")+":"+(o.auth.password||""));let n=Buffer.from(o.auth,"utf8").toString("base64");t.headers["Proxy-Authorization"]="Basic "+n}t.headers.host=t.hostname+(t.port?":"+t.port:"");let i=o.hostname||o.host;t.hostname=i,t.host=i,t.port=o.port,t.path=r,o.protocol&&(t.protocol=o.protocol.includes(":")?o.protocol:`${o.protocol}:`)}t.beforeRedirects.proxy=function(n){Rs(n,e,n.href)}}var gu=typeof process<"u"&&d.kindOf(process)==="process",yu=t=>new Promise((e,r)=>{let o,i,n=(l,c)=>{i||(i=!0,o&&o(l,c))},s=l=>{n(l),e(l)},a=l=>{n(l,!0),r(l)};t(s,a,l=>o=l).catch(a)}),bu=({address:t,family:e})=>{if(!d.isString(t))throw TypeError("address must be a string");return{address:t,family:e||(t.indexOf(".")<0?6:4)}},Cs=(t,e)=>bu(d.isObject(t)?t:{address:t,family:e}),xs=gu&&function(e){return yu(async function(o,i,n){let{data:s,lookup:a,family:l}=e,{responseType:c,responseEncoding:u}=e,p=e.method.toUpperCase(),g,b=!1,m;if(a){let _=Ts(a,E=>d.isArray(E)?E:[E]);a=(E,W,K)=>{_(E,W,(j,re,me)=>{if(j)return K(j);let Z=d.isArray(re)?re.map(oe=>Cs(oe)):[Cs(re,me)];W.all?K(j,Z):K(j,Z[0].address,Z[0].family)})}}let y=new uu,T=()=>{e.cancelToken&&e.cancelToken.unsubscribe(v),e.signal&&e.signal.removeEventListener("abort",v),y.removeAllListeners()};n((_,E)=>{g=!0,E&&(b=!0,T())});function v(_){y.emit("abort",!_||_.type?new ae(null,e,m):_)}y.once("abort",i),(e.cancelToken||e.signal)&&(e.cancelToken&&e.cancelToken.subscribe(v),e.signal&&(e.signal.aborted?v():e.signal.addEventListener("abort",v)));let P=We(e.baseURL,e.url,e.allowAbsoluteUrls),S=new URL(P,O.hasBrowserEnv?O.origin:void 0),C=S.protocol||_s[0];if(C==="data:"){if(e.maxContentLength>-1){let E=String(e.url||P||"");if(Io(E)>e.maxContentLength)return i(new w("maxContentLength size of "+e.maxContentLength+" exceeded",w.ERR_BAD_RESPONSE,e))}let _;if(p!=="GET")return we(o,i,{status:405,statusText:"method not allowed",headers:{},config:e});try{_=Eo(e.url,c==="blob",{Blob:e.env&&e.env.Blob})}catch(E){throw w.from(E,w.ERR_BAD_REQUEST,e)}return c==="text"?(_=_.toString(u),(!u||u==="utf8")&&(_=d.stripBOM(_))):c==="stream"&&(_=pt.Readable.from(_)),we(o,i,{data:_,status:200,statusText:"OK",headers:new B,config:e})}if(_s.indexOf(C)===-1)return i(new w("Unsupported protocol "+C,w.ERR_BAD_REQUEST,e));let x=B.from(e.headers).normalize();x.set("User-Agent","axios/"+He,!1);let{onUploadProgress:q,onDownloadProgress:F}=e,te=e.maxRate,pe,Se;if(d.isSpecCompliantForm(s)){let _=x.getContentType(/boundary=([-_\w\d]{10,70})/i);s=ys(s,E=>{x.set(E)},{tag:`axios-${He}-boundary`,boundary:_&&_[1]||void 0})}else if(d.isFormData(s)&&d.isFunction(s.getHeaders)){if(x.set(s.getHeaders()),!x.hasContentLength())try{let _=await lu.promisify(s.getLength).call(s);Number.isFinite(_)&&_>=0&&x.setContentLength(_)}catch{}}else if(d.isBlob(s)||d.isFile(s))s.size&&x.setContentType(s.type||"application/octet-stream"),x.setContentLength(s.size||0),s=pt.Readable.from(gr(s));else if(s&&!d.isStream(s)){if(!Buffer.isBuffer(s))if(d.isArrayBuffer(s))s=Buffer.from(new Uint8Array(s));else if(d.isString(s))s=Buffer.from(s,"utf-8");else return i(new w("Data after transformation must be a string, an ArrayBuffer, a Buffer, or a Stream",w.ERR_BAD_REQUEST,e));if(x.setContentLength(s.length,!1),e.maxBodyLength>-1&&s.length>e.maxBodyLength)return i(new w("Request body larger than maxBodyLength limit",w.ERR_BAD_REQUEST,e))}let ve=d.toFiniteNumber(x.getContentLength());d.isArray(te)?(pe=te[0],Se=te[1]):pe=Se=te,s&&(q||pe)&&(d.isStream(s)||(s=pt.Readable.from(s,{objectMode:!1})),s=pt.pipeline([s,new Co({maxRate:d.toFiniteNumber(pe)})],d.noop),q&&s.on("progress",vs(s,ut(ve,_e(dt(q),!1,3)))));let ne;if(e.auth){let _=e.auth.username||"",E=e.auth.password||"";ne=_+":"+E}if(!ne&&S.username){let _=S.username,E=S.password;ne=_+":"+E}ne&&x.delete("authorization");let le;try{le=ze(S.pathname+S.search,e.params,e.paramsSerializer).replace(/^\?/,"")}catch(_){let E=new Error(_.message);return E.config=e,E.url=e.url,E.exists=!0,i(E)}x.set("Accept-Encoding","gzip, compress, deflate"+(Es?", br":""),!1);let G={path:le,method:p,headers:x.toJSON(),agents:{http:e.httpAgent,https:e.httpsAgent},auth:ne,protocol:C,family:l,beforeRedirect:hu,beforeRedirects:{}};!d.isUndefined(a)&&(G.lookup=a),e.socketPath?G.socketPath=e.socketPath:(G.hostname=S.hostname.startsWith("[")?S.hostname.slice(1,-1):S.hostname,G.port=S.port,Rs(G,e.proxy,C+"//"+S.hostname+(S.port?":"+S.port:"")+G.path));let J,Ce=fu.test(G.protocol);if(G.agent=Ce?e.httpsAgent:e.httpAgent,e.transport?J=e.transport:e.maxRedirects===0?J=Ce?au:nu:(e.maxRedirects&&(G.maxRedirects=e.maxRedirects),e.beforeRedirect&&(G.beforeRedirects.config=e.beforeRedirect),J=Ce?mu:pu),e.maxBodyLength>-1?G.maxBodyLength=e.maxBodyLength:G.maxBodyLength=1/0,e.insecureHTTPParser&&(G.insecureHTTPParser=e.insecureHTTPParser),m=J.request(G,function(E){if(m.destroyed)return;let W=[E],K=+E.headers["content-length"];if(F||Se){let oe=new Co({maxRate:d.toFiniteNumber(Se)});F&&oe.on("progress",vs(oe,ut(K,_e(dt(F),!0,3)))),W.push(oe)}let j=E,re=E.req||m;if(e.decompress!==!1&&E.headers["content-encoding"])switch((p==="HEAD"||E.statusCode===204)&&delete E.headers["content-encoding"],(E.headers["content-encoding"]||"").toLowerCase()){case"gzip":case"x-gzip":case"compress":case"x-compress":W.push(Pe.createUnzip(Ss)),delete E.headers["content-encoding"];break;case"deflate":W.push(new bs),W.push(Pe.createUnzip(Ss)),delete E.headers["content-encoding"];break;case"br":Es&&(W.push(Pe.createBrotliDecompress(du)),delete E.headers["content-encoding"])}j=W.length>1?pt.pipeline(W,d.noop):W[0];let me=pt.finished(j,()=>{me(),T()}),Z={status:E.statusCode,statusText:E.statusMessage,headers:new B(E.headers),config:e,request:re};if(c==="stream")Z.data=j,we(o,i,Z);else{let oe=[],tr=0;j.on("data",function(Q){oe.push(Q),tr+=Q.length,e.maxContentLength>-1&&tr>e.maxContentLength&&(b=!0,j.destroy(),i(new w("maxContentLength size of "+e.maxContentLength+" exceeded",w.ERR_BAD_RESPONSE,e,re)))}),j.on("aborted",function(){if(b)return;let Q=new w("stream has been aborted",w.ERR_BAD_RESPONSE,e,re);j.destroy(Q),i(Q)}),j.on("error",function(Q){m.destroyed||i(w.from(Q,null,e,re))}),j.on("end",function(){try{let Q=oe.length===1?oe[0]:Buffer.concat(oe);c!=="arraybuffer"&&(Q=Q.toString(u),(!u||u==="utf8")&&(Q=d.stripBOM(Q))),Z.data=Q}catch(Q){return i(w.from(Q,null,e,Z.request,Z))}we(o,i,Z)})}y.once("abort",oe=>{j.destroyed||(j.emit("error",oe),j.destroy())})}),y.once("abort",_=>{i(_),m.destroy(_)}),m.on("error",function(E){i(w.from(E,null,e,m))}),m.on("socket",function(E){E.setKeepAlive(!0,1e3*60)}),e.timeout){let _=parseInt(e.timeout,10);if(Number.isNaN(_)){i(new w("error trying to parse `config.timeout` to int",w.ERR_BAD_OPTION_VALUE,e,m));return}m.setTimeout(_,function(){if(g)return;let W=e.timeout?"timeout of "+e.timeout+"ms exceeded":"timeout exceeded",K=e.transitional||at;e.timeoutErrorMessage&&(W=e.timeoutErrorMessage),i(new w(W,K.clarifyTimeoutError?w.ETIMEDOUT:w.ECONNABORTED,e,m)),v()})}if(d.isStream(s)){let _=!1,E=!1;s.on("end",()=>{_=!0}),s.once("error",W=>{E=!0,m.destroy(W)}),s.on("close",()=>{!_&&!E&&v(new ae("Request stream has been aborted",e,m))}),s.pipe(m)}else m.end(s)})};var Is=O.hasStandardBrowserEnv?((t,e)=>r=>(r=new URL(r,O.origin),t.protocol===r.protocol&&t.host===r.host&&(e||t.port===r.port)))(new URL(O.origin),O.navigator&&/(msie|trident)/i.test(O.navigator.userAgent)):()=>!0;var Ps=O.hasStandardBrowserEnv?{write(t,e,r,o,i,n){let s=[t+"="+encodeURIComponent(e)];d.isNumber(r)&&s.push("expires="+new Date(r).toGMTString()),d.isString(o)&&s.push("path="+o),d.isString(i)&&s.push("domain="+i),n===!0&&s.push("secure"),document.cookie=s.join("; ")},read(t){let e=document.cookie.match(new RegExp("(^|;\\s*)("+t+")=([^;]*)"));return e?decodeURIComponent(e[3]):null},remove(t){this.write(t,"",Date.now()-864e5)}}:{write(){},read(){return null},remove(){}};var Ds=t=>t instanceof B?{...t}:t;function ge(t,e){e=e||{};let r={};function o(c,u,p,g){return d.isPlainObject(c)&&d.isPlainObject(u)?d.merge.call({caseless:g},c,u):d.isPlainObject(u)?d.merge({},u):d.isArray(u)?u.slice():u}function i(c,u,p,g){if(d.isUndefined(u)){if(!d.isUndefined(c))return o(void 0,c,p,g)}else return o(c,u,p,g)}function n(c,u){if(!d.isUndefined(u))return o(void 0,u)}function s(c,u){if(d.isUndefined(u)){if(!d.isUndefined(c))return o(void 0,c)}else return o(void 0,u)}function a(c,u,p){if(p in e)return o(c,u);if(p in t)return o(void 0,c)}let l={url:n,method:n,data:n,baseURL:s,transformRequest:s,transformResponse:s,paramsSerializer:s,timeout:s,timeoutMessage:s,withCredentials:s,withXSRFToken:s,adapter:s,responseType:s,xsrfCookieName:s,xsrfHeaderName:s,onUploadProgress:s,onDownloadProgress:s,decompress:s,maxContentLength:s,maxBodyLength:s,beforeRedirect:s,transport:s,httpAgent:s,httpsAgent:s,cancelToken:s,socketPath:s,responseEncoding:s,validateStatus:a,headers:(c,u,p)=>i(Ds(c),Ds(u),p,!0)};return d.forEach(Object.keys({...t,...e}),function(u){let p=l[u]||i,g=p(t[u],e[u],u);d.isUndefined(g)&&p!==a||(r[u]=g)}),r}var yr=t=>{let e=ge({},t),{data:r,withXSRFToken:o,xsrfHeaderName:i,xsrfCookieName:n,headers:s,auth:a}=e;if(e.headers=s=B.from(s),e.url=ze(We(e.baseURL,e.url,e.allowAbsoluteUrls),t.params,t.paramsSerializer),a&&s.set("Authorization","Basic "+btoa((a.username||"")+":"+(a.password?unescape(encodeURIComponent(a.password)):""))),d.isFormData(r)){if(O.hasStandardBrowserEnv||O.hasStandardBrowserWebWorkerEnv)s.setContentType(void 0);else if(d.isFunction(r.getHeaders)){let l=r.getHeaders(),c=["content-type","content-length"];Object.entries(l).forEach(([u,p])=>{c.includes(u.toLowerCase())&&s.set(u,p)})}}if(O.hasStandardBrowserEnv&&(o&&d.isFunction(o)&&(o=o(e)),o||o!==!1&&Is(e.url))){let l=i&&n&&Ps.read(n);l&&s.set(i,l)}return e};var Tu=typeof XMLHttpRequest<"u",ks=Tu&&function(t){return new Promise(function(r,o){let i=yr(t),n=i.data,s=B.from(i.headers).normalize(),{responseType:a,onUploadProgress:l,onDownloadProgress:c}=i,u,p,g,b,m;function y(){b&&b(),m&&m(),i.cancelToken&&i.cancelToken.unsubscribe(u),i.signal&&i.signal.removeEventListener("abort",u)}let T=new XMLHttpRequest;T.open(i.method.toUpperCase(),i.url,!0),T.timeout=i.timeout;function v(){if(!T)return;let S=B.from("getAllResponseHeaders"in T&&T.getAllResponseHeaders()),x={data:!a||a==="text"||a==="json"?T.responseText:T.response,status:T.status,statusText:T.statusText,headers:S,config:t,request:T};we(function(F){r(F),y()},function(F){o(F),y()},x),T=null}"onloadend"in T?T.onloadend=v:T.onreadystatechange=function(){!T||T.readyState!==4||T.status===0&&!(T.responseURL&&T.responseURL.indexOf("file:")===0)||setTimeout(v)},T.onabort=function(){T&&(o(new w("Request aborted",w.ECONNABORTED,t,T)),T=null)},T.onerror=function(C){let x=C&&C.message?C.message:"Network Error",q=new w(x,w.ERR_NETWORK,t,T);q.event=C||null,o(q),T=null},T.ontimeout=function(){let C=i.timeout?"timeout of "+i.timeout+"ms exceeded":"timeout exceeded",x=i.transitional||at;i.timeoutErrorMessage&&(C=i.timeoutErrorMessage),o(new w(C,x.clarifyTimeoutError?w.ETIMEDOUT:w.ECONNABORTED,t,T)),T=null},n===void 0&&s.setContentType(null),"setRequestHeader"in T&&d.forEach(s.toJSON(),function(C,x){T.setRequestHeader(x,C)}),d.isUndefined(i.withCredentials)||(T.withCredentials=!!i.withCredentials),a&&a!=="json"&&(T.responseType=i.responseType),c&&([g,m]=_e(c,!0),T.addEventListener("progress",g)),l&&T.upload&&([p,b]=_e(l),T.upload.addEventListener("progress",p),T.upload.addEventListener("loadend",b)),(i.cancelToken||i.signal)&&(u=S=>{T&&(o(!S||S.type?new ae(null,t,T):S),T.abort(),T=null)},i.cancelToken&&i.cancelToken.subscribe(u),i.signal&&(i.signal.aborted?u():i.signal.addEventListener("abort",u)));let P=Ot(i.url);if(P&&O.protocols.indexOf(P)===-1){o(new w("Unsupported protocol "+P+":",w.ERR_BAD_REQUEST,t));return}T.send(n||null)})};var wu=(t,e)=>{let{length:r}=t=t?t.filter(Boolean):[];if(e||r){let o=new AbortController,i,n=function(c){if(!i){i=!0,a();let u=c instanceof Error?c:this.reason;o.abort(u instanceof w?u:new ae(u instanceof Error?u.message:u))}},s=e&&setTimeout(()=>{s=null,n(new w(`timeout ${e} of ms exceeded`,w.ETIMEDOUT))},e),a=()=>{t&&(s&&clearTimeout(s),s=null,t.forEach(c=>{c.unsubscribe?c.unsubscribe(n):c.removeEventListener("abort",n)}),t=null)};t.forEach(c=>c.addEventListener("abort",n));let{signal:l}=o;return l.unsubscribe=()=>d.asap(a),l}},Ls=wu;var Au=function*(t,e){let r=t.byteLength;if(!e||r<e){yield t;return}let o=0,i;for(;o<r;)i=o+e,yield t.slice(o,i),o=i},Su=async function*(t,e){for await(let r of Eu(t))yield*Au(r,e)},Eu=async function*(t){if(t[Symbol.asyncIterator]){yield*t;return}let e=t.getReader();try{for(;;){let{done:r,value:o}=await e.read();if(r)break;yield o}}finally{await e.cancel()}},Po=(t,e,r,o)=>{let i=Su(t,e),n=0,s,a=l=>{s||(s=!0,o&&o(l))};return new ReadableStream({async pull(l){try{let{done:c,value:u}=await i.next();if(c){a(),l.close();return}let p=u.byteLength;if(r){let g=n+=p;r(g)}l.enqueue(new Uint8Array(u))}catch(c){throw a(c),c}},cancel(l){return a(l),i.return()}},{highWaterMark:2})};var Ms=64*1024,{isFunction:br}=d,Fs=(({fetch:t,Request:e,Response:r})=>({fetch:t,Request:e,Response:r}))(d.global),{ReadableStream:Os,TextEncoder:Ns}=d.global,Us=(t,...e)=>{try{return!!t(...e)}catch{return!1}},_u=t=>{let{fetch:e,Request:r,Response:o}=Object.assign({},Fs,t),i=br(e),n=br(r),s=br(o);if(!i)return!1;let a=i&&br(Os),l=i&&(typeof Ns=="function"?(m=>y=>m.encode(y))(new Ns):async m=>new Uint8Array(await new r(m).arrayBuffer())),c=n&&a&&Us(()=>{let m=!1,y=new r(O.origin,{body:new Os,method:"POST",get duplex(){return m=!0,"half"}}).headers.has("Content-Type");return m&&!y}),u=s&&a&&Us(()=>d.isReadableStream(new o("").body)),p={stream:u&&(m=>m.body)};i&&["text","arrayBuffer","blob","formData","stream"].forEach(m=>{!p[m]&&(p[m]=(y,T)=>{let v=y&&y[m];if(v)return v.call(y);throw new w(`Response type '${m}' is not supported`,w.ERR_NOT_SUPPORT,T)})});let g=async m=>{if(m==null)return 0;if(d.isBlob(m))return m.size;if(d.isSpecCompliantForm(m))return(await new r(O.origin,{method:"POST",body:m}).arrayBuffer()).byteLength;if(d.isArrayBufferView(m)||d.isArrayBuffer(m))return m.byteLength;if(d.isURLSearchParams(m)&&(m=m+""),d.isString(m))return(await l(m)).byteLength},b=async(m,y)=>{let T=d.toFiniteNumber(m.getContentLength());return T??g(y)};return async m=>{let{url:y,method:T,data:v,signal:P,cancelToken:S,timeout:C,onDownloadProgress:x,onUploadProgress:q,responseType:F,headers:te,withCredentials:pe="same-origin",fetchOptions:Se}=yr(m);F=F?(F+"").toLowerCase():"text";let ve=Ls([P,S&&S.toAbortSignal()],C),ne=null,le=ve&&ve.unsubscribe&&(()=>{ve.unsubscribe()}),G;try{if(q&&c&&T!=="get"&&T!=="head"&&(G=await b(te,v))!==0){let K=new r(y,{method:"POST",body:v,duplex:"half"}),j;if(d.isFormData(v)&&(j=K.headers.get("content-type"))&&te.setContentType(j),K.body){let[re,me]=ut(G,_e(dt(q)));v=Po(K.body,Ms,re,me)}}d.isString(pe)||(pe=pe?"include":"omit");let J=n&&"credentials"in r.prototype,Ce={...Se,signal:ve,method:T.toUpperCase(),headers:te.normalize().toJSON(),body:v,duplex:"half",credentials:J?pe:void 0};ne=n&&new r(y,Ce);let _=await(n?e(ne,Se):e(y,Ce)),E=u&&(F==="stream"||F==="response");if(u&&(x||E&&le)){let K={};["status","statusText","headers"].forEach(Z=>{K[Z]=_[Z]});let j=d.toFiniteNumber(_.headers.get("content-length")),[re,me]=x&&ut(j,_e(dt(x),!0))||[];_=new o(Po(_.body,Ms,re,()=>{me&&me(),le&&le()}),K)}F=F||"text";let W=await p[d.findKey(p,F)||"text"](_,m);return!E&&le&&le(),await new Promise((K,j)=>{we(K,j,{data:W,headers:B.from(_.headers),status:_.status,statusText:_.statusText,config:m,request:ne})})}catch(J){throw le&&le(),J&&J.name==="TypeError"&&/Load failed|fetch/i.test(J.message)?Object.assign(new w("Network Error",w.ERR_NETWORK,m,ne),{cause:J.cause||J}):w.from(J,J&&J.code,m,ne)}}},vu=new Map,Do=t=>{let e=d.merge.call({skipUndefined:!0},Fs,t?t.env:null),{fetch:r,Request:o,Response:i}=e,n=[o,i,r],s=n.length,a=s,l,c,u=vu;for(;a--;)l=n[a],c=u.get(l),c===void 0&&u.set(l,c=a?new Map:_u(e)),u=c;return c},Lb=Do();var ko={http:xs,xhr:ks,fetch:{get:Do}};d.forEach(ko,(t,e)=>{if(t){try{Object.defineProperty(t,"name",{value:e})}catch{}Object.defineProperty(t,"adapterName",{value:e})}});var qs=t=>`- ${t}`,Ru=t=>d.isFunction(t)||t===null||t===!1,Tr={getAdapter:(t,e)=>{t=d.isArray(t)?t:[t];let{length:r}=t,o,i,n={};for(let s=0;s<r;s++){o=t[s];let a;if(i=o,!Ru(o)&&(i=ko[(a=String(o)).toLowerCase()],i===void 0))throw new w(`Unknown adapter '${a}'`);if(i&&(d.isFunction(i)||(i=i.get(e))))break;n[a||"#"+s]=i}if(!i){let s=Object.entries(n).map(([l,c])=>`adapter ${l} `+(c===!1?"is not supported by the environment":"is not available in the build")),a=r?s.length>1?`since :
9
+ `+s.map(qs).join(`
10
+ `):" "+qs(s[0]):"as no adapter specified";throw new w("There is no suitable adapter to dispatch the request "+a,"ERR_NOT_SUPPORT")}return i},adapters:ko};function Lo(t){if(t.cancelToken&&t.cancelToken.throwIfRequested(),t.signal&&t.signal.aborted)throw new ae(null,t)}function wr(t){return Lo(t),t.headers=B.from(t.headers),t.data=Lt.call(t,t.transformRequest),["post","put","patch"].indexOf(t.method)!==-1&&t.headers.setContentType("application/x-www-form-urlencoded",!1),Tr.getAdapter(t.adapter||lt.adapter,t)(t).then(function(o){return Lo(t),o.data=Lt.call(t,t.transformResponse,o),o.headers=B.from(o.headers),o},function(o){return Mt(o)||(Lo(t),o&&o.response&&(o.response.data=Lt.call(t,t.transformResponse,o.response),o.response.headers=B.from(o.response.headers))),Promise.reject(o)})}var Ar={};["object","boolean","number","function","string","symbol"].forEach((t,e)=>{Ar[t]=function(o){return typeof o===t||"a"+(e<1?"n ":" ")+t}});var js={};Ar.transitional=function(e,r,o){function i(n,s){return"[Axios v"+He+"] Transitional option '"+n+"'"+s+(o?". "+o:"")}return(n,s,a)=>{if(e===!1)throw new w(i(s," has been removed"+(r?" in "+r:"")),w.ERR_DEPRECATED);return r&&!js[s]&&(js[s]=!0,console.warn(i(s," has been deprecated since v"+r+" and will be removed in the near future"))),e?e(n,s,a):!0}};Ar.spelling=function(e){return(r,o)=>(console.warn(`${o} is likely a misspelling of ${e}`),!0)};function xu(t,e,r){if(typeof t!="object")throw new w("options must be an object",w.ERR_BAD_OPTION_VALUE);let o=Object.keys(t),i=o.length;for(;i-- >0;){let n=o[i],s=e[n];if(s){let a=t[n],l=a===void 0||s(a,n,t);if(l!==!0)throw new w("option "+n+" must be "+l,w.ERR_BAD_OPTION_VALUE);continue}if(r!==!0)throw new w("Unknown option "+n,w.ERR_BAD_OPTION)}}var Ut={assertOptions:xu,validators:Ar};var Ae=Ut.validators,mt=class{constructor(e){this.defaults=e||{},this.interceptors={request:new mo,response:new mo}}async request(e,r){try{return await this._request(e,r)}catch(o){if(o instanceof Error){let i={};Error.captureStackTrace?Error.captureStackTrace(i):i=new Error;let n=i.stack?i.stack.replace(/^.+\n/,""):"";try{o.stack?n&&!String(o.stack).endsWith(n.replace(/^.+\n.+\n/,""))&&(o.stack+=`
11
+ `+n):o.stack=n}catch{}}throw o}}_request(e,r){typeof e=="string"?(r=r||{},r.url=e):r=e||{},r=ge(this.defaults,r);let{transitional:o,paramsSerializer:i,headers:n}=r;o!==void 0&&Ut.assertOptions(o,{silentJSONParsing:Ae.transitional(Ae.boolean),forcedJSONParsing:Ae.transitional(Ae.boolean),clarifyTimeoutError:Ae.transitional(Ae.boolean)},!1),i!=null&&(d.isFunction(i)?r.paramsSerializer={serialize:i}:Ut.assertOptions(i,{encode:Ae.function,serialize:Ae.function},!0)),r.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?r.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:r.allowAbsoluteUrls=!0),Ut.assertOptions(r,{baseUrl:Ae.spelling("baseURL"),withXsrfToken:Ae.spelling("withXSRFToken")},!0),r.method=(r.method||this.defaults.method||"get").toLowerCase();let s=n&&d.merge(n.common,n[r.method]);n&&d.forEach(["delete","get","head","post","put","patch","common"],m=>{delete n[m]}),r.headers=B.concat(s,n);let a=[],l=!0;this.interceptors.request.forEach(function(y){typeof y.runWhen=="function"&&y.runWhen(r)===!1||(l=l&&y.synchronous,a.unshift(y.fulfilled,y.rejected))});let c=[];this.interceptors.response.forEach(function(y){c.push(y.fulfilled,y.rejected)});let u,p=0,g;if(!l){let m=[wr.bind(this),void 0];for(m.unshift(...a),m.push(...c),g=m.length,u=Promise.resolve(r);p<g;)u=u.then(m[p++],m[p++]);return u}g=a.length;let b=r;for(p=0;p<g;){let m=a[p++],y=a[p++];try{b=m(b)}catch(T){y.call(this,T);break}}try{u=wr.call(this,b)}catch(m){return Promise.reject(m)}for(p=0,g=c.length;p<g;)u=u.then(c[p++],c[p++]);return u}getUri(e){e=ge(this.defaults,e);let r=We(e.baseURL,e.url,e.allowAbsoluteUrls);return ze(r,e.params,e.paramsSerializer)}};d.forEach(["delete","get","head","options"],function(e){mt.prototype[e]=function(r,o){return this.request(ge(o||{},{method:e,url:r,data:(o||{}).data}))}});d.forEach(["post","put","patch"],function(e){function r(o){return function(n,s,a){return this.request(ge(a||{},{method:e,headers:o?{"Content-Type":"multipart/form-data"}:{},url:n,data:s}))}}mt.prototype[e]=r(),mt.prototype[e+"Form"]=r(!0)});var Ft=mt;var Mo=class t{constructor(e){if(typeof e!="function")throw new TypeError("executor must be a function.");let r;this.promise=new Promise(function(n){r=n});let o=this;this.promise.then(i=>{if(!o._listeners)return;let n=o._listeners.length;for(;n-- >0;)o._listeners[n](i);o._listeners=null}),this.promise.then=i=>{let n,s=new Promise(a=>{o.subscribe(a),n=a}).then(i);return s.cancel=function(){o.unsubscribe(n)},s},e(function(n,s,a){o.reason||(o.reason=new ae(n,s,a),r(o.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(e){if(this.reason){e(this.reason);return}this._listeners?this._listeners.push(e):this._listeners=[e]}unsubscribe(e){if(!this._listeners)return;let r=this._listeners.indexOf(e);r!==-1&&this._listeners.splice(r,1)}toAbortSignal(){let e=new AbortController,r=o=>{e.abort(o)};return this.subscribe(r),e.signal.unsubscribe=()=>this.unsubscribe(r),e.signal}static source(){let e;return{token:new t(function(i){e=i}),cancel:e}}},Vs=Mo;function Oo(t){return function(r){return t.apply(null,r)}}function No(t){return d.isObject(t)&&t.isAxiosError===!0}var Uo={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(Uo).forEach(([t,e])=>{Uo[e]=t});var Bs=Uo;function zs(t){let e=new Ft(t),r=xt(Ft.prototype.request,e);return d.extend(r,Ft.prototype,e,{allOwnKeys:!0}),d.extend(r,e,null,{allOwnKeys:!0}),r.create=function(i){return zs(ge(t,i))},r}var $=zs(lt);$.Axios=Ft;$.CanceledError=ae;$.CancelToken=Vs;$.isCancel=Mt;$.VERSION=He;$.toFormData=Ie;$.AxiosError=w;$.Cancel=$.CanceledError;$.all=function(e){return Promise.all(e)};$.spread=Oo;$.isAxiosError=No;$.mergeConfig=ge;$.AxiosHeaders=B;$.formToJSON=t=>fr(d.isHTMLForm(t)?new FormData(t):t);$.getAdapter=Tr.getAdapter;$.HttpStatusCode=Bs;$.default=$;var qt=$;var{Axios:IT,AxiosError:PT,CanceledError:DT,isCancel:kT,CancelToken:LT,VERSION:MT,all:OT,Cancel:NT,isAxiosError:De,spread:UT,toFormData:FT,AxiosHeaders:qT,HttpStatusCode:jT,formToJSON:VT,getAdapter:BT,mergeConfig:zT}=qt;function Fo(t,e){let r=t[e]||"";return typeof r=="string"?r:""}import{makeApi as Fu,makeEndpoint as ft}from"@zodios/core";import{z as U}from"zod";import{z as h}from"zod";var Iu=h.object({name:h.string(),description:h.string(),id:h.string(),schema_version:h.string(),metric_version:h.coerce.number(),definition_version:h.coerce.number(),last_updated_user:h.object({id:h.string()}).optional()}),Pu=h.object({id:h.string()}),Ws=h.object({field:h.string(),operator:h.string(),categorical_values:h.array(h.object({string_value:h.string().optional(),bool_value:h.boolean().optional(),null_value:h.string().optional()}))}),Sr=h.object({measure:h.object({field:h.string(),aggregation:h.string()}),time_dimension:h.object({field:h.string()}),filters:h.array(Ws)}),Du=h.object({datasource:Pu,basic_specification:Sr.optional(),viz_state_specification:h.object({viz_state_string:h.string()}).optional(),is_running_total:h.boolean()}),Hs=h.object({allowed_dimensions:h.array(h.string()),allowed_granularities:h.array(h.string()),offset_from_today:h.number()}),$s=h.object({filters:h.array(Ws),measurement_period:h.object({granularity:h.string(),range:h.string()}),comparison:h.object({comparison:h.string()})}),Gs=h.object({target:h.object({value:h.number()}).optional()}),Er=h.object({id:h.string(),specification:$s,definition_id:h.string(),is_default:h.boolean(),schema_version:h.string(),metric_version:h.coerce.number(),goals:Gs.optional(),is_followed:h.boolean(),datasource_luid:h.string()}),Qs=h.object({type:h.string(),number_units:h.object({singular_noun:h.string(),plural_noun:h.string()}),sentiment_type:h.string(),row_level_id_field:h.object({identifier_col:h.string()}),row_level_entity_names:h.object({entity_name_singular:h.string().optional(),entity_name_plural:h.string().optional()}),row_level_name_field:h.object({name_col:h.string()}),currency_code:h.string()}),Ks=h.object({settings:h.array(h.object({type:h.string(),disabled:h.boolean()}))}),ku=h.object({comparisons:h.array(h.object({compare_config:h.object({comparison:h.string()}),index:h.coerce.number()}))}),Lu=h.array(h.object({basic_specification:Sr.optional(),threshold_basic_specification:Sr.optional(),threshold_viz_state_specification:h.object({viz_state_string:h.string()}).optional(),viz_state_specification:h.object({viz_state_string:h.string()}).optional(),minimum_granularity:h.string(),benchmark_sentiment_type:h.string(),name:h.string()})),qo=h.object({metadata:Iu,specification:Du,extension_options:Hs,metrics:h.array(Er),total_metrics:h.coerce.number(),representation_options:Qs,insights_options:Ks,comparisons:ku,datasource_goals:Lu}),Js=h.object({id:h.string(),metric_id:h.string()}),Mu=h.enum(["LANGUAGE_UNSPECIFIED","LANGUAGE_DE_DE","LANGUAGE_EN_US","LANGUAGE_EN_GB","LANGUAGE_ES_ES","LANGUAGE_FR_FR","LANGUAGE_FR_CA","LANGUAGE_GA_IE","LANGUAGE_IT_IT","LANGUAGE_JA_JP","LANGUAGE_KO_KR","LANGUAGE_NL_NL","LANGUAGE_PT_BR","LANGUAGE_SV_SE","LANGUAGE_TH_TH","LANGUAGE_ZH_CN","LANGUAGE_ZH_TW"]),Ou=h.enum(["LOCALE_UNSPECIFIED","LOCALE_AR_AE","LOCALE_AR_BH","LOCALE_AR_DZ","LOCALE_AR_EG","LOCALE_AR_IQ","LOCALE_AR_JO","LOCALE_AR_KW","LOCALE_AR_LB","LOCALE_AR_LY","LOCALE_AR_MA","LOCALE_AR_OM","LOCALE_AR_QA","LOCALE_AR_SA","LOCALE_AR_SD","LOCALE_AR_SY","LOCALE_AR_TN","LOCALE_AR_YE","LOCALE_BE_BY","LOCALE_BG_BG","LOCALE_CA_ES","LOCALE_CS_CZ","LOCALE_DA_DK","LOCALE_DE_AT","LOCALE_DE_CH","LOCALE_DE_DE","LOCALE_DE_LU","LOCALE_EL_CY","LOCALE_EL_GR","LOCALE_EN_AU","LOCALE_EN_CA","LOCALE_EN_GB","LOCALE_EN_IE","LOCALE_EN_IN","LOCALE_EN_MT","LOCALE_EN_NZ","LOCALE_EN_PH","LOCALE_EN_SG","LOCALE_EN_US","LOCALE_EN_ZA","LOCALE_ES_AR","LOCALE_ES_BO","LOCALE_ES_CL","LOCALE_ES_CO","LOCALE_ES_CR","LOCALE_ES_DO","LOCALE_ES_EC","LOCALE_ES_ES","LOCALE_ES_GT","LOCALE_ES_HN","LOCALE_ES_MX","LOCALE_ES_NI","LOCALE_ES_PA","LOCALE_ES_PE","LOCALE_ES_PR","LOCALE_ES_PY","LOCALE_ES_SV","LOCALE_ES_US","LOCALE_ES_UY","LOCALE_ES_VE","LOCALE_ET_EE","LOCALE_FI_FI","LOCALE_FR_BE","LOCALE_FR_CA","LOCALE_FR_CH","LOCALE_FR_FR","LOCALE_FR_LU","LOCALE_GA_IE","LOCALE_HE_IL","LOCALE_HI_IN","LOCALE_HR_HR","LOCALE_HU_HU","LOCALE_ID_ID","LOCALE_IN_ID","LOCALE_IS_IS","LOCALE_IT_CH","LOCALE_IT_IT","LOCALE_IW_IL","LOCALE_JA_JP","LOCALE_KO_KR","LOCALE_LT_LT","LOCALE_LV_LV","LOCALE_MK_MK","LOCALE_MS_MY","LOCALE_MT_MT","LOCALE_NL_BE","LOCALE_NL_NL","LOCALE_NB_NO","LOCALE_NO_NO","LOCALE_PL_PL","LOCALE_PT_BR","LOCALE_PT_PT","LOCALE_RO_RO","LOCALE_RU_RU","LOCALE_SK_SK","LOCALE_SL_SI","LOCALE_SQ_AL","LOCALE_SR_BA","LOCALE_SR_ME","LOCALE_SR_RS","LOCALE_SV_SE","LOCALE_TH_TH","LOCALE_TR_TR","LOCALE_UK_UA","LOCALE_VI_VN","LOCALE_ZH_CN","LOCALE_ZH_HK","LOCALE_ZH_SG","LOCALE_ZH_TW"]),Nu=h.enum(["OUTPUT_FORMAT_UNSPECIFIED","OUTPUT_FORMAT_HTML","OUTPUT_FORMAT_TEXT"]),_r=h.object({bundle_request:h.object({version:h.number(),options:h.object({output_format:Nu,time_zone:h.string(),language:Mu,locale:Ou}),input:h.object({metadata:h.object({name:h.string().nonempty(),metric_id:h.string().nonempty(),definition_id:h.string().nonempty()}),metric:h.object({definition:h.object({datasource:h.object({id:h.string()}),basic_specification:Sr,is_running_total:h.boolean()}),metric_specification:$s,extension_options:Hs,representation_options:Qs,insights_options:Ks,goals:Gs.optional()})})})}),Uu=h.object({type:h.string(),insights:h.array(h.object({result:h.object({type:h.string(),version:h.number(),content:h.string().optional(),markup:h.string().optional(),viz:h.any().optional(),facts:h.any().optional(),characterization:h.string().optional(),question:h.string(),score:h.number()}),insight_type:h.string()})),summaries:h.array(h.object({result:h.object({id:h.string(),markup:h.string().optional(),viz:h.any().optional(),generation_id:h.string(),timestamp:h.string().optional(),last_attempted_timestamp:h.string().optional()})}))}),Ys=h.object({bundle_response:h.object({result:h.object({insight_groups:h.array(Uu),has_errors:h.boolean(),characterization:h.string()})})}),vr=["ban","springboard","basic","detail"],Ge=["DEFINITION_VIEW_BASIC","DEFINITION_VIEW_FULL","DEFINITION_VIEW_DEFAULT"];var qu=ft({method:"get",path:"/pulse/definitions",alias:"listAllPulseMetricDefinitions",description:"Returns a list of all published Pulse Metric Definitions on the specified site.",parameters:[{name:"view",type:"Query",schema:U.optional(U.enum(Ge)),description:`The range of metrics to return for a definition. The default is 'DEFINITION_VIEW_BASIC' if not specified.
12
12
  - 'DEFINITION_VIEW_BASIC' - Return only the specified metric definition.
13
13
  - 'DEFINITION_VIEW_FULL' - Return the metric definition and the specified number of metrics.
14
- - 'DEFINITION_VIEW_DEFAULT' - Return the metric definition and the default metric.`},{name:"page_size",type:"Query",schema:M.optional(M.coerce.number().int().positive()),description:"Specifies the number of results in a paged response."},{name:"page_token",type:"Query",schema:M.optional(M.string()),description:"Token for retrieving the next page of results. Omit for the first page."}],response:M.object({definitions:M.array(Ro),next_page_token:M.string().optional(),offset:M.coerce.number(),total_available:M.coerce.number()})}),yu=mt({method:"post",path:"/pulse/definitions%3AbatchGet",alias:"listPulseMetricDefinitionsFromMetricDefinitionIds",description:"Returns a list of published Pulse Metric Definitions from a list of metric definition IDs.",parameters:[{name:"definition_ids",type:"Body",schema:M.object({definition_ids:M.array(M.string().nonempty()).min(1)}),description:"A list of metric definition IDs to retrieve."},{name:"view",type:"Query",schema:M.optional(M.enum(He)),description:`The range of metrics to return for a definition. The default is 'DEFINITION_VIEW_BASIC' if not specified.
14
+ - 'DEFINITION_VIEW_DEFAULT' - Return the metric definition and the default metric.`},{name:"page_size",type:"Query",schema:U.optional(U.coerce.number().int().positive()),description:"Specifies the number of results in a paged response."},{name:"page_token",type:"Query",schema:U.optional(U.string()),description:"Token for retrieving the next page of results. Omit for the first page."}],response:U.object({definitions:U.array(qo),next_page_token:U.string().optional(),offset:U.coerce.number(),total_available:U.coerce.number()})}),ju=ft({method:"post",path:"/pulse/definitions%3AbatchGet",alias:"listPulseMetricDefinitionsFromMetricDefinitionIds",description:"Returns a list of published Pulse Metric Definitions from a list of metric definition IDs.",parameters:[{name:"definition_ids",type:"Body",schema:U.object({definition_ids:U.array(U.string().nonempty()).min(1)}),description:"A list of metric definition IDs to retrieve."},{name:"view",type:"Query",schema:U.optional(U.enum(Ge)),description:`The range of metrics to return for a definition. The default is 'DEFINITION_VIEW_BASIC' if not specified.
15
15
  - 'DEFINITION_VIEW_BASIC' - Return only the specified metric definition.
16
16
  - 'DEFINITION_VIEW_FULL' - Return the metric definition and the specified number of metrics.
17
- - 'DEFINITION_VIEW_DEFAULT' - Return the metric definition and the default metric.`}],response:M.object({definitions:M.array(Ro)})}),wu=mt({method:"get",path:"/pulse/definitions/:pulseMetricDefinitionID/metrics",alias:"listPulseMetricsFromMetricDefinitionId",description:"Returns a list of published Pulse Metrics for a specific Pulse Metric Definition.",parameters:[{name:"pulseMetricDefinitionID",type:"Path",schema:M.string().nonempty()}],response:M.object({metrics:M.array(Ar),total_available:M.number()})}),Tu=mt({method:"post",path:"/pulse/metrics%3AbatchGet",alias:"listPulseMetricsFromMetricIds",description:"Returns a list of Pulse Metrics for a list of metric IDs.",parameters:[{name:"metric_ids",type:"Body",schema:M.object({metric_ids:M.array(M.string().nonempty())})}],response:M.object({metrics:M.array(Ar)})}),Au=mt({method:"get",path:"/pulse/subscriptions",alias:"listPulseMetricSubscriptionsForCurrentUser",description:"Returns a list of Pulse Subscriptions for the current user.",parameters:[{name:"user_id",type:"Query",schema:M.string().nonempty()}],response:M.object({subscriptions:M.array(Ns)})}),Eu=mt({method:"post",path:"/pulse/insights/:bundle_type",alias:"generatePulseMetricValueInsightBundle",description:"Generates a bundle for the current aggregated value for the Pulse metric.",parameters:[{name:"bundle_request",type:"Body",schema:Er},{name:"bundle_type",type:"Path",schema:M.enum(_r)}],response:Fs}),_u=gu([Eu,bu,yu,wu,Au,Tu]),Us=[..._u];var Ut=class extends H{constructor(e,r){super(new Su(e,Us),r)}listAllPulseMetricDefinitions=async(e,r,o)=>await ft(async()=>{let i=await this._apiClient.listAllPulseMetricDefinitions({queries:{view:e,page_token:r,page_size:o},...this.authHeader});return{pagination:{next_page_token:i.next_page_token,offset:i.offset,total_available:i.total_available},definitions:i.definitions??[]}});listPulseMetricDefinitionsFromMetricDefinitionIds=async(e,r)=>await ft(async()=>(await this._apiClient.listPulseMetricDefinitionsFromMetricDefinitionIds({definition_ids:e},{queries:{view:r},...this.authHeader})).definitions??[]);listPulseMetricsFromMetricDefinitionId=async e=>await ft(async()=>(await this._apiClient.listPulseMetricsFromMetricDefinitionId({params:{pulseMetricDefinitionID:e},...this.authHeader})).metrics??[]);listPulseMetricsFromMetricIds=async e=>await ft(async()=>(await this._apiClient.listPulseMetricsFromMetricIds({metric_ids:e},{...this.authHeader})).metrics??[]);listPulseMetricSubscriptionsForCurrentUser=async()=>await ft(async()=>(await this._apiClient.listPulseMetricSubscriptionsForCurrentUser({queries:{user_id:this.userId},...this.authHeader})).subscriptions??[]);generatePulseMetricValueInsightBundle=async(e,r)=>await ft(async()=>await this._apiClient.generatePulseMetricValueInsightBundle({bundle_request:e.bundle_request},{params:{bundle_type:r},...this.authHeader})??{})};async function ft(t){try{return new vu(await t())}catch(e){if(xe(e)){if(e.response?.status===404)return new qs("tableau-server");if(e.response?.status===400&&e.response.headers.tableau_error_code==="0xd3408984"&&e.response.headers.validation_code==="400999")return new qs("pulse-disabled")}throw e}}import{isErrorFromAlias as Pu,Zodios as Du}from"@zodios/core";import{Err as ko,Ok as Lu}from"ts-results-es";import{makeApi as Cu,makeEndpoint as zs}from"@zodios/core";import{z as Ie}from"zod";import{z as qt}from"zod";var js=qt.object({productVersion:qt.object({value:qt.string(),build:qt.string()}),restApiVersion:qt.string()});import{z as xo}from"zod";var Vs=xo.object({id:xo.string(),name:xo.string()});import{z as Io}from"zod";var Bs=Io.object({id:Io.string(),name:Io.string()});var Ru=Ie.object({site:Vs,user:Bs}),xu=zs({method:"get",path:"/serverinfo",alias:"getServerInfo",description:"Returns the version of Tableau Server and the supported version of the REST API.",response:Ie.object({serverInfo:js})}),Iu=zs({method:"get",path:"/sessions/current",alias:"getCurrentServerSession",description:"Returns details of the current session of Tableau Server.",response:Ie.object({session:Ru}),errors:[{status:401,schema:Ie.object({error:Ie.object({code:Ie.string(),summary:Ie.string(),detail:Ie.string()})})}]}),ku=Cu([xu,Iu]),Ws=[...ku];var jt=class extends H{constructor(e,r){super(new Du(e,Ws),r)}getServerInfo=async()=>(await this._apiClient.getServerInfo()).serverInfo;getCurrentServerSession=async()=>{try{let e=await this._apiClient.getCurrentServerSession({...this.authHeader});return Lu(e.session)}catch(e){return Pu(this._apiClient.api,"getCurrentServerSession",e)?ko({type:"unauthorized",message:e.response.data.error}):xe(e)&&e.response?ko({type:"unknown",message:e.response.data}):ko({type:"unknown",message:W(e)})}}};import{Zodios as Vu}from"@zodios/core";import{makeApi as Ou,makeEndpoint as Vt}from"@zodios/core";import{z as X}from"zod";import{z as Z}from"zod";var ht=Z.object({id:Z.string(),name:Z.string(),createdAt:Z.string(),updatedAt:Z.string(),workbook:Z.object({id:Z.string()}).optional(),owner:Z.object({id:Z.string()}).optional(),project:Z.object({id:Z.string()}).optional(),tags:Z.object({tag:Z.array(Z.object({label:Z.string()})).optional()}),usage:Z.object({totalViewCount:Z.coerce.number()}).optional()});var Mu=Vt({method:"get",path:"/sites/:siteId/views/:viewId",alias:"getView",description:"Gets the details of a specific view.",response:X.object({view:ht})}),Nu=Vt({method:"get",path:"/sites/:siteId/views/:viewId/data",alias:"queryViewData",description:"Returns a specified view rendered as data in comma separated value (CSV) format.",response:X.string()}),Fu=Vt({method:"get",path:"/sites/:siteId/views/:viewId/image",alias:"queryViewImage",description:"Returns an image of the specified view.",parameters:[{name:"vizWidth",type:"Query",schema:X.number().optional(),description:"The width of the rendered image in pixels that, along with the value of vizHeight determine its resolution and aspect ratio."},{name:"vizHeight",type:"Query",schema:X.number().optional(),description:"The height of the rendered image in pixels that, along with the value of vizWidth determine its resolution and aspect ratio."},{name:"resolution",type:"Query",schema:X.literal("high").optional(),description:"The resolution of the image. Image width and actual pixel density are determined by the display context of the image. Aspect ratio is always preserved. Set the value to high to ensure maximum pixel density."}],response:X.string()}),Uu=Vt({method:"get",path:"/sites/:siteId/workbooks/:workbookId/views",alias:"queryViewsForWorkbook",description:"Returns all the views for the specified workbook, optionally including usage statistics.",parameters:[{name:"includeUsageStatistics",type:"Query",schema:X.boolean().optional(),description:"true to return usage statistics. The default is false."}],response:X.object({views:X.object({view:X.array(ht)})})}),qu=Vt({method:"get",path:"/sites/:siteId/views",alias:"queryViewsForSite",description:"Returns all the views for the specified site, optionally including usage statistics.",parameters:[...rt,{name:"includeUsageStatistics",type:"Query",schema:X.boolean().optional(),description:"true to return usage statistics. The default is false."},{name:"filter",type:"Query",schema:X.string().optional(),description:"An expression that lets you specify a subset of views to return. You can filter on predefined fields such as name, tags, and createdAt. You can include multiple filter expressions."}],response:X.object({pagination:tt,views:X.object({view:X.array(ht).optional()})})}),ju=Ou([Mu,Nu,Fu,Uu,qu]),Hs=[...ju];var Bt=class extends H{constructor(e,r){super(new Vu(e,Hs),r)}getView=async({viewId:e,siteId:r})=>(await this._apiClient.getView({params:{siteId:r,viewId:e},...this.authHeader})).view;queryViewData=async({viewId:e,siteId:r})=>await this._apiClient.queryViewData({params:{siteId:r,viewId:e},...this.authHeader});queryViewImage=async({viewId:e,siteId:r,width:o,height:i,resolution:n})=>await this._apiClient.queryViewImage({params:{siteId:r,viewId:e},queries:{vizWidth:o,vizHeight:i,resolution:n},...this.authHeader,responseType:"arraybuffer"});queryViewsForWorkbook=async({workbookId:e,siteId:r,includeUsageStatistics:o})=>(await this._apiClient.queryViewsForWorkbook({params:{siteId:r,workbookId:e},queries:{includeUsageStatistics:o},...this.authHeader})).views.view;queryViewsForSite=async({siteId:e,includeUsageStatistics:r,filter:o,pageSize:i,pageNumber:n})=>{let s=await this._apiClient.queryViewsForSite({params:{siteId:e},queries:{includeUsageStatistics:r,filter:o,pageSize:i,pageNumber:n},...this.authHeader});return{pagination:s.pagination,views:s.views.view??[]}}};import{isErrorFromAlias as Xs,Zodios as cd,ZodiosError as ud}from"@zodios/core";import{Err as vr,Ok as en}from"ts-results-es";import{makeApi as Bu}from"@zodios/core";import{z as m}from"zod";var zu=m.object({connectionLuid:m.string().optional(),connectionUsername:m.string(),connectionPassword:m.string()}),Gs=m.object({datasourceLuid:m.string().nonempty(),connections:m.array(zu).optional()}),Wu=m.enum(["OBJECTS","ARRAYS"]),$s=m.object({returnFormat:Wu,debug:m.boolean().default(!1)}).partial().passthrough(),Hu=m.object({datasource:Gs,options:$s.optional()}).passthrough(),Lo=m.enum(["SUM","AVG","MEDIAN","COUNT","COUNTD","MIN","MAX","STDEV","VAR","COLLECT","YEAR","QUARTER","MONTH","WEEK","DAY","TRUNC_YEAR","TRUNC_QUARTER","TRUNC_MONTH","TRUNC_WEEK","TRUNC_DAY","AGG","NONE","UNSPECIFIED"]),Qs=m.enum(["INTEGER","REAL","STRING","DATETIME","BOOLEAN","DATE","SPATIAL","UNKNOWN"]),Ks=m.enum(["MINUTES","HOURS","DAYS","WEEKS","MONTHS","QUARTERS","YEARS"]),Gu=m.object({fieldName:m.string(),fieldCaption:m.string(),dataType:Qs,defaultAggregation:Lo,columnClass:m.enum(["COLUMN","BIN","GROUP","CALCULATION","TABLE_CALCULATION"]),formula:m.string(),logicalTableId:m.string()}).partial().passthrough(),Js=m.union([m.number(),m.string(),m.boolean(),m.null()]),Sr=m.object({parameterCaption:m.string(),dataType:Qs.exclude(["DATETIME","SPATIAL","UNKNOWN"]),parameterName:m.string().optional(),value:Js}),$u=m.discriminatedUnion("parameterType",[Sr.extend({parameterType:m.literal("ANY_VALUE")}).strict(),Sr.extend({parameterType:m.literal("LIST"),members:m.array(Js)}).strict(),Sr.extend({parameterType:m.literal("QUANTITATIVE_DATE"),value:m.string().nullable(),minDate:m.string().nullish(),maxDate:m.string().nullish(),periodValue:m.number().nullish(),periodType:Ks.nullish()}).strict(),Sr.extend({parameterType:m.literal("QUANTITATIVE_RANGE"),value:m.number().nullable(),min:m.number().nullish(),max:m.number().nullish(),step:m.number().nullish()}).strict()]),Qu=m.object({data:m.array(Gu),extraData:m.object({parameters:m.array($u)})}).partial().passthrough(),Ku=m.object({errorCode:m.string(),message:m.string(),datetime:m.string().datetime({offset:!0}),debug:m.object({}).partial().passthrough(),"tab-error-code":m.string()}).partial().passthrough(),Ju=m.enum(["ASC","DESC"]),Po=m.object({fieldCaption:m.string(),fieldAlias:m.string().optional(),maxDecimalPlaces:m.number().int().optional(),sortDirection:Ju.optional(),sortPriority:m.number().int().optional()}),Zu=m.union([Po.strict(),Po.extend({function:Lo}).strict(),Po.extend({calculation:m.string()}).strict()]),Zs=m.union([m.object({fieldCaption:m.string()}).strict(),m.object({fieldCaption:m.string(),function:Lo}).strict(),m.object({calculation:m.string()}).strict()]),Oo=m.object({field:Zs,context:m.boolean().optional()}),Mo=m.object({field:m.object({fieldCaption:m.string()}).strict(),context:m.boolean().optional()}),Yu=Mo.extend({filterType:m.literal("SET"),values:m.union([m.array(m.string()),m.array(m.number()),m.array(m.boolean())]),exclude:m.boolean().optional()}),gt=Mo.extend({filterType:m.literal("DATE"),periodType:Ks,anchorDate:m.string().optional(),includeNulls:m.boolean().optional()}),Xu=m.discriminatedUnion("dateRangeType",[gt.extend({dateRangeType:m.literal("CURRENT")}).strict(),gt.extend({dateRangeType:m.literal("LAST")}).strict(),gt.extend({dateRangeType:m.literal("NEXT")}).strict(),gt.extend({dateRangeType:m.literal("TODATE")}).strict(),gt.extend({dateRangeType:m.literal("LASTN"),rangeN:m.number().int()}).strict(),gt.extend({dateRangeType:m.literal("NEXTN"),rangeN:m.number().int()}).strict()]),Do=Mo.extend({filterType:m.literal("MATCH"),startsWith:m.string().optional(),endsWith:m.string().optional(),contains:m.string().optional(),exclude:m.boolean().optional()}),ed=m.union([Do.extend({startsWith:m.string()}).strict(),Do.extend({endsWith:m.string()}).strict(),Do.extend({contains:m.string()}).strict()]),zt=Oo.extend({filterType:m.literal("QUANTITATIVE_NUMERICAL")}),td=m.discriminatedUnion("quantitativeFilterType",[zt.extend({quantitativeFilterType:m.literal("RANGE"),min:m.number(),max:m.number(),includeNulls:m.boolean().optional()}).strict(),zt.extend({quantitativeFilterType:m.literal("MIN"),min:m.number(),includeNulls:m.boolean().optional()}).strict(),zt.extend({quantitativeFilterType:m.literal("MAX"),max:m.number(),includeNulls:m.boolean().optional()}).strict(),zt.extend({quantitativeFilterType:m.literal("ONLY_NULL")}).strict(),zt.extend({quantitativeFilterType:m.literal("ONLY_NON_NULL")}).strict()]),Wt=Oo.extend({filterType:m.literal("QUANTITATIVE_DATE")}),rd=m.discriminatedUnion("quantitativeFilterType",[Wt.extend({quantitativeFilterType:m.literal("RANGE"),minDate:m.string(),maxDate:m.string(),includeNulls:m.boolean().optional()}).strict(),Wt.extend({quantitativeFilterType:m.literal("MIN"),minDate:m.string(),includeNulls:m.boolean().optional()}).strict(),Wt.extend({quantitativeFilterType:m.literal("MAX"),maxDate:m.string(),includeNulls:m.boolean().optional()}).strict(),Wt.extend({quantitativeFilterType:m.literal("ONLY_NULL")}).strict(),Wt.extend({quantitativeFilterType:m.literal("ONLY_NON_NULL")}).strict()]),od=Oo.extend({filterType:m.literal("TOP"),howMany:m.number().int(),fieldToMeasure:Zs,direction:m.enum(["TOP","BOTTOM"]).optional().default("TOP")}),id=m.union([Yu.strict(),od.strict(),...ed.options,...td.options,...rd.options,...Xu.options]),Ht=m.strictObject({fields:m.array(Zu),filters:m.array(id).optional()}),sd=$s.and(m.object({disaggregate:m.boolean()}).partial().passthrough()),nd=m.object({datasource:Gs,query:Ht,options:sd.optional()}).passthrough(),ad=m.object({data:m.array(m.unknown())}).partial().passthrough(),ld=Bu([{method:"post",path:"/query-datasource",alias:"queryDatasource",description:"Queries a specific data source and returns the resulting data.",requestFormat:"json",parameters:[{name:"body",type:"Body",schema:nd}],response:ad,errors:[{status:"default",schema:Ku},{status:404,schema:m.any()}]},{method:"post",path:"/read-metadata",alias:"readMetadata",description:"Requests metadata for a specific data source. The metadata provides information about the data fields, such as field names, data types, and descriptions.",requestFormat:"json",parameters:[{name:"body",type:"Body",schema:Hu}],response:Qu,errors:[{status:404,schema:m.any()}]},{method:"get",path:"/simple-request",alias:"simpleRequest",description:"Sends a request that can be used for testing or doing a health check.",requestFormat:"json",response:m.string()}]),Ys=[...ld];var Gt=class extends H{constructor(e,r){super(new cd(e,Ys),r)}queryDatasource=async e=>{try{return en(await this._apiClient.queryDatasource(e,{...this.authHeader}))}catch(r){if(Xs(this._apiClient.api,"queryDatasource",r))return r.response.status===404?vr("feature-disabled"):vr(r.response.data);if(r instanceof ud)return vr(r);throw r}};readMetadata=async e=>{try{return en(await this._apiClient.readMetadata(e,{...this.authHeader}))}catch(r){if(Xs(this._apiClient.api,"readMetadata",r)&&r.response.status===404)return vr("feature-disabled");throw r}}};import{Zodios as hd}from"@zodios/core";import{makeApi as dd,makeEndpoint as tn}from"@zodios/core";import{z as Ge}from"zod";import{z as ee}from"zod";var No=ee.object({id:ee.string(),name:ee.string(),description:ee.string().optional(),webpageUrl:ee.string().optional(),contentUrl:ee.string(),project:sr.optional(),showTabs:ee.coerce.boolean(),defaultViewId:ee.string().optional(),tags:ee.object({tag:ee.array(ee.object({label:ee.string()})).optional()}),views:ee.optional(ee.object({view:ee.array(ht)}))});var pd=tn({method:"get",path:"/sites/:siteId/workbooks/:workbookId",alias:"getWorkbook",description:"Returns information about the specified workbook, including information about views and tags.",response:Ge.object({workbook:No})}),md=tn({method:"get",path:"/sites/:siteId/workbooks",alias:"queryWorkbooksForSite",description:"Returns the workbooks on a site.",parameters:[...rt,{name:"siteId",type:"Path",schema:Ge.string()},{name:"filter",type:"Query",schema:Ge.string().optional(),description:"An expression that lets you specify a subset of workbooks to return. You can filter on predefined fields such as name, tags, and createdAt. You can include multiple filter expressions."}],response:Ge.object({pagination:tt,workbooks:Ge.object({workbook:Ge.optional(Ge.array(No))})})}),fd=dd([md,pd]),rn=[...fd];var $t=class extends H{constructor(e,r){super(new hd(e,rn),r)}getWorkbook=async({workbookId:e,siteId:r})=>(await this._apiClient.getWorkbook({params:{siteId:r,workbookId:e},...this.authHeader})).workbook;queryWorkbooksForSite=async({siteId:e,filter:r,pageSize:o,pageNumber:i})=>{let n=await this._apiClient.queryWorkbooksForSite({params:{siteId:e},queries:{filter:r,pageSize:o,pageNumber:i},...this.authHeader});return{pagination:n.pagination,workbooks:n.workbooks.workbook??[]}}};var bt=class t{_creds;_host;_baseUrl;_baseUrlWithoutVersion;_authenticationMethods;_authenticatedAuthenticationMethods;_contentExplorationMethods;_datasourcesMethods;_metadataMethods;_pulseMethods;_serverMethods;_vizqlDataServiceMethods;_viewsMethods;_workbooksMethods;static _version="3.24";_requestInterceptor;_responseInterceptor;constructor(e,r){this._host=e,this._baseUrl=`${this._host}/api/${t._version}`,this._baseUrlWithoutVersion=`${this._host}/api/-`,this._requestInterceptor=r?.requestInterceptor,this._responseInterceptor=r?.responseInterceptor}get creds(){if(!this._creds)throw new Error("No credentials found. Authenticate by calling signIn() first.");return this._creds}get siteId(){return this.creds.site.id}get authenticationMethods(){return this._authenticationMethods||(this._authenticationMethods=new _t(this._baseUrl),this._addInterceptors(this._baseUrl,this._authenticationMethods.interceptors)),this._authenticationMethods}get authenticatedAuthenticationMethods(){return this._authenticatedAuthenticationMethods||(this._authenticatedAuthenticationMethods=new ir(this._baseUrl,this.creds),this._addInterceptors(this._baseUrl,this._authenticatedAuthenticationMethods.interceptors)),this._authenticatedAuthenticationMethods}get contentExplorationMethods(){return this._contentExplorationMethods||(this._contentExplorationMethods=new St(this._baseUrlWithoutVersion,this.creds),this._addInterceptors(this._baseUrlWithoutVersion,this._contentExplorationMethods.interceptors)),this._contentExplorationMethods}get datasourcesMethods(){return this._datasourcesMethods||(this._datasourcesMethods=new vt(this._baseUrl,this.creds),this._addInterceptors(this._baseUrl,this._datasourcesMethods.interceptors)),this._datasourcesMethods}get metadataMethods(){if(!this._metadataMethods){let e=`${this._host}/api/metadata`;this._metadataMethods=new Ct(e,this.creds),this._addInterceptors(e,this._metadataMethods.interceptors)}return this._metadataMethods}get pulseMethods(){return this._pulseMethods||(this._pulseMethods=new Ut(this._baseUrlWithoutVersion,this.creds),this._addInterceptors(this._baseUrlWithoutVersion,this._pulseMethods.interceptors)),this._pulseMethods}get serverMethods(){return this._serverMethods||(this._serverMethods=new jt(this._baseUrl,this.creds),this._addInterceptors(this._baseUrl,this._serverMethods.interceptors)),this._serverMethods}get vizqlDataServiceMethods(){if(!this._vizqlDataServiceMethods){let e=`${this._host}/api/v1/vizql-data-service`;this._vizqlDataServiceMethods=new Gt(e,this.creds),this._addInterceptors(e,this._vizqlDataServiceMethods.interceptors)}return this._vizqlDataServiceMethods}get viewsMethods(){return this._viewsMethods||(this._viewsMethods=new Bt(this._baseUrl,this.creds),this._addInterceptors(this._baseUrl,this._viewsMethods.interceptors)),this._viewsMethods}get workbooksMethods(){return this._workbooksMethods||(this._workbooksMethods=new $t(this._baseUrl,this.creds),this._addInterceptors(this._baseUrl,this._workbooksMethods.interceptors)),this._workbooksMethods}signIn=async e=>{this._creds=await this.authenticationMethods.signIn(e)};signOut=async()=>{await this.authenticatedAuthenticationMethods.signOut(),this._creds=void 0};setCredentials=(e,r)=>{let o=e.split("|");if(o.length<3)throw new Error("Could not determine site ID. Access token must have 3 parts.");let i=o[2];this._creds={site:{id:i},user:{id:r},token:e}};_addInterceptors=(e,r)=>{r.request.use(o=>(this._requestInterceptor?.[0]({baseUrl:e,...rr(o)}),o),o=>(this._requestInterceptor?.[1]?.(o,e),Promise.reject(o))),r.response.use(o=>(this._responseInterceptor?.[0]({baseUrl:e,...or(o)}),o),o=>(this._responseInterceptor?.[1]?.(o,e),Promise.reject(o)))}};var gd=async(t,e,r,o,i)=>{let n=t.server||i?.server;ce(n,"Tableau server could not be determined");let s=new bt(n,{requestInterceptor:[bd(r,e),yd(r,e)],responseInterceptor:[wd(r,e),Td(r,e)]});if(t.auth==="pat")await s.signIn({type:"pat",patName:t.patName,patValue:t.patValue,siteName:t.siteName});else if(t.auth==="direct-trust")await s.signIn({type:"direct-trust",siteName:t.siteName,username:Ed(t,i),clientId:t.connectedAppClientId,secretId:t.connectedAppSecretId,secretValue:t.connectedAppSecretValue,scopes:o,additionalPayload:_d(t,i)});else{if(!i?.accessToken||!i?.userId)throw new Error("Auth info is required when not signing in first.");s.setCredentials(i.accessToken,i.userId)}return s},I=async({config:t,requestId:e,server:r,callback:o,jwtScopes:i,authInfo:n})=>{let s=await gd(t,e,r,new Set(i),n);try{return await o(s)}finally{t.auth!=="oauth"&&await s.signOut()}},bd=(t,e)=>r=>(r.headers["User-Agent"]=Ad(t),on(t,r,e),r),yd=(t,e)=>(r,o)=>{if(!xe(r)||!r.request){ue.error(t,`Request ${e} failed with error: ${W(r)}`,{logger:"rest-api",requestId:e});return}let{request:i}=r;on(t,{baseUrl:o,...rr(i)},e)},wd=(t,e)=>r=>(sn(t,r,e),r),Td=(t,e)=>(r,o)=>{if(!xe(r)||!r.response){ue.error(t,`Response from request ${e} failed with error: ${W(r)}`,{logger:"rest-api",requestId:e});return}let{response:i}=r;sn(t,{baseUrl:o,...or(i)},e)};function on(t,e,r){let i=E().disableLogMasking?e:hi(e),n=new URL(i.url??"",i.baseUrl);e.params&&Object.keys(e.params).length>0&&(n.search=new URLSearchParams(e.params).toString());let s={type:"request",requestId:r,method:i.method,url:n.toString(),...Oe("debug")&&{headers:i.headers,data:i.data,params:i.params}};ue.info(t,s,{logger:"rest-api",requestId:r})}function sn(t,e,r){let i=E().disableLogMasking?e:gi(e),n=new URL(i.url??"",i.baseUrl);e.request?.params&&Object.keys(e.request.params).length>0&&(n.search=new URLSearchParams(e.request.params).toString());let s={type:"response",requestId:r,url:n.toString(),status:i.status,...Oe("debug")&&{headers:i.headers,data:i.data}};ue.info(t,s,{logger:"rest-api",requestId:r})}function Ad(t){let e=[Cr];if(t.clientInfo){let{name:r,version:o}=t.clientInfo;r&&e.push(o?`(${r} ${o})`:`(${r})`)}return e.join(" ")}function Ed(t,e){return t.jwtSubClaim.replaceAll("{OAUTH_USERNAME}",e?.username??"")}function _d(t,e){let r=t.jwtAdditionalPayload.replaceAll("{OAUTH_USERNAME}",e?.username??"");return JSON.parse(r||"{}")}import{z as q}from"zod";import{z as Sd}from"zod";var B=t=>Sd.string({message:`${t} is required`}).nonempty({message:`${t} must be non-empty`});var nn=q.object({client_id:B("client_id"),redirect_uri:B("redirect_uri"),response_type:B("response_type"),code_challenge:B("code_challenge"),code_challenge_method:B("code_challenge_method"),state:q.string().optional()}).transform(t=>({clientId:t.client_id,redirectUri:t.redirect_uri,responseType:t.response_type,codeChallenge:t.code_challenge,codeChallengeMethod:t.code_challenge_method,state:t.state})),an=q.discriminatedUnion("grant_type",[q.object({grant_type:q.literal("authorization_code"),code:B("code"),redirect_uri:B("redirect_uri"),code_verifier:B("code_verifier")}),q.object({grant_type:q.literal("refresh_token"),refresh_token:B("refresh_token")}),q.object({grant_type:q.literal("client_credentials")})],{errorMap:(t,e)=>({message:t.code==="invalid_union_discriminator"?`grant_type must be ${t.options.map(r=>`'${String(r)}'`).join(" | ")}, got '${e.data.grant_type}'.`:e.defaultError})}).and(q.object({client_id:q.string().optional(),client_secret:q.string().optional()})).transform(t=>{let{client_id:e,client_secret:r}=t,o={clientId:e,clientSecret:r};return t.grant_type==="authorization_code"?{grantType:t.grant_type,code:t.code,redirectUri:t.redirect_uri,codeVerifier:t.code_verifier,...o}:t.grant_type==="refresh_token"?{grantType:t.grant_type,refreshToken:t.refresh_token,...o}:{grantType:t.grant_type,...o}}),ln=q.object({code:q.string().optional(),state:q.string().optional(),error:q.string().optional()}),Fo=q.object({iss:B("iss"),aud:B("aud"),exp:q.number().int().nonnegative(),sub:B("sub"),clientId:B("clientId"),tableauServer:B("tableauServer"),tableauUserId:q.string().optional()}),cn=Fo.extend({tableauAccessToken:B("tableauAccessToken"),tableauRefreshToken:B("tableauRefreshToken"),tableauExpiresAt:q.number().int().nonnegative(),tableauUserId:B("tableauUserId")}),Rr=q.object({username:q.string(),userId:q.string(),server:q.string(),accessToken:q.string(),refreshToken:q.string()}).partial();var N=t=>{if(!t)return;let e=Rr.safeParse(t.extra);if(e.success)return e.data};import{ZodiosError as un}from"@zodios/core";import{fromError as vd,isZodErrorLike as Cd}from"zod-validation-error";var ke=class{_provider;constructor(e){this._provider=e}get(){return this._provider()}};var O=class{server;name;description;paramsSchema;annotations;argsValidator;callback;constructor({server:e,name:r,description:o,paramsSchema:i,annotations:n,argsValidator:s,callback:a}){this.server=e,this.name=r,this.description=o instanceof ke?o.get():o,this.paramsSchema=i instanceof ke?i.get():i,this.annotations=n instanceof ke?n.get():n,this.argsValidator=s instanceof ke?s.get():s,this.callback=a instanceof ke?a.get():a}logInvocation({requestId:e,args:r,username:o}){ue.debug(this.server,pi({requestId:e,toolName:this.name,args:r,username:o}))}async logAndExecute({requestId:e,args:r,authInfo:o,callback:i,getSuccessResult:n,getErrorText:s,constrainSuccessResult:a}){let c=o?.extra?Rr.safeParse(o.extra).data?.username:void 0;if(this.logInvocation({requestId:e,args:r,username:c}),r)try{this.argsValidator?.(r)}catch(l){return xr(e,l)}try{let l=await i();if(l.isOk()){let u=await a(l.value);return u.type!=="success"?{isError:u.type==="error",content:[{type:"text",text:u.message}]}:n?n(u.result):{isError:!1,content:[{type:"text",text:JSON.stringify(u.result)}]}}return l.error instanceof un?xr(e,l.error):s?{isError:!0,content:[{type:"text",text:s(l.error)}]}:xr(e,l.error)}catch(l){return xr(e,l)}}};function xr(t,e){if(e instanceof un&&Cd(e.cause)){let r=vd(e.cause);return{isError:!1,content:[{type:"text",text:JSON.stringify({data:e.data,warning:r.toString()})}]}}return{isError:!0,content:[{type:"text",text:`requestId: ${t}, error: ${W(e)}`}]}}function dn(t){let e=new Set;return t.flatMap(r=>e.has(r.method)?[]:(e.add(r.method),r.method+(r.sortDirection?`:${r.sortDirection}`:""))).join(",")}function pn(t){let e=[];if(t.contentTypes)if(t.contentTypes.length===1)e.push(`type:eq:${t.contentTypes[0]}`);else{let r=new Set;for(let o of t.contentTypes)r.add(o);e.push(`type:in:[${Array.from(r).join(",")}]`)}if(t.ownerIds)if(t.ownerIds.length===1)e.push(`ownerId:eq:${t.ownerIds[0]}`);else{let r=new Set;for(let o of t.ownerIds)r.add(o);e.push(`ownerId:in:[${Array.from(r).join(",")}]`)}if(t.modifiedTime)if(Array.isArray(t.modifiedTime))if(t.modifiedTime.length===1)e.push(`modifiedTime:eq:${t.modifiedTime[0]}`);else{let r=new Set;for(let o of t.modifiedTime)r.add(o);e.push(`modifiedTime:in:[${Array.from(r).join(",")}]`)}else if(t.modifiedTime.startDate&&t.modifiedTime.endDate){let r=t.modifiedTime.startDate,o=t.modifiedTime.endDate;r>o&&(r=t.modifiedTime.endDate,o=t.modifiedTime.startDate),e.push(`modifiedTime:gte:${r}`),e.push(`modifiedTime:lte:${o}`)}else t.modifiedTime.startDate?e.push(`modifiedTime:gte:${t.modifiedTime.startDate}`):t.modifiedTime.endDate&&e.push(`modifiedTime:lte:${t.modifiedTime.endDate}`);return e.join(",")}function mn(t){let e=[];if(t.items)for(let o of t.items)e.push(Rd(o.content));let r=new Set(e.filter(o=>o.type==="unifieddatasource").map(o=>o.datasourceLuid).filter(o=>typeof o=="string"));e=e.filter(o=>o.type==="datasource"?typeof o.luid=="string"&&!r.has(o.luid):!0);for(let o of e)o.type==="unifieddatasource"&&(o.type="datasource",o.luid=o.datasourceLuid,delete o.datasourceLuid);return e}function Rd(t){let e={};return t.modifiedTime&&(e.modifiedTime=t.modifiedTime),t.sheetType&&(e.sheetType=t.sheetType),t.caption&&(e.caption=t.caption),t.workbookDescription&&(e.workbookDescription=t.workbookDescription),t.type&&(e.type=t.type),t.ownerId&&(e.ownerId=t.ownerId),t.title&&(e.title=t.title),t.ownerName&&(e.ownerName=t.ownerName),t.containerName&&(t.type==="view"?e.parentWorkbookName=t.containerName:e.containerName=t.containerName),t.luid&&(e.luid=t.luid),t.locationName&&(e.locationName=t.locationName),t.comments?.length&&(e.comments=t.comments),t.hitsTotal!=null&&(e.totalViewCount=t.hitsTotal),t.favoritesTotal!=null&&(e.favoritesTotal=t.favoritesTotal),t.tags?.length&&(e.tags=t.tags),t.projectId&&(e.projectId=t.projectId),t.projectName&&(e.projectName=t.projectName),t.hitsSmallSpanTotal!=null&&(e.viewCountLastMonth=t.hitsSmallSpanTotal),t.downstreamWorkbookCount!=null&&(e.downstreamWorkbookCount=t.downstreamWorkbookCount),t.isConnectable!=null&&(e.isConnectable=t.isConnectable),t.datasourceIsPublished!=null&&(e.datasourceIsPublished=t.datasourceIsPublished),t.connectionType&&(e.connectionType=t.connectionType),t.isCertified!=null&&(e.isCertified=t.isCertified),t.hasExtracts!=null&&(e.hasExtracts=t.hasExtracts),t.extractRefreshedAt&&(e.extractRefreshedAt=t.extractRefreshedAt),t.extractUpdatedAt&&(e.extractUpdatedAt=t.extractUpdatedAt),t.connectedWorkbooksCount!=null&&(e.connectedWorkbooksCount=t.connectedWorkbooksCount),t.extractCreationPending!=null&&(e.extractCreationPending=t.extractCreationPending),t.hasSevereDataQualityWarning!=null&&(e.hasSevereDataQualityWarning=t.hasSevereDataQualityWarning),t.datasourceLuid&&(e.datasourceLuid=t.datasourceLuid),t.hasActiveDataQualityWarning!=null&&(e.hasActiveDataQualityWarning=t.hasActiveDataQualityWarning),e}function fn({items:t,boundedContext:e}){if(t.length===0)return{type:"empty",message:"No search results were found. Either none exist or you do not have permission to view them."};let{projectIds:r,datasourceIds:o,workbookIds:i}=e;return r&&(t=t.filter(n=>!!(typeof n.projectId=="number"&&r.has(n.projectId.toString())))),o&&(t=t.filter(n=>!(n.type==="datasource"&&typeof n.luid=="string"&&!o.has(n.luid)))),i&&(t=t.filter(n=>!(n.type==="workbook"&&typeof n.luid=="string"&&!i.has(n.luid)))),t.length===0?{type:"empty",message:["The set of allowed content that can be queried is limited by the server configuration.","While search results were found, they were all filtered out by the server configuration."].join(" ")}:{type:"success",result:t}}var Id={terms:hn.string().trim().nonempty().optional(),limit:hn.number().int().min(1).max(2e3).default(100).optional(),orderBy:Ei.optional(),filter:vi.optional()},gn=t=>{let e=new O({server:t,name:"search-content",description:"\nThis tool searches across all supported content types for objects relevant to the search expression specified by search terms and filters.\n\n**Parameters:**\n\n- `terms` (optional): A string containing one or more search terms that the search uses as the basis for determining which items are relevant to return. If the terms parameter is not provided, it searches for everything bound by the specified filters.\n\n- `filter` (optional): Allows you to limit search results based on:\n - `contentTypes`: Filter by content types. Supported types are: 'lens', 'datasource', 'virtualconnection', 'collection', 'project', 'flow', 'datarole', 'table', 'database', 'view', 'workbook'\n - `ownerIds`: Filter by specific owner IDs (array of integers)\n - `modifiedTime`: Filter by last modified times using ISO 8601 date-time strings. Can be either a range (with startDate/endDate) or an array of specific date-times to include\n\n- `limit` (optional): The number of items to return in the search response (default: 100, max: 2000)\n\n- `orderBy` (optional): Determines the sorting method for returned items. Available sorting methods:\n - `hitsTotal`: Number of times a content item has been viewed since it was created\n - `hitsSmallSpanTotal`: Number of times a content item was viewed in the last month\n - `hitsMediumSpanTotal`: Number of times a content item was viewed in the last 3 months\n - `hitsLargeSpanTotal`: Number of times a content item was viewed in the last year\n - `downstreamWorkbookCount`: Number of workbooks in a given project. This value is only available when the content type filter includes 'database' or 'table'\n \n For each sort method, you can specify a sort direction: 'asc' for ascending or 'desc' for descending (default: 'asc'). The orderBy parameter is an array of objects containing the sorting method and direction. The first element determines primary sorting, with subsequent elements used as tiebreakers.\n\n**Important Notes:**\n- If `orderBy` is omitted, the search will sort items by their \"relevance score\" in descending order, which is Tableau's internal algorithm for providing the most relevant results",paramsSchema:Id,annotations:{title:"Search Content",readOnlyHint:!0,openWorldHint:!1},callback:async({terms:r,limit:o,orderBy:i,filter:n},{requestId:s,authInfo:a})=>{let c=E(),l=i?dn(i):void 0,u=n?pn(n):void 0;return await e.logAndExecute({requestId:s,authInfo:a,args:{},callback:async()=>new xd(await I({config:c,requestId:s,server:t,jwtScopes:["tableau:content:read"],authInfo:N(a),callback:async p=>{let g=await p.contentExplorationMethods.searchContent({terms:r,page:0,limit:c.maxResultLimit?Math.min(c.maxResultLimit,o??100):o??100,orderBy:l,filter:u});return mn(g)}})),constrainSuccessResult:p=>fn({items:p,boundedContext:c.boundedContext})})}});return e};import{Err as wn,Ok as qo}from"ts-results-es";import{z as Dd}from"zod";function Ir(){return["The VizQL Data Service is disabled on this Tableau Server.","To enable it, use TSM using the instructions at https://help.tableau.com/current/server-linux/en-us/cli_configuration-set_tsm.htm#featuresvizqldataservicedeploywithtsm."].join(" ")}var Qt=class t{_allowedProjectIds;_allowedDatasourceIds;_allowedWorkbookIds;_cachedDatasourceIds;_cachedWorkbookIds;_cachedViewIds;static create(){return new t}static createForTesting(e){return new t(e)}constructor(e){this._allowedProjectIds=e?.projectIds,this._allowedDatasourceIds=e?.datasourceIds,this._allowedWorkbookIds=e?.workbookIds,this._cachedDatasourceIds=new Map,this._cachedWorkbookIds=new Map,this._cachedViewIds=new Map}get allowedProjectIds(){return this._allowedProjectIds===void 0&&(this._allowedProjectIds=E().boundedContext.projectIds),this._allowedProjectIds}get allowedDatasourceIds(){return this._allowedDatasourceIds===void 0&&(this._allowedDatasourceIds=E().boundedContext.datasourceIds),this._allowedDatasourceIds}get allowedWorkbookIds(){return this._allowedWorkbookIds===void 0&&(this._allowedWorkbookIds=E().boundedContext.workbookIds),this._allowedWorkbookIds}async isDatasourceAllowed({datasourceLuid:e,restApiArgs:r}){let o=await this._isDatasourceAllowed({datasourceLuid:e,restApiArgs:r});return this.allowedProjectIds||this._cachedDatasourceIds.set(e,o),o}async isWorkbookAllowed({workbookId:e,restApiArgs:r}){let o=await this._isWorkbookAllowed({workbookId:e,restApiArgs:r});return this.allowedProjectIds||this._cachedWorkbookIds.set(e,o),o}async isViewAllowed({viewId:e,restApiArgs:r}){let o=await this._isViewAllowed({viewId:e,restApiArgs:r});return this.allowedProjectIds||this._cachedViewIds.set(e,o),o}async _isDatasourceAllowed({datasourceLuid:e,restApiArgs:{config:r,requestId:o,server:i}}){let n=this._cachedDatasourceIds.get(e);if(n)return n;if(this.allowedDatasourceIds&&!this.allowedDatasourceIds.has(e))return{allowed:!1,message:["The set of allowed data sources that can be queried is limited by the server configuration.",`Querying the datasource with LUID ${e} is not allowed.`].join(" ")};if(this.allowedProjectIds)try{let s=await I({config:r,requestId:o,server:i,jwtScopes:["tableau:content:read"],callback:async a=>(await a.datasourcesMethods.queryDatasource({siteId:a.siteId,datasourceId:e})).project.id});if(!this.allowedProjectIds.has(s))return{allowed:!1,message:["The set of allowed data sources that can be queried is limited by the server configuration.",`The datasource with LUID ${e} cannot be queried because it does not belong to an allowed project.`].join(" ")}}catch(s){return{allowed:!1,message:["The set of allowed data sources that can be queried is limited by the server configuration.",`An error occurred while checking if the datasource with LUID ${e} is in an allowed project:`,W(s)].join(" ")}}return{allowed:!0}}async _isWorkbookAllowed({workbookId:e,restApiArgs:{config:r,requestId:o,server:i}}){let n=this._cachedWorkbookIds.get(e);if(n)return n;if(this.allowedWorkbookIds&&!this.allowedWorkbookIds.has(e))return{allowed:!1,message:["The set of allowed workbooks that can be queried is limited by the server configuration.",`Querying the workbook with LUID ${e} is not allowed.`].join(" ")};let s;if(this.allowedProjectIds)try{if(s=await I({config:r,requestId:o,server:i,jwtScopes:["tableau:content:read"],callback:async a=>await a.workbooksMethods.getWorkbook({siteId:a.siteId,workbookId:e})}),!this.allowedProjectIds.has(s.project?.id??""))return{allowed:!1,message:["The set of allowed workbooks that can be queried is limited by the server configuration.",`The workbook with LUID ${e} cannot be queried because it does not belong to an allowed project.`].join(" ")}}catch(a){return{allowed:!1,message:["The set of allowed workbooks that can be queried is limited by the server configuration.",`An error occurred while checking if the workbook with LUID ${e} is in an allowed project:`,W(a)].join(" ")}}return{allowed:!0,content:s}}async _isViewAllowed({viewId:e,restApiArgs:{config:r,requestId:o,server:i}}){let n=this._cachedViewIds.get(e);if(n)return n;let s="",a="";if(this.allowedWorkbookIds)try{let c=await I({config:r,requestId:o,server:i,jwtScopes:["tableau:content:read"],callback:async l=>await l.viewsMethods.getView({siteId:l.siteId,viewId:e})});if(s=c.workbook?.id??"",a=c.project?.id??"",!this.allowedWorkbookIds.has(s))return{allowed:!1,message:["The set of allowed workbooks that can be queried is limited by the server configuration.",`The view with LUID ${e} cannot be queried because it does not belong to an allowed workbook.`].join(" ")}}catch(c){return{allowed:!1,message:["The set of allowed workbooks that can be queried is limited by the server configuration.",`An error occurred while checking if the workbook containing the view with LUID ${e} is in an allowed workbook:`,W(c)].join(" ")}}if(this.allowedProjectIds)try{if(a=a||await I({config:r,requestId:o,server:i,jwtScopes:["tableau:content:read"],callback:async c=>(await c.viewsMethods.getView({siteId:c.siteId,viewId:e})).project?.id??""}),!this.allowedProjectIds.has(a))return{allowed:!1,message:["The set of allowed views that can be queried is limited by the server configuration.",`The view with LUID ${e} cannot be queried because it does not belong to an allowed project.`].join(" ")}}catch(c){return{allowed:!1,message:["The set of allowed views that can be queried is limited by the server configuration.",`An error occurred while checking if the workbook containing the view with LUID ${e} is in an allowed project:`,W(c)].join(" ")}}return{allowed:!0}}},be=Qt.create(),jA={createResourceAccessChecker:Qt.createForTesting,resetResourceAccessCheckerSingleton:()=>{be=Qt.create()}};function kr({datasourceLuid:t}){if(!t)throw new Error("datasourceLuid must be a non-empty string.")}import{z as C}from"zod";var kd=C.object({name:C.string(),columnClass:C.string(),dataType:C.string().nullable(),defaultAggregation:C.string().nullable(),description:C.string().nullable(),descriptionInherited:C.array(C.object({attribute:C.string(),value:C.string().nullable()}).nullable()).nullable(),dataCategory:C.string().nullable(),role:C.string().nullable(),defaultFormat:C.string().nullable(),semanticRole:C.string().nullable(),aggregation:C.string().nullable(),aggregationParam:C.string().nullable(),formula:C.string().nullable(),isAutoGenerated:C.boolean().nullable(),hasUserReference:C.boolean().nullable(),binSize:C.number().nullable()}).partial(),Pd=C.object({name:C.string(),parameterType:C.string(),dataType:C.string().nullable(),value:C.union([C.number(),C.string(),C.boolean(),C.null()]),members:C.array(C.union([C.number(),C.string(),C.boolean(),C.null()])),min:C.number().nullable(),max:C.number().nullable(),step:C.number().nullable(),minDate:C.string().nullable(),maxDate:C.string().nullable(),periodValue:C.number().nullable(),periodType:C.string().nullable()}).partial(),WA=C.object({fields:C.array(kd),parameters:C.array(Pd)});function Uo(t){let e={fields:[],parameters:[]};if(!t.data)return e;for(let r of t.data){let o={name:r.fieldCaption,dataType:r.dataType,columnClass:r.columnClass};r.defaultAggregation&&(o.defaultAggregation=r.defaultAggregation),r.formula&&(o.formula=r.formula),e.fields.push(o)}if(t.extraData?.parameters)for(let r of t.extraData.parameters){let o={name:r.parameterCaption,parameterType:r.parameterType,dataType:r.dataType,value:r.value};r.parameterType==="LIST"&&r.members?o.members=r.members:r.parameterType==="QUANTITATIVE_DATE"?(o.minDate=r.minDate,o.maxDate=r.maxDate,o.periodValue=r.periodValue,o.periodType=r.periodType):r.parameterType==="QUANTITATIVE_RANGE"&&(o.min=r.min,o.max=r.max,o.step=r.step),e.parameters.push(o)}return e}function yn(t,e){let r={fields:[],parameters:[]};if(!t.data){if(e.data.publishedDatasources[0]?.fields.length)for(let o of e.data.publishedDatasources[0].fields){let i={name:o.name};o.dataType&&(i.dataType=o.dataType),o.aggregation&&(i.defaultAggregation=o.aggregation),bn(o,i),r.fields.push(i)}return r}for(let o of t.data){let i={name:o.fieldCaption,dataType:o.dataType,columnClass:o.columnClass};o.defaultAggregation&&(i.defaultAggregation=o.defaultAggregation),o.formula&&(i.formula=o.formula),r.fields.push(i)}if(t.extraData?.parameters)for(let o of t.extraData.parameters){let i={name:o.parameterCaption,parameterType:o.parameterType,dataType:o.dataType,value:o.value};o.parameterType==="LIST"&&o.members?i.members=o.members:o.parameterType==="QUANTITATIVE_DATE"?(i.minDate=o.minDate,i.maxDate=o.maxDate,i.periodValue=o.periodValue,i.periodType=o.periodType):o.parameterType==="QUANTITATIVE_RANGE"&&(i.min=o.min,i.max=o.max,i.step=o.step),r.parameters.push(i)}if(!e.data.publishedDatasources[0]?.fields.length)return r;for(let o of r.fields){let i=e.data.publishedDatasources[0].fields.find(n=>n.name===o.name);i&&bn(i,o)}return r}function bn(t,e){t.description&&(e.description=t.description),t.descriptionInherited?.length&&(e.descriptionInherited=t.descriptionInherited),t.dataCategory&&(e.dataCategory=t.dataCategory),t.role&&(e.role=t.role),t.defaultFormat&&(e.defaultFormat=t.defaultFormat),t.formula&&(e.formula=t.formula,t.isAutoGenerated!=null&&(e.isAutoGenerated=t.isAutoGenerated),t.hasUserReference!=null&&(e.hasUserReference=t.hasUserReference)),t.binSize!=null&&(e.binSize=t.binSize)}var Ld=t=>`
17
+ - 'DEFINITION_VIEW_DEFAULT' - Return the metric definition and the default metric.`}],response:U.object({definitions:U.array(qo)})}),Vu=ft({method:"get",path:"/pulse/definitions/:pulseMetricDefinitionID/metrics",alias:"listPulseMetricsFromMetricDefinitionId",description:"Returns a list of published Pulse Metrics for a specific Pulse Metric Definition.",parameters:[{name:"pulseMetricDefinitionID",type:"Path",schema:U.string().nonempty()}],response:U.object({metrics:U.array(Er),total_available:U.number()})}),Bu=ft({method:"post",path:"/pulse/metrics%3AbatchGet",alias:"listPulseMetricsFromMetricIds",description:"Returns a list of Pulse Metrics for a list of metric IDs.",parameters:[{name:"metric_ids",type:"Body",schema:U.object({metric_ids:U.array(U.string().nonempty())})}],response:U.object({metrics:U.array(Er)})}),zu=ft({method:"get",path:"/pulse/subscriptions",alias:"listPulseMetricSubscriptionsForCurrentUser",description:"Returns a list of Pulse Subscriptions for the current user.",parameters:[{name:"user_id",type:"Query",schema:U.string().nonempty()}],response:U.object({subscriptions:U.array(Js)})}),Wu=ft({method:"post",path:"/pulse/insights/:bundle_type",alias:"generatePulseMetricValueInsightBundle",description:"Generates a bundle for the current aggregated value for the Pulse metric.",parameters:[{name:"bundle_request",type:"Body",schema:_r},{name:"bundle_type",type:"Path",schema:U.enum(vr)}],response:Ys}),Hu=Fu([Wu,qu,ju,Vu,zu,Bu]),Zs=[...Hu];var jt=class extends H{constructor(e,r){super(new $u(e,Zs),r)}listAllPulseMetricDefinitions=async(e,r,o)=>await ht(async()=>{let i=await this._apiClient.listAllPulseMetricDefinitions({queries:{view:e,page_token:r,page_size:o},...this.authHeader});return{pagination:{next_page_token:i.next_page_token,offset:i.offset,total_available:i.total_available},definitions:i.definitions??[]}});listPulseMetricDefinitionsFromMetricDefinitionIds=async(e,r)=>await ht(async()=>(await this._apiClient.listPulseMetricDefinitionsFromMetricDefinitionIds({definition_ids:e},{queries:{view:r},...this.authHeader})).definitions??[]);listPulseMetricsFromMetricDefinitionId=async e=>await ht(async()=>(await this._apiClient.listPulseMetricsFromMetricDefinitionId({params:{pulseMetricDefinitionID:e},...this.authHeader})).metrics??[]);listPulseMetricsFromMetricIds=async e=>await ht(async()=>(await this._apiClient.listPulseMetricsFromMetricIds({metric_ids:e},{...this.authHeader})).metrics??[]);listPulseMetricSubscriptionsForCurrentUser=async()=>await ht(async()=>(await this._apiClient.listPulseMetricSubscriptionsForCurrentUser({queries:{user_id:this.userId},...this.authHeader})).subscriptions??[]);generatePulseMetricValueInsightBundle=async(e,r)=>await ht(async()=>await this._apiClient.generatePulseMetricValueInsightBundle({bundle_request:e.bundle_request},{params:{bundle_type:r},...this.authHeader})??{})};async function ht(t){try{return new Gu(await t())}catch(e){if(De(e)){if(e.response?.status===404)return new Xs("tableau-server");if(e.response?.status===400&&e.response.headers.tableau_error_code==="0xd3408984"&&e.response.headers.validation_code==="400999")return new Xs("pulse-disabled")}throw e}}import{isErrorFromAlias as Xu,Zodios as sn}from"@zodios/core";import{Err as zo,Ok as ed}from"ts-results-es";import{makeApi as Qu,makeEndpoint as on}from"@zodios/core";import{z as ke}from"zod";import{z as Vt}from"zod";var en=Vt.object({productVersion:Vt.object({value:Vt.string(),build:Vt.string()}),restApiVersion:Vt.string()});import{z as jo}from"zod";var tn=jo.object({id:jo.string(),name:jo.string()});import{z as Vo}from"zod";var rn=Vo.object({id:Vo.string(),name:Vo.string()});var Ku=ke.object({site:tn,user:rn}),Ju=on({method:"get",path:"/serverinfo",alias:"getServerInfo",description:"Returns the version of Tableau Server and the supported version of the REST API.",response:ke.object({serverInfo:en})}),Yu=on({method:"get",path:"/sessions/current",alias:"getCurrentServerSession",description:"Returns details of the current session of Tableau Server.",response:ke.object({session:Ku}),errors:[{status:401,schema:ke.object({error:ke.object({code:ke.string(),summary:ke.string(),detail:ke.string()})})}]}),Zu=Qu([Ju,Yu]),Bo=[...Zu];var Cr=class extends Ee{constructor(e){super(new sn(e,Bo))}getServerInfo=async()=>(await this._apiClient.getServerInfo()).serverInfo},Rr=class extends H{constructor(e,r){super(new sn(e,Bo),r)}getCurrentServerSession=async()=>{try{let e=await this._apiClient.getCurrentServerSession({...this.authHeader});return ed(e.session)}catch(e){return Xu(this._apiClient.api,"getCurrentServerSession",e)?zo({type:"unauthorized",message:e.response.data.error}):De(e)&&e.response?zo({type:"unknown",message:e.response.data}):zo({type:"unknown",message:V(e)})}}};import{Zodios as ld}from"@zodios/core";import{makeApi as td,makeEndpoint as Bt}from"@zodios/core";import{z as X}from"zod";import{z as Y}from"zod";var gt=Y.object({id:Y.string(),name:Y.string(),createdAt:Y.string(),updatedAt:Y.string(),workbook:Y.object({id:Y.string()}).optional(),owner:Y.object({id:Y.string()}).optional(),project:Y.object({id:Y.string()}).optional(),tags:Y.object({tag:Y.array(Y.object({label:Y.string()})).optional()}),usage:Y.object({totalViewCount:Y.coerce.number()}).optional()});var rd=Bt({method:"get",path:"/sites/:siteId/views/:viewId",alias:"getView",description:"Gets the details of a specific view.",response:X.object({view:gt})}),od=Bt({method:"get",path:"/sites/:siteId/views/:viewId/data",alias:"queryViewData",description:"Returns a specified view rendered as data in comma separated value (CSV) format.",response:X.string()}),id=Bt({method:"get",path:"/sites/:siteId/views/:viewId/image",alias:"queryViewImage",description:"Returns an image of the specified view.",parameters:[{name:"vizWidth",type:"Query",schema:X.number().optional(),description:"The width of the rendered image in pixels that, along with the value of vizHeight determine its resolution and aspect ratio."},{name:"vizHeight",type:"Query",schema:X.number().optional(),description:"The height of the rendered image in pixels that, along with the value of vizWidth determine its resolution and aspect ratio."},{name:"resolution",type:"Query",schema:X.literal("high").optional(),description:"The resolution of the image. Image width and actual pixel density are determined by the display context of the image. Aspect ratio is always preserved. Set the value to high to ensure maximum pixel density."}],response:X.string()}),sd=Bt({method:"get",path:"/sites/:siteId/workbooks/:workbookId/views",alias:"queryViewsForWorkbook",description:"Returns all the views for the specified workbook, optionally including usage statistics.",parameters:[{name:"includeUsageStatistics",type:"Query",schema:X.boolean().optional(),description:"true to return usage statistics. The default is false."}],response:X.object({views:X.object({view:X.array(gt)})})}),nd=Bt({method:"get",path:"/sites/:siteId/views",alias:"queryViewsForSite",description:"Returns all the views for the specified site, optionally including usage statistics.",parameters:[...ot,{name:"includeUsageStatistics",type:"Query",schema:X.boolean().optional(),description:"true to return usage statistics. The default is false."},{name:"filter",type:"Query",schema:X.string().optional(),description:"An expression that lets you specify a subset of views to return. You can filter on predefined fields such as name, tags, and createdAt. You can include multiple filter expressions."}],response:X.object({pagination:rt,views:X.object({view:X.array(gt).optional()})})}),ad=td([rd,od,id,sd,nd]),nn=[...ad];var zt=class extends H{constructor(e,r){super(new ld(e,nn),r)}getView=async({viewId:e,siteId:r})=>(await this._apiClient.getView({params:{siteId:r,viewId:e},...this.authHeader})).view;queryViewData=async({viewId:e,siteId:r})=>await this._apiClient.queryViewData({params:{siteId:r,viewId:e},...this.authHeader});queryViewImage=async({viewId:e,siteId:r,width:o,height:i,resolution:n})=>await this._apiClient.queryViewImage({params:{siteId:r,viewId:e},queries:{vizWidth:o,vizHeight:i,resolution:n},...this.authHeader,responseType:"arraybuffer"});queryViewsForWorkbook=async({workbookId:e,siteId:r,includeUsageStatistics:o})=>(await this._apiClient.queryViewsForWorkbook({params:{siteId:r,workbookId:e},queries:{includeUsageStatistics:o},...this.authHeader})).views.view;queryViewsForSite=async({siteId:e,includeUsageStatistics:r,filter:o,pageSize:i,pageNumber:n})=>{let s=await this._apiClient.queryViewsForSite({params:{siteId:e},queries:{includeUsageStatistics:r,filter:o,pageSize:i,pageNumber:n},...this.authHeader});return{pagination:s.pagination,views:s.views.view??[]}}};import{isErrorFromAlias as mn,Zodios as Bd,ZodiosError as zd}from"@zodios/core";import{Err as Pr,Ok as fn}from"ts-results-es";import{makeApi as cd,makeEndpoint as Ho}from"@zodios/core";import{z as f}from"zod";var $o=f.enum(["SUM","AVG","MEDIAN","COUNT","COUNTD","MIN","MAX","STDEV","VAR","COLLECT","YEAR","QUARTER","MONTH","WEEK","DAY","TRUNC_YEAR","TRUNC_QUARTER","TRUNC_MONTH","TRUNC_WEEK","TRUNC_DAY","AGG","NONE","UNSPECIFIED"]),an=f.enum(["INTEGER","REAL","STRING","DATETIME","BOOLEAN","DATE","SPATIAL","UNKNOWN"]),ln=f.enum(["MINUTES","HOURS","DAYS","WEEKS","MONTHS","QUARTERS","YEARS"]),ud=f.enum(["COLUMN","BIN","GROUP","CALCULATION","TABLE_CALCULATION"]),dd=f.object({fieldName:f.string(),fieldCaption:f.string(),dataType:an,defaultAggregation:$o,columnClass:ud,formula:f.string(),logicalTableId:f.string()}).partial().passthrough(),Go=f.union([f.number(),f.string(),f.boolean(),f.null()]),xr=f.object({parameterCaption:f.string(),dataType:an.exclude(["DATETIME","SPATIAL","UNKNOWN"]),parameterName:f.string().optional(),value:Go}),pd=f.discriminatedUnion("parameterType",[xr.extend({parameterType:f.literal("ANY_VALUE")}).strict(),xr.extend({parameterType:f.literal("LIST"),members:f.array(Go)}).strict(),xr.extend({parameterType:f.literal("QUANTITATIVE_DATE"),value:f.string().nullable(),minDate:f.string().nullish(),maxDate:f.string().nullish(),periodValue:f.number().nullish(),periodType:ln.nullish()}).strict(),xr.extend({parameterType:f.literal("QUANTITATIVE_RANGE"),value:f.number().nullable(),min:f.number().nullish(),max:f.number().nullish(),step:f.number().nullish()}).strict()]),md=f.enum(["ASC","DESC"]),Ir=f.object({fieldCaption:f.string(),fieldAlias:f.string().optional(),maxDecimalPlaces:f.number().int().gte(0).optional(),sortDirection:md.optional(),sortPriority:f.number().int().gt(0).optional()}),fd=Ir.strict(),hd=Ir.extend({function:$o}).strict(),gd=Ir.extend({calculation:f.string()}).strict(),yd=Ir.extend({binSize:f.number().gt(0)}).strict(),bd=f.union([fd,hd,gd,yd]),Td=f.object({fieldCaption:f.string()}).strict(),wd=f.object({fieldCaption:f.string(),function:$o}).strict(),Ad=f.object({calculation:f.string()}).strict(),cn=f.union([Td,wd,Ad]),Qo=f.object({field:cn,context:f.boolean().optional()}),Ko=f.object({field:f.object({fieldCaption:f.string()}).strict(),context:f.boolean().optional()}),Sd=Ko.extend({filterType:f.literal("SET"),values:f.union([f.array(f.string()),f.array(f.number()),f.array(f.boolean())]),exclude:f.boolean().optional()}),yt=Ko.extend({filterType:f.literal("DATE"),periodType:ln,anchorDate:f.string().optional(),includeNulls:f.boolean().optional()}),Ed=f.discriminatedUnion("dateRangeType",[yt.extend({dateRangeType:f.literal("CURRENT")}).strict(),yt.extend({dateRangeType:f.literal("LAST")}).strict(),yt.extend({dateRangeType:f.literal("NEXT")}).strict(),yt.extend({dateRangeType:f.literal("TODATE")}).strict(),yt.extend({dateRangeType:f.literal("LASTN"),rangeN:f.number().int()}).strict(),yt.extend({dateRangeType:f.literal("NEXTN"),rangeN:f.number().int()}).strict()]),Wo=Ko.extend({filterType:f.literal("MATCH"),startsWith:f.string().optional(),endsWith:f.string().optional(),contains:f.string().optional(),exclude:f.boolean().optional()}),_d=f.union([Wo.extend({startsWith:f.string()}).strict(),Wo.extend({endsWith:f.string()}).strict(),Wo.extend({contains:f.string()}).strict()]),Wt=Qo.extend({filterType:f.literal("QUANTITATIVE_NUMERICAL")}),vd=f.discriminatedUnion("quantitativeFilterType",[Wt.extend({quantitativeFilterType:f.literal("RANGE"),min:f.number(),max:f.number(),includeNulls:f.boolean().optional()}).strict(),Wt.extend({quantitativeFilterType:f.literal("MIN"),min:f.number(),includeNulls:f.boolean().optional()}).strict(),Wt.extend({quantitativeFilterType:f.literal("MAX"),max:f.number(),includeNulls:f.boolean().optional()}).strict(),Wt.extend({quantitativeFilterType:f.literal("ONLY_NULL")}).strict(),Wt.extend({quantitativeFilterType:f.literal("ONLY_NON_NULL")}).strict()]),Ht=Qo.extend({filterType:f.literal("QUANTITATIVE_DATE")}),Cd=f.discriminatedUnion("quantitativeFilterType",[Ht.extend({quantitativeFilterType:f.literal("RANGE"),minDate:f.string(),maxDate:f.string(),includeNulls:f.boolean().optional()}).strict(),Ht.extend({quantitativeFilterType:f.literal("MIN"),minDate:f.string(),includeNulls:f.boolean().optional()}).strict(),Ht.extend({quantitativeFilterType:f.literal("MAX"),maxDate:f.string(),includeNulls:f.boolean().optional()}).strict(),Ht.extend({quantitativeFilterType:f.literal("ONLY_NULL")}).strict(),Ht.extend({quantitativeFilterType:f.literal("ONLY_NON_NULL")}).strict()]),Rd=Qo.extend({filterType:f.literal("TOP"),howMany:f.number().int(),fieldToMeasure:cn,direction:f.enum(["TOP","BOTTOM"]).optional().default("TOP")}),xd=f.union([Sd.strict(),Rd.strict(),..._d.options,...vd.options,...Cd.options,...Ed.options]),Id=f.object({parameterCaption:f.string(),value:Go}),Pd=f.object({connectionLuid:f.string().optional(),connectionUsername:f.string(),connectionPassword:f.string()}),un=f.object({datasourceLuid:f.string().nonempty(),connections:f.array(Pd).optional()}),Dd=f.enum(["OBJECTS","ARRAYS"]),dn=f.object({returnFormat:Dd,debug:f.boolean().default(!1)}).partial().passthrough(),kd=f.object({datasource:un,options:dn.optional()}).passthrough(),Ld=f.object({data:f.array(dd),extraData:f.object({parameters:f.array(pd)})}).partial().passthrough(),Md=f.object({errorCode:f.string(),message:f.string(),datetime:f.string().datetime({offset:!0}),debug:f.object({}).partial().passthrough(),"tab-error-code":f.string()}).partial().passthrough(),$t=f.strictObject({fields:f.array(bd),filters:f.array(xd).optional(),parameters:f.array(Id).optional()}),Od=dn.and(f.object({disaggregate:f.boolean()}).partial().passthrough()),Nd=f.object({datasource:un,query:$t,options:Od.optional()}).passthrough(),Ud=f.object({data:f.array(f.unknown())}).partial().passthrough(),Fd=Ho({method:"post",path:"/query-datasource",alias:"queryDatasource",description:"Queries a specific data source and returns the resulting data.",requestFormat:"json",parameters:[{name:"body",type:"Body",schema:Nd}],response:Ud,errors:[{status:"default",schema:Md},{status:404,schema:f.any()}]}),qd=Ho({method:"post",path:"/read-metadata",alias:"readMetadata",description:"Requests metadata for a specific data source. The metadata provides information about the data fields, such as field names, data types, and descriptions.','Requests metadata for a specific data source. The metadata provides information about the data fields, such as field names, data types, and descriptions.",requestFormat:"json",parameters:[{name:"body",type:"Body",schema:kd}],response:Ld,errors:[{status:404,schema:f.any()}]}),jd=Ho({method:"get",path:"/simple-request",alias:"simpleRequest",description:"Sends a request that can be used for testing or doing a health check.",requestFormat:"json",response:f.string()}),Vd=cd([Fd,qd,jd]),pn=[...Vd];var Gt=class extends H{constructor(e,r){super(new Bd(e,pn),r)}queryDatasource=async e=>{try{return fn(await this._apiClient.queryDatasource(e,{...this.authHeader}))}catch(r){if(mn(this._apiClient.api,"queryDatasource",r))return r.response.status===404?Pr("feature-disabled"):Pr(r.response.data);if(r instanceof zd)return Pr(r);throw r}};readMetadata=async e=>{try{return fn(await this._apiClient.readMetadata(e,{...this.authHeader}))}catch(r){if(mn(this._apiClient.api,"readMetadata",r)&&r.response.status===404)return Pr("feature-disabled");throw r}}};import{Zodios as Qd}from"@zodios/core";import{makeApi as Wd,makeEndpoint as hn}from"@zodios/core";import{z as Qe}from"zod";import{z as ee}from"zod";var Jo=ee.object({id:ee.string(),name:ee.string(),description:ee.string().optional(),webpageUrl:ee.string().optional(),contentUrl:ee.string(),project:ar.optional(),showTabs:ee.coerce.boolean(),defaultViewId:ee.string().optional(),tags:ee.object({tag:ee.array(ee.object({label:ee.string()})).optional()}),views:ee.optional(ee.object({view:ee.array(gt)}))});var Hd=hn({method:"get",path:"/sites/:siteId/workbooks/:workbookId",alias:"getWorkbook",description:"Returns information about the specified workbook, including information about views and tags.",response:Qe.object({workbook:Jo})}),$d=hn({method:"get",path:"/sites/:siteId/workbooks",alias:"queryWorkbooksForSite",description:"Returns the workbooks on a site.",parameters:[...ot,{name:"siteId",type:"Path",schema:Qe.string()},{name:"filter",type:"Query",schema:Qe.string().optional(),description:"An expression that lets you specify a subset of workbooks to return. You can filter on predefined fields such as name, tags, and createdAt. You can include multiple filter expressions."}],response:Qe.object({pagination:rt,workbooks:Qe.object({workbook:Qe.optional(Qe.array(Jo))})})}),Gd=Wd([$d,Hd]),gn=[...Gd];var Qt=class extends H{constructor(e,r){super(new Qd(e,gn),r)}getWorkbook=async({workbookId:e,siteId:r})=>(await this._apiClient.getWorkbook({params:{siteId:r,workbookId:e},...this.authHeader})).workbook;queryWorkbooksForSite=async({siteId:e,filter:r,pageSize:o,pageNumber:i})=>{let n=await this._apiClient.queryWorkbooksForSite({params:{siteId:e},queries:{filter:r,pageSize:o,pageNumber:i},...this.authHeader});return{pagination:n.pagination,workbooks:n.workbooks.workbook??[]}}};var Le=class t{_creds;_host;_baseUrl;_baseUrlWithoutVersion;_authenticationMethods;_authenticatedAuthenticationMethods;_authenticatedServerMethods;_contentExplorationMethods;_datasourcesMethods;_metadataMethods;_pulseMethods;_serverMethods;_vizqlDataServiceMethods;_viewsMethods;_workbooksMethods;static _version="3.24";_requestInterceptor;_responseInterceptor;constructor(e,r){this._host=e,this._baseUrl=`${this._host}/api/${t._version}`,this._baseUrlWithoutVersion=`${this._host}/api/-`,this._requestInterceptor=r?.requestInterceptor,this._responseInterceptor=r?.responseInterceptor}get creds(){if(!this._creds)throw new Error("No credentials found. Authenticate by calling signIn() first.");return this._creds}get siteId(){return this.creds.site.id}get authenticationMethods(){return this._authenticationMethods||(this._authenticationMethods=new sr(this._baseUrl),this._addInterceptors(this._baseUrl,this._authenticationMethods.interceptors)),this._authenticationMethods}get authenticatedAuthenticationMethods(){return this._authenticatedAuthenticationMethods||(this._authenticatedAuthenticationMethods=new nr(this._baseUrl,this.creds),this._addInterceptors(this._baseUrl,this._authenticatedAuthenticationMethods.interceptors)),this._authenticatedAuthenticationMethods}get authenticatedServerMethods(){return this._authenticatedServerMethods||(this._authenticatedServerMethods=new Rr(this._baseUrl,this.creds),this._addInterceptors(this._baseUrl,this._authenticatedServerMethods.interceptors)),this._authenticatedServerMethods}get contentExplorationMethods(){return this._contentExplorationMethods||(this._contentExplorationMethods=new vt(this._baseUrlWithoutVersion,this.creds),this._addInterceptors(this._baseUrlWithoutVersion,this._contentExplorationMethods.interceptors)),this._contentExplorationMethods}get datasourcesMethods(){return this._datasourcesMethods||(this._datasourcesMethods=new Ct(this._baseUrl,this.creds),this._addInterceptors(this._baseUrl,this._datasourcesMethods.interceptors)),this._datasourcesMethods}get metadataMethods(){if(!this._metadataMethods){let e=`${this._host}/api/metadata`;this._metadataMethods=new Rt(e,this.creds),this._addInterceptors(e,this._metadataMethods.interceptors)}return this._metadataMethods}get pulseMethods(){return this._pulseMethods||(this._pulseMethods=new jt(this._baseUrlWithoutVersion,this.creds),this._addInterceptors(this._baseUrlWithoutVersion,this._pulseMethods.interceptors)),this._pulseMethods}get serverMethods(){return this._serverMethods||(this._serverMethods=new Cr(this._baseUrl),this._addInterceptors(this._baseUrl,this._serverMethods.interceptors)),this._serverMethods}get vizqlDataServiceMethods(){if(!this._vizqlDataServiceMethods){let e=`${this._host}/api/v1/vizql-data-service`;this._vizqlDataServiceMethods=new Gt(e,this.creds),this._addInterceptors(e,this._vizqlDataServiceMethods.interceptors)}return this._vizqlDataServiceMethods}get viewsMethods(){return this._viewsMethods||(this._viewsMethods=new zt(this._baseUrl,this.creds),this._addInterceptors(this._baseUrl,this._viewsMethods.interceptors)),this._viewsMethods}get workbooksMethods(){return this._workbooksMethods||(this._workbooksMethods=new Qt(this._baseUrl,this.creds),this._addInterceptors(this._baseUrl,this._workbooksMethods.interceptors)),this._workbooksMethods}signIn=async e=>{this._creds=await this.authenticationMethods.signIn(e)};signOut=async()=>{await this.authenticatedAuthenticationMethods.signOut(),this._creds=void 0};setCredentials=(e,r)=>{let o=e.split("|");if(o.length<3)throw new Error("Could not determine site ID. Access token must have 3 parts.");let i=o[2];this._creds={site:{id:i},user:{id:r},token:e}};_addInterceptors=(e,r)=>{r.request.use(o=>(this._requestInterceptor?.[0]({baseUrl:e,...or(o)}),o),o=>(this._requestInterceptor?.[1]?.(o,e),Promise.reject(o))),r.response.use(o=>(this._responseInterceptor?.[0]({baseUrl:e,...ir(o)}),o),o=>(this._responseInterceptor?.[1]?.(o,e),Promise.reject(o)))}};var Kd=async(t,e,r,o,i)=>{let n=t.server||i?.server;ce(n,"Tableau server could not be determined");let s=new Le(n,{requestInterceptor:[Jd(r,e),Yd(r,e)],responseInterceptor:[Zd(r,e),Xd(r,e)]});if(t.auth==="pat")await s.signIn({type:"pat",patName:t.patName,patValue:t.patValue,siteName:t.siteName});else if(t.auth==="direct-trust")await s.signIn({type:"direct-trust",siteName:t.siteName,username:tp(t,i),clientId:t.connectedAppClientId,secretId:t.connectedAppSecretId,secretValue:t.connectedAppSecretValue,scopes:o,additionalPayload:rp(t,i)});else{if(!i?.accessToken||!i?.userId)throw new Error("Auth info is required when not signing in first.");s.setCredentials(i.accessToken,i.userId)}return s},D=async({config:t,requestId:e,server:r,callback:o,jwtScopes:i,authInfo:n})=>{let s=await Kd(t,e,r,new Set(i),n);try{return await o(s)}finally{t.auth!=="oauth"&&await s.signOut()}},Jd=(t,e)=>r=>(r.headers["User-Agent"]=ep(t),yn(t,r,e),r),Yd=(t,e)=>(r,o)=>{if(!De(r)||!r.request){ue.error(t,`Request ${e} failed with error: ${V(r)}`,{logger:"rest-api",requestId:e});return}let{request:i}=r;yn(t,{baseUrl:o,...or(i)},e)},Zd=(t,e)=>r=>(bn(t,r,e),r),Xd=(t,e)=>(r,o)=>{if(!De(r)||!r.response){ue.error(t,`Response from request ${e} failed with error: ${V(r)}`,{logger:"rest-api",requestId:e});return}let{response:i}=r;bn(t,{baseUrl:o,...ir(i)},e)};function yn(t,e,r){let i=A().disableLogMasking?e:Pi(e),n=new URL(i.url??"",i.baseUrl);e.params&&Object.keys(e.params).length>0&&(n.search=new URLSearchParams(e.params).toString());let s={type:"request",requestId:r,method:i.method,url:n.toString(),...Ue("debug")&&{headers:i.headers,data:i.data,params:i.params}};ue.info(t,s,{logger:"rest-api",requestId:r})}function bn(t,e,r){let i=A().disableLogMasking?e:Di(e),n=new URL(i.url??"",i.baseUrl);e.request?.params&&Object.keys(e.request.params).length>0&&(n.search=new URLSearchParams(e.request.params).toString());let s={type:"response",requestId:r,url:n.toString(),status:i.status,...Ue("debug")&&{headers:i.headers,data:i.data}};ue.info(t,s,{logger:"rest-api",requestId:r})}function ep(t){let e=[Dr];if(t.clientInfo){let{name:r,version:o}=t.clientInfo;r&&e.push(o?`(${r} ${o})`:`(${r})`)}return e.join(" ")}function tp(t,e){return t.jwtSubClaim.replaceAll("{OAUTH_USERNAME}",e?.username??"")}function rp(t,e){let r=t.jwtAdditionalPayload.replaceAll("{OAUTH_USERNAME}",e?.username??"");return JSON.parse(r||"{}")}import{z as I}from"zod";import{z as op}from"zod";var z=t=>op.string({message:`${t} is required`}).nonempty({message:`${t} must be non-empty`});var Tn=I.object({client_id:z("client_id"),redirect_uri:z("redirect_uri"),response_type:z("response_type"),code_challenge:z("code_challenge"),code_challenge_method:z("code_challenge_method"),state:I.string().optional()}),wn=I.discriminatedUnion("grant_type",[I.object({grant_type:I.literal("authorization_code"),code:z("code"),redirect_uri:z("redirect_uri"),code_verifier:z("code_verifier")}),I.object({grant_type:I.literal("refresh_token"),refresh_token:z("refresh_token")}),I.object({grant_type:I.literal("client_credentials")})],{errorMap:(t,e)=>({message:t.code==="invalid_union_discriminator"?`grant_type must be ${t.options.map(r=>`'${String(r)}'`).join(" | ")}, got '${e.data.grant_type}'.`:e.defaultError})}).and(I.object({client_id:I.string().optional(),client_secret:I.string().optional()})).transform(t=>{let{client_id:e,client_secret:r}=t,o={clientId:e,clientSecret:r};return t.grant_type==="authorization_code"?{grantType:t.grant_type,code:t.code,redirectUri:t.redirect_uri,codeVerifier:t.code_verifier,...o}:t.grant_type==="refresh_token"?{grantType:t.grant_type,refreshToken:t.refresh_token,...o}:{grantType:t.grant_type,...o}}),An=I.object({code:I.string().optional(),state:I.string().optional(),error:I.string().optional()}),Yo=I.object({iss:z("iss"),aud:z("aud"),exp:I.number().int().nonnegative(),sub:z("sub"),clientId:z("clientId"),tableauServer:z("tableauServer"),tableauUserId:I.string().optional()}),Sn=Yo.extend({tableauAccessToken:z("tableauAccessToken"),tableauRefreshToken:z("tableauRefreshToken"),tableauExpiresAt:I.number().int().nonnegative(),tableauUserId:z("tableauUserId")}),kr=I.object({username:I.string(),userId:I.string(),server:I.string(),accessToken:I.string(),refreshToken:I.string()}).partial(),En=I.object({client_id:I.string(),redirect_uris:I.array(I.string().url()).min(1),client_name:I.string().optional(),logo_uri:I.string().url().optional(),client_uri:I.string().url().optional(),tos_uri:I.string().url().optional(),policy_uri:I.string().url().optional(),grant_types:I.array(I.string()).optional(),response_types:I.array(I.enum(["code","token"])).optional(),post_logout_redirect_uris:I.array(I.string().url()).optional(),scope:I.string().default("read").optional(),token_endpoint_auth_method:I.enum(["none","client_secret_basic","client_secret_post"]).optional()});var M=t=>{if(!t)return;let e=kr.safeParse(t.extra);if(e.success)return e.data};import{ZodiosError as _n}from"@zodios/core";import{fromError as ip,isZodErrorLike as sp}from"zod-validation-error";var ye=class t{_provider;constructor(e){this._provider=e}get(){return this._provider()}static async from(e){return e===void 0?void 0:e instanceof t?await e.get():e}};var N=class{server;name;description;paramsSchema;annotations;argsValidator;callback;constructor({server:e,name:r,description:o,paramsSchema:i,annotations:n,argsValidator:s,callback:a}){this.server=e,this.name=r,this.description=o,this.paramsSchema=i,this.annotations=n,this.argsValidator=s,this.callback=a}logInvocation({requestId:e,args:r,username:o}){ue.debug(this.server,Ri({requestId:e,toolName:this.name,args:r,username:o}))}async logAndExecute({requestId:e,args:r,authInfo:o,callback:i,getSuccessResult:n,getErrorText:s,constrainSuccessResult:a}){let l=o?.extra?kr.safeParse(o.extra).data?.username:void 0;if(this.logInvocation({requestId:e,args:r,username:l}),r)try{(await ye.from(this.argsValidator))?.(r)}catch(c){return Lr(e,c)}try{let c=await i();if(c.isOk()){let u=await a(c.value);return u.type!=="success"?{isError:u.type==="error",content:[{type:"text",text:u.message}]}:n?n(u.result):{isError:!1,content:[{type:"text",text:JSON.stringify(u.result)}]}}return c.error instanceof _n?Lr(e,c.error):s?{isError:!0,content:[{type:"text",text:s(c.error)}]}:Lr(e,c.error)}catch(c){return Lr(e,c)}}};function Lr(t,e){if(e instanceof _n&&sp(e.cause)){let r=ip(e.cause);return{isError:!1,content:[{type:"text",text:JSON.stringify({data:e.data,warning:r.toString()})}]}}return{isError:!0,content:[{type:"text",text:`requestId: ${t}, error: ${V(e)}`}]}}function vn(t){let e=new Set;return t.flatMap(r=>e.has(r.method)?[]:(e.add(r.method),r.method+(r.sortDirection?`:${r.sortDirection}`:""))).join(",")}function Cn(t){let e=[];if(t.contentTypes)if(t.contentTypes.length===1)e.push(`type:eq:${t.contentTypes[0]}`);else{let r=new Set;for(let o of t.contentTypes)r.add(o);e.push(`type:in:[${Array.from(r).join(",")}]`)}if(t.ownerIds)if(t.ownerIds.length===1)e.push(`ownerId:eq:${t.ownerIds[0]}`);else{let r=new Set;for(let o of t.ownerIds)r.add(o);e.push(`ownerId:in:[${Array.from(r).join(",")}]`)}if(t.modifiedTime)if(Array.isArray(t.modifiedTime))if(t.modifiedTime.length===1)e.push(`modifiedTime:eq:${t.modifiedTime[0]}`);else{let r=new Set;for(let o of t.modifiedTime)r.add(o);e.push(`modifiedTime:in:[${Array.from(r).join(",")}]`)}else if(t.modifiedTime.startDate&&t.modifiedTime.endDate){let r=t.modifiedTime.startDate,o=t.modifiedTime.endDate;r>o&&(r=t.modifiedTime.endDate,o=t.modifiedTime.startDate),e.push(`modifiedTime:gte:${r}`),e.push(`modifiedTime:lte:${o}`)}else t.modifiedTime.startDate?e.push(`modifiedTime:gte:${t.modifiedTime.startDate}`):t.modifiedTime.endDate&&e.push(`modifiedTime:lte:${t.modifiedTime.endDate}`);return e.join(",")}function Rn(t){let e=[];if(t.items)for(let o of t.items)e.push(np(o.content));let r=new Set(e.filter(o=>o.type==="unifieddatasource").map(o=>o.datasourceLuid).filter(o=>typeof o=="string"));e=e.filter(o=>o.type==="datasource"?typeof o.luid=="string"&&!r.has(o.luid):!0);for(let o of e)o.type==="unifieddatasource"&&(o.type="datasource",o.luid=o.datasourceLuid,delete o.datasourceLuid);return e}function np(t){let e={};return t.modifiedTime&&(e.modifiedTime=t.modifiedTime),t.sheetType&&(e.sheetType=t.sheetType),t.caption&&(e.caption=t.caption),t.workbookDescription&&(e.workbookDescription=t.workbookDescription),t.type&&(e.type=t.type),t.ownerId&&(e.ownerId=t.ownerId),t.title&&(e.title=t.title),t.ownerName&&(e.ownerName=t.ownerName),t.containerName&&(t.type==="view"?e.parentWorkbookName=t.containerName:e.containerName=t.containerName),t.luid&&(e.luid=t.luid),t.locationName&&(e.locationName=t.locationName),t.comments?.length&&(e.comments=t.comments),t.hitsTotal!=null&&(e.totalViewCount=t.hitsTotal),t.favoritesTotal!=null&&(e.favoritesTotal=t.favoritesTotal),t.tags?.length&&(e.tags=t.tags),t.projectId&&(e.projectId=t.projectId),t.projectName&&(e.projectName=t.projectName),t.hitsSmallSpanTotal!=null&&(e.viewCountLastMonth=t.hitsSmallSpanTotal),t.downstreamWorkbookCount!=null&&(e.downstreamWorkbookCount=t.downstreamWorkbookCount),t.isConnectable!=null&&(e.isConnectable=t.isConnectable),t.datasourceIsPublished!=null&&(e.datasourceIsPublished=t.datasourceIsPublished),t.connectionType&&(e.connectionType=t.connectionType),t.isCertified!=null&&(e.isCertified=t.isCertified),t.hasExtracts!=null&&(e.hasExtracts=t.hasExtracts),t.extractRefreshedAt&&(e.extractRefreshedAt=t.extractRefreshedAt),t.extractUpdatedAt&&(e.extractUpdatedAt=t.extractUpdatedAt),t.connectedWorkbooksCount!=null&&(e.connectedWorkbooksCount=t.connectedWorkbooksCount),t.extractCreationPending!=null&&(e.extractCreationPending=t.extractCreationPending),t.hasSevereDataQualityWarning!=null&&(e.hasSevereDataQualityWarning=t.hasSevereDataQualityWarning),t.datasourceLuid&&(e.datasourceLuid=t.datasourceLuid),t.hasActiveDataQualityWarning!=null&&(e.hasActiveDataQualityWarning=t.hasActiveDataQualityWarning),e}function xn({items:t,boundedContext:e}){if(t.length===0)return{type:"empty",message:"No search results were found. Either none exist or you do not have permission to view them."};let{projectIds:r,datasourceIds:o,workbookIds:i}=e;return r&&(t=t.filter(n=>!!(typeof n.projectId=="number"&&r.has(n.projectId.toString())))),o&&(t=t.filter(n=>!(n.type==="datasource"&&typeof n.luid=="string"&&!o.has(n.luid)))),i&&(t=t.filter(n=>!(n.type==="workbook"&&typeof n.luid=="string"&&!i.has(n.luid)))),t.length===0?{type:"empty",message:["The set of allowed content that can be queried is limited by the server configuration.","While search results were found, they were all filtered out by the server configuration."].join(" ")}:{type:"success",result:t}}var lp={terms:In.string().trim().nonempty().optional(),limit:In.number().int().min(1).max(2e3).default(100).optional(),orderBy:Ui.optional(),filter:ji.optional()},Pn=t=>{let e=new N({server:t,name:"search-content",description:"\nThis tool searches across all supported content types for objects relevant to the search expression specified by search terms and filters.\n\n**Parameters:**\n\n- `terms` (optional): A string containing one or more search terms that the search uses as the basis for determining which items are relevant to return. If the terms parameter is not provided, it searches for everything bound by the specified filters.\n\n- `filter` (optional): Allows you to limit search results based on:\n - `contentTypes`: Filter by content types. Supported types are: 'lens', 'datasource', 'virtualconnection', 'collection', 'project', 'flow', 'datarole', 'table', 'database', 'view', 'workbook'\n - `ownerIds`: Filter by specific owner IDs (array of integers)\n - `modifiedTime`: Filter by last modified times using ISO 8601 date-time strings. Can be either a range (with startDate/endDate) or an array of specific date-times to include\n\n- `limit` (optional): The number of items to return in the search response (default: 100, max: 2000)\n\n- `orderBy` (optional): Determines the sorting method for returned items. Available sorting methods:\n - `hitsTotal`: Number of times a content item has been viewed since it was created\n - `hitsSmallSpanTotal`: Number of times a content item was viewed in the last month\n - `hitsMediumSpanTotal`: Number of times a content item was viewed in the last 3 months\n - `hitsLargeSpanTotal`: Number of times a content item was viewed in the last year\n - `downstreamWorkbookCount`: Number of workbooks in a given project. This value is only available when the content type filter includes 'database' or 'table'\n \n For each sort method, you can specify a sort direction: 'asc' for ascending or 'desc' for descending (default: 'asc'). The orderBy parameter is an array of objects containing the sorting method and direction. The first element determines primary sorting, with subsequent elements used as tiebreakers.\n\n**Important Notes:**\n- If `orderBy` is omitted, the search will sort items by their \"relevance score\" in descending order, which is Tableau's internal algorithm for providing the most relevant results",paramsSchema:lp,annotations:{title:"Search Content",readOnlyHint:!0,openWorldHint:!1},callback:async({terms:r,limit:o,orderBy:i,filter:n},{requestId:s,authInfo:a})=>{let l=A(),c=i?vn(i):void 0,u=n?Cn(n):void 0;return await e.logAndExecute({requestId:s,authInfo:a,args:{},callback:async()=>new ap(await D({config:l,requestId:s,server:t,jwtScopes:["tableau:content:read"],authInfo:M(a),callback:async p=>{let g=await p.contentExplorationMethods.searchContent({terms:r,page:0,limit:l.maxResultLimit?Math.min(l.maxResultLimit,o??100):o??100,orderBy:c,filter:u});return Rn(g)}})),constrainSuccessResult:p=>xn({items:p,boundedContext:l.boundedContext})})}});return e};import{Err as Ln,Ok as Xo}from"ts-results-es";import{z as dp}from"zod";function Mr(){return["The VizQL Data Service is disabled on this Tableau Server.","To enable it, use TSM using the instructions at https://help.tableau.com/current/server-linux/en-us/cli_configuration-set_tsm.htm#featuresvizqldataservicedeploywithtsm."].join(" ")}var Kt=class t{_allowedProjectIds;_allowedDatasourceIds;_allowedWorkbookIds;_cachedDatasourceIds;_cachedWorkbookIds;_cachedViewIds;static create(){return new t}static createForTesting(e){return new t(e)}constructor(e){this._allowedProjectIds=e?.projectIds,this._allowedDatasourceIds=e?.datasourceIds,this._allowedWorkbookIds=e?.workbookIds,this._cachedDatasourceIds=new Map,this._cachedWorkbookIds=new Map,this._cachedViewIds=new Map}get allowedProjectIds(){return this._allowedProjectIds===void 0&&(this._allowedProjectIds=A().boundedContext.projectIds),this._allowedProjectIds}get allowedDatasourceIds(){return this._allowedDatasourceIds===void 0&&(this._allowedDatasourceIds=A().boundedContext.datasourceIds),this._allowedDatasourceIds}get allowedWorkbookIds(){return this._allowedWorkbookIds===void 0&&(this._allowedWorkbookIds=A().boundedContext.workbookIds),this._allowedWorkbookIds}async isDatasourceAllowed({datasourceLuid:e,restApiArgs:r}){let o=await this._isDatasourceAllowed({datasourceLuid:e,restApiArgs:r});return this.allowedProjectIds||this._cachedDatasourceIds.set(e,o),o}async isWorkbookAllowed({workbookId:e,restApiArgs:r}){let o=await this._isWorkbookAllowed({workbookId:e,restApiArgs:r});return this.allowedProjectIds||this._cachedWorkbookIds.set(e,o),o}async isViewAllowed({viewId:e,restApiArgs:r}){let o=await this._isViewAllowed({viewId:e,restApiArgs:r});return this.allowedProjectIds||this._cachedViewIds.set(e,o),o}async _isDatasourceAllowed({datasourceLuid:e,restApiArgs:{config:r,requestId:o,server:i}}){let n=this._cachedDatasourceIds.get(e);if(n)return n;if(this.allowedDatasourceIds&&!this.allowedDatasourceIds.has(e))return{allowed:!1,message:["The set of allowed data sources that can be queried is limited by the server configuration.",`Querying the datasource with LUID ${e} is not allowed.`].join(" ")};if(this.allowedProjectIds)try{let s=await D({config:r,requestId:o,server:i,jwtScopes:["tableau:content:read"],callback:async a=>(await a.datasourcesMethods.queryDatasource({siteId:a.siteId,datasourceId:e})).project.id});if(!this.allowedProjectIds.has(s))return{allowed:!1,message:["The set of allowed data sources that can be queried is limited by the server configuration.",`The datasource with LUID ${e} cannot be queried because it does not belong to an allowed project.`].join(" ")}}catch(s){return{allowed:!1,message:["The set of allowed data sources that can be queried is limited by the server configuration.",`An error occurred while checking if the datasource with LUID ${e} is in an allowed project:`,V(s)].join(" ")}}return{allowed:!0}}async _isWorkbookAllowed({workbookId:e,restApiArgs:{config:r,requestId:o,server:i}}){let n=this._cachedWorkbookIds.get(e);if(n)return n;if(this.allowedWorkbookIds&&!this.allowedWorkbookIds.has(e))return{allowed:!1,message:["The set of allowed workbooks that can be queried is limited by the server configuration.",`Querying the workbook with LUID ${e} is not allowed.`].join(" ")};let s;if(this.allowedProjectIds)try{if(s=await D({config:r,requestId:o,server:i,jwtScopes:["tableau:content:read"],callback:async a=>await a.workbooksMethods.getWorkbook({siteId:a.siteId,workbookId:e})}),!this.allowedProjectIds.has(s.project?.id??""))return{allowed:!1,message:["The set of allowed workbooks that can be queried is limited by the server configuration.",`The workbook with LUID ${e} cannot be queried because it does not belong to an allowed project.`].join(" ")}}catch(a){return{allowed:!1,message:["The set of allowed workbooks that can be queried is limited by the server configuration.",`An error occurred while checking if the workbook with LUID ${e} is in an allowed project:`,V(a)].join(" ")}}return{allowed:!0,content:s}}async _isViewAllowed({viewId:e,restApiArgs:{config:r,requestId:o,server:i}}){let n=this._cachedViewIds.get(e);if(n)return n;let s="",a="";if(this.allowedWorkbookIds)try{let l=await D({config:r,requestId:o,server:i,jwtScopes:["tableau:content:read"],callback:async c=>await c.viewsMethods.getView({siteId:c.siteId,viewId:e})});if(s=l.workbook?.id??"",a=l.project?.id??"",!this.allowedWorkbookIds.has(s))return{allowed:!1,message:["The set of allowed workbooks that can be queried is limited by the server configuration.",`The view with LUID ${e} cannot be queried because it does not belong to an allowed workbook.`].join(" ")}}catch(l){return{allowed:!1,message:["The set of allowed workbooks that can be queried is limited by the server configuration.",`An error occurred while checking if the workbook containing the view with LUID ${e} is in an allowed workbook:`,V(l)].join(" ")}}if(this.allowedProjectIds)try{if(a=a||await D({config:r,requestId:o,server:i,jwtScopes:["tableau:content:read"],callback:async l=>(await l.viewsMethods.getView({siteId:l.siteId,viewId:e})).project?.id??""}),!this.allowedProjectIds.has(a))return{allowed:!1,message:["The set of allowed views that can be queried is limited by the server configuration.",`The view with LUID ${e} cannot be queried because it does not belong to an allowed project.`].join(" ")}}catch(l){return{allowed:!1,message:["The set of allowed views that can be queried is limited by the server configuration.",`An error occurred while checking if the workbook containing the view with LUID ${e} is in an allowed project:`,V(l)].join(" ")}}return{allowed:!0}}},be=Kt.create(),LS={createResourceAccessChecker:Kt.createForTesting,resetResourceAccessCheckerSingleton:()=>{be=Kt.create()}};function Or({datasourceLuid:t}){if(!t)throw new Error("datasourceLuid must be a non-empty string.")}import{z as R}from"zod";var cp=R.object({name:R.string(),columnClass:R.string(),dataType:R.string().nullable(),defaultAggregation:R.string().nullable(),description:R.string().nullable(),descriptionInherited:R.array(R.object({attribute:R.string(),value:R.string().nullable()}).nullable()).nullable(),dataCategory:R.string().nullable(),role:R.string().nullable(),defaultFormat:R.string().nullable(),semanticRole:R.string().nullable(),aggregation:R.string().nullable(),aggregationParam:R.string().nullable(),formula:R.string().nullable(),isAutoGenerated:R.boolean().nullable(),hasUserReference:R.boolean().nullable(),binSize:R.number().nullable()}).partial(),up=R.object({name:R.string(),parameterType:R.string(),dataType:R.string().nullable(),value:R.union([R.number(),R.string(),R.boolean(),R.null()]),members:R.array(R.union([R.number(),R.string(),R.boolean(),R.null()])),min:R.number().nullable(),max:R.number().nullable(),step:R.number().nullable(),minDate:R.string().nullable(),maxDate:R.string().nullable(),periodValue:R.number().nullable(),periodType:R.string().nullable()}).partial(),US=R.object({fields:R.array(cp),parameters:R.array(up)});function Zo(t){let e={fields:[],parameters:[]};if(!t.data)return e;for(let r of t.data){let o={name:r.fieldCaption,dataType:r.dataType,columnClass:r.columnClass};r.defaultAggregation&&(o.defaultAggregation=r.defaultAggregation),r.formula&&(o.formula=r.formula),e.fields.push(o)}if(t.extraData?.parameters)for(let r of t.extraData.parameters){let o={name:r.parameterCaption,parameterType:r.parameterType,dataType:r.dataType,value:r.value};r.parameterType==="LIST"&&r.members?o.members=r.members:r.parameterType==="QUANTITATIVE_DATE"?(o.minDate=r.minDate,o.maxDate=r.maxDate,o.periodValue=r.periodValue,o.periodType=r.periodType):r.parameterType==="QUANTITATIVE_RANGE"&&(o.min=r.min,o.max=r.max,o.step=r.step),e.parameters.push(o)}return e}function kn(t,e){let r={fields:[],parameters:[]};if(!t.data){if(e.data.publishedDatasources[0]?.fields.length)for(let o of e.data.publishedDatasources[0].fields){let i={name:o.name};o.dataType&&(i.dataType=o.dataType),o.aggregation&&(i.defaultAggregation=o.aggregation),Dn(o,i),r.fields.push(i)}return r}for(let o of t.data){let i={name:o.fieldCaption,dataType:o.dataType,columnClass:o.columnClass};o.defaultAggregation&&(i.defaultAggregation=o.defaultAggregation),o.formula&&(i.formula=o.formula),r.fields.push(i)}if(t.extraData?.parameters)for(let o of t.extraData.parameters){let i={name:o.parameterCaption,parameterType:o.parameterType,dataType:o.dataType,value:o.value};o.parameterType==="LIST"&&o.members?i.members=o.members:o.parameterType==="QUANTITATIVE_DATE"?(i.minDate=o.minDate,i.maxDate=o.maxDate,i.periodValue=o.periodValue,i.periodType=o.periodType):o.parameterType==="QUANTITATIVE_RANGE"&&(i.min=o.min,i.max=o.max,i.step=o.step),r.parameters.push(i)}if(!e.data.publishedDatasources[0]?.fields.length)return r;for(let o of r.fields){let i=e.data.publishedDatasources[0].fields.find(n=>n.name===o.name);i&&Dn(i,o)}return r}function Dn(t,e){t.description&&(e.description=t.description),t.descriptionInherited?.length&&(e.descriptionInherited=t.descriptionInherited),t.dataCategory&&(e.dataCategory=t.dataCategory),t.role&&(e.role=t.role),t.defaultFormat&&(e.defaultFormat=t.defaultFormat),t.formula&&(e.formula=t.formula,t.isAutoGenerated!=null&&(e.isAutoGenerated=t.isAutoGenerated),t.hasUserReference!=null&&(e.hasUserReference=t.hasUserReference)),t.binSize!=null&&(e.binSize=t.binSize)}var pp=t=>`
18
18
  query datasourceFieldInfo {
19
19
  publishedDatasources(filter: { luid: "${t}" }) {
20
20
  name
@@ -75,11 +75,12 @@ var Ca=Object.defineProperty;var Ra=(t,e)=>{for(var r in e)Ca(t,r,{get:e[r],enum
75
75
  }
76
76
  }
77
77
  }
78
- }`,Od={datasourceLuid:Dd.string().nonempty()},Tn=t=>{let e=new O({server:t,name:"get-datasource-metadata",description:`
79
- This tool retrieves field metadata for a specified datasource by taking the basic, high level, metadata results from Tableau's VizQL Data Service and enriches them with additional context provided by Tableau's Metadata API.
80
- The fields provided by this tool will contain properties such as name and dataType, but may also expose richer context such as descriptions, dataCategories, roles, etc.
78
+ }`,mp={datasourceLuid:dp.string().nonempty()},Mn=t=>{let e=new N({server:t,name:"get-datasource-metadata",description:`
79
+ This tool retrieves metadata for a specified datasource by taking the basic, high level, metadata results from Tableau's VizQL Data Service and enriches them with additional context provided by Tableau's Metadata API.
80
+ The metadata provided by this tool consists of the fields and parameters that belong to the datasource.
81
+ Fields will contain properties such as name and dataType, but may also expose richer context such as descriptions, dataCategories, roles, etc.
81
82
  This tool should be used for getting the metadata to ground the use of a tool that queries Tableau published data sources.
82
- `,paramsSchema:Od,annotations:{title:"Get Datasource Metadata",readOnlyHint:!0,openWorldHint:!1},argsValidator:kr,callback:async({datasourceLuid:r},{requestId:o,authInfo:i})=>{let n=E(),s=Ld(r);return await e.logAndExecute({requestId:o,authInfo:i,args:{datasourceLuid:r},callback:async()=>{let a=await be.isDatasourceAllowed({datasourceLuid:r,restApiArgs:{config:n,requestId:o,server:t}});return a.allowed?await I({config:n,requestId:o,server:t,jwtScopes:["tableau:content:read","tableau:viz_data_service:read"],authInfo:N(i),callback:async c=>{let l=await c.vizqlDataServiceMethods.readMetadata({datasource:{datasourceLuid:r}});if(l.isErr())return wn({type:"feature-disabled"});if(n.disableMetadataApiRequests)return qo(Uo(l.value));let u;try{u=await c.metadataMethods.graphql(s)}catch{return qo(Uo(l.value))}return qo(yn(l.value,u))}}):new wn({type:"datasource-not-allowed",message:a.message})},constrainSuccessResult:a=>({type:"success",result:a}),getErrorText:a=>{switch(a.type){case"feature-disabled":return Ir();case"datasource-not-allowed":return a.message}}})}});return e};import{Ok as Bd}from"ts-results-es";import{z as Vo}from"zod";import{Ok as Md}from"ts-results-es";import{z as $e}from"zod";var Nd=$e.object({pageSize:$e.coerce.number().gt(0),pageNumber:$e.coerce.number().gt(0),limit:$e.coerce.number().gt(0)}).partial();async function yt({pageConfig:t,getDataFn:e}){let{pageSize:r,limit:o}=Nd.parse(t),{pagination:i,data:n}=await e(t),s=[...n],{totalAvailable:a,pageNumber:c}=i;for(;a>s.length&&(!o||o>s.length);){let{pagination:l,data:u}=await e({pageSize:r,pageNumber:c+1,limit:o});if(u.length===0)throw new Error(`No more data available. Last fetched page number: ${c}, Total available: ${a}, Total fetched: ${s.length}`);({totalAvailable:a,pageNumber:c}=l),s.push(...u)}return o&&o<s.length&&(s.length=o),s}var Fd=$e.object({limit:$e.coerce.number().gt(0).optional(),pageSize:$e.coerce.number().gt(0).optional()}).optional();async function An({config:t,getDataFn:e}){let r=Fd.parse(t),o=r?.limit,i=r?.pageSize,n=await e(void 0,i);if(n.isErr())return n;let{pagination:s,data:a}=n.value,c=[...a],l=s.total_available,u=s.next_page_token;for(!i&&l&&(i=Math.min(l-c.length,o?o-c.length:Number.MAX_SAFE_INTEGER));u&&(!o||o>c.length);){let p=await e(u,i);if(p.isErr())return p;let{pagination:g,data:b}=p.value;if(b.length===0)throw new Error(`No more data available. Total fetched: ${c.length}`);({next_page_token:u}=g),c.push(...b)}return o&&o<c.length&&(c.length=o),new Md(c)}var wt="**Supported Operators**\n - `eq`: equals\n - `gt`: greater than\n - `gte`: greater than or equal\n - `in`: any of [list] (for searching tags)\n - `lt`: less than\n - `lte`: less than or equal\n \n **Filter Expression Notes**\n - Filter expressions can't contain ampersand (&) or comma (,) characters even if those characters are encoded.\n - Operators are delimited with colons (:). For example: `filter=name:eq:Project Views`\n - Field names, operator names, and values are case-sensitive.\n - To filter on multiple fields, combine expressions using a comma: `filter=lastLogin:gte:2016-01-01T00:00:00Z,siteRole:eq:Publisher`\n - Multiple expressions are combined using a logical AND.\n - If you include the same field multiple times, only the last reference is used.\n - For date-time values, use ISO 8601 format (e.g., `2016-05-04T21:24:49Z`).\n - Wildcard searches (starts with, ends with, contains) are supported in recent Tableau versions:\n - Starts with: `?filter=name:eq:mark*`\n - Ends with: `?filter=name:eq:*-ample`\n - Contains: `?filter=name:eq:mark*ex*`";import{z as jo}from"zod";import Ud from"zod";var Qe=Ud.enum(["eq","in","gt","gte","lt","lte"]);function qd(t){return/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$/.test(t)}var jd=["createdAt","updatedAt"];function Tt({filterString:t,allowedOperatorsByField:e,filterFieldSchema:r}){function o(s,a){return e[s].includes(a)}let i=t.split(",").map(s=>s.trim()).filter(Boolean),n={};for(let s of i){let[a,c,...l]=s.split(":");if(!a||!c||l.length===0)throw new Error(`Invalid filter expression format: "${s}"`);let u=l.join(":"),p=r.parse(a),g=Qe.parse(c);if(!o(p,g))throw new Error(`Operator '${g}' is not allowed for field '${p}'. Allowed operators: ${e[p].join(", ")}`);if(jd.includes(p)&&!qd(u))throw new Error(`Value for field '${p}' must be a valid ISO 8601 date-time string (e.g., 2016-05-04T21:24:49Z)`);n[p]={field:p,operator:g,value:u}}return Object.values(n).map(s=>`${s.field}:${s.operator}:${s.value}`).join(",")}var En=jo.enum(["authenticationType","connectedWorkbookType","connectionTo","connectionType","contentUrl","createdAt","databaseName","databaseUserName","description","favoritesTotal","hasAlert","hasEmbeddedPassword","hasExtracts","isCertified","isConnectable","isDefaultPort","isHierarchical","isPublished","name","ownerDomain","ownerEmail","ownerName","projectName","serverName","serverPort","size","tableName","tags","type","updatedAt"]),Vd={authenticationType:["eq","in"],connectedWorkbookType:["eq","gt","gte","lt","lte"],connectionTo:["eq","in"],connectionType:["eq","in"],contentUrl:["eq","in"],createdAt:["eq","gt","gte","lt","lte"],databaseName:["eq","in"],databaseUserName:["eq","in"],description:["eq","in"],favoritesTotal:["eq","gt","gte","lt","lte"],hasAlert:["eq"],hasEmbeddedPassword:["eq"],hasExtracts:["eq"],isCertified:["eq"],isConnectable:["eq"],isDefaultPort:["eq"],isHierarchical:["eq"],isPublished:["eq"],name:["eq","in"],ownerDomain:["eq","in"],ownerEmail:["eq"],ownerName:["eq","in"],projectName:["eq","in"],serverName:["eq","in"],serverPort:["eq"],size:["eq","gt","gte","lt","lte"],tableName:["eq","in"],tags:["eq","in"],type:["eq"],updatedAt:["eq","gt","gte","lt","lte"]},mE=jo.object({field:En,operator:Qe,value:jo.string()});function _n(t){return Tt({filterString:t,allowedOperatorsByField:Vd,filterFieldSchema:En})}var zd={filter:Vo.string().optional(),pageSize:Vo.number().gt(0).optional(),limit:Vo.number().gt(0).optional()},Sn=t=>{let e=new O({server:t,name:"list-datasources",description:`
83
+ `,paramsSchema:mp,annotations:{title:"Get Datasource Metadata",readOnlyHint:!0,openWorldHint:!1},argsValidator:Or,callback:async({datasourceLuid:r},{requestId:o,authInfo:i})=>{let n=A(),s=pp(r);return await e.logAndExecute({requestId:o,authInfo:i,args:{datasourceLuid:r},callback:async()=>{let a=await be.isDatasourceAllowed({datasourceLuid:r,restApiArgs:{config:n,requestId:o,server:t}});return a.allowed?await D({config:n,requestId:o,server:t,jwtScopes:["tableau:content:read","tableau:viz_data_service:read"],authInfo:M(i),callback:async l=>{let c=await l.vizqlDataServiceMethods.readMetadata({datasource:{datasourceLuid:r}});if(c.isErr())return Ln({type:"feature-disabled"});if(n.disableMetadataApiRequests)return Xo(Zo(c.value));let u;try{u=await l.metadataMethods.graphql(s)}catch{return Xo(Zo(c.value))}return Xo(kn(c.value,u))}}):new Ln({type:"datasource-not-allowed",message:a.message})},constrainSuccessResult:a=>({type:"success",result:a}),getErrorText:a=>{switch(a.type){case"feature-disabled":return Mr();case"datasource-not-allowed":return a.message}}})}});return e};import{Ok as Ap}from"ts-results-es";import{z as ti}from"zod";import{Ok as fp}from"ts-results-es";import{z as Ke}from"zod";var hp=Ke.object({pageSize:Ke.coerce.number().gt(0),pageNumber:Ke.coerce.number().gt(0),limit:Ke.coerce.number().gt(0)}).partial();async function bt({pageConfig:t,getDataFn:e}){let{pageSize:r,limit:o}=hp.parse(t),{pagination:i,data:n}=await e(t),s=[...n],{totalAvailable:a,pageNumber:l}=i;for(;a>s.length&&(!o||o>s.length);){let{pagination:c,data:u}=await e({pageSize:r,pageNumber:l+1,limit:o});if(u.length===0)throw new Error(`No more data available. Last fetched page number: ${l}, Total available: ${a}, Total fetched: ${s.length}`);({totalAvailable:a,pageNumber:l}=c),s.push(...u)}return o&&o<s.length&&(s.length=o),s}var gp=Ke.object({limit:Ke.coerce.number().gt(0).optional(),pageSize:Ke.coerce.number().gt(0).optional()}).optional();async function On({config:t,getDataFn:e}){let r=gp.parse(t),o=r?.limit,i=r?.pageSize,n=await e(void 0,i);if(n.isErr())return n;let{pagination:s,data:a}=n.value,l=[...a],c=s.total_available,u=s.next_page_token;for(!i&&c&&(i=Math.min(c-l.length,o?o-l.length:Number.MAX_SAFE_INTEGER));u&&(!o||o>l.length);){let p=await e(u,i);if(p.isErr())return p;let{pagination:g,data:b}=p.value;if(b.length===0)throw new Error(`No more data available. Total fetched: ${l.length}`);({next_page_token:u}=g),l.push(...b)}return o&&o<l.length&&(l.length=o),new fp(l)}var Tt="**Supported Operators**\n - `eq`: equals\n - `gt`: greater than\n - `gte`: greater than or equal\n - `in`: any of [list] (for searching tags)\n - `lt`: less than\n - `lte`: less than or equal\n \n **Filter Expression Notes**\n - Filter expressions can't contain ampersand (&) or comma (,) characters even if those characters are encoded.\n - Operators are delimited with colons (:). For example: `filter=name:eq:Project Views`\n - Field names, operator names, and values are case-sensitive.\n - To filter on multiple fields, combine expressions using a comma: `filter=lastLogin:gte:2016-01-01T00:00:00Z,siteRole:eq:Publisher`\n - Multiple expressions are combined using a logical AND.\n - If you include the same field multiple times, only the last reference is used.\n - For date-time values, use ISO 8601 format (e.g., `2016-05-04T21:24:49Z`).\n - Wildcard searches (starts with, ends with, contains) are supported in recent Tableau versions:\n - Starts with: `?filter=name:eq:mark*`\n - Ends with: `?filter=name:eq:*-ample`\n - Contains: `?filter=name:eq:mark*ex*`";import{z as ei}from"zod";import yp from"zod";var Je=yp.enum(["eq","in","gt","gte","lt","lte"]);function bp(t){return/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$/.test(t)}var Tp=["createdAt","updatedAt"];function wt({filterString:t,allowedOperatorsByField:e,filterFieldSchema:r}){function o(s,a){return e[s].includes(a)}let i=t.split(",").map(s=>s.trim()).filter(Boolean),n={};for(let s of i){let[a,l,...c]=s.split(":");if(!a||!l||c.length===0)throw new Error(`Invalid filter expression format: "${s}"`);let u=c.join(":"),p=r.parse(a),g=Je.parse(l);if(!o(p,g))throw new Error(`Operator '${g}' is not allowed for field '${p}'. Allowed operators: ${e[p].join(", ")}`);if(Tp.includes(p)&&!bp(u))throw new Error(`Value for field '${p}' must be a valid ISO 8601 date-time string (e.g., 2016-05-04T21:24:49Z)`);n[p]={field:p,operator:g,value:u}}return Object.values(n).map(s=>`${s.field}:${s.operator}:${s.value}`).join(",")}var Nn=ei.enum(["authenticationType","connectedWorkbookType","connectionTo","connectionType","contentUrl","createdAt","databaseName","databaseUserName","description","favoritesTotal","hasAlert","hasEmbeddedPassword","hasExtracts","isCertified","isConnectable","isDefaultPort","isHierarchical","isPublished","name","ownerDomain","ownerEmail","ownerName","projectName","serverName","serverPort","size","tableName","tags","type","updatedAt"]),wp={authenticationType:["eq","in"],connectedWorkbookType:["eq","gt","gte","lt","lte"],connectionTo:["eq","in"],connectionType:["eq","in"],contentUrl:["eq","in"],createdAt:["eq","gt","gte","lt","lte"],databaseName:["eq","in"],databaseUserName:["eq","in"],description:["eq","in"],favoritesTotal:["eq","gt","gte","lt","lte"],hasAlert:["eq"],hasEmbeddedPassword:["eq"],hasExtracts:["eq"],isCertified:["eq"],isConnectable:["eq"],isDefaultPort:["eq"],isHierarchical:["eq"],isPublished:["eq"],name:["eq","in"],ownerDomain:["eq","in"],ownerEmail:["eq"],ownerName:["eq","in"],projectName:["eq","in"],serverName:["eq","in"],serverPort:["eq"],size:["eq","gt","gte","lt","lte"],tableName:["eq","in"],tags:["eq","in"],type:["eq"],updatedAt:["eq","gt","gte","lt","lte"]},nE=ei.object({field:Nn,operator:Je,value:ei.string()});function Un(t){return wt({filterString:t,allowedOperatorsByField:wp,filterFieldSchema:Nn})}var Sp={filter:ti.string().optional(),pageSize:ti.number().gt(0).optional(),limit:ti.number().gt(0).optional()},Fn=t=>{let e=new N({server:t,name:"list-datasources",description:`
83
84
  Retrieves a list of published data sources from a specified Tableau site using the Tableau REST API. Supports optional filtering via field:operator:value expressions (e.g., name:eq:Views) for precise and flexible data source discovery. Use this tool when a user requests to list, search, or filter Tableau data sources on a site.
84
85
 
85
86
  **Supported Filter Fields and Operators**
@@ -116,7 +117,7 @@ var Ca=Object.defineProperty;var Ra=(t,e)=>{for(var r in e)Ca(t,r,{get:e[r],enum
116
117
  | type | eq |
117
118
  | updatedAt | eq, gt, gte, lt, lte |
118
119
 
119
- ${wt}
120
+ ${Tt}
120
121
 
121
122
  **Example Usage:**
122
123
  - List all data sources on a site
@@ -128,7 +129,7 @@ var Ca=Object.defineProperty;var Ra=(t,e)=>{for(var r in e)Ca(t,r,{get:e[r],enum
128
129
  filter: "createdAt:gt:2023-01-01T00:00:00Z"
129
130
  - List data sources with the name "Project Views" in the "Finance" project and created after January 1, 2023:
130
131
  filter: "name:eq:Project Views,projectName:eq:Finance,createdAt:gt:2023-01-01T00:00:00Z"
131
- `,paramsSchema:zd,annotations:{title:"List Datasources",readOnlyHint:!0,openWorldHint:!1},callback:async({filter:r,pageSize:o,limit:i},{requestId:n,authInfo:s})=>{let a=E(),c=r?_n(r):void 0;return await e.logAndExecute({requestId:n,authInfo:s,args:{filter:r,pageSize:o,limit:i},callback:async()=>{let l=await I({config:a,requestId:n,server:t,jwtScopes:["tableau:content:read"],authInfo:N(s),callback:async u=>await yt({pageConfig:{pageSize:o,limit:a.maxResultLimit?Math.min(a.maxResultLimit,i??Number.MAX_SAFE_INTEGER):i},getDataFn:async g=>{let{pagination:b,datasources:f}=await u.datasourcesMethods.listDatasources({siteId:u.siteId,filter:c??"",pageSize:g.pageSize,pageNumber:g.pageNumber});return{pagination:b,data:f}}})});return new Bd(l)},constrainSuccessResult:l=>Wd({datasources:l,boundedContext:a.boundedContext})})}});return e};function Wd({datasources:t,boundedContext:e}){if(t.length===0)return{type:"empty",message:"No datasources were found. Either none exist or you do not have permission to view them."};let{projectIds:r,datasourceIds:o}=e;return r&&(t=t.filter(i=>r.has(i.project.id))),o&&(t=t.filter(i=>o.has(i.id))),t.length===0?{type:"empty",message:["The set of allowed data sources that can be queried is limited by the server configuration.","While data sources were found, they were all filtered out by the server configuration."].join(" ")}:{type:"success",result:t}}import{Err as vn}from"ts-results-es";import Cn from"zod";function de(t){switch(t){case"tableau-server":return["Pulse is not available on Tableau Server.","Consider disabling the Pulse MCP tools in your client or removing them using the EXCLUDE_TOOLS environment variable.","To enable Pulse on your Tableau Cloud site, please see the instructions at https://help.tableau.com/current/online/en-us/pulse_set_up.htm."].join(" ");case"pulse-disabled":return["Pulse is disabled on this Tableau Cloud site.","To enable Pulse, please see the instructions at https://help.tableau.com/current/online/en-us/pulse_set_up.htm."].join(" ")}}var Hd={bundleRequest:Er,bundleType:Cn.optional(Cn.enum(_r))},Rn=t=>{let e=new O({server:t,name:"generate-pulse-metric-value-insight-bundle",description:`
132
+ `,paramsSchema:Sp,annotations:{title:"List Datasources",readOnlyHint:!0,openWorldHint:!1},callback:async({filter:r,pageSize:o,limit:i},{requestId:n,authInfo:s})=>{let a=A(),l=r?Un(r):void 0;return await e.logAndExecute({requestId:n,authInfo:s,args:{filter:r,pageSize:o,limit:i},callback:async()=>{let c=await D({config:a,requestId:n,server:t,jwtScopes:["tableau:content:read"],authInfo:M(s),callback:async u=>await bt({pageConfig:{pageSize:o,limit:a.maxResultLimit?Math.min(a.maxResultLimit,i??Number.MAX_SAFE_INTEGER):i},getDataFn:async g=>{let{pagination:b,datasources:m}=await u.datasourcesMethods.listDatasources({siteId:u.siteId,filter:l??"",pageSize:g.pageSize,pageNumber:g.pageNumber});return{pagination:b,data:m}}})});return new Ap(c)},constrainSuccessResult:c=>Ep({datasources:c,boundedContext:a.boundedContext})})}});return e};function Ep({datasources:t,boundedContext:e}){if(t.length===0)return{type:"empty",message:"No datasources were found. Either none exist or you do not have permission to view them."};let{projectIds:r,datasourceIds:o}=e;return r&&(t=t.filter(i=>r.has(i.project.id))),o&&(t=t.filter(i=>o.has(i.id))),t.length===0?{type:"empty",message:["The set of allowed data sources that can be queried is limited by the server configuration.","While data sources were found, they were all filtered out by the server configuration."].join(" ")}:{type:"success",result:t}}import{Err as qn}from"ts-results-es";import jn from"zod";function de(t){switch(t){case"tableau-server":return["Pulse is not available on Tableau Server.","Consider disabling the Pulse MCP tools in your client or removing them using the EXCLUDE_TOOLS environment variable.","To enable Pulse on your Tableau Cloud site, please see the instructions at https://help.tableau.com/current/online/en-us/pulse_set_up.htm."].join(" ");case"pulse-disabled":return["Pulse is disabled on this Tableau Cloud site.","To enable Pulse, please see the instructions at https://help.tableau.com/current/online/en-us/pulse_set_up.htm."].join(" ")}}var _p={bundleRequest:_r,bundleType:jn.optional(jn.enum(vr))},Vn=t=>{let e=new N({server:t,name:"generate-pulse-metric-value-insight-bundle",description:`
132
133
  Generate an insight bundle for the current aggregated value for Pulse Metric using Tableau REST API. You need the full information of the Pulse Metric and Pulse Metric Definition to use this tool.
133
134
 
134
135
  **Parameters:**
@@ -235,7 +236,7 @@ Generate an insight bundle for the current aggregated value for Pulse Metric usi
235
236
  - Generate the detail insight bundle for the Pulse metric:
236
237
  bundleType: 'detail',
237
238
  bundleRequest: (See default example above)
238
- `,paramsSchema:Hd,annotations:{title:"Generate Pulse Metric Value Insight Bundle",readOnlyHint:!0,openWorldHint:!1},callback:async({bundleRequest:r,bundleType:o},{requestId:i,authInfo:n})=>{let s=E();return await e.logAndExecute({requestId:i,authInfo:n,args:{bundleRequest:r,bundleType:o},callback:async()=>{let{datasourceIds:a}=s.boundedContext;if(a){let l=r.bundle_request.input.metric.definition.datasource.id;if(!a.has(l))return new vn({type:"datasource-not-allowed",message:["The set of allowed metric insights that can be queried is limited by the server configuration.","Generating the Pulse Metric Value Insight Bundle is not allowed because the definition is derived",`from the data source with LUID ${l}, which is not in the allowed set of data sources.`].join(" ")})}let c=await I({config:s,requestId:i,server:t,jwtScopes:["tableau:insights:read"],authInfo:N(n),callback:async l=>await l.pulseMethods.generatePulseMetricValueInsightBundle(r,o??"ban")});return c.isErr()?new vn({type:"feature-disabled",reason:c.error}):c},constrainSuccessResult:a=>({type:"success",result:a}),getErrorText:a=>{switch(a.type){case"feature-disabled":return de(a.reason);case"datasource-not-allowed":return a.message}}})}});return e};import{Ok as Gd}from"ts-results-es";import{z as Dr}from"zod";function Pr({boundedContext:t,definitions:e}){if(e.length===0)return{type:"empty",message:"No Pulse Metric Definitions were found. Either none exist or you do not have permission to view them."};let{datasourceIds:r}=t;return r&&(e=e.filter(o=>r.has(o.specification.datasource.id))),e.length===0?{type:"empty",message:["The set of allowed Pulse Metric Definitions that can be queried is limited by the server configuration.","While Pulse Metric Definitions were found, they were all filtered out by the server configuration."].join(" ")}:{type:"success",result:e}}var $d={view:Dr.optional(Dr.enum(He)),limit:Dr.coerce.number().gt(0).optional(),pageSize:Dr.coerce.number().gt(0).optional()},xn=t=>{let e=new O({server:t,name:"list-all-pulse-metric-definitions",description:`
239
+ `,paramsSchema:_p,annotations:{title:"Generate Pulse Metric Value Insight Bundle",readOnlyHint:!0,openWorldHint:!1},callback:async({bundleRequest:r,bundleType:o},{requestId:i,authInfo:n})=>{let s=A();return await e.logAndExecute({requestId:i,authInfo:n,args:{bundleRequest:r,bundleType:o},callback:async()=>{let{datasourceIds:a}=s.boundedContext;if(a){let c=r.bundle_request.input.metric.definition.datasource.id;if(!a.has(c))return new qn({type:"datasource-not-allowed",message:["The set of allowed metric insights that can be queried is limited by the server configuration.","Generating the Pulse Metric Value Insight Bundle is not allowed because the definition is derived",`from the data source with LUID ${c}, which is not in the allowed set of data sources.`].join(" ")})}let l=await D({config:s,requestId:i,server:t,jwtScopes:["tableau:insights:read"],authInfo:M(n),callback:async c=>await c.pulseMethods.generatePulseMetricValueInsightBundle(r,o??"ban")});return l.isErr()?new qn({type:"feature-disabled",reason:l.error}):l},constrainSuccessResult:a=>({type:"success",result:a}),getErrorText:a=>{switch(a.type){case"feature-disabled":return de(a.reason);case"datasource-not-allowed":return a.message}}})}});return e};import{Ok as vp}from"ts-results-es";import{z as Ur}from"zod";function Nr({boundedContext:t,definitions:e}){if(e.length===0)return{type:"empty",message:"No Pulse Metric Definitions were found. Either none exist or you do not have permission to view them."};let{datasourceIds:r}=t;return r&&(e=e.filter(o=>r.has(o.specification.datasource.id))),e.length===0?{type:"empty",message:["The set of allowed Pulse Metric Definitions that can be queried is limited by the server configuration.","While Pulse Metric Definitions were found, they were all filtered out by the server configuration."].join(" ")}:{type:"success",result:e}}var Cp={view:Ur.optional(Ur.enum(Ge)),limit:Ur.coerce.number().gt(0).optional(),pageSize:Ur.coerce.number().gt(0).optional()},Bn=t=>{let e=new N({server:t,name:"list-all-pulse-metric-definitions",description:`
239
240
  Retrieves a list of all published Pulse Metric Definitions using the Tableau REST API. Use this tool when a user requests to list all Tableau Pulse Metric Definitions on the current site.
240
241
 
241
242
  **Parameters:**
@@ -260,7 +261,7 @@ Retrieves a list of all published Pulse Metric Definitions using the Tableau RES
260
261
  - See all metrics for my Pulse Metric Definitions:
261
262
  view: 'DEFINITION_VIEW_FULL'
262
263
  In the response you will only get up to 5 metrics, so if you want to see more you need to retrieve all the Pulse Metrics from another tool.
263
- `,paramsSchema:$d,annotations:{title:"List All Pulse Metric Definitions",readOnlyHint:!0,openWorldHint:!1},callback:async({view:r,limit:o,pageSize:i},{requestId:n,authInfo:s})=>{let a=E();return await e.logAndExecute({requestId:n,authInfo:s,args:{view:r,limit:o,pageSize:i},callback:async()=>await I({config:a,requestId:n,server:t,jwtScopes:["tableau:insight_definitions_metrics:read"],authInfo:N(s),callback:async c=>await An({config:{limit:a.maxResultLimit?Math.min(a.maxResultLimit,o??Number.MAX_SAFE_INTEGER):o,pageSize:i},getDataFn:async(u,p)=>{let g=await c.pulseMethods.listAllPulseMetricDefinitions(r,u,p);return g.isOk()?new Gd({pagination:g.value.pagination,data:g.value.definitions}):g}})}),constrainSuccessResult:c=>Pr({definitions:c,boundedContext:a.boundedContext}),getErrorText:de})}});return e};import{z as Lr}from"zod";var Qd={metricDefinitionIds:Lr.array(Lr.string().length(36)).min(1),view:Lr.optional(Lr.enum(He))},In=t=>{let e=new O({server:t,name:"list-pulse-metric-definitions-from-definition-ids",description:`
264
+ `,paramsSchema:Cp,annotations:{title:"List All Pulse Metric Definitions",readOnlyHint:!0,openWorldHint:!1},callback:async({view:r,limit:o,pageSize:i},{requestId:n,authInfo:s})=>{let a=A();return await e.logAndExecute({requestId:n,authInfo:s,args:{view:r,limit:o,pageSize:i},callback:async()=>await D({config:a,requestId:n,server:t,jwtScopes:["tableau:insight_definitions_metrics:read"],authInfo:M(s),callback:async l=>await On({config:{limit:a.maxResultLimit?Math.min(a.maxResultLimit,o??Number.MAX_SAFE_INTEGER):o,pageSize:i},getDataFn:async(u,p)=>{let g=await l.pulseMethods.listAllPulseMetricDefinitions(r,u,p);return g.isOk()?new vp({pagination:g.value.pagination,data:g.value.definitions}):g}})}),constrainSuccessResult:l=>Nr({definitions:l,boundedContext:a.boundedContext}),getErrorText:de})}});return e};import{z as Fr}from"zod";var Rp={metricDefinitionIds:Fr.array(Fr.string().length(36)).min(1),view:Fr.optional(Fr.enum(Ge))},zn=t=>{let e=new N({server:t,name:"list-pulse-metric-definitions-from-definition-ids",description:`
264
265
  Retrieves a list of specific Pulse Metric Definitions using the Tableau REST API from a list of metric definition IDs. Use this tool when a user requests information about specific Pulse Metric Definitions on the current site.
265
266
 
266
267
  **Parameters:**
@@ -289,7 +290,7 @@ Retrieves a list of specific Pulse Metric Definitions using the Tableau REST API
289
290
  metricDefinitionIds: ['BBC908D8-29ED-48AB-A78E-ACF8A424C8C3', 'BBC908D8-29ED-48AB-A78E-ACF8A424C8C4'],
290
291
  view: 'DEFINITION_VIEW_FULL'
291
292
  In the response you will only get up to 5 metrics, so if you want to see more you need to retrieve all the Pulse Metrics from another tool.
292
- `,paramsSchema:Qd,annotations:{title:"List Pulse Metric Definitions from Metric Definition IDs",readOnlyHint:!0,openWorldHint:!1},callback:async({view:r,metricDefinitionIds:o},{requestId:i,authInfo:n})=>{let s=E();return await e.logAndExecute({requestId:i,authInfo:n,args:{metricDefinitionIds:o,view:r},callback:async()=>await I({config:s,requestId:i,server:t,jwtScopes:["tableau:insight_definitions_metrics:read"],authInfo:N(n),callback:async a=>await a.pulseMethods.listPulseMetricDefinitionsFromMetricDefinitionIds(o,r)}),constrainSuccessResult:a=>Pr({definitions:a,boundedContext:s.boundedContext}),getErrorText:de})}});return e};import{z as Kd}from"zod";function Or({metrics:t,boundedContext:e}){if(t.length===0)return{type:"empty",message:"No Pulse Metrics were found. Either none exist or you do not have permission to view them."};let{datasourceIds:r}=e;return r&&(t=t.filter(o=>r.has(o.datasource_luid))),t.length===0?{type:"empty",message:["The set of allowed Pulse Metrics that can be queried is limited by the server configuration.","While Pulse Metrics were found, they were all filtered out by the server configuration."].join(" ")}:{type:"success",result:t}}var Jd={pulseMetricDefinitionID:Kd.string().length(36)},kn=t=>{let e=new O({server:t,name:"list-pulse-metrics-from-metric-definition-id",description:`
293
+ `,paramsSchema:Rp,annotations:{title:"List Pulse Metric Definitions from Metric Definition IDs",readOnlyHint:!0,openWorldHint:!1},callback:async({view:r,metricDefinitionIds:o},{requestId:i,authInfo:n})=>{let s=A();return await e.logAndExecute({requestId:i,authInfo:n,args:{metricDefinitionIds:o,view:r},callback:async()=>await D({config:s,requestId:i,server:t,jwtScopes:["tableau:insight_definitions_metrics:read"],authInfo:M(n),callback:async a=>await a.pulseMethods.listPulseMetricDefinitionsFromMetricDefinitionIds(o,r)}),constrainSuccessResult:a=>Nr({definitions:a,boundedContext:s.boundedContext}),getErrorText:de})}});return e};import{z as xp}from"zod";function qr({metrics:t,boundedContext:e}){if(t.length===0)return{type:"empty",message:"No Pulse Metrics were found. Either none exist or you do not have permission to view them."};let{datasourceIds:r}=e;return r&&(t=t.filter(o=>r.has(o.datasource_luid))),t.length===0?{type:"empty",message:["The set of allowed Pulse Metrics that can be queried is limited by the server configuration.","While Pulse Metrics were found, they were all filtered out by the server configuration."].join(" ")}:{type:"success",result:t}}var Ip={pulseMetricDefinitionID:xp.string().length(36)},Wn=t=>{let e=new N({server:t,name:"list-pulse-metrics-from-metric-definition-id",description:`
293
294
  Retrieves a list of published Pulse Metrics from a Pulse Metric Definition using the Tableau REST API. Use this tool when a user requests to list Tableau Pulse Metrics for a specific Pulse Metric Definition on the current site.
294
295
 
295
296
  **Parameters:**
@@ -297,7 +298,7 @@ Retrieves a list of published Pulse Metrics from a Pulse Metric Definition using
297
298
 
298
299
  **Example Usage:**
299
300
  - List all Pulse Metrics for this Pulse Metric Definition
300
- `,paramsSchema:Jd,annotations:{title:"List Pulse Metrics from Metric Definition ID",readOnlyHint:!0,openWorldHint:!1},callback:async({pulseMetricDefinitionID:r},{requestId:o,authInfo:i})=>{let n=E();return await e.logAndExecute({requestId:o,authInfo:i,args:{pulseMetricDefinitionID:r},callback:async()=>await I({config:n,requestId:o,server:t,jwtScopes:["tableau:insight_definitions_metrics:read"],authInfo:N(i),callback:async s=>await s.pulseMethods.listPulseMetricsFromMetricDefinitionId(r)}),constrainSuccessResult:s=>Or({metrics:s,boundedContext:n.boundedContext}),getErrorText:de})}});return e};import{z as Pn}from"zod";var Zd={metricIds:Pn.array(Pn.string().length(36))},Dn=t=>{let e=new O({server:t,name:"list-pulse-metrics-from-metric-ids",description:`
301
+ `,paramsSchema:Ip,annotations:{title:"List Pulse Metrics from Metric Definition ID",readOnlyHint:!0,openWorldHint:!1},callback:async({pulseMetricDefinitionID:r},{requestId:o,authInfo:i})=>{let n=A();return await e.logAndExecute({requestId:o,authInfo:i,args:{pulseMetricDefinitionID:r},callback:async()=>await D({config:n,requestId:o,server:t,jwtScopes:["tableau:insight_definitions_metrics:read"],authInfo:M(i),callback:async s=>await s.pulseMethods.listPulseMetricsFromMetricDefinitionId(r)}),constrainSuccessResult:s=>qr({metrics:s,boundedContext:n.boundedContext}),getErrorText:de})}});return e};import{z as Hn}from"zod";var Pp={metricIds:Hn.array(Hn.string().length(36))},$n=t=>{let e=new N({server:t,name:"list-pulse-metrics-from-metric-ids",description:`
301
302
  Retrieves a list of published Pulse Metrics from a list of metric IDs using the Tableau REST API. Use this tool when a user requests to list Tableau Pulse Metrics for a list of metric IDs on the current site.
302
303
 
303
304
  **Parameters:**
@@ -311,7 +312,7 @@ Retrieves a list of published Pulse Metrics from a list of metric IDs using the
311
312
  - This tool is recommended for use with data in Pulse Metric Subscriptions.
312
313
  - 00000000-0000-0000-0000-000000000000 is not a valid datasource id.
313
314
  - If you need a valid datasource id, you may need to retrieve the Pulse Metric Definition for the Pulse Metric which should have a valid datasource information.
314
- `,paramsSchema:Zd,annotations:{title:"List Pulse Metrics from Metric IDs",readOnlyHint:!0,openWorldHint:!1},callback:async({metricIds:r},{requestId:o,authInfo:i})=>{let n=E();return await e.logAndExecute({requestId:o,authInfo:i,args:{metricIds:r},callback:async()=>await I({config:n,requestId:o,server:t,jwtScopes:["tableau:insight_metrics:read"],authInfo:N(i),callback:async s=>await s.pulseMethods.listPulseMetricsFromMetricIds(r)}),constrainSuccessResult:s=>Or({metrics:s,boundedContext:n.boundedContext}),getErrorText:de})}});return e};var Yd={},Ln=t=>{let e=new O({server:t,name:"list-pulse-metric-subscriptions",description:`
315
+ `,paramsSchema:Pp,annotations:{title:"List Pulse Metrics from Metric IDs",readOnlyHint:!0,openWorldHint:!1},callback:async({metricIds:r},{requestId:o,authInfo:i})=>{let n=A();return await e.logAndExecute({requestId:o,authInfo:i,args:{metricIds:r},callback:async()=>await D({config:n,requestId:o,server:t,jwtScopes:["tableau:insight_metrics:read"],authInfo:M(i),callback:async s=>await s.pulseMethods.listPulseMetricsFromMetricIds(r)}),constrainSuccessResult:s=>qr({metrics:s,boundedContext:n.boundedContext}),getErrorText:de})}});return e};var Dp={},Gn=t=>{let e=new N({server:t,name:"list-pulse-metric-subscriptions",description:`
315
316
  Retrieves a list of published Pulse Metric Subscriptions for the current user using the Tableau REST API. Use this tool when a user requests to list Tableau Pulse Metric Subscriptions for the current user.
316
317
 
317
318
  **Example Usage:**
@@ -322,13 +323,14 @@ Retrieves a list of published Pulse Metric Subscriptions for the current user us
322
323
  - This tool does not directly provide information about Pulse Metric Definitions. If you need to know information about Pulse Metric Defintiions associated with your subscriptions you need to:
323
324
  1. Retrieve Pulse Metrics from the metric ids returned in the Pulse Metric Subscriptions.
324
325
  2. Retrieve Pulse Metric Definitions from the metric definition id returned in the Pulse Metrics.
325
- `,paramsSchema:Yd,annotations:{title:"List Pulse Metric Subscriptions for Current User",readOnlyHint:!0,openWorldHint:!1},callback:async(r,{requestId:o,authInfo:i})=>{let n=E();return await e.logAndExecute({requestId:o,authInfo:i,args:{},callback:async()=>await I({config:n,requestId:o,server:t,jwtScopes:["tableau:metric_subscriptions:read"],authInfo:N(i),callback:async s=>await s.pulseMethods.listPulseMetricSubscriptionsForCurrentUser()}),constrainSuccessResult:async s=>await Xd({subscriptions:s,boundedContext:n.boundedContext,restApiArgs:{config:n,requestId:o,server:t}}),getErrorText:de})}});return e};async function Xd({subscriptions:t,boundedContext:e,restApiArgs:r}){if(t.length===0)return{type:"empty",message:"No Pulse Metric Subscriptions were found. Either none exist or you do not have permission to view them."};let{datasourceIds:o}=e;if(!o)return{type:"success",result:t};let{config:i,requestId:n,server:s}=r;try{let a=await I({config:i,requestId:n,server:s,jwtScopes:["tableau:insight_metrics:read"],callback:async l=>await l.pulseMethods.listPulseMetricsFromMetricIds(t.map(u=>u.metric_id))});if(a.isErr())return{type:"error",message:["The set of allowed Pulse Metric Subscriptions that can be queried is limited by the server configuration.","While Pulse Metric Subscriptions were found, an error occurred while retrieving information about them to determine if they are allowed to be viewed.",W(a.error)].join(" ")};let c=new Set(a.value.filter(l=>o.has(l.datasource_luid)).map(l=>l.id));return t=t.filter(l=>c.has(l.metric_id)),t.length===0?{type:"empty",message:["The set of allowed Pulse Metric Subscriptions that can be queried is limited by the server configuration.","While Pulse Metric Subscriptions were found, they were all filtered out by the server configuration."].join(" ")}:{type:"success",result:t}}catch(a){return{type:"error",message:["The set of allowed Pulse Metric Subscriptions that can be queried is limited by the server configuration.","While Pulse Metric Subscriptions were found, an error occurred while retrieving information about them to determine if they are allowed to be viewed.",W(a)].join(" ")}}}import{ZodiosError as lp}from"@zodios/core";import{Err as Ho}from"ts-results-es";import{z as cp}from"zod";import{z as Ke}from"zod";var ep=Ke.record(Ke.string().nonempty(),Ke.array(Ke.object({luid:Ke.string().optional(),u:Ke.string().nonempty(),p:Ke.string().nonempty()}).transform(({luid:t,u:e,p:r})=>({connectionLuid:t,connectionUsername:e,connectionPassword:r})))),On,Mn=!1,Nn=t=>{if(!Mn){Mn=!0;let{datasourceCredentials:e}=E();if(!e)return;let r;try{r=JSON.parse(e)}catch(i){throw new Error(`Invalid datasource credentials format. Could not parse JSON string: ${e}`,{cause:i})}let o=ep.parse(r);On=new Map(Object.entries(o))}return On?.get(t)};function Fn(t){let e={...t};switch(t.errorCode){case"400000":e.condition="Bad request",e.details="The content of the request body is invalid. Check for missing or incomplete JSON.";break;case"400800":e.condition="Invalid formula for calculation",e.details="Invalid custom calculation syntax. For help, see https://help.tableau.com/current/pro/desktop/en-us/functions_operators.htm";break;case"400802":e.condition="Invalid API request",e.details="The incoming request isn't valid per the OpenAPI specification.";break;case"400803":e.condition="Validation failed",e.details="The incoming request isn't valid per the validation rules.";break;case"400804":e.condition="Response too large",e.details="The response value exceeds the limit. You must apply a filter in your request.";break;case"401001":e.condition="Login error",e.details="The login failed for the given user.";break;case"401002":e.condition="Invalid authorization credentials",e.details="The provided auth token is formatted incorrectly.";break;case"403157":e.condition="Feature disabled",e.details="The feature is disabled.";break;case"403800":e.condition="API access permission denied",e.details="The user doesn't have API Access granted on the given data source. Set the API Access capability for the given data source to Allowed. For help, see https://help.tableau.com/current/online/en-us/permissions_capabilities.htm";break;case"404934":e.condition="Unknown field",e.details="The requested field doesn't exist.";break;case"404950":e.condition="API endpoint not found",e.details="The request endpoint doesn't exist.";break;case"408000":e.condition="Request timeout",e.details="The request timed out.";break;case"409000":e.condition="User already on site",e.details="HTTP status conflict.";break;case"429000":e.condition="Too many requests",e.details="Too many requests in the allotted amount of time. For help, see https://help.tableau.com/current/api/vizql-data-service/en-us/docs/vds_limitations.html#licensing-and-data-transfer";break;case"500000":e.condition="Internal server error",e.details="The request could not be completed.";break;case"500810":e.condition="VDS empty table response",e.details="The underlying data engine returned empty data value response.";break;case"500811":e.condition="VDS missing table",e.details="The underlying data engine returned empty metadata associated with response.";break;case"500812":e.condition="Error while processing an error",e.details="Internal processing error.";break;case"501000":e.condition="Not implemented",e.details="Can't find response from upstream server.";break;case"503800":e.condition="VDS unavailable",e.details="The underlying data engine is unavailable.";break;case"503801":e.condition="VDS discovery error",e.details="The upstream service can't be found.";break;case"504000":e.condition="Gateway timeout",e.details="The upstream service response timed out.";break}return e}function Un(t){if(t.length===0)throw new Error("The query must include at least one field. The fields property cannot be an empty array.");if(t.some(tp))throw new Error("The query must not include any fields with an empty fieldCaption.");{let e=t.reduce((o,i)=>(i.sortPriority===void 0||(o[i.sortPriority]||(o[i.sortPriority]=[]),o[i.sortPriority].push(i.fieldCaption)),o),{}),r=Object.entries(e).filter(([o,i])=>i.length>1);if(r.length>0){let o=r.reduce((i,[n,s])=>(i.push(`${s.map(a=>`"${a}"`).join(", ")} with a sort priority of ${n}`),i),[]);throw new Error(`The query must not include duplicate sort priorities. The following fields have sort priorities that are duplicated: ${o.join(". ")}.`)}}{let e=t.filter(Bo).map(r=>r.fieldCaption);if(e.length>0)throw new Error(`The query must not include fields that contain both a function and a calculation. The following fields contain both a function and a calculation: ${e.join(", ")}.`)}{let e=t.filter(rp).map(r=>r.fieldCaption);if(e.length>0)throw new Error(`The query must not include fields that have a maxDecimalPlaces value that is less than 0. The following fields have a maxDecimalPlaces value that is less than 0: ${e.join(", ")}.`)}}function tp(t){return!t.fieldCaption}function Bo(t){return!!("function"in t&&t.function&&"calculation"in t&&t.calculation)}function qn(t){return!!("fieldCaption"in t&&t.fieldCaption&&"calculation"in t&&t.calculation)}function rp(t){return t.maxDecimalPlaces!==void 0&&t.maxDecimalPlaces<0}import{Err as zo,Ok as op}from"ts-results-es";function Vn(t){if(t){if(t.some(e=>!("field"in e)))throw new Error("The query must not include filters with invalid fields. The following field errors occurred: The filter must include a field property.");{let e=t.reduce((o,i)=>("fieldCaption"in i.field&&(o[i.field.fieldCaption]||(o[i.field.fieldCaption]=0),o[i.field.fieldCaption]++),o),{}),r=Object.entries(e).filter(([o,i])=>i>1);if(r.length>0)throw new Error(`The query must not include multiple filters for the following fields: ${r.map(([o])=>o).join(", ")}.`)}{let e=t.reduce((r,o)=>{if(!("field"in o))return r;let i=jn(o.field);return i.isErr()&&r.push(i.error),r},[]);if(e.length>0)throw new Error(`The query must not include filters with invalid fields. The following field errors occurred: ${e.join(", ")}.`)}if(t.filter(r=>["SET","MATCH","DATE"].includes(r.filterType)&&("function"in r.field&&r.field.function||"calculation"in r.field&&r.field.calculation)).length>0)throw new Error("The query must not include Set Filters, Match Filters, or Relative Date Filters with functions or calculations.");if(t.filter(r=>r.filterType==="SET"&&r.values.length===0).length>0)throw new Error("The query must not include Set Filters with an empty values array.");if(t.filter(r=>{if(r.filterType!=="QUANTITATIVE_DATE")return!1;switch(r.quantitativeFilterType){case"RANGE":return isNaN(Date.parse(r.minDate))||isNaN(Date.parse(r.maxDate));case"MIN":return isNaN(Date.parse(r.minDate));case"MAX":return isNaN(Date.parse(r.maxDate))}}).length>0)throw new Error("The query must not include Quantitative Date Filters with invalid dates. Dates must use the RFC 3339 standard. Example: 2025-03-14");if(t.filter(r=>r.filterType==="DATE"&&r.anchorDate&&isNaN(Date.parse(r.anchorDate))).length>0)throw new Error("The query must not include Relative Date Filters with invalid anchor dates. Anchor dates must use the RFC 3339 standard. Example: 2025-03-14");{let e=t.reduce((r,o)=>{if(o.filterType!=="TOP")return r;let i=jn(o.fieldToMeasure);return i.isErr()&&r.push(i.error),r},[]);if(e.length>0)throw new Error(`The query must not include Top N filters with invalid fields. The following field errors occurred: ${e.join(", ")}`)}{let e=t.reduce((r,o)=>(o.filterType!=="MATCH"||!o.startsWith&&!o.endsWith&&!o.contains&&r.push(`The match filter for field "${o.field.fieldCaption}" must include at least one of the following properties: startsWith, endsWith, or contains`),r),[]);if(e.length>0)throw new Error(`The query must not include Match Filters with invalid fields. The following field errors occurred: ${e.join(", ")}.`)}}}function jn(t){if(ip(t))return new zo("The fieldCaption property must be a non-empty string.");if(qn(t)){let e="fieldCaption"in t?`"${t.fieldCaption}" `:"";return new zo(`The field ${e} must not contain both a fieldCaption and a calculation.`.replace(" "," "))}if(Bo(t)){let e="fieldCaption"in t?`"${t.fieldCaption}" `:"";return new zo(`The field ${e} must not contain both a function and a calculation.`.replace(" "," "))}return op.EMPTY}function ip(t){return"fieldCaption"in t&&!t.fieldCaption}function Bn({datasourceLuid:t,query:e}){kr({datasourceLuid:t});let{fields:r,filters:o}=e;if(Un(r),Vn(o),!Ht.safeParse(e).success)throw new Error("The query does not match the expected schema.")}var zn=`# Query Tableau Data Source Tool
326
+ `,paramsSchema:Dp,annotations:{title:"List Pulse Metric Subscriptions for Current User",readOnlyHint:!0,openWorldHint:!1},callback:async(r,{requestId:o,authInfo:i})=>{let n=A();return await e.logAndExecute({requestId:o,authInfo:i,args:{},callback:async()=>await D({config:n,requestId:o,server:t,jwtScopes:["tableau:metric_subscriptions:read"],authInfo:M(i),callback:async s=>await s.pulseMethods.listPulseMetricSubscriptionsForCurrentUser()}),constrainSuccessResult:async s=>await kp({subscriptions:s,boundedContext:n.boundedContext,restApiArgs:{config:n,requestId:o,server:t}}),getErrorText:de})}});return e};async function kp({subscriptions:t,boundedContext:e,restApiArgs:r}){if(t.length===0)return{type:"empty",message:"No Pulse Metric Subscriptions were found. Either none exist or you do not have permission to view them."};let{datasourceIds:o}=e;if(!o)return{type:"success",result:t};let{config:i,requestId:n,server:s}=r;try{let a=await D({config:i,requestId:n,server:s,jwtScopes:["tableau:insight_metrics:read"],callback:async c=>await c.pulseMethods.listPulseMetricsFromMetricIds(t.map(u=>u.metric_id))});if(a.isErr())return{type:"error",message:["The set of allowed Pulse Metric Subscriptions that can be queried is limited by the server configuration.","While Pulse Metric Subscriptions were found, an error occurred while retrieving information about them to determine if they are allowed to be viewed.",V(a.error)].join(" ")};let l=new Set(a.value.filter(c=>o.has(c.datasource_luid)).map(c=>c.id));return t=t.filter(c=>l.has(c.metric_id)),t.length===0?{type:"empty",message:["The set of allowed Pulse Metric Subscriptions that can be queried is limited by the server configuration.","While Pulse Metric Subscriptions were found, they were all filtered out by the server configuration."].join(" ")}:{type:"success",result:t}}catch(a){return{type:"error",message:["The set of allowed Pulse Metric Subscriptions that can be queried is limited by the server configuration.","While Pulse Metric Subscriptions were found, an error occurred while retrieving information about them to determine if they are allowed to be viewed.",V(a)].join(" ")}}}import{ZodiosError as Kp}from"@zodios/core";import{Err as Vr}from"ts-results-es";import{z as Jp}from"zod";import{ZodiosError as Lp}from"@zodios/core";import{fromError as Mp,isZodErrorLike as Op}from"zod-validation-error";var At=class extends Map{timeouts;expirationTimeMs;constructor({defaultExpirationTimeMs:e}){if(super(),e<=0)throw new Error("Expiration time must be greater than 0");if(e>2**31-1)throw new Error(`Expiration time must be at most ${2**31-1}`);this.timeouts=new Map,this.expirationTimeMs=e}get defaultExpirationTimeMs(){return this.expirationTimeMs}set=(e,r,o=this.expirationTimeMs)=>{if(o<=0)throw new Error("Expiration time must be greater than 0");if(o>2**31-1)throw new Error(`Expiration time must be at most ${2**31-1}`);let i=this.timeouts.get(e);i&&clearTimeout(i),super.set(e,r);let n=setTimeout(()=>{this.delete(e)},o);return this.timeouts.set(e,n),this};delete=e=>{let r=this.timeouts.get(e);return r&&(clearTimeout(r),this.timeouts.delete(e)),super.delete(e)};clear=()=>{this.timeouts.forEach(e=>clearTimeout(e)),this.timeouts.clear(),super.clear()};[Symbol.dispose](){this.clear()}};var jr,Qn=async t=>{if(!t)throw new Error("server cannot be empty");jr||(jr=new At({defaultExpirationTimeMs:A().tableauServerVersionCheckIntervalInHours*60*60*1e3}));let e=jr.get(t);if(e)return e;let r=new Le(t);try{let o=(await r.serverMethods.getServerInfo()).productVersion;return jr.set(t,o),o}catch(o){let i=o instanceof Lp&&Op(o.cause)?Mp(o.cause).toString():V(o);throw new Error(`Failed to get server version: ${i}`)}};async function Kn({server:t,mappings:e}){let r=await Qn(t);for(let[o,i]of Object.entries(e))if(Np({productVersion:r,minVersion:o}))return i;return e.default}function Np({productVersion:t,minVersion:e}){let{value:r}=t;if(r==="main")return!0;let[o,i,n]=r.split(".").map(Number);if([o,i,n].some(isNaN))return!0;let[s,a,l]=e.split(".").map(Number);return o>s||o===s&&i>a||o===s&&i===a&&n>=l}import{z as Ye}from"zod";var Up=Ye.record(Ye.string().nonempty(),Ye.array(Ye.object({luid:Ye.string().optional(),u:Ye.string().nonempty(),p:Ye.string().nonempty()}).transform(({luid:t,u:e,p:r})=>({connectionLuid:t,connectionUsername:e,connectionPassword:r})))),Jn,Yn=!1,Zn=t=>{if(!Yn){Yn=!0;let{datasourceCredentials:e}=A();if(!e)return;let r;try{r=JSON.parse(e)}catch(i){throw new Error(`Invalid datasource credentials format. Could not parse JSON string: ${e}`,{cause:i})}let o=Up.parse(r);Jn=new Map(Object.entries(o))}return Jn?.get(t)};function Xn(t){let e={...t};switch(t.errorCode){case"400000":e.condition="Bad request",e.details="The content of the request body is invalid. Check for missing or incomplete JSON.";break;case"400800":e.condition="Invalid formula for calculation",e.details="Invalid custom calculation syntax. For help, see https://help.tableau.com/current/pro/desktop/en-us/functions_operators.htm";break;case"400802":e.condition="Invalid API request",e.details="The incoming request isn't valid per the OpenAPI specification.";break;case"400803":e.condition="Validation failed",e.details="The incoming request isn't valid per the validation rules.";break;case"400804":e.condition="Response too large",e.details="The response value exceeds the limit. You must apply a filter in your request.";break;case"401001":e.condition="Login error",e.details="The login failed for the given user.";break;case"401002":e.condition="Invalid authorization credentials",e.details="The provided auth token is formatted incorrectly.";break;case"403157":e.condition="Feature disabled",e.details="The feature is disabled.";break;case"403800":e.condition="API access permission denied",e.details="The user doesn't have API Access granted on the given data source. Set the API Access capability for the given data source to Allowed. For help, see https://help.tableau.com/current/online/en-us/permissions_capabilities.htm";break;case"404934":e.condition="Unknown field",e.details="The requested field doesn't exist.";break;case"404950":e.condition="API endpoint not found",e.details="The request endpoint doesn't exist.";break;case"408000":e.condition="Request timeout",e.details="The request timed out.";break;case"409000":e.condition="User already on site",e.details="HTTP status conflict.";break;case"429000":e.condition="Too many requests",e.details="Too many requests in the allotted amount of time. For help, see https://help.tableau.com/current/api/vizql-data-service/en-us/docs/vds_limitations.html#licensing-and-data-transfer";break;case"500000":e.condition="Internal server error",e.details="The request could not be completed.";break;case"500810":e.condition="VDS empty table response",e.details="The underlying data engine returned empty data value response.";break;case"500811":e.condition="VDS missing table",e.details="The underlying data engine returned empty metadata associated with response.";break;case"500812":e.condition="Error while processing an error",e.details="Internal processing error.";break;case"501000":e.condition="Not implemented",e.details="Can't find response from upstream server.";break;case"503800":e.condition="VDS unavailable",e.details="The underlying data engine is unavailable.";break;case"503801":e.condition="VDS discovery error",e.details="The upstream service can't be found.";break;case"504000":e.condition="Gateway timeout",e.details="The upstream service response timed out.";break}return e}function ea(t){if(t.length===0)throw new Error("The query must include at least one field. The fields property cannot be an empty array.");if(t.some(Fp))throw new Error("The query must not include any fields with an empty fieldCaption.");{let e=t.reduce((o,i)=>(i.sortPriority===void 0||(o[i.sortPriority]||(o[i.sortPriority]=[]),o[i.sortPriority].push(i.fieldCaption)),o),{}),r=Object.entries(e).filter(([o,i])=>i.length>1);if(r.length>0){let o=r.reduce((i,[n,s])=>(i.push(`${s.map(a=>`"${a}"`).join(", ")} with a sort priority of ${n}`),i),[]);throw new Error(`The query must not include duplicate sort priorities. The following fields have sort priorities that are duplicated: ${o.join(". ")}.`)}}{let e=t.filter(ri).map(r=>r.fieldCaption);if(e.length>0)throw new Error(`The query must not include fields that contain both a function and a calculation. The following fields contain both a function and a calculation: ${e.join(", ")}.`)}{let e=t.filter(qp).map(r=>r.fieldCaption);if(e.length>0)throw new Error(`The query must not include fields that have a maxDecimalPlaces value that is less than 0. The following fields have a maxDecimalPlaces value that is less than 0: ${e.join(", ")}.`)}}function Fp(t){return!t.fieldCaption}function ri(t){return!!("function"in t&&t.function&&"calculation"in t&&t.calculation)}function ta(t){return!!("fieldCaption"in t&&t.fieldCaption&&"calculation"in t&&t.calculation)}function qp(t){return t.maxDecimalPlaces!==void 0&&t.maxDecimalPlaces<0}import{Err as oi,Ok as jp}from"ts-results-es";function oa(t){if(t){if(t.some(e=>!("field"in e)))throw new Error("The query must not include filters with invalid fields. The following field errors occurred: The filter must include a field property.");{let e=t.reduce((o,i)=>("fieldCaption"in i.field&&(o[i.field.fieldCaption]||(o[i.field.fieldCaption]=0),o[i.field.fieldCaption]++),o),{}),r=Object.entries(e).filter(([o,i])=>i>1);if(r.length>0)throw new Error(`The query must not include multiple filters for the following fields: ${r.map(([o])=>o).join(", ")}.`)}{let e=t.reduce((r,o)=>{if(!("field"in o))return r;let i=ra(o.field);return i.isErr()&&r.push(i.error),r},[]);if(e.length>0)throw new Error(`The query must not include filters with invalid fields. The following field errors occurred: ${e.join(", ")}.`)}if(t.filter(r=>["SET","MATCH","DATE"].includes(r.filterType)&&("function"in r.field&&r.field.function||"calculation"in r.field&&r.field.calculation)).length>0)throw new Error("The query must not include Set Filters, Match Filters, or Relative Date Filters with functions or calculations.");if(t.filter(r=>r.filterType==="SET"&&r.values.length===0).length>0)throw new Error("The query must not include Set Filters with an empty values array.");if(t.filter(r=>{if(r.filterType!=="QUANTITATIVE_DATE")return!1;switch(r.quantitativeFilterType){case"RANGE":return isNaN(Date.parse(r.minDate))||isNaN(Date.parse(r.maxDate));case"MIN":return isNaN(Date.parse(r.minDate));case"MAX":return isNaN(Date.parse(r.maxDate))}}).length>0)throw new Error("The query must not include Quantitative Date Filters with invalid dates. Dates must use the RFC 3339 standard. Example: 2025-03-14");if(t.filter(r=>r.filterType==="DATE"&&r.anchorDate&&isNaN(Date.parse(r.anchorDate))).length>0)throw new Error("The query must not include Relative Date Filters with invalid anchor dates. Anchor dates must use the RFC 3339 standard. Example: 2025-03-14");{let e=t.reduce((r,o)=>{if(o.filterType!=="TOP")return r;let i=ra(o.fieldToMeasure);return i.isErr()&&r.push(i.error),r},[]);if(e.length>0)throw new Error(`The query must not include Top N filters with invalid fields. The following field errors occurred: ${e.join(", ")}`)}{let e=t.reduce((r,o)=>(o.filterType!=="MATCH"||!o.startsWith&&!o.endsWith&&!o.contains&&r.push(`The match filter for field "${o.field.fieldCaption}" must include at least one of the following properties: startsWith, endsWith, or contains`),r),[]);if(e.length>0)throw new Error(`The query must not include Match Filters with invalid fields. The following field errors occurred: ${e.join(", ")}.`)}}}function ra(t){if(Vp(t))return new oi("The fieldCaption property must be a non-empty string.");if(ta(t)){let e="fieldCaption"in t?`"${t.fieldCaption}" `:"";return new oi(`The field ${e} must not contain both a fieldCaption and a calculation.`.replace(" "," "))}if(ri(t)){let e="fieldCaption"in t?`"${t.fieldCaption}" `:"";return new oi(`The field ${e} must not contain both a function and a calculation.`.replace(" "," "))}return jp.EMPTY}function Vp(t){return"fieldCaption"in t&&!t.fieldCaption}function ia({datasourceLuid:t,query:e}){Or({datasourceLuid:t});let{fields:r,filters:o}=e;if(ea(r),oa(o),!$t.safeParse(e).success)throw new Error("The query does not match the expected schema.")}var sa=`# Query Tableau Data Source Tool
326
327
 
327
328
  Executes VizQL queries against Tableau data sources to answer business questions from published data. This tool allows you to retrieve aggregated and filtered data with proper sorting and grouping.
328
329
 
329
330
  ## Prerequisites
330
331
  Before using this tool, you should:
331
332
  1. Understand available fields and their types
333
+ 2. Understand what parameters are available and their types
332
334
  3. Understand the data structure and field relationships
333
335
 
334
336
  ## Best Practices
@@ -354,8 +356,52 @@ Before using this tool, you should:
354
356
  ### Field Usage Guidelines
355
357
  - **Prefer existing fields** - Use fields already modeled in the data source rather than creating custom calculations
356
358
  - **Use calculations sparingly** - Only create calculated fields when absolutely necessary and the calculation cannot be achieved through existing fields and aggregations
359
+ - **Use bins for distribution analysis** - Create bins to group continuous data into discrete ranges (e.g., age groups, price ranges)
357
360
  - **Validate field availability** - Always check field metadata before constructing queries
358
361
 
362
+ ### Field Types
363
+
364
+ #### Dimension Fields
365
+ Basic fields without aggregation:
366
+ \`\`\`json
367
+ {
368
+ "fieldCaption": "Category",
369
+ "fieldAlias": "Product Category"
370
+ }
371
+ \`\`\`
372
+
373
+ #### Measure Fields
374
+ Fields with aggregation functions (SUM, AVG, COUNT, etc.):
375
+ \`\`\`json
376
+ {
377
+ "fieldCaption": "Sales",
378
+ "function": "SUM",
379
+ "fieldAlias": "Total Sales",
380
+ "maxDecimalPlaces": 2
381
+ }
382
+ \`\`\`
383
+
384
+ #### Calculated Fields
385
+ Custom fields defined using Tableau calculation syntax:
386
+ \`\`\`json
387
+ {
388
+ "fieldCaption": "Profit Margin",
389
+ "calculation": "SUM([Profit]) / SUM([Sales])",
390
+ "fieldAlias": "Margin %"
391
+ }
392
+ \`\`\`
393
+
394
+ #### Bin Fields
395
+ Group continuous data into discrete ranges:
396
+ \`\`\`json
397
+ {
398
+ "fieldCaption": "Sales",
399
+ "binSize": 1000,
400
+ "fieldAlias": "Sales Range"
401
+ }
402
+ \`\`\`
403
+ This creates bins of $1,000 intervals (0-1000, 1000-2000, etc.)
404
+
359
405
  ### Query Construction
360
406
  - **Group by meaningful dimensions** - Ensure grouping supports the business question being asked
361
407
  - **Order results logically** - Use sortDirection and sortPriority to present data in a meaningful way
@@ -398,6 +444,107 @@ When a query might return large amounts of data, follow this profiling approach:
398
444
 
399
445
  **Step 3: Apply appropriate aggregation or filtering based on counts**
400
446
 
447
+ ## Parameters
448
+
449
+ Parameters are dynamic values defined in the Tableau datasource that can be used to control calculations, filters, and query behavior. They allow for interactive, user-controlled queries without modifying the query structure.
450
+
451
+ ### When to Use Parameters
452
+ - **Dynamic filtering** - Let users control date ranges, regions, or categories
453
+ - **What-if analysis** - Adjust values like growth rates, targets, or thresholds
454
+ - **Calculation control** - Switch between different metrics or calculation methods
455
+ - **User preferences** - Currency selection, display units, or other settings
456
+
457
+ ### Parameter Types
458
+ - **LIST** - Predefined values (e.g., regions, categories)
459
+ - **ANY_VALUE** - Free-form values matching data type
460
+ - **QUANTITATIVE_RANGE** - Numeric values with optional min/max/step
461
+ - **QUANTITATIVE_DATE** - Date values with optional range constraints
462
+
463
+ ### Usage Example
464
+ \`\`\`json
465
+ {
466
+ "datasourceLuid": "abc123",
467
+ "query": {
468
+ "fields": [...],
469
+ "filters": [...],
470
+ "parameters": [
471
+ {
472
+ "name": "Selected Year",
473
+ "value": 2024
474
+ },
475
+ {
476
+ "name": "Currency",
477
+ "value": "USD"
478
+ }
479
+ ]
480
+ }
481
+ }
482
+ \`\`\`
483
+
484
+ - Parameters affect entire query; filters restrict returned data
485
+
486
+ ## Bins
487
+
488
+ Bins group continuous numerical data into discrete ranges, enabling distribution analysis and histogram creation. Unlike parameters and filters, bins are created dynamically in the query.
489
+
490
+ ### Creating Bin Fields
491
+
492
+ To create a bin field in a query, you **must** include:
493
+ 1. A **measure field** with the base field and aggregation function
494
+ 2. A **bin field** with the same fieldCaption and a binSize property
495
+
496
+ **Example:**
497
+ \`\`\`json
498
+ {
499
+ "fields": [
500
+ {
501
+ "fieldCaption": "Sales",
502
+ "function": "SUM",
503
+ "fieldAlias": "Total Sales"
504
+ },
505
+ {
506
+ "fieldCaption": "Sales",
507
+ "binSize": 1000,
508
+ "fieldAlias": "Sales Range"
509
+ }
510
+ ]
511
+ }
512
+ \`\`\`
513
+
514
+ This creates bins of $1,000 intervals (0-1000, 1000-2000, etc.)
515
+
516
+ ### When to Use Bins
517
+ - Analyzing distribution patterns (age groups, price ranges, score brackets)
518
+ - Creating histograms or frequency distributions
519
+ - Grouping continuous numerical data into meaningful categories
520
+ - User asks questions like "How many customers in each age range?" or "What's the distribution of order sizes?"
521
+
522
+ ### Bin Restrictions
523
+ - **Cannot override existing bin fields** - If a bin field already exists in the datasource, query it without binSize
524
+ - **binSize must be positive** - Only values > 0 are allowed
525
+ - **Measure fields only** - Can only bin numeric/quantitative fields
526
+ - **Choose appropriate bin sizes** - Consider your data range (e.g., bin size 100 for values 0-10,000)
527
+
528
+ ### Querying Existing Bin Fields
529
+
530
+ If a bin field already exists in the datasource (e.g., "Profit (bin)"), query it as a regular dimension field:
531
+
532
+ \`\`\`json
533
+ {
534
+ "fields": [
535
+ {
536
+ "fieldCaption": "Profit (bin)"
537
+ },
538
+ {
539
+ "fieldCaption": "Profit",
540
+ "function": "SUM"
541
+ }
542
+ ]
543
+ }
544
+ \`\`\`
545
+
546
+ To control existing bin field behavior, use parameters if available (e.g., "Profit Bin Size").
547
+
401
548
  ## Filter Types and Usage
402
549
 
403
550
  ### SET Filters
@@ -611,6 +758,69 @@ Filter relative date periods:
611
758
  }
612
759
  \`\`\`
613
760
 
761
+ ### Example 5: Distribution Analysis Using Bins
762
+ **Question:** "How are our sales distributed across different price ranges?"
763
+
764
+ \`\`\`json
765
+ {
766
+ "datasourceLuid": "abc123",
767
+ "query": {
768
+ "fields": [
769
+ {
770
+ "fieldCaption": "Sales",
771
+ "binSize": 1000,
772
+ "fieldAlias": "Sales Range",
773
+ "sortDirection": "ASC",
774
+ "sortPriority": 1
775
+ },
776
+ {
777
+ "fieldCaption": "Order ID",
778
+ "function": "COUNT",
779
+ "fieldAlias": "Number of Orders"
780
+ },
781
+ {
782
+ "fieldCaption": "Sales",
783
+ "function": "SUM",
784
+ "fieldAlias": "Total Sales in Range"
785
+ }
786
+ ]
787
+ }
788
+ }
789
+ \`\`\`
790
+
791
+ ### Example 6: Using Parameters for Dynamic Analysis
792
+ **Question:** "Show me sales for the selected region and year"
793
+
794
+ \`\`\`json
795
+ {
796
+ "datasourceLuid": "abc123",
797
+ "query": {
798
+ "fields": [
799
+ {
800
+ "fieldCaption": "Category"
801
+ },
802
+ {
803
+ "fieldCaption": "Sales",
804
+ "function": "SUM",
805
+ "fieldAlias": "Total Sales",
806
+ "sortDirection": "DESC",
807
+ "sortPriority": 1
808
+ }
809
+ ],
810
+ "parameters": [
811
+ {
812
+ "name": "Selected Region",
813
+ "value": "West"
814
+ },
815
+ {
816
+ "name": "Analysis Year",
817
+ "value": 2024
818
+ }
819
+ ]
820
+ }
821
+ }
822
+ \`\`\`
823
+
614
824
  ## Error Prevention and Data Management
615
825
 
616
826
  **When to profile data first:**
@@ -631,7 +841,318 @@ Filter relative date periods:
631
841
  **Instead:**
632
842
  - Use metadata tools to understand available fields
633
843
  - Suggest alternative questions that can be answered with available data
634
- - Recommend appropriate aggregation levels for the business question`;import Kt from"fast-levenshtein";import{Err as Wo,Ok as Je}from"ts-results-es";async function Wn(t,e,r,o){if(!e.filters)return Je.EMPTY;let i=[],n=e.filters.filter(s=>(s.filterType==="SET"||s.filterType==="MATCH")&&"fieldCaption"in s.field&&s.field.fieldCaption);if(n.length===0)return Je.EMPTY;for(let s of n){let a=s.field.fieldCaption;try{if(s.filterType==="SET"){let c=await sp(s,r,o);c.isErr()&&i.push(c.error)}else if(s.filterType==="MATCH"){let c=await np(s,r,o);c.isErr()&&i.push(c.error)}}catch(c){ue.warning(t,`Filter value validation failed for field ${a}: ${c}`)}}return i.length>0?new Wo(i):Je.EMPTY}async function sp(t,e,r){let o=t.field.fieldCaption,i=t.values.map(p=>String(p)),s={datasource:r,query:{fields:[{fieldCaption:o,fieldAlias:"DistinctValues"}]},options:{returnFormat:"OBJECTS",debug:!0,disaggregate:!1}},a=await e.queryDatasource(s);if(a.isErr())return Je.EMPTY;let c=a.value.data||[],l=new Set(c.map(p=>String(p.DistinctValues||p[o]||""))),u=i.filter(p=>!l.has(p));if(u.length>0){let p=ap(u,Array.from(l),3,5),g=`Filter validation failed for field "${o}". The following values were not found: ${u.join(", ")}.`;return p.length>0&&(g+=` Did you mean: ${p.join(", ")}?`),g+=" Please evaluate whether you included the wrong filter value or if you are trying to filter on the wrong field entirely.",new Wo({field:o,invalidValues:u,sampleValues:p,message:g})}return Je.EMPTY}async function np(t,e,r){let o=t.field.fieldCaption,n={datasource:r,query:{fields:[{fieldCaption:o,fieldAlias:"SampleValues"}]},options:{returnFormat:"OBJECTS",debug:!0,disaggregate:!1}},s=await e.queryDatasource(n);if(s.isErr())return Je.EMPTY;let c=(s.value.data||[]).map(u=>String(u.SampleValues||u[o]||""));if(!c.some(u=>!(t.startsWith&&!u.startsWith(t.startsWith)||t.endsWith&&!u.endsWith(t.endsWith)||t.contains&&!u.includes(t.contains)))){let u=new Set;for(let f of c){if(u.size>=5)break;let y=f.toLowerCase(),w=t.startsWith?(()=>{let A=t.startsWith.toLowerCase(),x=A.length,R=Math.min(2,Math.floor(x/2)),j=y.slice(0,x);return Kt.get(A,j)<=R})():!0,v=t.endsWith?(()=>{let A=t.endsWith.toLowerCase(),x=A.length,R=Math.min(2,Math.floor(x/2)),j=y.slice(-x);return Kt.get(A,j)<=R})():!0,D=t.contains?(()=>{let A=t.contains.toLowerCase(),x=A.length,R=Math.min(2,Math.floor(x/2));return y.length>=x?Array.from({length:y.length-x+1},(j,F)=>Kt.get(A,y.slice(F,F+x))).some(j=>j<=R):Kt.get(A,y)<=R})():!0;w&&v&&D&&u.add(f)}let p=[];t.startsWith&&p.push(`starts with "${t.startsWith}"`),t.endsWith&&p.push(`ends with "${t.endsWith}"`),t.contains&&p.push(`contains "${t.contains}"`);let g=u.size>0?`Similar values in this field: ${Array.from(u).join(", ")}.`:"",b=`Filter validation failed for field "${o}". No values found that ${p.join(" and ")}. ${g} Please evaluate whether you included the wrong filter value or if you are trying to filter on the wrong field entirely.`;return new Wo({field:o,invalidValues:p,sampleValues:Array.from(u),message:b})}return Je.EMPTY}function ap(t,e,r=3,o=5){let i=[];for(let c of e){let l=t.map(u=>({value:u,distance:Kt.get(u.toLowerCase(),c.toLowerCase())})).filter(u=>u.distance<=r).sort((u,p)=>u.distance-p.distance);if(l.length>0){let u=l[0];i.push({invalidValue:u.value,suggestionForInvalidValue:c,distance:u.distance})}}i.sort((c,l)=>c.distance-l.distance);let n=[],s=Math.ceil(o/t.length),a=new Map;for(let c of t)a.set(c,0);for(let{invalidValue:c,suggestionForInvalidValue:l}of i){if(n.length===o)break;a.get(c)!==s&&(n.push(l),a.set(c,a.get(c)+1))}for(let{suggestionForInvalidValue:c}of i){if(n.length===o)break;if(n.includes(c))continue;n.push(c)}return n}var up={datasourceLuid:cp.string().nonempty(),query:Ht},Hn=t=>{let e=new O({server:t,name:"query-datasource",description:zn,paramsSchema:up,annotations:{title:"Query Datasource",readOnlyHint:!0,openWorldHint:!1},argsValidator:Bn,callback:async({datasourceLuid:r,query:o},{requestId:i,authInfo:n})=>{let s=E();return await e.logAndExecute({requestId:i,authInfo:n,args:{datasourceLuid:r,query:o},callback:async()=>{let a=await be.isDatasourceAllowed({datasourceLuid:r,restApiArgs:{config:s,requestId:i,server:t}});if(!a.allowed)return new Ho({type:"datasource-not-allowed",message:a.message});let c={datasourceLuid:r},l={returnFormat:"OBJECTS",debug:!0,disaggregate:!1},u=Nn(r);u&&(c.connections=u);let p={datasource:c,query:o,options:l};return await I({config:s,requestId:i,server:t,jwtScopes:["tableau:viz_data_service:read"],authInfo:N(n),callback:async g=>{if(!s.disableQueryDatasourceFilterValidation){let f=await Wn(t,o,g.vizqlDataServiceMethods,c);if(f.isErr()){let w=f.error.map(v=>v.message).join(", ");return new Ho({type:"filter-validation",message:w})}}let b=await g.vizqlDataServiceMethods.queryDatasource(p);return b.isErr()?new Ho(b.error instanceof lp?b.error:b.error==="feature-disabled"?{type:"feature-disabled"}:{type:"tableau-error",error:b.error}):b}})},constrainSuccessResult:a=>({type:"success",result:a}),getErrorText:a=>{switch(a.type){case"feature-disabled":return Ir();case"datasource-not-allowed":return a.message;case"filter-validation":return JSON.stringify({requestId:i,errorType:"validation",message:a.message});case"tableau-error":return JSON.stringify({requestId:i,...Fn(a.error)})}}})}});return e};import{Err as dp,Ok as pp}from"ts-results-es";import{z as mp}from"zod";var fp={viewId:mp.string()},Gn=t=>{let e=new O({server:t,name:"get-view-data",description:"Retrieves data in comma separated value (CSV) format for the specified view in a Tableau workbook.",paramsSchema:fp,annotations:{title:"Get View Data",readOnlyHint:!0,openWorldHint:!1},callback:async({viewId:r},{requestId:o,authInfo:i})=>{let n=E();return await e.logAndExecute({requestId:o,authInfo:i,args:{viewId:r},callback:async()=>{let s=await be.isViewAllowed({viewId:r,restApiArgs:{config:n,requestId:o,server:t}});return s.allowed?new pp(await I({config:n,requestId:o,server:t,jwtScopes:["tableau:views:download"],authInfo:N(i),callback:async a=>await a.viewsMethods.queryViewData({viewId:r,siteId:a.siteId})})):new dp({type:"view-not-allowed",message:s.message})},constrainSuccessResult:s=>({type:"success",result:s}),getErrorText:s=>{switch(s.type){case"view-not-allowed":return s.message}}})}});return e};import{Err as hp,Ok as gp}from"ts-results-es";import{z as Go}from"zod";function $n(t){return{isError:!1,content:[{type:"image",data:Buffer.from(t).toString("base64"),mimeType:"image/png"}]}}var bp={viewId:Go.string(),width:Go.number().gt(0).optional(),height:Go.number().gt(0).optional()},Qn=t=>{let e=new O({server:t,name:"get-view-image",description:"Retrieves an image of the specified view in a Tableau workbook. The width and height in pixels can be provided. The default width and height are both 800 pixels.",paramsSchema:bp,annotations:{title:"Get View Image",readOnlyHint:!0,openWorldHint:!1},callback:async({viewId:r,width:o,height:i},{requestId:n,authInfo:s})=>{let a=E();return await e.logAndExecute({requestId:n,authInfo:s,args:{viewId:r},callback:async()=>{let c=await be.isViewAllowed({viewId:r,restApiArgs:{config:a,requestId:n,server:t}});return c.allowed?new gp(await I({config:a,requestId:n,server:t,jwtScopes:["tableau:views:download"],authInfo:N(s),callback:async l=>await l.viewsMethods.queryViewImage({viewId:r,siteId:l.siteId,width:o,height:i,resolution:"high"})})):new hp({type:"view-not-allowed",message:c.message})},constrainSuccessResult:c=>({type:"success",result:c}),getSuccessResult:$n,getErrorText:c=>{switch(c.type){case"view-not-allowed":return c.message}}})}});return e};import{Ok as wp}from"ts-results-es";import{z as Qo}from"zod";import{z as $o}from"zod";var Kn=$o.enum(["caption","contentUrl","createdAt","favoritesTotal","fields","hitsTotal","name","ownerDomain","ownerEmail","ownerName","projectName","sheetNumber","sheetType","tags","title","updatedAt","viewUrlname","workbookDescription","workbookName"]),yp={caption:["eq","in"],contentUrl:["eq","in"],createdAt:["eq","gt","gte","lt","lte"],favoritesTotal:["eq","gt","gte","lt","lte"],fields:["eq","in"],hitsTotal:["eq","gt","gte","lt","lte"],name:["eq","in"],ownerDomain:["eq","in"],ownerEmail:["eq","in"],ownerName:["eq","in"],projectName:["eq","in"],sheetNumber:["eq","gt","gte","lt","lte"],sheetType:["eq","in"],tags:["eq","in"],title:["eq","in"],updatedAt:["eq","gt","gte","lt","lte"],viewUrlname:["eq","in"],workbookDescription:["eq","in"],workbookName:["eq","in"]},qS=$o.object({field:Kn,operator:Qe,value:$o.string()});function Jn(t){return Tt({filterString:t,allowedOperatorsByField:yp,filterFieldSchema:Kn})}var Tp={filter:Qo.string().optional(),pageSize:Qo.number().gt(0).optional(),limit:Qo.number().gt(0).optional()},Zn=t=>{let e=new O({server:t,name:"list-views",description:`
844
+ - Recommend appropriate aggregation levels for the business question`;var na=`# Query Tableau Data Source Tool
845
+
846
+ Executes VizQL queries against Tableau data sources to answer business questions from published data. This tool allows you to retrieve aggregated and filtered data with proper sorting and grouping.
847
+
848
+ ## Prerequisites
849
+ Before using this tool, you should:
850
+ 1. Understand available fields and their types
851
+ 3. Understand the data structure and field relationships
852
+
853
+ ## Best Practices
854
+
855
+ ### Data Volume Management
856
+ - **Always prefer aggregation** - Use aggregated fields (SUM, COUNT, AVG, etc.) instead of raw row-level data to reduce response size
857
+ - **Profile data before querying** - When unsure about data volume, first run a COUNT query to understand the scale:
858
+ \`\`\`json
859
+ {
860
+ "fields": [
861
+ {
862
+ "fieldCaption": "Order ID",
863
+ "function": "COUNT",
864
+ "fieldAlias": "Total Records"
865
+ }
866
+ ]
867
+ }
868
+ \`\`\`
869
+ - **Use TOP filters for rankings** - When users ask for "top N" results, use TOP filter type to limit results at the database level
870
+ - **Apply restrictive filters** - Use SET, QUANTITATIVE, or DATE filters to reduce data volume before processing
871
+ - **Avoid row-level queries when possible** - Only retrieve individual records when specifically requested and the business need is clear
872
+
873
+ ### Field Usage Guidelines
874
+ - **Prefer existing fields** - Use fields already modeled in the data source rather than creating custom calculations
875
+ - **Use calculations sparingly** - Only create calculated fields when absolutely necessary and the calculation cannot be achieved through existing fields and aggregations
876
+ - **Validate field availability** - Always check field metadata before constructing queries
877
+
878
+ ### Query Construction
879
+ - **Group by meaningful dimensions** - Ensure grouping supports the business question being asked
880
+ - **Order results logically** - Use sortDirection and sortPriority to present data in a meaningful way
881
+ - **Use appropriate date functions** - Choose the right date aggregation (YEAR, QUARTER, MONTH, WEEK, DAY, or TRUNC_* variants)
882
+ - **Leverage filter capabilities** - Use the extensive filter options to narrow results
883
+
884
+ ## Data Profiling Strategy
885
+
886
+ When a query might return large amounts of data, follow this profiling approach:
887
+
888
+ **Step 1: Count total records**
889
+ \`\`\`json
890
+ {
891
+ "fields": [
892
+ {
893
+ "fieldCaption": "Primary_Key_Field",
894
+ "function": "COUNT",
895
+ "fieldAlias": "Total Records"
896
+ }
897
+ ]
898
+ }
899
+ \`\`\`
900
+
901
+ **Step 2: Count by key dimensions**
902
+ \`\`\`json
903
+ {
904
+ "fields": [
905
+ {
906
+ "fieldCaption": "Category",
907
+ "fieldAlias": "Category"
908
+ },
909
+ {
910
+ "fieldCaption": "Order ID",
911
+ "function": "COUNT",
912
+ "fieldAlias": "Record Count"
913
+ }
914
+ ]
915
+ }
916
+ \`\`\`
917
+
918
+ **Step 3: Apply appropriate aggregation or filtering based on counts**
919
+
920
+ ## Filter Types and Usage
921
+
922
+ ### SET Filters
923
+ Filter by specific values:
924
+ \`\`\`json
925
+ {
926
+ "field": {"fieldCaption": "Region"},
927
+ "filterType": "SET",
928
+ "values": ["North", "South", "East"],
929
+ "exclude": false
930
+ }
931
+ \`\`\`
932
+
933
+ ### TOP Filters
934
+ Get top/bottom N records by a measure:
935
+ \`\`\`json
936
+ {
937
+ "field": {"fieldCaption": "Customer Name"},
938
+ "filterType": "TOP",
939
+ "howMany": 10,
940
+ "direction": "TOP",
941
+ "fieldToMeasure": {"fieldCaption": "Sales", "function": "SUM"}
942
+ }
943
+ \`\`\`
944
+
945
+ ### QUANTITATIVE Filters
946
+ Filter numeric ranges:
947
+ \`\`\`json
948
+ {
949
+ "field": {"fieldCaption": "Sales"},
950
+ "filterType": "QUANTITATIVE_NUMERICAL",
951
+ "quantitativeFilterType": "RANGE",
952
+ "min": 1000,
953
+ "max": 50000,
954
+ "includeNulls": false
955
+ }
956
+ \`\`\`
957
+
958
+ ### DATE Filters
959
+ Filter relative date periods:
960
+ \`\`\`json
961
+ {
962
+ "field": {"fieldCaption": "Order Date"},
963
+ "filterType": "DATE",
964
+ "periodType": "MONTHS",
965
+ "dateRangeType": "LAST"
966
+ }
967
+ \`\`\`
968
+
969
+ ## Example Queries
970
+
971
+ ### Example 1: Data Profiling Before Large Query
972
+ **Question:** "Show me all customer orders this year"
973
+
974
+ **Step 1 - Profile the data volume:**
975
+ \`\`\`json
976
+ {
977
+ "datasourceLuid": "abc123",
978
+ "query": {
979
+ "fields": [
980
+ {
981
+ "fieldCaption": "Order ID",
982
+ "function": "COUNT",
983
+ "fieldAlias": "Total Orders This Year"
984
+ }
985
+ ],
986
+ "filters": [
987
+ {
988
+ "field": {"fieldCaption": "Order Date"},
989
+ "filterType": "DATE",
990
+ "periodType": "YEARS",
991
+ "dateRangeType": "CURRENT"
992
+ }
993
+ ]
994
+ }
995
+ }
996
+ \`\`\`
997
+
998
+ **If count is manageable (< 10,000), proceed with detail query. If large, suggest aggregation:**
999
+ \`\`\`json
1000
+ {
1001
+ "datasourceLuid": "abc123",
1002
+ "query": {
1003
+ "fields": [
1004
+ {
1005
+ "fieldCaption": "Customer Name"
1006
+ },
1007
+ {
1008
+ "fieldCaption": "Order Date",
1009
+ "function": "TRUNC_MONTH",
1010
+ "sortDirection": "DESC",
1011
+ "sortPriority": 1
1012
+ },
1013
+ {
1014
+ "fieldCaption": "Sales",
1015
+ "function": "SUM",
1016
+ "fieldAlias": "Monthly Sales"
1017
+ }
1018
+ ],
1019
+ "filters": [
1020
+ {
1021
+ "field": {"fieldCaption": "Order Date"},
1022
+ "filterType": "DATE",
1023
+ "periodType": "YEARS",
1024
+ "dateRangeType": "CURRENT"
1025
+ }
1026
+ ]
1027
+ }
1028
+ }
1029
+ \`\`\`
1030
+
1031
+ ### Example 2: Top Customers Query (Using TOP Filter)
1032
+ **Question:** "Who are our top 10 customers by revenue?"
1033
+
1034
+ \`\`\`json
1035
+ {
1036
+ "datasourceLuid": "abc123",
1037
+ "query": {
1038
+ "fields": [
1039
+ {
1040
+ "fieldCaption": "Customer Name"
1041
+ },
1042
+ {
1043
+ "fieldCaption": "Sales",
1044
+ "function": "SUM",
1045
+ "fieldAlias": "Total Revenue",
1046
+ "sortDirection": "DESC",
1047
+ "sortPriority": 1
1048
+ }
1049
+ ],
1050
+ "filters": [
1051
+ {
1052
+ "field": {"fieldCaption": "Customer Name"},
1053
+ "filterType": "TOP",
1054
+ "howMany": 10,
1055
+ "direction": "TOP",
1056
+ "fieldToMeasure": {"fieldCaption": "Sales", "function": "SUM"}
1057
+ }
1058
+ ]
1059
+ }
1060
+ }
1061
+ \`\`\`
1062
+
1063
+ ### Example 3: Time Series with Aggregation
1064
+ **Question:** "What are our monthly sales trends?"
1065
+
1066
+ \`\`\`json
1067
+ {
1068
+ "datasourceLuid": "abc123",
1069
+ "query": {
1070
+ "fields": [
1071
+ {
1072
+ "fieldCaption": "Order Date",
1073
+ "function": "TRUNC_MONTH",
1074
+ "fieldAlias": "Month",
1075
+ "sortDirection": "ASC",
1076
+ "sortPriority": 1
1077
+ },
1078
+ {
1079
+ "fieldCaption": "Sales",
1080
+ "function": "SUM",
1081
+ "fieldAlias": "Monthly Sales"
1082
+ },
1083
+ {
1084
+ "fieldCaption": "Order ID",
1085
+ "function": "COUNT",
1086
+ "fieldAlias": "Order Count"
1087
+ }
1088
+ ]
1089
+ }
1090
+ }
1091
+ \`\`\`
1092
+
1093
+ ### Example 4: Filtered Category Analysis
1094
+ **Question:** "What's the performance by product category for high-value orders?"
1095
+
1096
+ \`\`\`json
1097
+ {
1098
+ "datasourceLuid": "abc123",
1099
+ "query": {
1100
+ "fields": [
1101
+ {
1102
+ "fieldCaption": "Category"
1103
+ },
1104
+ {
1105
+ "fieldCaption": "Sales",
1106
+ "function": "SUM",
1107
+ "fieldAlias": "Total Sales"
1108
+ },
1109
+ {
1110
+ "fieldCaption": "Sales",
1111
+ "function": "AVG",
1112
+ "fieldAlias": "Average Order Value",
1113
+ "maxDecimalPlaces": 2
1114
+ },
1115
+ {
1116
+ "fieldCaption": "Order ID",
1117
+ "function": "COUNT",
1118
+ "fieldAlias": "Order Count"
1119
+ }
1120
+ ],
1121
+ "filters": [
1122
+ {
1123
+ "field": {"fieldCaption": "Sales"},
1124
+ "filterType": "QUANTITATIVE_NUMERICAL",
1125
+ "quantitativeFilterType": "MIN",
1126
+ "min": 500
1127
+ }
1128
+ ]
1129
+ }
1130
+ }
1131
+ \`\`\`
1132
+
1133
+ ## Error Prevention and Data Management
1134
+
1135
+ **When to profile data first:**
1136
+ - User asks for "all records" or similar broad requests
1137
+ - Query involves high-cardinality fields without filters
1138
+ - Request could potentially return row-level data for large tables
1139
+
1140
+ **Suggest aggregation when:**
1141
+ - Profile queries return very high counts (> 10,000 records)
1142
+ - User asks questions that can be answered with summaries
1143
+ - Performance or response size might be an issue
1144
+
1145
+ **Don't call this tool if:**
1146
+ - The requested fields are not available in the data source
1147
+ - The question requires data not present in the current data source
1148
+ - Field validation shows incompatible field types for the requested operation
1149
+
1150
+ **Instead:**
1151
+ - Use metadata tools to understand available fields
1152
+ - Suggest alternative questions that can be answered with available data
1153
+ - Recommend appropriate aggregation levels for the business question`;import Jt from"fast-levenshtein";import{Err as ii,Ok as Ze}from"ts-results-es";async function aa(t,e,r,o){if(!e.filters)return Ze.EMPTY;let i=[],n=e.filters.filter(s=>(s.filterType==="SET"||s.filterType==="MATCH")&&"fieldCaption"in s.field&&s.field.fieldCaption);if(n.length===0)return Ze.EMPTY;for(let s of n){let a=s.field.fieldCaption;try{if(s.filterType==="SET"){let l=await Bp(s,r,o);l.isErr()&&i.push(l.error)}else if(s.filterType==="MATCH"){let l=await zp(s,r,o);l.isErr()&&i.push(l.error)}}catch(l){ue.warning(t,`Filter value validation failed for field ${a}: ${l}`)}}return i.length>0?new ii(i):Ze.EMPTY}async function Bp(t,e,r){let o=t.field.fieldCaption,i=t.values.map(p=>String(p)),s={datasource:r,query:{fields:[{fieldCaption:o,fieldAlias:"DistinctValues"}]},options:{returnFormat:"OBJECTS",debug:!0,disaggregate:!1}},a=await e.queryDatasource(s);if(a.isErr())return Ze.EMPTY;let l=a.value.data||[],c=new Set(l.map(p=>String(p.DistinctValues||p[o]||""))),u=i.filter(p=>!c.has(p));if(u.length>0){let p=Wp(u,Array.from(c),3,5),g=`Filter validation failed for field "${o}". The following values were not found: ${u.join(", ")}.`;return p.length>0&&(g+=` Did you mean: ${p.join(", ")}?`),g+=" Please evaluate whether you included the wrong filter value or if you are trying to filter on the wrong field entirely.",new ii({field:o,invalidValues:u,sampleValues:p,message:g})}return Ze.EMPTY}async function zp(t,e,r){let o=t.field.fieldCaption,n={datasource:r,query:{fields:[{fieldCaption:o,fieldAlias:"SampleValues"}]},options:{returnFormat:"OBJECTS",debug:!0,disaggregate:!1}},s=await e.queryDatasource(n);if(s.isErr())return Ze.EMPTY;let l=(s.value.data||[]).map(u=>String(u.SampleValues||u[o]||""));if(!l.some(u=>!(t.startsWith&&!u.startsWith(t.startsWith)||t.endsWith&&!u.endsWith(t.endsWith)||t.contains&&!u.includes(t.contains)))){let u=new Set;for(let m of l){if(u.size>=5)break;let y=m.toLowerCase(),T=t.startsWith?(()=>{let S=t.startsWith.toLowerCase(),C=S.length,x=Math.min(2,Math.floor(C/2)),q=y.slice(0,C);return Jt.get(S,q)<=x})():!0,v=t.endsWith?(()=>{let S=t.endsWith.toLowerCase(),C=S.length,x=Math.min(2,Math.floor(C/2)),q=y.slice(-C);return Jt.get(S,q)<=x})():!0,P=t.contains?(()=>{let S=t.contains.toLowerCase(),C=S.length,x=Math.min(2,Math.floor(C/2));return y.length>=C?Array.from({length:y.length-C+1},(q,F)=>Jt.get(S,y.slice(F,F+C))).some(q=>q<=x):Jt.get(S,y)<=x})():!0;T&&v&&P&&u.add(m)}let p=[];t.startsWith&&p.push(`starts with "${t.startsWith}"`),t.endsWith&&p.push(`ends with "${t.endsWith}"`),t.contains&&p.push(`contains "${t.contains}"`);let g=u.size>0?`Similar values in this field: ${Array.from(u).join(", ")}.`:"",b=`Filter validation failed for field "${o}". No values found that ${p.join(" and ")}. ${g} Please evaluate whether you included the wrong filter value or if you are trying to filter on the wrong field entirely.`;return new ii({field:o,invalidValues:p,sampleValues:Array.from(u),message:b})}return Ze.EMPTY}function Wp(t,e,r=3,o=5){let i=[];for(let l of e){let c=t.map(u=>({value:u,distance:Jt.get(u.toLowerCase(),l.toLowerCase())})).filter(u=>u.distance<=r).sort((u,p)=>u.distance-p.distance);if(c.length>0){let u=c[0];i.push({invalidValue:u.value,suggestionForInvalidValue:l,distance:u.distance})}}i.sort((l,c)=>l.distance-c.distance);let n=[],s=Math.ceil(o/t.length),a=new Map;for(let l of t)a.set(l,0);for(let{invalidValue:l,suggestionForInvalidValue:c}of i){if(n.length===o)break;a.get(l)!==s&&(n.push(c),a.set(l,a.get(l)+1))}for(let{suggestionForInvalidValue:l}of i){if(n.length===o)break;if(n.includes(l))continue;n.push(l)}return n}import{Err as Hp,Ok as si}from"ts-results-es";async function la(t,e,r){let o=[];try{let i=await e.readMetadata({datasource:{datasourceLuid:r.datasourceLuid}});if(i.isErr()||!i.value.data)return si.EMPTY;$p(t.fields,i.value,o),t.parameters&&Gp(t.parameters,i.value,o)}catch{return si.EMPTY}return o.length>0?new Hp(o):si.EMPTY}function $p(t,e,r){for(let o of t){if("binSize"in o){if(e.data?.find(a=>a.fieldCaption===o.fieldCaption&&a.columnClass==="BIN")){r.push({field:o.fieldCaption,message:`The bin field '${o.fieldCaption}' has a fixed bin size defined in the datasource and can not be modified. To create a new bin on a field, use the field caption of the measure field you want to group. To use this bin, omit the binSize property.`});continue}t.find(a=>a.fieldCaption===o.fieldCaption&&"function"in a&&a.function)||r.push({field:o.fieldCaption,message:`The bin field '${o.fieldCaption}' was provided in the query, but no corresponding measure field was found. To create a new bin on a field, use the field caption of the measure field you want to group.`});continue}let i=e.data?.find(n=>n.fieldCaption===o.fieldCaption);if(i){if("calculation"in o){"formula"in i?r.push({field:o.fieldCaption,message:`A custom calculation was provided for field '${o.fieldCaption}', but this field already has a calculation and can not be overwritten. To query this field, omit the calculation property. To create a new calculation, provide a new field caption.`}):r.push({field:o.fieldCaption,message:`A custom calculation was provided for field '${o.fieldCaption}', but this field already exists in the datasource. To create a new calculation, provide a new field caption. To query this field, omit the calculation property.`});continue}}else{"calculation"in o||r.push({field:o.fieldCaption,message:`Field '${o.fieldCaption}' was not found in the datasource. Fields must either belong to the datasource or provide a custom calculation.`});continue}if("function"in o)switch(i.dataType){case"INTEGER":case"REAL":["SUM","AVG","MEDIAN","COUNT","COUNTD","MIN","MAX","STDEV","VAR"].includes(o.function)||r.push({field:o.fieldCaption,message:`The '${o.fieldCaption}' field is of type '${i.dataType}'. The '${o.function}' function can not be applied to fields of this data type.`});continue;case"STRING":case"BOOLEAN":["MIN","MAX","COUNT","COUNTD"].includes(o.function)||r.push({field:o.fieldCaption,message:`The '${o.fieldCaption}' field is of type '${i.dataType}'. The '${o.function}' function can not be applied to fields of this data type.`});continue;case"DATE":case"DATETIME":["MIN","MAX","COUNT","COUNTD","YEAR","QUARTER","MONTH","WEEK","DAY","TRUNC_YEAR","TRUNC_QUARTER","TRUNC_MONTH","TRUNC_WEEK","TRUNC_DAY"].includes(o.function)||r.push({field:o.fieldCaption,message:`The '${o.fieldCaption}' field is of type '${i.dataType}'. The '${o.function}' function can not be applied to fields of this data type.`});continue;default:continue}}}function Gp(t,e,r){for(let o of t){let i=e.extraData?.parameters?.find(n=>n.parameterCaption===o.parameterCaption);if(!i){r.push({parameter:o.parameterCaption,message:`Parameter '${o.parameterCaption}' was not found in the datasource. Only parameters that are defined in the datasource can be used in a query.`});continue}switch(i.parameterType){case"ANY_VALUE":Qp(o.value,i.dataType)||r.push({parameter:o.parameterCaption,message:`Parameter '${o.parameterCaption}' has '${i.dataType}' data type but was provided a value that does not match the data type: ${o.value}.`});continue;case"LIST":i.members.includes(o.value)||r.push({parameter:o.parameterCaption,message:`Parameter '${o.parameterCaption}' has a value that is not in the list of allowed values for the parameter. The list of allowed values is [${i.members.join(", ")}].`});continue;case"QUANTITATIVE_DATE":if(typeof o.value!="string"||isNaN(Date.parse(o.value))){r.push({parameter:o.parameterCaption,message:`Parameter '${o.parameterCaption}' was provided a value that is not a valid date. Dates must use the RFC 3339 standard. Example: 2025-03-14`});continue}if(i.minDate&&new Date(o.value)<new Date(i.minDate)){r.push({parameter:o.parameterCaption,message:`Parameter '${o.parameterCaption}' was provided a value that is less than the minimum allowed date of ${i.minDate}.`});continue}if(i.maxDate&&new Date(o.value)>new Date(i.maxDate)){r.push({parameter:o.parameterCaption,message:`Parameter '${o.parameterCaption}' was provided a value that is greater than the maximum allowed date of ${i.maxDate}.`});continue}continue;case"QUANTITATIVE_RANGE":if(typeof o.value!="number"){r.push({parameter:o.parameterCaption,message:`Parameter '${o.parameterCaption}' is a quantitative range parameter, and can only be assigned numerical values.`});continue}if(i.min!=null&&o.value<i.min){r.push({parameter:o.parameterCaption,message:`Parameter '${o.parameterCaption}' was provided a value that is less than the minimum allowed value of ${i.min}.`});continue}if(i.max!=null&&o.value>i.max){r.push({parameter:o.parameterCaption,message:`Parameter '${o.parameterCaption}' was provided a value that is greater than the maximum allowed value of ${i.max}.`});continue}continue;default:continue}}}function Qp(t,e){if(t===null)return!0;switch(e){case"INTEGER":return typeof t=="number"&&Number.isInteger(t);case"REAL":return typeof t=="number";case"STRING":return typeof t=="string";case"BOOLEAN":return typeof t=="boolean";case"DATE":return typeof t=="string"&&!isNaN(Date.parse(t));default:return!1}}var Yp={datasourceLuid:Jp.string().nonempty(),query:$t},ca=(t,e)=>{let r=A(),o=new N({server:t,name:"query-datasource",description:new ye(async()=>await Kn({server:r.server||e?.server,mappings:{"2025.3.0":sa,default:na}})),paramsSchema:Yp,annotations:{title:"Query Datasource",readOnlyHint:!0,openWorldHint:!1},argsValidator:ia,callback:async({datasourceLuid:i,query:n},{requestId:s,authInfo:a})=>await o.logAndExecute({requestId:s,authInfo:a,args:{datasourceLuid:i,query:n},callback:async()=>{let l=await be.isDatasourceAllowed({datasourceLuid:i,restApiArgs:{config:r,requestId:s,server:t}});if(!l.allowed)return new Vr({type:"datasource-not-allowed",message:l.message});let c={datasourceLuid:i},u={returnFormat:"OBJECTS",debug:!0,disaggregate:!1},p=Zn(i);p&&(c.connections=p);let g={datasource:c,query:n,options:u};return await D({config:r,requestId:s,server:t,jwtScopes:["tableau:viz_data_service:read"],authInfo:M(a),callback:async b=>{if(!r.disableQueryDatasourceValidationRequests){let y=await la(n,b.vizqlDataServiceMethods,c);if(y.isErr()){let P=y.error.map(S=>S.message).join(`
1154
+
1155
+ `);return new Vr({type:"query-validation",message:P})}let T=await aa(t,n,b.vizqlDataServiceMethods,c);if(T.isErr()){let P=T.error.map(S=>S.message).join(", ");return new Vr({type:"query-validation",message:P})}}let m=await b.vizqlDataServiceMethods.queryDatasource(g);return m.isErr()?new Vr(m.error instanceof Kp?m.error:m.error==="feature-disabled"?{type:"feature-disabled"}:{type:"tableau-error",error:m.error}):m}})},constrainSuccessResult:l=>({type:"success",result:l}),getErrorText:l=>{switch(l.type){case"feature-disabled":return Mr();case"datasource-not-allowed":return l.message;case"query-validation":return JSON.stringify({requestId:s,errorType:"validation",message:l.message});case"tableau-error":return JSON.stringify({requestId:s,...Xn(l.error)})}}})});return o};import{Err as Zp,Ok as Xp}from"ts-results-es";import{z as em}from"zod";var tm={viewId:em.string()},ua=t=>{let e=new N({server:t,name:"get-view-data",description:"Retrieves data in comma separated value (CSV) format for the specified view in a Tableau workbook.",paramsSchema:tm,annotations:{title:"Get View Data",readOnlyHint:!0,openWorldHint:!1},callback:async({viewId:r},{requestId:o,authInfo:i})=>{let n=A();return await e.logAndExecute({requestId:o,authInfo:i,args:{viewId:r},callback:async()=>{let s=await be.isViewAllowed({viewId:r,restApiArgs:{config:n,requestId:o,server:t}});return s.allowed?new Xp(await D({config:n,requestId:o,server:t,jwtScopes:["tableau:views:download"],authInfo:M(i),callback:async a=>await a.viewsMethods.queryViewData({viewId:r,siteId:a.siteId})})):new Zp({type:"view-not-allowed",message:s.message})},constrainSuccessResult:s=>({type:"success",result:s}),getErrorText:s=>{switch(s.type){case"view-not-allowed":return s.message}}})}});return e};import{Err as rm,Ok as om}from"ts-results-es";import{z as ni}from"zod";function da(t){return{isError:!1,content:[{type:"image",data:Buffer.from(t).toString("base64"),mimeType:"image/png"}]}}var im={viewId:ni.string(),width:ni.number().gt(0).optional(),height:ni.number().gt(0).optional()},pa=t=>{let e=new N({server:t,name:"get-view-image",description:"Retrieves an image of the specified view in a Tableau workbook. The width and height in pixels can be provided. The default width and height are both 800 pixels.",paramsSchema:im,annotations:{title:"Get View Image",readOnlyHint:!0,openWorldHint:!1},callback:async({viewId:r,width:o,height:i},{requestId:n,authInfo:s})=>{let a=A();return await e.logAndExecute({requestId:n,authInfo:s,args:{viewId:r},callback:async()=>{let l=await be.isViewAllowed({viewId:r,restApiArgs:{config:a,requestId:n,server:t}});return l.allowed?new om(await D({config:a,requestId:n,server:t,jwtScopes:["tableau:views:download"],authInfo:M(s),callback:async c=>await c.viewsMethods.queryViewImage({viewId:r,siteId:c.siteId,width:o,height:i,resolution:"high"})})):new rm({type:"view-not-allowed",message:l.message})},constrainSuccessResult:l=>({type:"success",result:l}),getSuccessResult:da,getErrorText:l=>{switch(l.type){case"view-not-allowed":return l.message}}})}});return e};import{Ok as nm}from"ts-results-es";import{z as li}from"zod";import{z as ai}from"zod";var ma=ai.enum(["caption","contentUrl","createdAt","favoritesTotal","fields","hitsTotal","name","ownerDomain","ownerEmail","ownerName","projectName","sheetNumber","sheetType","tags","title","updatedAt","viewUrlname","workbookDescription","workbookName"]),sm={caption:["eq","in"],contentUrl:["eq","in"],createdAt:["eq","gt","gte","lt","lte"],favoritesTotal:["eq","gt","gte","lt","lte"],fields:["eq","in"],hitsTotal:["eq","gt","gte","lt","lte"],name:["eq","in"],ownerDomain:["eq","in"],ownerEmail:["eq","in"],ownerName:["eq","in"],projectName:["eq","in"],sheetNumber:["eq","gt","gte","lt","lte"],sheetType:["eq","in"],tags:["eq","in"],title:["eq","in"],updatedAt:["eq","gt","gte","lt","lte"],viewUrlname:["eq","in"],workbookDescription:["eq","in"],workbookName:["eq","in"]},Jv=ai.object({field:ma,operator:Je,value:ai.string()});function fa(t){return wt({filterString:t,allowedOperatorsByField:sm,filterFieldSchema:ma})}var am={filter:li.string().optional(),pageSize:li.number().gt(0).optional(),limit:li.number().gt(0).optional()},ha=t=>{let e=new N({server:t,name:"list-views",description:`
635
1156
  Retrieves a list of views on a Tableau site including their metadata such as name, owner, and the workbook they are found in. Supports optional filtering via field:operator:value expressions (e.g., name:eq:Overview) for precise and flexible view discovery. Use this tool when a user requests to list, search, or filter Tableau views on a site.
636
1157
 
637
1158
  **Supported Filter Fields and Operators**
@@ -657,7 +1178,7 @@ Filter relative date periods:
657
1178
  | workbookDescription | eq, in |
658
1179
  | workbookName | eq, in |
659
1180
 
660
- ${wt}
1181
+ ${Tt}
661
1182
 
662
1183
  **Example Usage:**
663
1184
  - List all views on a site
@@ -668,7 +1189,7 @@ Filter relative date periods:
668
1189
  - List views created after January 1, 2023:
669
1190
  filter: "createdAt:gt:2023-01-01T00:00:00Z"
670
1191
  - List views with the name "Overview" in the "Finance" project and created after January 1, 2023:
671
- filter: "name:eq:Overview,projectName:eq:Finance,createdAt:gt:2023-01-01T00:00:00Z"`,paramsSchema:Tp,annotations:{title:"List Views",readOnlyHint:!0,openWorldHint:!1},callback:async({filter:r,pageSize:o,limit:i},{requestId:n,authInfo:s})=>{let a=E(),c=r?Jn(r):void 0;return await e.logAndExecute({requestId:n,authInfo:s,args:{},callback:async()=>new wp(await I({config:a,requestId:n,server:t,jwtScopes:["tableau:content:read"],authInfo:N(s),callback:async l=>await yt({pageConfig:{pageSize:o,limit:a.maxResultLimit?Math.min(a.maxResultLimit,i??Number.MAX_SAFE_INTEGER):i},getDataFn:async p=>{let{pagination:g,views:b}=await l.viewsMethods.queryViewsForSite({siteId:l.siteId,filter:c??"",includeUsageStatistics:!0,pageSize:p.pageSize,pageNumber:p.pageNumber});return{pagination:g,data:b}}})})),constrainSuccessResult:l=>Ap({views:l,boundedContext:a.boundedContext})})}});return e};function Ap({views:t,boundedContext:e}){if(t.length===0)return{type:"empty",message:"No views were found. Either none exist or you do not have permission to view them."};let{projectIds:r,workbookIds:o}=e;return r&&(t=t.filter(i=>i.project?.id?r.has(i.project.id):!1)),o&&(t=t.filter(i=>i.workbook?.id?o.has(i.workbook.id):!1)),t.length===0?{type:"empty",message:["The set of allowed views that can be queried is limited by the server configuration.","While views were found, they were all filtered out by the server configuration."].join(" ")}:{type:"success",result:t}}import{Err as Ep,Ok as _p}from"ts-results-es";import{z as Sp}from"zod";var vp={workbookId:Sp.string()},Yn=t=>{let e=new O({server:t,name:"get-workbook",description:"Retrieves information about the specified workbook, including information about the views contained in the workbook.",paramsSchema:vp,annotations:{title:"Get Workbook",readOnlyHint:!0,openWorldHint:!1},callback:async({workbookId:r},{requestId:o,authInfo:i})=>{let n=E();return await e.logAndExecute({requestId:o,authInfo:i,args:{workbookId:r},callback:async()=>{let s=await be.isWorkbookAllowed({workbookId:r,restApiArgs:{config:n,requestId:o,server:t}});return s.allowed?new _p(await I({config:n,requestId:o,server:t,jwtScopes:["tableau:content:read"],authInfo:N(i),callback:async a=>{let c=s.content??await a.workbooksMethods.getWorkbook({workbookId:r,siteId:a.siteId});if(c.views){let l=await a.viewsMethods.queryViewsForWorkbook({workbookId:r,siteId:a.siteId,includeUsageStatistics:!0});c.views.view=l}return c}})):new Ep({type:"workbook-not-allowed",message:s.message})},constrainSuccessResult:s=>({type:"success",result:s}),getErrorText:s=>{switch(s.type){case"workbook-not-allowed":return s.message}}})}});return e};import{Ok as Rp}from"ts-results-es";import{z as Jo}from"zod";import{z as Ko}from"zod";var Xn=Ko.enum(["createdAt","contentUrl","displayTabs","favoritesTotal","hasAlerts","hasExtracts","name","ownerDomain","ownerEmail","ownerName","projectName","sheetCount","size","subscriptionTotal","tags","updatedAt"]),Cp={createdAt:["eq","gt","gte","lt","lte"],contentUrl:["eq","in"],displayTabs:["eq"],favoritesTotal:["eq","gt","gte","lt","lte"],hasAlerts:["eq"],hasExtracts:["eq"],name:["eq","in"],ownerDomain:["eq","in"],ownerEmail:["eq","in"],ownerName:["eq","in"],projectName:["eq","in"],sheetCount:["eq","gt","gte","lt","lte"],size:["eq","gt","gte","lt","lte"],subscriptionTotal:["eq","gt","gte","lt","lte"],tags:["eq","in"],updatedAt:["eq","gt","gte","lt","lte"]},uv=Ko.object({field:Xn,operator:Qe,value:Ko.string()});function ea(t){return Tt({filterString:t,allowedOperatorsByField:Cp,filterFieldSchema:Xn})}var xp={filter:Jo.string().optional(),pageSize:Jo.number().gt(0).optional(),limit:Jo.number().gt(0).optional()},ta=t=>{let e=new O({server:t,name:"list-workbooks",description:`
1192
+ filter: "name:eq:Overview,projectName:eq:Finance,createdAt:gt:2023-01-01T00:00:00Z"`,paramsSchema:am,annotations:{title:"List Views",readOnlyHint:!0,openWorldHint:!1},callback:async({filter:r,pageSize:o,limit:i},{requestId:n,authInfo:s})=>{let a=A(),l=r?fa(r):void 0;return await e.logAndExecute({requestId:n,authInfo:s,args:{},callback:async()=>new nm(await D({config:a,requestId:n,server:t,jwtScopes:["tableau:content:read"],authInfo:M(s),callback:async c=>await bt({pageConfig:{pageSize:o,limit:a.maxResultLimit?Math.min(a.maxResultLimit,i??Number.MAX_SAFE_INTEGER):i},getDataFn:async p=>{let{pagination:g,views:b}=await c.viewsMethods.queryViewsForSite({siteId:c.siteId,filter:l??"",includeUsageStatistics:!0,pageSize:p.pageSize,pageNumber:p.pageNumber});return{pagination:g,data:b}}})})),constrainSuccessResult:c=>lm({views:c,boundedContext:a.boundedContext})})}});return e};function lm({views:t,boundedContext:e}){if(t.length===0)return{type:"empty",message:"No views were found. Either none exist or you do not have permission to view them."};let{projectIds:r,workbookIds:o}=e;return r&&(t=t.filter(i=>i.project?.id?r.has(i.project.id):!1)),o&&(t=t.filter(i=>i.workbook?.id?o.has(i.workbook.id):!1)),t.length===0?{type:"empty",message:["The set of allowed views that can be queried is limited by the server configuration.","While views were found, they were all filtered out by the server configuration."].join(" ")}:{type:"success",result:t}}import{Err as cm,Ok as um}from"ts-results-es";import{z as dm}from"zod";var pm={workbookId:dm.string()},ga=t=>{let e=new N({server:t,name:"get-workbook",description:"Retrieves information about the specified workbook, including information about the views contained in the workbook.",paramsSchema:pm,annotations:{title:"Get Workbook",readOnlyHint:!0,openWorldHint:!1},callback:async({workbookId:r},{requestId:o,authInfo:i})=>{let n=A();return await e.logAndExecute({requestId:o,authInfo:i,args:{workbookId:r},callback:async()=>{let s=await be.isWorkbookAllowed({workbookId:r,restApiArgs:{config:n,requestId:o,server:t}});return s.allowed?new um(await D({config:n,requestId:o,server:t,jwtScopes:["tableau:content:read"],authInfo:M(i),callback:async a=>{let l=s.content??await a.workbooksMethods.getWorkbook({workbookId:r,siteId:a.siteId});if(l.views){let c=await a.viewsMethods.queryViewsForWorkbook({workbookId:r,siteId:a.siteId,includeUsageStatistics:!0});l.views.view=c}return l}})):new cm({type:"workbook-not-allowed",message:s.message})},constrainSuccessResult:s=>({type:"success",result:s}),getErrorText:s=>{switch(s.type){case"workbook-not-allowed":return s.message}}})}});return e};import{Ok as fm}from"ts-results-es";import{z as ui}from"zod";import{z as ci}from"zod";var ya=ci.enum(["createdAt","contentUrl","displayTabs","favoritesTotal","hasAlerts","hasExtracts","name","ownerDomain","ownerEmail","ownerName","projectName","sheetCount","size","subscriptionTotal","tags","updatedAt"]),mm={createdAt:["eq","gt","gte","lt","lte"],contentUrl:["eq","in"],displayTabs:["eq"],favoritesTotal:["eq","gt","gte","lt","lte"],hasAlerts:["eq"],hasExtracts:["eq"],name:["eq","in"],ownerDomain:["eq","in"],ownerEmail:["eq","in"],ownerName:["eq","in"],projectName:["eq","in"],sheetCount:["eq","gt","gte","lt","lte"],size:["eq","gt","gte","lt","lte"],subscriptionTotal:["eq","gt","gte","lt","lte"],tags:["eq","in"],updatedAt:["eq","gt","gte","lt","lte"]},AC=ci.object({field:ya,operator:Je,value:ci.string()});function ba(t){return wt({filterString:t,allowedOperatorsByField:mm,filterFieldSchema:ya})}var hm={filter:ui.string().optional(),pageSize:ui.number().gt(0).optional(),limit:ui.number().gt(0).optional()},Ta=t=>{let e=new N({server:t,name:"list-workbooks",description:`
672
1193
  Retrieves a list of workbooks on a Tableau site including their metadata such as name, description, and information about the views contained in the workbook. Supports optional filtering via field:operator:value expressions (e.g., name:eq:Superstore) for precise and flexible workbook discovery. Use this tool when a user requests to list, search, or filter Tableau workbooks on a site.
673
1194
 
674
1195
  **Supported Filter Fields and Operators**
@@ -691,7 +1212,7 @@ Filter relative date periods:
691
1212
  | tags | eq, in |
692
1213
  | updatedAt | eq, gt, gte, lt, lte |
693
1214
 
694
- ${wt}
1215
+ ${Tt}
695
1216
 
696
1217
  **Example Usage:**
697
1218
  - List all workbooks on a site
@@ -702,18 +1223,18 @@ Filter relative date periods:
702
1223
  - List workbooks created after January 1, 2023:
703
1224
  filter: "createdAt:gt:2023-01-01T00:00:00Z"
704
1225
  - List workbooks with the name "Superstore" in the "Finance" project and created after January 1, 2023:
705
- filter: "name:eq:Superstore,projectName:eq:Finance,createdAt:gt:2023-01-01T00:00:00Z"`,paramsSchema:xp,annotations:{title:"List Workbooks",readOnlyHint:!0,openWorldHint:!1},callback:async({filter:r,pageSize:o,limit:i},{requestId:n,authInfo:s})=>{let a=E(),c=r?ea(r):void 0;return await e.logAndExecute({requestId:n,authInfo:s,args:{},callback:async()=>new Rp(await I({config:a,requestId:n,server:t,jwtScopes:["tableau:content:read"],authInfo:N(s),callback:async l=>await yt({pageConfig:{pageSize:o,limit:a.maxResultLimit?Math.min(a.maxResultLimit,i??Number.MAX_SAFE_INTEGER):i},getDataFn:async p=>{let{pagination:g,workbooks:b}=await l.workbooksMethods.queryWorkbooksForSite({siteId:l.siteId,filter:c??"",pageSize:p.pageSize,pageNumber:p.pageNumber});return{pagination:g,data:b}}})})),constrainSuccessResult:l=>Ip({workbooks:l,boundedContext:a.boundedContext})})}});return e};function Ip({workbooks:t,boundedContext:e}){if(t.length===0)return{type:"empty",message:"No workbooks were found. Either none exist or you do not have permission to view them."};let{projectIds:r,workbookIds:o}=e;return r&&(t=t.filter(i=>i.project?.id?r.has(i.project.id):!1)),o&&(t=t.filter(i=>o.has(i.id))),t.length===0?{type:"empty",message:["The set of allowed workbooks that can be queried is limited by the server configuration.","While workbooks were found, they were all filtered out by the server configuration."].join(" ")}:{type:"success",result:t}}var ra=[Tn,Sn,Hn,xn,In,kn,Dn,Ln,Rn,Yn,Gn,Qn,ta,Zn,gn];var Pe="tableau-mcp",Jt=mi.version,Cr=`${Pe}/${Jt}`,Ze=class extends kp{name;version;_clientInfo;get clientInfo(){return this._clientInfo??this.server.getClientVersion()}constructor({clientInfo:e}={}){super({name:Pe,version:Jt},{capabilities:{logging:{},tools:{}}}),this.name=Pe,this.version=Jt,this._clientInfo=e}registerTools=()=>{for(let{name:e,description:r,paramsSchema:o,annotations:i,callback:n}of this._getToolsToRegister())this.tool(e,r,o,i,n)};registerRequestHandlers=()=>{this.server.setRequestHandler(Pp,async e=>(Xe(this,e.params.level),{}))};_getToolsToRegister=()=>{let{includeTools:e,excludeTools:r}=E(),i=ra.map(n=>n(this)).filter(n=>e.length>0?e.includes(n.name):r.length>0?!r.includes(n.name):!0);if(i.length===0)throw new Error(`
1226
+ filter: "name:eq:Superstore,projectName:eq:Finance,createdAt:gt:2023-01-01T00:00:00Z"`,paramsSchema:hm,annotations:{title:"List Workbooks",readOnlyHint:!0,openWorldHint:!1},callback:async({filter:r,pageSize:o,limit:i},{requestId:n,authInfo:s})=>{let a=A(),l=r?ba(r):void 0;return await e.logAndExecute({requestId:n,authInfo:s,args:{},callback:async()=>new fm(await D({config:a,requestId:n,server:t,jwtScopes:["tableau:content:read"],authInfo:M(s),callback:async c=>await bt({pageConfig:{pageSize:o,limit:a.maxResultLimit?Math.min(a.maxResultLimit,i??Number.MAX_SAFE_INTEGER):i},getDataFn:async p=>{let{pagination:g,workbooks:b}=await c.workbooksMethods.queryWorkbooksForSite({siteId:c.siteId,filter:l??"",pageSize:p.pageSize,pageNumber:p.pageNumber});return{pagination:g,data:b}}})})),constrainSuccessResult:c=>gm({workbooks:c,boundedContext:a.boundedContext})})}});return e};function gm({workbooks:t,boundedContext:e}){if(t.length===0)return{type:"empty",message:"No workbooks were found. Either none exist or you do not have permission to view them."};let{projectIds:r,workbookIds:o}=e;return r&&(t=t.filter(i=>i.project?.id?r.has(i.project.id):!1)),o&&(t=t.filter(i=>o.has(i.id))),t.length===0?{type:"empty",message:["The set of allowed workbooks that can be queried is limited by the server configuration.","While workbooks were found, they were all filtered out by the server configuration."].join(" ")}:{type:"success",result:t}}var wa=[Mn,Fn,ca,Bn,zn,Wn,$n,Gn,Vn,ga,ua,pa,Ta,ha,Pn];var Me="tableau-mcp",Yt=xi.version,Dr=`${Me}/${Yt}`,Xe=class extends ym{name;version;_clientInfo;get clientInfo(){return this._clientInfo??this.server.getClientVersion()}constructor({clientInfo:e}={}){super({name:Me,version:Yt},{capabilities:{logging:{},tools:{}}}),this.name=Me,this.version=Yt,this._clientInfo=e}registerTools=async e=>{for(let{name:r,description:o,paramsSchema:i,annotations:n,callback:s}of this._getToolsToRegister(e))this.tool(r,await ye.from(o),await ye.from(i),await ye.from(n),await ye.from(s))};registerRequestHandlers=()=>{this.server.setRequestHandler(bm,async e=>(et(this,e.params.level),{}))};_getToolsToRegister=e=>{let{includeTools:r,excludeTools:o}=A(),n=wa.map(s=>s(this,e)).filter(s=>r.length>0?r.includes(s.name):o.length>0?!o.includes(s.name):!0);if(n.length===0)throw new Error(`
706
1227
  No tools to register.
707
- Tools available = [${jr.join(", ")}].
708
- EXCLUDE_TOOLS = [${r.join(", ")}].
709
- INCLUDE_TOOLS = [${e.join(", ")}]
710
- `);return i}};import{StreamableHTTPServerTransport as om}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{isInitializeRequest as im}from"@modelcontextprotocol/sdk/types.js";import sm from"cors";import ri from"express";import Ta,{existsSync as Aa}from"fs";import nm from"http";import am from"https";import{StreamableHTTPServerTransport as Dp}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{randomUUID as Lp}from"crypto";var Zo={},oa=({clientInfo:t})=>{let e=new Dp({sessionIdGenerator:()=>Lp(),onsessioninitialized:r=>{Zo[r]={transport:e,clientInfo:t}}});return e.onclose=()=>{e.sessionId&&Op(e.sessionId)},e},Yo=t=>Zo[t],Op=t=>{delete Zo[t]};function ia(t,e,r){let o=t.headers["mcp-protocol-version"];if(!o){r();return}let i=["2025-06-18","2025-03-26","2024-11-05"];if(!i.includes(o)){e.status(400).json({jsonrpc:"2.0",error:{code:-32600,message:"Unsupported protocol version",data:{supported:i,requested:o}},id:null});return}r()}import{createPrivateKey as em,createPublicKey as tm}from"crypto";import{readFileSync as rm}from"fs";function sa(t){t.get("/.well-known/oauth-authorization-server",(e,r)=>{let o=E().oauth.issuer;r.json({issuer:o,authorization_endpoint:`${o}/oauth/authorize`,token_endpoint:`${o}/oauth/token`,registration_endpoint:`${o}/oauth/register`,response_types_supported:["code"],grant_types_supported:["authorization_code","refresh_token","client_credentials"],code_challenge_methods_supported:["S256"],scopes_supported:[],token_endpoint_auth_methods_supported:["client_secret_basic","client_secret_post"],subject_types_supported:["public"]})})}function na(t){t.get("/.well-known/oauth-protected-resource",(e,r)=>{let o=E().oauth.issuer;r.json({resource:`${o}/${Pe}`,authorization_servers:[o],bearer_methods_supported:["header"]})})}import{compactDecrypt as Mp}from"jose";import{Err as Zt,Ok as Np}from"ts-results-es";import{fromError as aa}from"zod-validation-error";function la(t){return async(e,r,o)=>{let i=e.headers.authorization;if(!i||!i.startsWith("Bearer ")){if(e.method==="GET"&&e.headers.accept?.includes("text/event-stream")){r.writeHead(401,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),r.write(`event: error
1228
+ Tools available = [${Jr.join(", ")}].
1229
+ EXCLUDE_TOOLS = [${o.join(", ")}].
1230
+ INCLUDE_TOOLS = [${r.join(", ")}]
1231
+ `);return n}};import{StreamableHTTPServerTransport as Gm}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{isInitializeRequest as Qm}from"@modelcontextprotocol/sdk/types.js";import Km from"cors";import gi from"express";import za,{existsSync as Wa}from"fs";import Jm from"http";import Ym from"https";import{StreamableHTTPServerTransport as Tm}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{randomUUID as wm}from"crypto";var di={},Aa=({clientInfo:t})=>{let e=new Tm({sessionIdGenerator:()=>wm(),onsessioninitialized:r=>{di[r]={transport:e,clientInfo:t}}});return e.onclose=()=>{e.sessionId&&Am(e.sessionId)},e},pi=t=>di[t],Am=t=>{delete di[t]};function Sa(t,e,r){let o=t.headers["mcp-protocol-version"];if(!o){r();return}let i=["2025-06-18","2025-03-26","2024-11-05"];if(!i.includes(o)){e.status(400).json({jsonrpc:"2.0",error:{code:-32600,message:"Unsupported protocol version",data:{supported:i,requested:o}},id:null});return}r()}import{createPrivateKey as Wm,createPublicKey as Hm}from"crypto";import{readFileSync as $m}from"fs";function Ea(t){t.get("/.well-known/oauth-authorization-server",(e,r)=>{let o=A().oauth.issuer;r.json({issuer:o,authorization_endpoint:`${o}/oauth/authorize`,token_endpoint:`${o}/oauth/token`,registration_endpoint:`${o}/oauth/register`,response_types_supported:["code"],grant_types_supported:["authorization_code","refresh_token","client_credentials"],code_challenge_methods_supported:["S256"],scopes_supported:[],token_endpoint_auth_methods_supported:["client_secret_basic","client_secret_post"],subject_types_supported:["public"],client_id_metadata_document_supported:!0})})}function _a(t){t.get("/.well-known/oauth-protected-resource",(e,r)=>{let o=A().oauth.issuer;r.json({resource:`${o}/${Me}`,authorization_servers:[o],bearer_methods_supported:["header"]})})}import{compactDecrypt as Sm}from"jose";import{Err as Zt,Ok as Em}from"ts-results-es";import{fromError as va}from"zod-validation-error";function Ca(t){return async(e,r,o)=>{let i=e.headers.authorization;if(!i||!i.startsWith("Bearer ")){if(e.method==="GET"&&e.headers.accept?.includes("text/event-stream")){r.writeHead(401,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),r.write(`event: error
711
1232
  `),r.write(`data: {"error": "unauthorized", "error_description": "Authorization required"}
712
1233
 
713
- `),r.end();return}let a=`${e.protocol}://${e.get("host")}`;r.status(401).header("WWW-Authenticate",`Bearer realm="MCP", resource_metadata="${a}/.well-known/oauth-protected-resource"`).json({error:"unauthorized",error_description:"Authorization required. Use OAuth 2.1 flow."});return}let n=i.slice(7),s=await Fp(n,t);if(s.isErr()){if(e.method==="GET"&&e.headers.accept?.includes("text/event-stream")){r.writeHead(401,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),r.write(`event: error
1234
+ `),r.end();return}let a=`${e.protocol}://${e.get("host")}`;r.status(401).header("WWW-Authenticate",`Bearer realm="MCP", resource_metadata="${a}/.well-known/oauth-protected-resource"`).json({error:"unauthorized",error_description:"Authorization required. Use OAuth 2.1 flow."});return}let n=i.slice(7),s=await _m(n,t);if(s.isErr()){if(e.method==="GET"&&e.headers.accept?.includes("text/event-stream")){r.writeHead(401,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),r.write(`event: error
714
1235
  `),r.write(`data: {"error": "invalid_token", "error_description": "${s.error}"}
715
1236
 
716
- `),r.end();return}r.status(401).json({error:"invalid_token",error_description:s.error});return}e.auth=s.value,o()}}async function Fp(t,e){let r=E();try{let{plaintext:o}=await Mp(t,e),i=JSON.parse(new TextDecoder().decode(o)),n=Fo.safeParse(i);if(!n.success)return Zt(`Invalid access token: ${aa(n.error).toString()}`);let{iss:s,aud:a,exp:c,clientId:l}=n.data;if(s!==r.oauth.issuer||a!==Yt||c<Math.floor(Date.now()/1e3))return new Zt("Invalid or expired access token");let u;if(r.auth==="oauth"){let p=cn.safeParse(i);if(!p.success)return Zt(`Invalid access token: ${aa(p.error).toString()}`);let{tableauAccessToken:g,tableauRefreshToken:b,tableauExpiresAt:f,tableauUserId:y,tableauServer:w,sub:v}=p.data;if(f<Math.floor(Date.now()/1e3))return new Zt("Invalid or expired access token");u={username:v,userId:y,server:w,accessToken:g,refreshToken:b}}else{let{tableauUserId:p,tableauServer:g,sub:b}=n.data;u={username:b,server:g,...p?{userId:p}:{}}}return Np({token:t,clientId:l,scopes:[],expiresAt:i.exp,extra:u})}catch{return new Zt("Invalid or expired access token")}}import{randomBytes as Xo,randomUUID as ca}from"crypto";import{fromError as qp}from"zod-validation-error";function Xt(t,e,...r){return e>2147483647?setTimeout(()=>{Xt(t,e-2147483647,...r)},2147483647):setTimeout(t,e,...r)}import{createHash as Up}from"crypto";function Mr(t){return Up("sha256").update(t).digest("base64url")}function Nr(t){if(typeof t!="string")return!1;try{let e=new URL(t);return e.protocol==="https:"?!0:e.protocol==="http:"?e.hostname==="localhost"||e.hostname==="127.0.0.1":!!e.protocol.match(/^[a-zA-Z][a-zA-Z0-9+.-]*:$/)}catch{return!1}}function ua(t,e){let r=E();t.get("/oauth/authorize",(o,i)=>{let n=nn.safeParse(o.query);if(!n.success){i.status(400).json({error:"invalid_request",error_description:qp(n.error).toString()});return}let{clientId:s,redirectUri:a,responseType:c,codeChallenge:l,codeChallengeMethod:u,state:p}=n.data;if(c!=="code"){i.status(400).json({error:"unsupported_response_type",error_description:"Only authorization code flow is supported"});return}if(u!=="S256"){i.status(400).json({error:"invalid_request",error_description:"Only S256 code challenge method is supported"});return}if(!Nr(a)){i.status(400).json({error:"invalid_request",error_description:`Invalid redirect URI: ${a}`});return}let g=Xo(32).toString("hex"),b=Xo(32).toString("hex"),f=ca(),y=Math.floor(Math.random()*43)+22,w=Xo(y).toString("hex"),v=Mr(w);e.set(b,{clientId:s,redirectUri:a,codeChallenge:l,state:p??"",tableauState:g,tableauClientId:f,tableauCodeVerifier:w}),Xt(()=>e.delete(b),r.oauth.authzCodeTimeoutMs);let D=r.server||Fr,A=new URL(`${D}/oauth2/v1/auth`);A.searchParams.set("client_id",f),A.searchParams.set("code_challenge",v),A.searchParams.set("code_challenge_method","S256"),A.searchParams.set("response_type","code"),A.searchParams.set("redirect_uri",r.oauth.redirectUri),A.searchParams.set("state",`${b}:${g}`),A.searchParams.set("device_id",ca()),A.searchParams.set("target_site",r.siteName),A.searchParams.set("device_name",jp(a,p??"")),A.searchParams.set("client_type","tableau-mcp"),i.redirect(A.toString())})}function jp(t,e){let r="tableau-mcp (Unknown agent)";try{let o=new URL(t);return o.protocol==="https:"||o.protocol==="http:"?t==="https://vscode.dev/redirect"&&new URL(e).protocol==="vscode:"?"tableau-mcp (VS Code)":r:o.protocol==="cursor:"?"tableau-mcp (Cursor)":`tableau-mcp (${o.protocol.slice(0,-1)})`}catch{return r}}import{randomBytes as zp}from"crypto";import{Err as Wp,Ok as Hp}from"ts-results-es";import{fromError as Gp}from"zod-validation-error";import{Zodios as Bp}from"@zodios/core";import{makeApi as Vp}from"@zodios/core";import{z as ie}from"zod";var da=ie.discriminatedUnion("grant_type",[ie.object({grant_type:ie.literal("authorization_code"),code:ie.string(),code_verifier:ie.string(),redirect_uri:ie.string(),client_id:ie.string()}),ie.object({grant_type:ie.literal("refresh_token"),client_id:ie.string(),refresh_token:ie.string(),site_namespace:ie.string()})]),pa=ie.object({access_token:B("access_token"),expires_in:ie.number().int().nonnegative(),refresh_token:B("refresh_token"),origin_host:B("origin_host")}).transform(t=>({accessToken:t.access_token,expiresInSeconds:t.expires_in,refreshToken:t.refresh_token,originHost:t.origin_host}));var ma=Vp([{method:"post",path:"/oauth2/v1/token",alias:"token",response:pa,parameters:[{name:"body",type:"Body",schema:da}]}]);var fa=t=>new Bp(t,ma);async function Ur(t,e){return await fa(t).token(e,{headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":Cr}})}function ha(t,e,r){let o=E();t.get("/Callback",async(i,n)=>{let s=ln.safeParse(i.query);if(!s.success){n.status(400).json({error:"invalid_request",error_description:Gp(s.error).toString()});return}let{error:a,code:c,state:l}=s.data;if(a){n.status(400).json({error:"access_denied",error_description:"User denied authorization"});return}try{let[u,p]=l?.split(":")??[],g=e.get(u);if(!g||g.tableauState!==p){n.status(400).json({error:"invalid_request",error_description:"Invalid state parameter"});return}let b=await $p({server:o.server||Fr,code:c??"",redirectUri:o.oauth.redirectUri,clientId:g.tableauClientId,codeVerifier:g.tableauCodeVerifier});if(b.isErr()){n.status(400).json({error:"invalid_request",error_description:b.error});return}let{accessToken:f,refreshToken:y,expiresInSeconds:w,originHost:v}=b.value,D=new URL(`https://${v}`);if(o.server){let ae=new URL(o.server);if(D.hostname!==ae.hostname){n.status(400).json({error:"invalid_request",error_description:`Invalid origin host: ${v}. Expected: ${new URL(o.server).hostname}`});return}}let A=D.toString(),x=new bt(A);x.setCredentials(f,"unknown user id");let R=await x.serverMethods.getCurrentServerSession();if(R.isErr()){R.error.type==="unauthorized"?n.status(401).json({error:"unauthorized",error_description:`Unable to get the Tableau server session. Error: ${JSON.stringify(R.error)}`}):n.status(500).json({error:"server_error",error_description:"Internal server error during authorization. Unable to get the Tableau server session. Contact your administrator."});return}let j=zp(32).toString("hex");r.set(j,{clientId:g.clientId,redirectUri:g.redirectUri,codeChallenge:g.codeChallenge,user:R.value.user,server:A,tableauClientId:g.tableauClientId,tokens:{accessToken:f,refreshToken:y,expiresInSeconds:w},expiresAt:Math.floor((Date.now()+o.oauth.authzCodeTimeoutMs)/1e3)}),e.delete(u);let F=new URL(g.redirectUri);F.searchParams.set("code",j),F.searchParams.set("state",g.state),n.redirect(F.toString())}catch(u){console.error("OAuth callback error:",u),n.status(500).json({error:"server_error",error_description:"Internal server error during authorization. Contact your administrator."})}})}async function $p({server:t,code:e,redirectUri:r,clientId:o,codeVerifier:i}){try{let n=await Ur(t,{grant_type:"authorization_code",code:e,redirect_uri:r,client_id:o,code_verifier:i});return Hp(n)}catch{return Wp("Failed to exchange authorization code")}}import Qp from"express";function ga(t){t.post("/oauth/register",Qp.json(),(e,r)=>{let{redirect_uris:o}=e.body,i=[];if(o&&Array.isArray(o))for(let s of o){if(!Nr(s)){r.status(400).json({error:"invalid_redirect_uri",error_description:`Invalid redirect URI: ${s}`});return}i.push(s)}let{token_endpoint_auth_method:n}=e.body;(!n||typeof n!="string"||!["client_secret_basic","client_secret_post"].includes(n))&&(n="client_secret_basic"),r.json({client_id:"mcp-public-client",redirect_uris:i,grant_types:["authorization_code","client_credentials"],response_types:["code"],token_endpoint_auth_method:n,application_type:"native"})})}import{randomBytes as ba,timingSafeEqual as Kp}from"crypto";import{CompactEncrypt as ya}from"jose";import{Err as De,Ok as ti}from"ts-results-es";import{fromError as Jp}from"zod-validation-error";function wa(t,e,r,o){let i=E();t.post("/oauth/token",async(n,s)=>{let a=an.safeParse(n.body);if(!a.success){s.status(400).json({error:"invalid_request",error_description:Jp(a.error).toString()});return}let c=Xp({required:a.data.grantType==="client_credentials",clientId:a.data.clientId,clientSecret:a.data.clientSecret,clientIdSecretPairs:E().oauth.clientIdSecretPairs,authorizationHeader:n.headers.authorization});if(c.isErr()){s.status(401).json({error:"invalid_client",error_description:c.error});return}try{switch(a.data.grantType){case"authorization_code":{let{code:l,codeVerifier:u}=a.data,p=e.get(l);if(!p||p.expiresAt<Math.floor(Date.now()/1e3)){e.delete(l),s.status(400).json({error:"invalid_grant",error_description:"Invalid or expired authorization code"});return}if(Mr(u)!==p.codeChallenge){s.status(400).json({error:"invalid_grant",error_description:"Invalid code verifier"});return}let b=ba(32).toString("hex"),f=await ei(p,o);r.set(b,{user:p.user,server:p.server,clientId:p.clientId,tokens:p.tokens,expiresAt:Math.floor((Date.now()+i.oauth.refreshTokenTimeoutMs)/1e3),tableauClientId:p.tableauClientId}),Xt(()=>r.delete(b),i.oauth.refreshTokenTimeoutMs),e.delete(l),s.json({access_token:f,token_type:"Bearer",expires_in:i.oauth.accessTokenTimeoutMs/1e3,refresh_token:b});return}case"client_credentials":{let l=await Zp({clientId:c.value.clientId,server:i.server},o);s.json({access_token:l,token_type:"Bearer",expires_in:i.oauth.accessTokenTimeoutMs/1e3});return}case"refresh_token":{let{refreshToken:l}=a.data,u=r.get(l);if(!u||u.expiresAt<Math.floor(Date.now()/1e3)){r.delete(l),s.status(400).json({error:"invalid_grant",error_description:"Invalid or expired refresh token"});return}let p,{refreshToken:g}=u.tokens,b=await Yp(u.server,g,u.tableauClientId);if(b.isErr())p=await ei({user:u.user,clientId:u.clientId,server:u.server,tokens:u.tokens},o);else{let{accessToken:y,refreshToken:w,expiresInSeconds:v}=b.value;p=await ei({user:u.user,clientId:u.clientId,server:u.server,tokens:{accessToken:y,refreshToken:w,expiresInSeconds:v}},o)}r.delete(l);let f=ba(32).toString("hex");r.set(f,{user:u.user,server:u.server,clientId:u.clientId,tokens:u.tokens,expiresAt:Math.floor((Date.now()+i.oauth.refreshTokenTimeoutMs)/1e3),tableauClientId:u.tableauClientId}),s.json({access_token:p,token_type:"Bearer",expires_in:i.oauth.accessTokenTimeoutMs/1e3,refresh_token:f});return}}}catch(l){console.error("Token endpoint error:",l),s.status(500).json({error:"server_error",error_description:"Internal server error"});return}})}async function ei(t,e){let r=E(),o=JSON.stringify({sub:t.user.name,clientId:t.clientId,tableauServer:t.server,tableauUserId:t.user.id,iat:Math.floor(Date.now()/1e3),exp:Math.floor((Date.now()+r.oauth.accessTokenTimeoutMs)/1e3),aud:Yt,iss:r.oauth.issuer,...r.auth==="oauth"?{tableauAccessToken:t.tokens.accessToken,tableauRefreshToken:t.tokens.refreshToken,tableauExpiresAt:Math.floor(Date.now()/1e3)+t.tokens.expiresInSeconds,tableauUserId:t.user.id}:{}});return await new ya(new TextEncoder().encode(o)).setProtectedHeader({alg:"RSA-OAEP-256",enc:"A256GCM"}).encrypt(e)}async function Zp(t,e){let r=E(),o=JSON.stringify({sub:t.clientId,clientId:t.clientId,tableauServer:t.server,iat:Math.floor(Date.now()/1e3),exp:Math.floor((Date.now()+r.oauth.accessTokenTimeoutMs)/1e3),aud:Yt,iss:r.oauth.issuer});return await new ya(new TextEncoder().encode(o)).setProtectedHeader({alg:"RSA-OAEP-256",enc:"A256GCM"}).encrypt(e)}async function Yp(t,e,r){try{let o=await Ur(t,{grant_type:"refresh_token",refresh_token:e,client_id:r,site_namespace:""});return ti(o)}catch{return De("Failed to exchange refresh token")}}function Xp({required:t,clientId:e,clientSecret:r,clientIdSecretPairs:o,authorizationHeader:i}){if(!e&&!r&&t){if(!i)return De("Authorization header is required");let[l,u]=i.split(" ");if(l!=="Basic")return De("Invalid authorization type");if([e,r]=Buffer.from(u,"base64").toString().split(":"),!e||!r)return De("Invalid client credentials")}if(!t)return ti({clientId:""});if(!e)return De("Client ID is required");if(!r)return De("Client secret is required");let n=o?.[e];if(!n||r.length!==n.length)return De("Invalid client credentials");let s=new TextEncoder,a=s.encode(r),c=s.encode(n);return a.byteLength!==c.byteLength||!Kp(a,c)?De("Invalid client credentials"):ti({clientId:e})}var Fr="https://online.tableau.com",Yt="tableau-mcp-server",qr=class{config=E();pendingAuthorizations=new Map;authorizationCodes=new Map;refreshTokens=new Map;privateKey;publicKey;constructor(){this.privateKey=this.getPrivateKey(),this.publicKey=tm(this.privateKey)}get authMiddleware(){return la(this.privateKey)}setupRoutes(e){sa(e),na(e),ga(e),ua(e,this.pendingAuthorizations),ha(e,this.pendingAuthorizations,this.authorizationCodes),wa(e,this.authorizationCodes,this.refreshTokens,this.publicKey)}getPrivateKey(){let e=this.config.oauth.jwePrivateKey.replace(/\\n/g,`
717
- `);if(!e)try{e=rm(this.config.oauth.jwePrivateKeyPath,"utf8")}catch{throw new Error("Failed to read private key file")}try{return em({key:e,format:"pem",passphrase:this.config.oauth.jwePrivateKeyPassphrase})}catch{throw new Error("Failed to create private key")}}};var oi="mcp-session-id";async function va({basePath:t,config:e,logLevel:r}){let o=ri();o.use(ri.json()),o.use(ri.urlencoded()),o.use(sm({origin:e.corsOriginConfig,credentials:!0,allowedHeaders:["Content-Type","Authorization","Cache-Control","Accept","MCP-Protocol-Version"],exposedHeaders:[oi,"x-session-id"]})),e.trustProxyConfig!==null&&o.set("trust proxy",e.trustProxyConfig);let i=[];if(e.oauth.enabled){let l=new qr;l.setupRoutes(o),i.push(l.authMiddleware),i.push(ia)}let n=`/${t}`;if(o.post(n,...i,c),o.get(n,...i,e.disableSessionManagement?_a:Sa),o.delete(n,...i,e.disableSessionManagement?_a:Sa),!!!(e.sslKey&&e.sslCert))return new Promise(l=>{let u=nm.createServer(o).listen(e.httpPort,()=>l({url:`http://localhost:${e.httpPort}/${t}`,app:o,server:u}))});if(!Aa(e.sslKey))throw new Error("SSL key file does not exist");if(!Aa(e.sslCert))throw new Error("SSL cert file does not exist");let a={key:Ta.readFileSync(e.sslKey),cert:Ta.readFileSync(e.sslCert)};return new Promise(l=>{let u=am.createServer(a,o).listen(e.httpPort,()=>l({url:`https://localhost:${e.httpPort}/${t}`,app:o,server:u}))});async function c(l,u){try{let p;if(e.disableSessionManagement){let g=new Ze;p=new om({sessionIdGenerator:void 0}),u.on("close",()=>{p.close(),g.close()}),await Ea(g,p,r)}else{let g=l.headers[oi],b;if(g&&(b=Yo(g)))p=b.transport;else if(!g&&im(l.body)){let f=l.body.params.clientInfo;p=oa({clientInfo:f});let y=new Ze({clientInfo:f});await Ea(y,p,r)}else{u.status(400).json({jsonrpc:"2.0",error:{code:-32e3,message:"Bad Request: No valid session ID provided"},id:null});return}}await p.handleRequest(l,u,l.body)}catch(p){console.error("Error handling MCP request:",p),u.headersSent||u.status(500).json({jsonrpc:"2.0",error:{code:-32603,message:"Internal server error"},id:null})}}}async function Ea(t,e,r){t.registerTools(),t.registerRequestHandlers(),await t.connect(e),Xe(t,r)}async function _a(t,e){e.writeHead(405).end(JSON.stringify({jsonrpc:"2.0",error:{code:-32e3,message:"Method not allowed."},id:null}))}async function Sa(t,e){let r=t.headers[oi],o;if(!r||!(o=Yo(r))){e.status(400).send("Invalid or missing session ID");return}await o.transport.handleRequest(t,e)}async function um(){cm.config();let t=E(),e=ui(t.defaultLogLevel)?t.defaultLogLevel:"debug";switch(t.enableServerLogging&&di(new tr({logDirectory:t.serverLogDirectory})),t.transport){case"stdio":{let r=new Ze;r.registerTools(),r.registerRequestHandlers();let o=new lm;await r.connect(o),Xe(r,e),ue.info(r,`${r.name} v${r.version} running on stdio`);break}case"http":{let{url:r}=await va({basePath:Pe,config:t,logLevel:e});t.oauth.enabled||console.warn('\u26A0\uFE0F TRANSPORT is "http" but OAuth is disabled! Your MCP server may not be protected from unauthorized access! By having explicitly disabled OAuth by setting the DANGEROUSLY_DISABLE_OAUTH environment variable to "true", you accept any and all risks associated with this decision.'),console.log(`${Pe} v${Jt} ${t.disableSessionManagement?"stateless ":""}streamable HTTP server available at ${r}`);break}}t.disableLogMasking&&Me("\u26A0\uFE0F Log masking is disabled!")}try{await um()}catch(t){Me(`Fatal error when starting the server: ${W(t)}`),process.exit(1)}
1237
+ `),r.end();return}r.status(401).json({error:"invalid_token",error_description:s.error});return}e.auth=s.value,o()}}async function _m(t,e){let r=A();try{let{plaintext:o}=await Sm(t,e),i=JSON.parse(new TextDecoder().decode(o)),n=Yo.safeParse(i);if(!n.success)return Zt(`Invalid access token: ${va(n.error).toString()}`);let{iss:s,aud:a,exp:l,clientId:c}=n.data;if(s!==r.oauth.issuer||a!==Xt||l<Math.floor(Date.now()/1e3))return new Zt("Invalid or expired access token");let u;if(r.auth==="oauth"){let p=Sn.safeParse(i);if(!p.success)return Zt(`Invalid access token: ${va(p.error).toString()}`);let{tableauAccessToken:g,tableauRefreshToken:b,tableauExpiresAt:m,tableauUserId:y,tableauServer:T,sub:v}=p.data;if(m<Math.floor(Date.now()/1e3))return new Zt("Invalid or expired access token");u={username:v,userId:y,server:T,accessToken:g,refreshToken:b}}else{let{tableauUserId:p,tableauServer:g,sub:b}=n.data;u={username:b,server:g,...p?{userId:p}:{}}}return Em({token:t,clientId:c,scopes:[],expiresAt:i.exp,extra:u})}catch{return new Zt("Invalid or expired access token")}}import Ia from"axios-retry";import{randomBytes as mi,randomUUID as Pa}from"crypto";import{isIP as Rm}from"net";import{isSSRFSafeURL as xm}from"ssrfcheck";import{Err as Oe,Ok as Da}from"ts-results-es";import{fromError as ka}from"zod-validation-error";function Ra(t){try{return new URL(t)}catch{return}}function er(t,e,...r){return e>2147483647?setTimeout(()=>{er(t,e-2147483647,...r)},2147483647):setTimeout(t,e,...r)}var Br=new At({defaultExpirationTimeMs:ro});import{Resolver as vm}from"dns/promises";var zr=null;function xa(){return zr||(zr=new vm,zr.setServers(A().oauth.dnsServers)),zr}import{createHash as Cm}from"crypto";function Wr(t){return Cm("sha256").update(t).digest("base64url")}function Hr(t){if(typeof t!="string")return!1;try{let e=new URL(t);return e.protocol==="https:"?!0:e.protocol==="http:"?e.hostname==="localhost"||e.hostname==="127.0.0.1":!!e.protocol.match(/^[a-zA-Z][a-zA-Z0-9+.-]*:$/)}catch{return!1}}function La(t,e){let r=A();t.get("/oauth/authorize",async(o,i)=>{let n=Tn.safeParse(o.query);if(!n.success){i.status(400).json({error:"invalid_request",error_description:ka(n.error).toString()});return}let{client_id:s,redirect_uri:a,response_type:l,code_challenge:c,code_challenge_method:u,state:p}=n.data,g=Ra(s);if(g){let x=await Im(g);if(x.isErr()){i.status(400).json(x.error);return}let{redirect_uris:q,response_types:F}=x.value;if(F&&!F.find(te=>te===l)){i.status(400).json({error:"unsupported_response_type",error_description:`Unsupported response type: ${l}`});return}if(q&&!q.includes(a)){i.status(400).json({error:"invalid_request",error_description:`Invalid redirect URI: ${a}`});return}}if(l!=="code"){i.status(400).json({error:"unsupported_response_type",error_description:"Only authorization code flow is supported"});return}if(u!=="S256"){i.status(400).json({error:"invalid_request",error_description:"Only S256 code challenge method is supported"});return}if(!Hr(a)){i.status(400).json({error:"invalid_request",error_description:`Invalid redirect URI: ${a}`});return}let b=mi(32).toString("hex"),m=mi(32).toString("hex"),y=Pa(),T=Math.floor(Math.random()*43)+22,v=mi(T).toString("hex"),P=Wr(v);e.set(m,{clientId:s,redirectUri:a,codeChallenge:c,state:p??"",tableauState:b,tableauClientId:y,tableauCodeVerifier:v}),er(()=>e.delete(m),r.oauth.authzCodeTimeoutMs);let S=r.server||$r,C=new URL(`${S}/oauth2/v1/auth`);C.searchParams.set("client_id",y),C.searchParams.set("code_challenge",P),C.searchParams.set("code_challenge_method","S256"),C.searchParams.set("response_type","code"),C.searchParams.set("redirect_uri",r.oauth.redirectUri),C.searchParams.set("state",`${m}:${b}`),C.searchParams.set("device_id",Pa()),C.searchParams.set("target_site",r.siteName),C.searchParams.set("device_name",Pm(a,p??"")),C.searchParams.set("client_type","tableau-mcp"),i.redirect(C.toString())})}async function Im(t){let e=t.toString(),r=Br.get(e);if(r)return Da(r);let o=t.hostname;if(!Rm(t.hostname))try{let g=xa(),m=(await g.resolve4(t.hostname)).find(Boolean);if(!m&&(m=(await g.resolve6(t.hostname)).find(Boolean),!m))return Oe({error:"invalid_request",error_description:"IP address of Client Metadata URL could not be resolved"});t.hostname=m}catch{return Oe({error:"invalid_request",error_description:"IP address of Client Metadata URL could not be resolved"})}if(!xm(t.toString(),{allowedProtocols:["https"],autoPrependProtocol:!1}))return Oe({error:"invalid_request",error_description:"Client Metadata URL is not allowed"});let n;try{let g=qt.create();Ia(g,{retries:3,retryDelay:Ia.exponentialDelay}),n=await g.get(t.toString(),{timeout:5e3,maxContentLength:5*1024,maxRedirects:3,headers:{Accept:"application/json",Host:o}})}catch{return Oe({error:"invalid_request",error_description:"Unable to fetch client metadata"})}let s=Fo(n.headers,"content-type");if(!s)return Oe({error:"invalid_client_metadata",error_description:"Client Metadata URL must return a valid Content-Type header"});if(!s.split(";").map(g=>g.trim()).includes("application/json"))return Oe({error:"invalid_client_metadata",error_description:"Client Metadata URL must return a JSON response"});let l=En.safeParse(n.data);if(!l.success)return Oe({error:"invalid_client_metadata",error_description:`Client metadata is invalid: ${ka(l.error).toString()}`});if(l.data.client_id!==e)return Oe({error:"invalid_client_metadata",error_description:"Client ID mismatch"});let c=Fo(n.headers,"cache-control"),u;if(c){let g=c.split(",").map(b=>b.trim()).find(b=>/^max-age\s*=\s*\d+$/i.test(b));g&&(u=g.split("=")[1].trim())}let p=Br.defaultExpirationTimeMs;if(u){let g=parseInt(u);!isNaN(g)&&g>=0&&(p=Math.min(Ei,g*1e3))}return p>0&&Br.set(e,l.data,p),Da(l.data)}function Pm(t,e){let r="tableau-mcp (Unknown agent)";try{let o=new URL(t);return o.protocol==="https:"||o.protocol==="http:"?t==="https://vscode.dev/redirect"&&new URL(e).protocol==="vscode:"?"tableau-mcp (VS Code)":r:o.protocol==="cursor:"?"tableau-mcp (Cursor)":`tableau-mcp (${o.protocol.slice(0,-1)})`}catch{return r}}import{randomBytes as Lm}from"crypto";import{Err as Mm,Ok as Om}from"ts-results-es";import{fromError as Nm}from"zod-validation-error";import{Zodios as km}from"@zodios/core";import{makeApi as Dm}from"@zodios/core";import{z as se}from"zod";var Ma=se.discriminatedUnion("grant_type",[se.object({grant_type:se.literal("authorization_code"),code:se.string(),code_verifier:se.string(),redirect_uri:se.string(),client_id:se.string()}),se.object({grant_type:se.literal("refresh_token"),client_id:se.string(),refresh_token:se.string(),site_namespace:se.string()})]),Oa=se.object({access_token:z("access_token"),expires_in:se.number().int().nonnegative(),refresh_token:z("refresh_token"),origin_host:z("origin_host")}).transform(t=>({accessToken:t.access_token,expiresInSeconds:t.expires_in,refreshToken:t.refresh_token,originHost:t.origin_host}));var Na=Dm([{method:"post",path:"/oauth2/v1/token",alias:"token",response:Oa,parameters:[{name:"body",type:"Body",schema:Ma}]}]);var Ua=t=>new km(t,Na);async function Gr(t,e){return await Ua(t).token(e,{headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":Dr}})}function Fa(t,e,r){let o=A();t.get("/Callback",async(i,n)=>{let s=An.safeParse(i.query);if(!s.success){n.status(400).json({error:"invalid_request",error_description:Nm(s.error).toString()});return}let{error:a,code:l,state:c}=s.data;if(a){n.status(400).json({error:"access_denied",error_description:"User denied authorization"});return}try{let[u,p]=c?.split(":")??[],g=e.get(u);if(!g||g.tableauState!==p){n.status(400).json({error:"invalid_request",error_description:"Invalid state parameter"});return}let b=await Um({server:o.server||$r,code:l??"",redirectUri:o.oauth.redirectUri,clientId:g.tableauClientId,codeVerifier:g.tableauCodeVerifier});if(b.isErr()){n.status(400).json({error:"invalid_request",error_description:b.error});return}let{accessToken:m,refreshToken:y,expiresInSeconds:T,originHost:v}=b.value,P=new URL(`https://${v}`);if(o.server){let te=new URL(o.server);if(P.hostname!==te.hostname){n.status(400).json({error:"invalid_request",error_description:`Invalid origin host: ${v}. Expected: ${new URL(o.server).hostname}`});return}}let S=P.toString(),C=new Le(S);C.setCredentials(m,"unknown user id");let x=await C.authenticatedServerMethods.getCurrentServerSession();if(x.isErr()){x.error.type==="unauthorized"?n.status(401).json({error:"unauthorized",error_description:`Unable to get the Tableau server session. Error: ${JSON.stringify(x.error)}`}):n.status(500).json({error:"server_error",error_description:"Internal server error during authorization. Unable to get the Tableau server session. Contact your administrator."});return}let q=Lm(32).toString("hex");r.set(q,{clientId:g.clientId,redirectUri:g.redirectUri,codeChallenge:g.codeChallenge,user:x.value.user,server:S,tableauClientId:g.tableauClientId,tokens:{accessToken:m,refreshToken:y,expiresInSeconds:T},expiresAt:Math.floor((Date.now()+o.oauth.authzCodeTimeoutMs)/1e3)}),e.delete(u);let F=new URL(g.redirectUri);F.searchParams.set("code",q),F.searchParams.set("state",g.state),n.redirect(F.toString())}catch(u){console.error("OAuth callback error:",u),n.status(500).json({error:"server_error",error_description:"Internal server error during authorization. Contact your administrator."})}})}async function Um({server:t,code:e,redirectUri:r,clientId:o,codeVerifier:i}){try{let n=await Gr(t,{grant_type:"authorization_code",code:e,redirect_uri:r,client_id:o,code_verifier:i});return Om(n)}catch{return Mm("Failed to exchange authorization code")}}import Fm from"express";function qa(t){t.post("/oauth/register",Fm.json(),(e,r)=>{let{redirect_uris:o}=e.body,i=[];if(o&&Array.isArray(o))for(let s of o){if(!Hr(s)){r.status(400).json({error:"invalid_redirect_uri",error_description:`Invalid redirect URI: ${s}`});return}i.push(s)}let{token_endpoint_auth_method:n}=e.body;(!n||typeof n!="string"||!["client_secret_basic","client_secret_post"].includes(n))&&(n="client_secret_basic"),r.json({client_id:"mcp-public-client",redirect_uris:i,grant_types:["authorization_code","client_credentials"],response_types:["code"],token_endpoint_auth_method:n,application_type:"native"})})}import{randomBytes as ja,timingSafeEqual as qm}from"crypto";import{CompactEncrypt as Va}from"jose";import{Err as Ne,Ok as hi}from"ts-results-es";import{fromError as jm}from"zod-validation-error";function Ba(t,e,r,o){let i=A();t.post("/oauth/token",async(n,s)=>{let a=wn.safeParse(n.body);if(!a.success){s.status(400).json({error:"invalid_request",error_description:jm(a.error).toString()});return}let l=zm({required:a.data.grantType==="client_credentials",clientId:a.data.clientId,clientSecret:a.data.clientSecret,clientIdSecretPairs:A().oauth.clientIdSecretPairs,authorizationHeader:n.headers.authorization});if(l.isErr()){s.status(401).json({error:"invalid_client",error_description:l.error});return}try{switch(a.data.grantType){case"authorization_code":{let{code:c,codeVerifier:u}=a.data,p=e.get(c);if(!p||p.expiresAt<Math.floor(Date.now()/1e3)){e.delete(c),s.status(400).json({error:"invalid_grant",error_description:"Invalid or expired authorization code"});return}if(Wr(u)!==p.codeChallenge){s.status(400).json({error:"invalid_grant",error_description:"Invalid code verifier"});return}let b=ja(32).toString("hex"),m=await fi(p,o);r.set(b,{user:p.user,server:p.server,clientId:p.clientId,tokens:p.tokens,expiresAt:Math.floor((Date.now()+i.oauth.refreshTokenTimeoutMs)/1e3),tableauClientId:p.tableauClientId}),er(()=>r.delete(b),i.oauth.refreshTokenTimeoutMs),e.delete(c),s.json({access_token:m,token_type:"Bearer",expires_in:i.oauth.accessTokenTimeoutMs/1e3,refresh_token:b});return}case"client_credentials":{let c=await Vm({clientId:l.value.clientId,server:i.server},o);s.json({access_token:c,token_type:"Bearer",expires_in:i.oauth.accessTokenTimeoutMs/1e3});return}case"refresh_token":{let{refreshToken:c}=a.data,u=r.get(c);if(!u||u.expiresAt<Math.floor(Date.now()/1e3)){r.delete(c),s.status(400).json({error:"invalid_grant",error_description:"Invalid or expired refresh token"});return}let p,{refreshToken:g}=u.tokens,b=await Bm(u.server,g,u.tableauClientId);if(b.isErr())p=await fi({user:u.user,clientId:u.clientId,server:u.server,tokens:u.tokens},o);else{let{accessToken:y,refreshToken:T,expiresInSeconds:v}=b.value;p=await fi({user:u.user,clientId:u.clientId,server:u.server,tokens:{accessToken:y,refreshToken:T,expiresInSeconds:v}},o)}r.delete(c);let m=ja(32).toString("hex");r.set(m,{user:u.user,server:u.server,clientId:u.clientId,tokens:u.tokens,expiresAt:Math.floor((Date.now()+i.oauth.refreshTokenTimeoutMs)/1e3),tableauClientId:u.tableauClientId}),s.json({access_token:p,token_type:"Bearer",expires_in:i.oauth.accessTokenTimeoutMs/1e3,refresh_token:m});return}}}catch(c){console.error("Token endpoint error:",c),s.status(500).json({error:"server_error",error_description:"Internal server error"});return}})}async function fi(t,e){let r=A(),o=JSON.stringify({sub:t.user.name,clientId:t.clientId,tableauServer:t.server,tableauUserId:t.user.id,iat:Math.floor(Date.now()/1e3),exp:Math.floor((Date.now()+r.oauth.accessTokenTimeoutMs)/1e3),aud:Xt,iss:r.oauth.issuer,...r.auth==="oauth"?{tableauAccessToken:t.tokens.accessToken,tableauRefreshToken:t.tokens.refreshToken,tableauExpiresAt:Math.floor(Date.now()/1e3)+t.tokens.expiresInSeconds,tableauUserId:t.user.id}:{}});return await new Va(new TextEncoder().encode(o)).setProtectedHeader({alg:"RSA-OAEP-256",enc:"A256GCM"}).encrypt(e)}async function Vm(t,e){let r=A(),o=JSON.stringify({sub:t.clientId,clientId:t.clientId,tableauServer:t.server,iat:Math.floor(Date.now()/1e3),exp:Math.floor((Date.now()+r.oauth.accessTokenTimeoutMs)/1e3),aud:Xt,iss:r.oauth.issuer});return await new Va(new TextEncoder().encode(o)).setProtectedHeader({alg:"RSA-OAEP-256",enc:"A256GCM"}).encrypt(e)}async function Bm(t,e,r){try{let o=await Gr(t,{grant_type:"refresh_token",refresh_token:e,client_id:r,site_namespace:""});return hi(o)}catch{return Ne("Failed to exchange refresh token")}}function zm({required:t,clientId:e,clientSecret:r,clientIdSecretPairs:o,authorizationHeader:i}){if(!e&&!r&&t){if(!i)return Ne("Authorization header is required");let[c,u]=i.split(" ");if(c!=="Basic")return Ne("Invalid authorization type");if([e,r]=Buffer.from(u,"base64").toString().split(":"),!e||!r)return Ne("Invalid client credentials")}if(!t)return hi({clientId:""});if(!e)return Ne("Client ID is required");if(!r)return Ne("Client secret is required");let n=o?.[e];if(!n||r.length!==n.length)return Ne("Invalid client credentials");let s=new TextEncoder,a=s.encode(r),l=s.encode(n);return a.byteLength!==l.byteLength||!qm(a,l)?Ne("Invalid client credentials"):hi({clientId:e})}var $r="https://online.tableau.com",Xt="tableau-mcp-server",Qr=class{config=A();pendingAuthorizations=new Map;authorizationCodes=new Map;refreshTokens=new Map;privateKey;publicKey;constructor(){this.privateKey=this.getPrivateKey(),this.publicKey=Hm(this.privateKey)}get authMiddleware(){return Ca(this.privateKey)}setupRoutes(e){Ea(e),_a(e),qa(e),La(e,this.pendingAuthorizations),Fa(e,this.pendingAuthorizations,this.authorizationCodes),Ba(e,this.authorizationCodes,this.refreshTokens,this.publicKey)}getPrivateKey(){let e=this.config.oauth.jwePrivateKey.replace(/\\n/g,`
1238
+ `);if(!e)try{e=$m(this.config.oauth.jwePrivateKeyPath,"utf8")}catch{throw new Error("Failed to read private key file")}try{return Wm({key:e,format:"pem",passphrase:this.config.oauth.jwePrivateKeyPassphrase})}catch{throw new Error("Failed to create private key")}}};var yi="mcp-session-id";async function Qa({basePath:t,config:e,logLevel:r}){let o=gi();o.use(gi.json()),o.use(gi.urlencoded()),o.use(Km({origin:e.corsOriginConfig,credentials:!0,allowedHeaders:["Content-Type","Authorization","Cache-Control","Accept","MCP-Protocol-Version"],exposedHeaders:[yi,"x-session-id"]})),e.trustProxyConfig!==null&&o.set("trust proxy",e.trustProxyConfig);let i=[];if(e.oauth.enabled){let c=new Qr;c.setupRoutes(o),i.push(c.authMiddleware),i.push(Sa)}let n=`/${t}`;if(o.post(n,...i,l),o.get(n,...i,e.disableSessionManagement?$a:Ga),o.delete(n,...i,e.disableSessionManagement?$a:Ga),!!!(e.sslKey&&e.sslCert))return new Promise(c=>{let u=Jm.createServer(o).listen(e.httpPort,()=>c({url:`http://localhost:${e.httpPort}/${t}`,app:o,server:u}))});if(!Wa(e.sslKey))throw new Error("SSL key file does not exist");if(!Wa(e.sslCert))throw new Error("SSL cert file does not exist");let a={key:za.readFileSync(e.sslKey),cert:za.readFileSync(e.sslCert)};return new Promise(c=>{let u=Ym.createServer(a,o).listen(e.httpPort,()=>c({url:`https://localhost:${e.httpPort}/${t}`,app:o,server:u}))});async function l(c,u){try{let p;if(e.disableSessionManagement){let g=new Xe;p=new Gm({sessionIdGenerator:void 0}),u.on("close",()=>{p.close(),g.close()}),await Ha(g,p,r,M(c.auth))}else{let g=c.headers[yi],b;if(g&&(b=pi(g)))p=b.transport;else if(!g&&Qm(c.body)){let m=c.body.params.clientInfo;p=Aa({clientInfo:m});let y=new Xe({clientInfo:m});await Ha(y,p,r,M(c.auth))}else{u.status(400).json({jsonrpc:"2.0",error:{code:-32e3,message:"Bad Request: No valid session ID provided"},id:null});return}}await p.handleRequest(c,u,c.body)}catch(p){console.error("Error handling MCP request:",p),u.headersSent||u.status(500).json({jsonrpc:"2.0",error:{code:-32603,message:"Internal server error"},id:null})}}}async function Ha(t,e,r,o){await t.registerTools(o),t.registerRequestHandlers(),await t.connect(e),et(t,r)}async function $a(t,e){e.writeHead(405).end(JSON.stringify({jsonrpc:"2.0",error:{code:-32e3,message:"Method not allowed."},id:null}))}async function Ga(t,e){let r=t.headers[yi],o;if(!r||!(o=pi(r))){e.status(400).send("Invalid or missing session ID");return}await o.transport.handleRequest(t,e)}async function ef(){Xm.config();let t=A(),e=vi(t.defaultLogLevel)?t.defaultLogLevel:"debug";switch(t.enableServerLogging&&Ci(new rr({logDirectory:t.serverLogDirectory})),t.transport){case"stdio":{let r=new Xe;await r.registerTools(),r.registerRequestHandlers();let o=new Zm;await r.connect(o),et(r,e),ue.info(r,`${r.name} v${r.version} running on stdio`);break}case"http":{let{url:r}=await Qa({basePath:Me,config:t,logLevel:e});t.oauth.enabled||console.warn('\u26A0\uFE0F TRANSPORT is "http" but OAuth is disabled! Your MCP server may not be protected from unauthorized access! By having explicitly disabled OAuth by setting the DANGEROUSLY_DISABLE_OAUTH environment variable to "true", you accept any and all risks associated with this decision.'),console.log(`${Me} v${Yt} ${t.disableSessionManagement?"stateless ":""}streamable HTTP server available at ${r}`);break}}t.disableLogMasking&&Fe("\u26A0\uFE0F Log masking is disabled!")}try{await ef()}catch(t){Fe(`Fatal error when starting the server: ${V(t)}`),process.exit(1)}
718
1239
  /* v8 ignore file -- @preserve */
719
1240
  //# sourceMappingURL=index.js.map