@ax-hub/sdk 1.0.2 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var ulid=require('ulid'),crypto=require('crypto');var m=class extends Error{code;category;httpStatus;retryable;requestId;resource;fields;retry;docUrl;constructor(e){super(e.message,e.cause?{cause:e.cause}:void 0),this.name=this.constructor.name,this.code=e.code,this.category=e.category,this.httpStatus=e.httpStatus,this.retryable=e.retryable,this.requestId=e.requestId,e.resource!==void 0&&(this.resource=e.resource),e.fields!==void 0&&(this.fields=e.fields),e.retry!==void 0&&(this.retry=e.retry),e.docUrl!==void 0&&(this.docUrl=e.docUrl);}toJSON(){return {name:this.name,message:this.message,code:this.code,category:this.category,httpStatus:this.httpStatus,retryable:this.retryable,requestId:this.requestId,resource:this.resource,fields:this.fields,retry:this.retry,docUrl:this.docUrl}}toString(){return xn(this)}};function xn(t){let e=[`${t.name}[${t.code}]`];return t.requestId&&e.push(`req=${t.requestId}`),e.push(`problem=${t.message}`),t.fields?.length&&e.push(`cause=${t.fields.map(n=>`${n.name}:${n.code}`).join(",")}`),t.retry?.afterMs!==void 0?e.push(`fix=retry_after_${t.retry.afterMs}ms`):t.retryable?e.push("fix=retry_with_backoff"):e.push("fix=inspect_input_or_permissions"),t.docUrl&&e.push(`docs=${t.docUrl}`),e.join(" ")}var d=class extends m{},P=class extends m{},E=class extends m{},y=class extends m{},f=class extends m{},oe=class extends m{},$=class extends m{},G=class extends m{},Q=class extends m{},ae=class extends f{},ue=class extends f{},ce=class extends f{},de=class extends P{},le=class extends P{},pe=class extends P{},me=class extends E{},ge=class extends E{},fe=class extends y{},ye=class extends y{},he=class extends f{},be=class extends f{},Re=class extends f{},we=class extends f{},_e=class extends f{},xe=class extends f{},ve=class extends f{},Se=class extends f{},Ie=class extends f{},Ce=class extends f{},Ae=class extends f{},ke=class extends f{},Te=class extends d{},F=class extends d{},Pe=class extends d{},Ee=class extends d{},qe=class extends E{},Oe=class extends E{},De=class extends Q{},Ue=class extends m{},Me=class extends m{},k=class extends m{},b=class extends m{},Z=class extends m{},pt=class extends m{},Le=class extends m{},w=class extends m{},X=class extends m{},B=class extends P{},Yt=class extends d{},H=class extends y{},j=class extends G{},_=class extends d{},q=class extends d{},$e=class extends X{},O=class extends G{},h=class extends m{description;uri;constructor(e){super({message:e.description??e.code,code:e.code,category:"oauth",httpStatus:e.httpStatus,retryable:e.retryable,requestId:e.requestId}),e.description!==void 0&&(this.description=e.description),e.uri!==void 0&&(this.uri=e.uri);}},Ge=class extends h{},Y=class extends h{},N=class extends h{},V=class extends h{},J=class extends h{},Jt=class extends Y{},en=class extends J{},Fe=class extends h{},Be=class extends h{},He=class extends h{},je=class extends h{},Ne=class extends h{},Ve=class extends h{},Ke=class extends h{},ze=class extends h{},We=class extends h{};var vn={slug_taken:ae,already_member:ue,already_deleted:ce,already_revoked:he,already_settled:be,already_active:Re,already_inactive:we,already_accessed:_e,not_deleted:xe,last_admin:ve,pending_exists:Se,invalid_state_transition:Ie,schema_name_taken:Ce,domain_taken:Ae,duplicate:ke,token_missing:de,token_expired:le,token_invalid:pe,pool_stale:B,not_admin:me,forbidden:ge,not_member:qe,not_allowed:Oe,permanently_deleted:fe,invitation_expired:ye,invalid_value:Te,required:F,empty:Pe,bad_request:Ee,app_unavailable:De},Sn={validation:d,unauthenticated:P,permission_denied:E,not_found:y,conflict:f,precondition_failed:oe,rate_limited:$,internal:G,unavailable:Q},In={invalid_grant:Ge,access_denied:Y,authorization_pending:N,slow_down:V,expired_token:J,invalid_target:Fe,invalid_client:Be,invalid_request:He,invalid_scope:je,invalid_token:Ne,unauthorized_client:Ve,unsupported_grant_type:Ke,server_error:ze,temporarily_unavailable:We},Cn={authorization_pending:true,slow_down:true,access_denied:false,invalid_grant:false,expired_token:false,server_error:true,temporarily_unavailable:true};function Mr(t){if(typeof t!="object"||t===null)return false;let e=t.error;if(typeof e!="object"||e===null)return false;let n=e;return typeof n.code=="string"&&typeof n.category=="string"&&typeof n.retryable=="boolean"}function Lr(t){return typeof t!="object"||t===null?false:typeof t.error=="string"}function An(t){return t.startsWith("/oauth/")||t.startsWith("/auth/")}function tn(t){return An(t.path)&&Lr(t.body)?Gr(t):Mr(t.body)?$r(t):new k({message:"Unexpected error response shape",code:"decode_failed",category:"decode",httpStatus:t.status,retryable:false,requestId:t.fallbackRequestId})}function $r(t){let n=t.body.error,r=n.retry?{afterMs:n.retry.after_ms}:void 0,i={message:n.message,code:n.code,category:n.category,httpStatus:t.status,retryable:n.retryable,requestId:n.request_id||t.fallbackRequestId,resource:n.resource,fields:n.fields,retry:r,docUrl:n.doc_url},s=vn[n.code];if(s)return new s(i);let o=Sn[n.category]??m;return new o(i)}function Gr(t){let e=t.body,n=In[e.error]??h,r=Cn[e.error]??false;return new n({code:e.error,description:e.error_description,uri:e.error_uri,httpStatus:t.status,retryable:r,requestId:t.fallbackRequestId})}function Fr(t){return t}function Br(t){return t}function Hr(t){return t}function jr(t){return t}function Nr(t){return t}function Vr(t){return t}function Kr(t){return t}function zr(t){return t}var Wr=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,kn=/^[a-z][a-z0-9-]{0,62}$/;function mt(t,e,n){return new d({message:t,code:n,category:"validation",httpStatus:0,retryable:false,requestId:"",fields:[{name:e,code:n}]})}function S(t,e){if(t.trim()==="")throw mt(`${e} must be non-empty`,e,"empty");if(!Wr.test(t))throw mt(`${e} must be a UUID`,e,"invalid_uuid")}function Tn(t,e){if(t.trim()==="")throw mt(`${e} must be non-empty`,e,"empty");if(!kn.test(t))throw mt(`${e} must match ${kn.source}`,e,"invalid_slug")}var Qr={tenant(t){return S(t,"tenantId"),t},tenantSlug(t){return Tn(t,"tenantSlug"),t},app(t){return S(t,"appId"),t},appSlug(t){return Tn(t,"appSlug"),t},user(t){return S(t,"userId"),t},deployment(t){return S(t,"deploymentId"),t},pat(t){return S(t,"patId"),t},resource(t){return S(t,"resourceId"),t},connector(t){return S(t,"connectorId"),t},subject(t){return S(t,"subjectId"),t},grant(t){return S(t,"grantId"),t},tag(t){return S(t,"tagId"),t},auditEvent(t){return S(t,"auditEventId"),t},table(t){return S(t,"tableId"),t}};var Qe=class{token;tokenType;onRefresh;refreshing=null;constructor(e){this.token=e.token,this.tokenType=e.tokenType,this.onRefresh=e.onRefresh;}currentToken(){return this.token}headersFor(e){return e==="public"?{}:this.tokenType==="pat"?{"X-Api-Key":this.token}:{Authorization:`Bearer ${this.token}`}}async onUnauthorized(){return this.tokenType!=="jwt"||!this.onRefresh?false:this.refreshing?this.refreshing:(this.refreshing=(async()=>{try{let e=await this.onRefresh();return this.token=e,!0}catch{return false}finally{this.refreshing=null;}})(),this.refreshing)}},Ze=class{headersFor(e){return {}}async onUnauthorized(){return false}};var gt={debug(){},info(){},warn(){},error(){}};function nn(t){if(!t)return 6e4;let e=t.trim();if(e==="")return 6e4;let n=Number(e);if(Number.isFinite(n))return n>=0?Math.floor(n*1e3):6e4;let r=Date.parse(e);return Number.isNaN(r)?6e4:Math.max(0,r-Date.now())}var Zr=new Set(["authorization","x-api-key","cookie","set-cookie","proxy-authorization"]),Xr="***REDACTED***";function Pn(t){let e={},n=(r,i)=>{e[r]=Zr.has(r.toLowerCase())?Xr:i;};if(typeof Headers<"u"&&t instanceof Headers)t.forEach((r,i)=>n(i,r));else for(let[r,i]of Object.entries(t))n(r,i);return e}var sn={maxAttempts:3,baseMs:200,capMs:5e3,jitter:Math.random};function Yr(t){return t instanceof m?t.retryable:t instanceof TypeError}async function En(t,e=sn,n){let r;for(let i=0;i<e.maxAttempts;i++){if(n?.aborted)throw rn("aborted before attempt",n.reason);try{return await t(i)}catch(s){if(r=s,!Yr(s)||i===e.maxAttempts-1)throw s;let o=Math.min(e.capMs,e.baseMs*2**i)*e.jitter();await on(o,n);}}throw r}function on(t,e){return new Promise((n,r)=>{if(e?.aborted){r(rn("aborted before sleep",e.reason));return}let i=setTimeout(()=>{e?.removeEventListener("abort",s),n();},t),s=()=>{clearTimeout(i),r(rn("aborted during sleep",e?.reason));};e?.addEventListener("abort",s,{once:true});})}function rn(t,e){return new b({message:t,code:"aborted",category:"abort",httpStatus:0,retryable:false,requestId:"",cause:e})}var Jr=new Set(["GET","HEAD","OPTIONS"]),ft=class{baseUrl;auth;fetch;logger;debug;timeoutMs;idempotencyKey;retryPolicy;rateLimitStrategy;constructor(e){this.baseUrl=e.baseUrl.replace(/\/$/,""),this.auth=e.auth,this.fetch=e.fetch??globalThis.fetch,this.logger=e.logger??gt,this.debug=e.debug??false,this.timeoutMs=e.timeoutMs??3e4,this.idempotencyKey={autoGenerate:e.idempotencyKey?.autoGenerate??true,generator:e.idempotencyKey?.generator??ulid.ulid},this.retryPolicy=e.retryPolicy??sn,this.rateLimitStrategy=e.rateLimitStrategy??"sleep";}async request(e,n,r){let i=Jr.has(e.toUpperCase()),s=this.withStableIdempotencyKey(r);return i||r.idempotent?En(()=>this.requestOnce(e,n,s),this.retryPolicy,s.signal):this.requestOnce(e,n,s)}async requestOnce(e,n,r){let i=this.buildUrl(n,r.query),s=ulid.ulid(),o=this.buildHeaders(s,r),u=r.body!==void 0?JSON.stringify(r.body):void 0;u!==void 0&&(o["Content-Type"]="application/json");let l=new AbortController,A=()=>l.abort(r.signal?.reason);r.signal?.addEventListener("abort",A,{once:true});let p=r.timeoutMs??this.timeoutMs,I=setTimeout(()=>l.abort(new Error("timeout")),p),x;try{this.logRequest(e,i,o,s),x=await this.fetch(i,{method:e,headers:o,body:u,signal:l.signal});}catch(v){throw r.signal?.aborted?new b({message:"Request aborted",code:"aborted",category:"abort",httpStatus:0,retryable:false,requestId:s,cause:v}):l.signal.aborted?new Me({message:`Request timed out after ${p}ms`,code:"timeout",category:"timeout",httpStatus:0,retryable:true,requestId:s,cause:v}):new Ue({message:"Network error",code:"network",category:"network",httpStatus:0,retryable:true,requestId:s,cause:v})}finally{clearTimeout(I),r.signal?.removeEventListener("abort",A);}if(r.rawResponse&&x.ok)return {response:x,requestId:s};if(x.ok)return this.parseSuccess(x,r,s);let L=await this.safeParseJson(x);if(x.status===401&&r.ring==="admin"&&await this.auth.onUnauthorized())return this.requestOnce(e,n,r);if(x.status===429){let v=nn(x.headers.get("Retry-After")),lt=new $({message:ei(L)??"Rate limited",code:ti(L)??"rate_limited",category:"rate_limited",httpStatus:429,retryable:true,requestId:s,retry:{afterMs:v}});if(this.rateLimitStrategy==="sleep")return await on(v,r.signal),this.requestOnce(e,n,r);throw lt}throw tn({path:n,status:x.status,body:L,fallbackRequestId:s})}async parseSuccess(e,n,r){if(e.status===204||n.parseBody===false)return;let i=await e.text();if(i!=="")try{return JSON.parse(i)}catch(s){throw new k({message:"Backend returned non-JSON success body",code:"decode_failed",category:"decode",httpStatus:e.status,retryable:false,requestId:r,cause:s})}}async safeParseJson(e){try{let n=await e.text();return n===""?void 0:JSON.parse(n)}catch{return}}buildUrl(e,n){let r=e.startsWith("/")?e:`/${e}`,i=this.baseUrl+r;if(!n)return i;let s=new URLSearchParams;for(let[u,l]of Object.entries(n))l!==void 0&&s.set(u,String(l));let o=s.toString();return o?`${i}?${o}`:i}buildHeaders(e,n){let r=this.resolveIdempotencyKey(n);return {"X-Request-Id":e,Accept:"application/json",...n.ring!=="public"?this.auth.headersFor(n.ring):{},...r?{"Idempotency-Key":r}:{},...n.headers??{}}}resolveIdempotencyKey(e){if(e.idempotencyKey!==false){if(typeof e.idempotencyKey=="string"){if(e.idempotencyKey.trim()==="")throw new m({message:"idempotencyKey must be non-empty",code:"invalid_idempotency_key",category:"validation",httpStatus:0,retryable:false,requestId:""});return e.idempotencyKey}if(!(!e.idempotent||!this.idempotencyKey.autoGenerate))return this.idempotencyKey.generator()}}withStableIdempotencyKey(e){return e.idempotencyKey!==void 0||!e.idempotent||!this.idempotencyKey.autoGenerate?e:{...e,idempotencyKey:this.idempotencyKey.generator()}}logRequest(e,n,r,i){this.debug&&this.logger.debug({method:e,url:n,headers:Pn(r),requestId:i},"http.request");}};function ei(t){if(typeof t!="object"||t===null)return;let e=t.error;if(typeof e=="object"&&e!==null){let n=e.message;if(typeof n=="string")return n}if(typeof e=="string")return e}function ti(t){if(typeof t!="object"||t===null)return;let e=t.error;if(typeof e=="object"&&e!==null){let n=e.code;if(typeof n=="string")return n}}var Xe=4096,On=false;function Dn(t){return `v2:${Buffer.from(JSON.stringify(t),"utf8").toString("base64url")}`}function yt(t){if(t.length>Xe)throw new _({message:`Cursor token exceeds maximum size (${Xe} chars)`,code:"invalid_cursor",category:"validation",httpStatus:0,retryable:false,requestId:"",docUrl:"https://docs.axhub.dev/errors/validation/invalid-cursor"});if(t.startsWith("v1:"))throw new q({message:"Legacy v1: cursor token is not compatible with keyset pagination; restart pagination without cursor",code:"legacy_cursor",category:"validation",httpStatus:0,retryable:false,requestId:"",docUrl:"https://docs.axhub.dev/errors/validation/legacy-cursor"});if(!t.startsWith("v2:"))throw new q({message:"Cursor token is missing the v2: keyset prefix; restart pagination without cursor",code:"legacy_cursor",category:"validation",httpStatus:0,retryable:false,requestId:"",docUrl:"https://docs.axhub.dev/errors/validation/legacy-cursor"});try{let e=JSON.parse(Buffer.from(t.slice(3),"base64url").toString("utf8"));if(!ni(e))throw new Error("invalid cursor shape");return e}catch(e){throw new _({message:"Malformed keyset cursor token",code:"invalid_cursor",category:"validation",httpStatus:0,retryable:false,requestId:"",cause:e,docUrl:"https://docs.axhub.dev/errors/validation/invalid-cursor"})}}function Un(t){return t===void 0?null:yt(t)}function ht(t,e){let n=typeof t=="string"?t.split(",").map(r=>{let i=r.trim();return i.startsWith("-")?{field:i.slice(1),dir:"desc"}:i.startsWith("+")?{field:i.slice(1),dir:"asc"}:{field:i,dir:"asc"}}).filter(r=>r.field.length>0):[...t??[]].map(r=>({field:r.field,dir:r.dir??"asc"}));return n.length>0&&!n.some(r=>r.field==="id")&&(e?.warnOnTiebreaker&&!On&&(On=true,console.warn("AX Hub SDK: orderBy is not unique; appending id ASC as keyset cursor tiebreaker")),n.push({field:"id",dir:"asc"})),n}function Mn(t){let e=ht(t,{warnOnTiebreaker:true});return e.length===0?typeof t=="string"?t:void 0:e.map(n=>`${n.dir==="desc"?"-":""}${n.field}`).join(",")}function Ln(t){return JSON.stringify(Gn(t))}function bt(t,e){if(!t)return;let n=Ln(e);if(t.orderByFingerprint!==n)throw new d({message:"Cursor was created with a different orderBy fingerprint",code:"cursor_order_mismatch",category:"validation",httpStatus:0,retryable:false,requestId:"",docUrl:"https://docs.axhub.dev/errors/validation/cursor-order-mismatch"})}function $n(t,e){if(!(!t||!t.contextFingerprint||!e)&&t.contextFingerprint!==e)throw new _({message:"Cursor was created for a different resource; restart pagination",code:"cursor_context_mismatch",category:"validation",httpStatus:0,retryable:false,requestId:"",docUrl:"https://docs.axhub.dev/errors/validation/invalid-cursor"})}function K(t,e){if(!t)return null;let n=Gn(e?.orderBy,{warnOnTiebreaker:true}),r={};for(let u of n){let l=t[u.field];(l===null||typeof l=="string"||typeof l=="number"||typeof l=="boolean")&&(r[u.field]=l);}let i=t.id,s={values:r,direction:e?.direction??"forward",orderBy:n,orderByFingerprint:JSON.stringify(n)};(typeof i=="string"||typeof i=="number")&&(s.tiebreaker={field:"id",value:i});let o=e?.page;return typeof o=="number"&&Number.isInteger(o)&&o>0&&(s.page=o),e?.contextFingerprint&&(s.contextFingerprint=e.contextFingerprint),Dn(s)}function Gn(t,e){let n=ht(t,e);return n.length>0?n:[{field:"id",dir:"asc"}]}function z(t){return typeof t=="string"&&t.startsWith("v2:")}function ni(t){return typeof t=="object"&&t!==null&&typeof t.values=="object"&&(t.direction==="forward"||t.direction==="backward")&&Array.isArray(t.orderBy)&&typeof t.orderByFingerprint=="string"}async function*T(t,e){let n=e?.cursor,r,i;for(;;){if(e?.signal?.aborted)throw new b({message:"listAll aborted",code:"aborted",category:"abort",httpStatus:0,retryable:false,requestId:""});let s=await t({pageSize:e?.pageSize,cursor:n});r===void 0?(r=s.total,i=s.total):s.total>(i??r)&&(yield {type:"drift",addedSince:s.total-(i??r)},i=s.total);for(let o of s.items)yield {type:"item",value:o};if(s.nextCursor==null)return;n=s.nextCursor;}}function an(t){return Buffer.isBuffer(t)?t:Buffer.from(t)}function ii(t){let e=t.startsWith("sha256=")?t.slice(7):t;return /^[0-9a-f]{64}$/i.test(e)?Buffer.from(e,"hex"):null}function si(t,e,n){let r=n?Buffer.concat([Buffer.from(`${n}.`),an(t)]):an(t);return `sha256=${crypto.createHmac("sha256",e).update(r).digest("hex")}`}function oi(t){if(!t.secret)return {ok:false,reason:"missing_secret"};let e=ii(t.signature);if(!e)return {ok:false,reason:"malformed_signature"};let n=Math.floor((t.now?.()??Date.now())/1e3),r=an(t.rawBody);if(t.timestamp!==void 0){let s=Number(t.timestamp);if(!Number.isFinite(s))return {ok:false,reason:"timestamp_skew"};let o=t.tolerance??300;if(Math.abs(n-s)>o)return {ok:false,reason:"timestamp_skew"};let u=`${t.timestamp}:${t.signature}`;if(t.replayCache?.has(u))return {ok:false,reason:"replay"};r=Buffer.concat([Buffer.from(`${t.timestamp}.`),r]);}let i=crypto.createHmac("sha256",t.secret).update(r).digest();return e.byteLength!==i.byteLength?{ok:false,reason:"signature_mismatch"}:crypto.timingSafeEqual(e,i)?(t.timestamp!==void 0&&t.replayCache?.add(`${t.timestamp}:${t.signature}`),{ok:true}):{ok:false,reason:"signature_mismatch"}}function a(t,e){return {...t,signal:e?.signal,timeoutMs:e?.timeoutMs,idempotencyKey:e?.idempotencyKey}}function D(t){let e={};return t?.pageSize!==void 0&&(e.limit=t.pageSize),t?.cursor!==void 0&&(e.cursor=t.cursor),e}function R(t,e){return {items:t.items.map(e),nextCursor:t.next_cursor,total:t.total}}function ee(t){let e={};for(let[n,r]of Object.entries(t))r!==void 0&&(e[n]=r);return e}function c(t){return encodeURIComponent(t)}function Bn(t){return {id:t.id,appId:t.app_id,userId:t.user_id,grantedAt:t.granted_at}}var Rt=class{constructor(e){this.http=e;}http;async grant(e){let n=await this.http.request("POST",`/api/v1/apps/${encodeURIComponent(e)}/access`,{ring:"admin",idempotent:false});return Bn(n)}async revoke(e){await this.http.request("DELETE",`/api/v1/apps/${encodeURIComponent(e)}/access`,{ring:"admin",idempotent:true});}async me(e){try{let n=await this.http.request("GET",`/api/v1/apps/${encodeURIComponent(e)}/access/me`,{ring:"admin"});return Bn(n)}catch(n){if(ai(n))return null;throw n}}};function ai(t){return typeof t=="object"&&t!==null&&"httpStatus"in t&&t.httpStatus===404}function Hn(t){let e={available:t.available};return t.reason!==void 0&&(e.reason=t.reason),e}var wt=class{constructor(e,n){this.http=e;this.defaultTenantId=n;}http;defaultTenantId;requireTenantId(e,n){if(this.defaultTenantId===void 0)throw new w({message:`apps.${e} requires a tenant UUID: set defaultTenantId on AxHubClient. Backend route ${n} takes a tenant UUID, not a slug.`,code:"tenant_id_required",category:"tenant_id_required",httpStatus:0,retryable:false,requestId:"",fields:[{name:"tenantId",code:"required"}]});return this.defaultTenantId}async checkAvailability(e){let n=this.requireTenantId("checkAvailability","GET /api/v1/tenants/{tenantID}/apps/check-availability"),r={};e.slug!==void 0&&(r.slug=e.slug),e.subdomain!==void 0&&(r.subdomain=e.subdomain);let i=await this.http.request("GET",`/api/v1/tenants/${encodeURIComponent(n)}/apps/check-availability`,{ring:"admin",query:r}),s={};return i.slug!==void 0&&(s.slug=Hn(i.slug)),i.subdomain!==void 0&&(s.subdomain=Hn(i.subdomain)),s}async iconPreCreateUrl(e){let n=this.requireTenantId("iconPreCreateUrl","POST /api/v1/tenants/{tenantID}/apps/icon/upload-url"),r={content_type:e.contentType,slug:e.slug};e.variant!==void 0&&(r.variant=e.variant);let i=await this.http.request("POST",`/api/v1/tenants/${encodeURIComponent(n)}/apps/icon/upload-url`,{ring:"admin",body:r,idempotent:false}),s={uploadUrl:i.put_url??"",getUrl:i.public_url??""};return i.expires_at!==void 0&&(s.expiresAt=i.expires_at),s}};var _t=class{constructor(e){this.http=e;}http;async list(e,n){let r=await this.http.request("GET",`/api/v1/tenants/${c(e)}/categories`,a({ring:"admin",query:D(n)},n));return R(r,i=>i)}get(e,n,r){return this.http.request("GET",`/api/v1/tenants/${c(e)}/categories/${c(n)}`,a({ring:"admin"},r))}};function jn(t){return {id:t.id,appId:t.app_id,authorId:t.author_id,body:t.body,createdAt:t.created_at,updatedAt:t.updated_at,deletedAt:t.deleted_at}}var Nn=500;function ui(t){if(typeof t!="string"||t.length===0)throw new d({message:"Comment body must be a non-empty string",code:"empty",category:"validation",httpStatus:0,retryable:false,requestId:"",fields:[{name:"body",code:"empty"}]});if(t.length>Nn)throw new d({message:`Comment body must be \u2264 ${Nn} characters (got ${t.length})`,code:"too_long",category:"validation",httpStatus:0,retryable:false,requestId:"",fields:[{name:"body",code:"too_long"}]})}var xt=class{constructor(e){this.http=e;}http;async add(e,n){ui(n.body);let r=await this.http.request("POST",`/api/v1/apps/${encodeURIComponent(e)}/comments`,{ring:"admin",body:{body:n.body},idempotent:false});return jn(r)}async list(e,n){let r={};n?.pageSize!==void 0&&(r.limit=n.pageSize),n?.cursor!==void 0&&(r.cursor=n.cursor);let i=await this.http.request("GET",`/api/v1/apps/${encodeURIComponent(e)}/comments`,{ring:"admin",query:r});return {items:i.items.map(jn),nextCursor:i.next_cursor,total:i.total}}listAll(e,n){return T(r=>this.list(e,r),n)}async delete(e){await this.http.request("DELETE",`/api/v1/comments/${encodeURIComponent(e)}`,{ring:"admin",idempotent:true});}};var Vn=/^[a-z0-9-]+$/;function zn(t,e){if(!t||!Vn.test(t))throw new Z({message:`Invalid ${e}: must match ${Vn}`,code:"invalid_path",category:"invalid_path",httpStatus:0,retryable:false,requestId:""})}var Kn=/^[a-z][a-z0-9]{0,62}$/;function C(t,e="name"){if(!t||!Kn.test(t))throw new Z({message:`Invalid ${e}: must match ${Kn}`,code:"invalid_path",category:"invalid_path",httpStatus:0,retryable:false,requestId:""})}function Wn(t){if(t.publication_status!==void 0)return t.publication_status;switch(t.review_status){case "pending":return "pending_review";case "approved":return "approved";default:return "draft"}}function ci(t){let e={id:t.id??"",slug:t.slug??"",name:t.name??""};return t.tenant_id!==void 0&&(e.tenantId=t.tenant_id),t.description!==void 0&&(e.description=t.description),t.color!==void 0&&(e.color=t.color),t.icon_url!==void 0&&(e.iconUrl=t.icon_url),t.display_order!==void 0&&(e.displayOrder=t.display_order),t.apps_count!==void 0&&(e.appsCount=t.apps_count),t.discoverable_apps_count!==void 0&&(e.discoverableAppsCount=t.discoverable_apps_count),t.created_at!==void 0&&(e.createdAt=t.created_at),t.updated_at!==void 0&&(e.updatedAt=t.updated_at),e}function di(t){let e={id:t.id??""};return t.name!==void 0&&(e.name=t.name),t.avatar_url!==void 0&&(e.avatarUrl=t.avatar_url),e}function g(t){let e={id:t.id??"",tenantId:t.tenant_id??"",ownerId:t.owner_id??"",slug:t.slug??"",name:t.name??"",schemaName:t.schema_name??"",status:t.status??"draft",visibility:t.visibility??"private",publicationStatus:Wn(t),likeCount:t.like_count??0,subscriberCount:t.subscriber_count??0,createdAt:t.created_at??"",updatedAt:t.updated_at??"",deletedAt:t.deleted_at??null};return t.description!==void 0&&(e.description=t.description),t.icon_url!==void 0&&(e.iconUrl=t.icon_url),t.icon_dark_url!==void 0&&(e.iconDarkUrl=t.icon_dark_url),t.review_status!==void 0&&(e.reviewStatus=t.review_status),t.auth_mode!==void 0&&(e.authMode=t.auth_mode),t.data_scopes!==void 0&&(e.dataScopes=t.data_scopes),t.deploy_method!==void 0&&(e.deployMethod=t.deploy_method),t.resource_tier!==void 0&&(e.resourceTier=t.resource_tier),t.subdomain!==void 0&&(e.subdomain=t.subdomain),t.access_url!==void 0&&(e.accessUrl=t.access_url),t.last_deployment_status!==void 0&&(e.lastDeploymentStatus=t.last_deployment_status),t.operating_status!==void 0&&(e.operatingStatus=t.operating_status),t.suspended_at!==void 0&&(e.suspendedAt=t.suspended_at),t.resumed_at!==void 0&&(e.resumedAt=t.resumed_at),t.category_id!==void 0&&(e.categoryId=t.category_id),t.category!==void 0&&(e.category=ci(t.category)),t.owner!==void 0&&(e.owner=di(t.owner)),t.calls_count!==void 0&&(e.callsCount=t.calls_count),t.shared_tables_count!==void 0&&(e.sharedTablesCount=t.shared_tables_count),e}function St(t){let e={slug:t.slug,name:t.name};return t.description!==void 0&&(e.description=t.description),t.iconUrl!==void 0&&(e.icon_url=t.iconUrl),t.iconDarkUrl!==void 0&&(e.icon_dark_url=t.iconDarkUrl),t.visibility!==void 0&&(e.visibility=t.visibility),t.authMode!==void 0&&(e.auth_mode=t.authMode),t.dataScopes!==void 0&&(e.data_scopes=t.dataScopes),t.deployMethod!==void 0&&(e.deploy_method=t.deployMethod),t.resourceTier!==void 0&&(e.resource_tier=t.resourceTier),t.subdomain!==void 0&&(e.subdomain=t.subdomain),e}function It(t){let e={};return t.name!==void 0&&(e.name=t.name),t.description!==void 0&&(e.description=t.description),t.iconUrl!==void 0&&(e.icon_url=t.iconUrl),t.iconDarkUrl!==void 0&&(e.icon_dark_url=t.iconDarkUrl),t.visibility!==void 0&&(e.visibility=t.visibility),t.authMode!==void 0&&(e.auth_mode=t.authMode),t.dataScopes!==void 0&&(e.data_scopes=t.dataScopes),t.deployMethod!==void 0&&(e.deploy_method=t.deployMethod),t.resourceTier!==void 0&&(e.resource_tier=t.resourceTier),t.subdomain!==void 0&&(e.subdomain=t.subdomain),t.clearSubdomain!==void 0&&(e.clear_subdomain=t.clearSubdomain),e}var vt=class{constructor(e,n,r,i){this.http=e;this.defaultTenantSlug=n;this.defaultTenantId=r;this.tenantResolver=i;}http;defaultTenantSlug;defaultTenantId;tenantResolver;async resolveTenantId(){if(this.defaultTenantId!==void 0)return this.defaultTenantId;if(this.defaultTenantSlug!==void 0&&this.tenantResolver!==void 0)return this.tenantResolver.resolveTenantId(this.defaultTenantSlug)}async create(e){zn(e.slug,"slug");let n=await this.resolveTenantId();if(n===void 0)throw new w({message:"apps.create requires a tenant: set defaultTenantId or defaultTenantSlug on AxHubClient. Backend route POST /api/v1/tenants/{tenantID}/apps takes a tenant UUID, not a slug.",code:"tenant_id_required",category:"tenant_id_required",httpStatus:0,retryable:false,requestId:"",fields:[{name:"tenantId",code:"required"}]});let r=St(e),i=await this.http.request("POST",`/api/v1/tenants/${encodeURIComponent(n)}/apps`,{ring:"admin",body:r,idempotent:false});return g(i)}async list(e){let n={};e?.pageSize!==void 0&&(n.limit=e.pageSize),e?.cursor!==void 0&&(n.cursor=e.cursor),e?.q!==void 0&&(n.q=e.q),e?.categoryId!==void 0&&(n.category_id=e.categoryId),e?.status!==void 0&&(n.status=e.status),e?.statusIn!==void 0&&(n.status_in=e.statusIn.join(",")),e?.reviewStatus!==void 0&&(n.review_status=e.reviewStatus),e?.reviewStatusIn!==void 0&&(n.review_status_in=e.reviewStatusIn.join(",")),e?.operatingStatus!==void 0&&(n.operating_status=e.operatingStatus),e?.operatingStatusIn!==void 0&&(n.operating_status_in=e.operatingStatusIn.join(",")),e?.sort!==void 0&&(n.sort=e.sort),e?.page!==void 0&&(n.page=e.page),e?.perPage!==void 0&&(n.per_page=e.perPage);let r=await this.resolveTenantId();if(r===void 0)throw new w({message:"apps.list requires a tenant: set defaultTenantId or defaultTenantSlug on AxHubClient. Use apps.listMine() for the caller workspace feed without tenant context.",code:"tenant_id_required",category:"tenant_id_required",httpStatus:0,retryable:false,requestId:"",fields:[{name:"tenantId",code:"required"}]});let i=await this.http.request("GET",`/api/v1/tenants/${encodeURIComponent(r)}/apps`,{ring:"admin",query:n});return {items:i.items.map(g),nextCursor:i.next_cursor,total:i.total}}listAll(e){return T(n=>this.list(n),e)}async get(e){let n=await this.http.request("GET",`/api/v1/apps/${encodeURIComponent(e)}`,{ring:"admin"});return g(n)}async update(e,n){let r=It(n),i=await this.http.request("PATCH",`/api/v1/apps/${encodeURIComponent(e)}`,{ring:"admin",body:r,idempotent:false});return g(i)}async delete(e){await this.http.request("DELETE",`/api/v1/apps/${encodeURIComponent(e)}`,{ring:"admin",idempotent:true});}async permanent(e){await this.http.request("DELETE",`/api/v1/apps/${encodeURIComponent(e)}/permanent`,{ring:"admin",idempotent:false});}async signIconUploadURL(e,n){return this.signIconImpl(e,n,"icon")}async signIconDarkUploadURL(e,n){return this.signIconImpl(e,n,"icon-dark")}async signIconImpl(e,n,r){let i=await this.http.request("POST",`/api/v1/apps/${encodeURIComponent(e)}/${r}/upload-url`,{ring:"admin",body:{content_type:n.contentType},idempotent:false}),s={uploadUrl:i.upload_url??i.put_url??"",getUrl:i.get_url??i.public_url??""};return i.expires_at!==void 0&&(s.expiresAt=i.expires_at),s}async listMine(){return (await this.http.request("GET","/api/v1/me/apps/workspace",{ring:"admin"})).items.map(g)}};var Ct=class{constructor(e,n,r){this.http=e;this.defaultTenantSlug=n;this.defaultTenantId=r;}http;defaultTenantSlug;defaultTenantId;async search(e){let n={...D(e),q:e?.q,category:e?.category,sort:e?.sort,visibility:e?.visibility,...this.defaultTenantSlug?{tenant_slug:this.defaultTenantSlug}:{}},r=await this.http.request("GET","/api/v1/apps/search",a({ring:"admin",query:n},e));return R(r,g)}feedQuery(e){let n={};return e?.q!==void 0&&(n.q=e.q),e?.category!==void 0&&(n.category=e.category),e?.sort!==void 0&&(n.sort=e.sort),e?.createdWithinDays!==void 0&&(n.created_within_days=e.createdWithinDays),e?.page!==void 0&&(n.page=e.page),e?.perPage!==void 0&&(n.per_page=e.perPage),n}async discoverGlobal(e){let n=await this.http.request("GET","/api/v1/apps/discover",a({ring:"admin",query:this.feedQuery(e)}));return R(n,g)}async discoverTenant(e){if(this.defaultTenantId===void 0)throw new w({message:"apps.discoverTenant requires a tenant UUID: set defaultTenantId on AxHubClient. Backend route GET /api/v1/tenants/{tenantID}/discover/apps takes a tenant UUID, not a slug.",code:"tenant_id_required",category:"tenant_id_required",httpStatus:0,retryable:false,requestId:"",fields:[{name:"tenantId",code:"required"}]});let n=await this.http.request("GET",`/api/v1/tenants/${encodeURIComponent(this.defaultTenantId)}/discover/apps`,a({ring:"admin",query:this.feedQuery(e)}));return R(n,g)}};function li(t){return {key:t.key,value:t.value,createdAt:t.created_at,updatedAt:t.updated_at}}var Qn=/^[A-Z_][A-Z0-9_]*$/;function un(t){if(!Qn.test(t))throw new d({message:`Env var key must match ${Qn}`,code:"validation_failed",category:"validation",httpStatus:0,retryable:false,requestId:"",fields:[{name:"key",code:"invalid_format"}]})}var At=class{constructor(e){this.http=e;}http;async listEnvVars(e){return (await this.http.request("GET",`/api/v1/apps/${encodeURIComponent(e)}/env-vars`,{ring:"admin"})).items.map(li)}async setEnvVar(e,n,r,i){un(n);let s={key:n,value:r};i!==void 0&&(s.stage=i),await this.http.request("POST",`/api/v1/apps/${encodeURIComponent(e)}/env-vars`,{ring:"admin",body:s,idempotent:true});}async getEnvVar(e,n){un(n);let r=(await this.listEnvVars(e)).find(i=>i.key===n);if(!r)throw new y({message:`Env var ${n} not found`,code:"not_found",category:"not_found",httpStatus:404,retryable:false,requestId:"",resource:"env_var"});return r}async deleteEnvVar(e,n){un(n),await this.http.request("DELETE",`/api/v1/apps/${encodeURIComponent(e)}/env-vars/${encodeURIComponent(n)}`,{ring:"admin",idempotent:true});}};function cn(t){return {connected:true,id:t.id,appId:t.app_id,repoFullName:t.repo_full_name,branch:t.branch,installationId:t.installation_id,connectedAt:t.connected_at}}function pi(t){return "connected"in t&&t.connected===false?{connected:false,installUrl:t.install_url}:cn(t)}var kt=class{constructor(e){this.http=e;}http;async get(e){let n=await this.http.request("GET",`/api/v1/apps/${encodeURIComponent(e)}/git-connection`,{ring:"admin"});return pi(n)}async connect(e,n){let r=await this.http.request("POST",`/api/v1/apps/${encodeURIComponent(e)}/git-connection`,{ring:"admin",body:{repo_full_name:n.repoFullName,branch:n.branch,installation_id:n.installationId},idempotent:false});return cn(r)}async update(e,n){let r=await this.http.request("PATCH",`/api/v1/apps/${encodeURIComponent(e)}/git-connection`,{ring:"admin",body:{branch:n.branch},idempotent:false});return cn(r)}async disconnect(e){await this.http.request("DELETE",`/api/v1/apps/${encodeURIComponent(e)}/git-connection`,{ring:"admin",idempotent:true});}async installStart(e,n){let r=await this.http.request("GET",`/api/v1/apps/${encodeURIComponent(e)}/git/github/install/start`,{ring:"admin",query:void 0});return {redirectUrl:typeof r=="string"?r:r.redirect_url??r.install_url??""}}};function mi(t){return {id:t.id,appId:t.app_id,userId:t.user_id,allowedScopes:t.allowed_scopes??[],grantedAt:t.granted_at??"",createdAt:t.created_at??""}}var Tt=class{constructor(e){this.http=e;}http;async create(e,n){let r=await this.http.request("POST",`/api/v1/apps/${encodeURIComponent(e)}/invitations`,{ring:"admin",body:{user_id:n.userId},idempotent:false});return mi(r)}async delete(e,n){await this.http.request("DELETE",`/api/v1/apps/${encodeURIComponent(e)}/invitations/${encodeURIComponent(n)}`,{ring:"admin",idempotent:true});}};var Pt=class{constructor(e){this.http=e;}http;async suspend(e){let n=await this.http.request("POST",`/api/v1/apps/${encodeURIComponent(e)}/suspend`,{ring:"admin",body:{},idempotent:false});return g(n)}async resume(e){let n=await this.http.request("POST",`/api/v1/apps/${encodeURIComponent(e)}/resume`,{ring:"admin",body:{},idempotent:false});return g(n)}};var Et=class{constructor(e){this.http=e;}http;async like(e){return {inserted:(await this.http.request("POST",`/api/v1/apps/${encodeURIComponent(e)}/likes`,{ring:"admin",idempotent:true}))?.inserted??true}}async unlike(e){try{return {deleted:(await this.http.request("DELETE",`/api/v1/apps/${encodeURIComponent(e)}/likes`,{ring:"admin",idempotent:!0}))?.deleted??!0}}catch(n){if(gi(n))return {deleted:false};throw n}}async me(e){return {liked:(await this.http.request("GET",`/api/v1/apps/${encodeURIComponent(e)}/likes/me`,{ring:"admin"})).liked}}};function gi(t){return typeof t=="object"&&t!==null&&"httpStatus"in t&&t.httpStatus===404}function fi(t){let e={id:t.id,appId:t.app_id,userId:t.user_id,allowedScopes:t.allowed_scopes??[],grantedAt:t.granted_at??""};return t.email!==void 0&&(e.email=t.email),t.granted_by_id!==void 0&&(e.grantedById=t.granted_by_id),e}var qt=class{constructor(e){this.http=e;}http;async list(e,n){let r={};n?.page!==void 0&&(r.page=n.page),n?.perPage!==void 0&&(r.per_page=n.perPage);let i=await this.http.request("GET",`/api/v1/apps/${encodeURIComponent(e)}/members`,a({ring:"admin",query:r},n));return R(i,fi)}};var Ot=class{constructor(e){this.http=e;}http;async owned(e){let n=await this.http.request("GET","/api/v1/me/apps/owned",a({ring:"admin"},e));return R(n,g)}async received(e){let n=await this.http.request("GET","/api/v1/me/apps/received",a({ring:"admin"},e));return R(n,g)}};function yi(t){return {id:t.id,appId:t.app_id,name:t.name,clientId:t.client_id??t.id,redirectUris:t.redirect_uris,scopes:t.scopes??t.allowed_scopes??[],createdAt:t.created_at}}function hi(t){return {...yi(t),clientSecret:t.client_secret}}var Dt=class{constructor(e){this.http=e;}http;async create(e,n){if(!n.scopes||n.scopes.length===0)throw new d({message:"scopes must be a non-empty array",code:"empty",category:"validation",httpStatus:0,retryable:false,requestId:"",fields:[{name:"scopes",code:"empty"}]});let r=await this.http.request("POST",`/api/v1/apps/${encodeURIComponent(e)}/oauth-clients`,{ring:"admin",body:{name:n.name,type:n.type??"confidential",token_endpoint_auth_method:n.tokenEndpointAuthMethod??(n.type==="public"?"none":"client_secret_post"),redirect_uris:n.redirectUris,allowed_scopes:n.scopes,allowed_grant_types:n.allowedGrantTypes??["authorization_code","refresh_token"],...n.allowedResources!==void 0?{allowed_resources:n.allowedResources}:{}},idempotent:false});return hi(r)}async delete(e){await this.http.request("DELETE",`/api/v1/oauth-clients/${encodeURIComponent(e)}`,{ring:"admin",idempotent:true});}};function Zn(t){let e={id:t.id,appId:t.app_id,requesterId:t.requester_id,status:t.status,createdAt:t.created_at,updatedAt:t.updated_at};t.reason!==void 0&&(e.reason=t.reason),t.reviewer_id!==void 0&&(e.reviewerId=t.reviewer_id);let n=t.reviewer_comment??t.review_comment;return n!==void 0&&(e.reviewerComment=n),t.settled_at!==void 0&&(e.settledAt=t.settled_at),e}var Ut=class{constructor(e){this.http=e;}http;async submit(e,n){let r={};n?.reason!==void 0&&(r.reason=n.reason);let i=await this.http.request("POST",`/api/v1/apps/${encodeURIComponent(e)}/review-requests`,{ring:"admin",body:r,idempotent:false});return Zn(i)}async list(e,n){let r={};n?.pageSize!==void 0&&(r.limit=n.pageSize),n?.cursor!==void 0&&(r.cursor=n.cursor);let i=await this.http.request("GET",`/api/v1/apps/${encodeURIComponent(e)}/review-requests`,{ring:"admin",query:r});return {items:i.items.map(Zn),nextCursor:i.next_cursor,total:i.total}}async unpublish(e,n){let r={};n?.comment!==void 0&&(r.comment=n.comment);let i;try{i=await this.http.request("POST",`/api/v1/apps/${encodeURIComponent(e)}/unpublish`,{ring:"admin",body:r,idempotent:!1});}catch(s){if(!(s instanceof k&&s.httpStatus===404))throw s;i=await this.http.request("PATCH",`/api/v1/apps/${encodeURIComponent(e)}`,{ring:"admin",body:{visibility:"private"},idempotent:false});}return g(i)}};function Xn(t){switch(t){case "float":return "numeric";case "timestamp":return "timestamptz";case "json":return "jsonb";default:return t}}function Yn(t){if(t!==void 0)return t===null?null:String(t)}function bi(t){switch(t){case "integer":return "int";case "timestamp with time zone":return "timestamptz";case "jsonb":return "jsonb";case "numeric":return "numeric";default:return t}}function er(t){let e={name:t.name,type:bi(t.type)};return t.nullable!==void 0&&(e.nullable=t.nullable),t.default!==void 0&&(e.default=t.default),e}function dn(t){return {appId:t.app_id,schemaName:t.schema_name??"",tableName:t.table_name??t.name??"",ownerColumn:t.owner_column??"",columns:(t.columns??[]).map(er),createdAt:t.created_at??"",updatedAt:t.updated_at??""}}function Ri(t){return {...dn(t),indexes:t.indexes??[],constraints:t.constraints??[],rowCount:t.row_count,sizeBytes:t.size_bytes}}function Jn(t,e=""){return {id:t.id,appId:t.app_id,tableName:t.table_name??e,principalType:t.principal_type,principalId:t.principal_id,scopes:t.scopes??t.actions??[],createdAt:t.granted_at??t.created_at??""}}var Mt=class{constructor(e){this.http=e;}http;async list(e){return (await this.http.request("GET",`/api/v1/apps/${encodeURIComponent(e)}/tables`,{ring:"admin"})).items.map(dn)}async create(e,n){C(n.name,"name");let r=await this.http.request("POST",`/api/v1/apps/${encodeURIComponent(e)}/tables`,{ring:"admin",body:{table_name:n.name,owner_column:n.ownerColumn,...n.description!==void 0?{description:n.description}:{},columns:n.columns.map(i=>({name:i.name,type:Xn(i.type),...i.nullable!==void 0?{nullable:i.nullable}:{},...i.default!==void 0?{default:Yn(i.default)}:{}}))},idempotent:false});return dn(r)}async delete(e,n){C(n,"tableName"),await this.http.request("DELETE",`/api/v1/apps/${encodeURIComponent(e)}/tables/${encodeURIComponent(n)}`,{ring:"admin",idempotent:true});}async addColumn(e,n,r){C(n,"tableName");let i={name:r.name,type:Xn(r.type)};r.nullable!==void 0&&(i.nullable=r.nullable),r.default!==void 0&&(i.default=Yn(r.default));let s=await this.http.request("POST",`/api/v1/apps/${encodeURIComponent(e)}/tables/${encodeURIComponent(n)}/columns`,{ring:"admin",body:{column:i},idempotent:false});return s?er(s):{...r}}async dropColumn(e,n,r){C(n,"tableName"),await this.http.request("DELETE",`/api/v1/apps/${encodeURIComponent(e)}/tables/${encodeURIComponent(n)}/columns/${encodeURIComponent(r)}`,{ring:"admin",idempotent:true});}async listGrants(e,n){return C(n,"tableName"),(await this.http.request("GET",`/api/v1/apps/${encodeURIComponent(e)}/tables/${encodeURIComponent(n)}/grants`,{ring:"admin"})).items.map(i=>Jn(i,n))}async addGrant(e,n,r){C(n,"tableName");let i=await this.http.request("POST",`/api/v1/apps/${encodeURIComponent(e)}/tables/${encodeURIComponent(n)}/grants`,{ring:"admin",body:{principal_type:r.principalType,principal_id:r.principalId,actions:r.scopes},idempotent:false});return Jn(i,n)}async revokeGrant(e,n,r){C(n,"tableName"),await this.http.request("DELETE",`/api/v1/apps/${encodeURIComponent(e)}/tables/${encodeURIComponent(n)}/grants/${encodeURIComponent(r)}`,{ring:"admin",idempotent:true});}async inspect(e,n){C(n,"tableName");let r=await this.http.request("GET",`/api/v1/apps/${encodeURIComponent(e)}/tables/${encodeURIComponent(n)}`,{ring:"admin"});return Ri(r)}async checkAvailability(e,n){C(n,"tableName");let r=await this.http.request("GET",`/api/v1/apps/${encodeURIComponent(e)}/tables/check-availability`,{ring:"admin",query:{table_name:n}});return {available:r.available,reason:r.reason??""}}async columnTypes(e){return ((await this.http.request("GET",`/api/v1/apps/${encodeURIComponent(e)}/tables/column-types`,{ring:"admin"})).types??[]).map(r=>({value:r.value,label:r.label}))}async browseRows(e,n,r){C(n,"tableName");let i={};r?.page!==void 0&&(i.page=r.page),r?.perPage!==void 0&&(i.per_page=r.perPage);let s=await this.http.request("GET",`/api/v1/apps/${encodeURIComponent(e)}/tables/${encodeURIComponent(n)}/rows`,a({ring:"admin",query:i},r));return {columns:(s.columns??[]).map(o=>({name:o.name,type:o.type,nullable:o.nullable})),rows:s.rows??[],meta:{page:s.meta?.page??1,perPage:s.meta?.per_page??0,total:s.meta?.total??0,totalPages:s.meta?.total_pages??0}}}};var Lt=class{constructor(e,n){this.http=e;this.defaultTenantSlug=n;}http;defaultTenantSlug;async list(e){let n={...D(e),...this.defaultTenantSlug?{tenant_slug:this.defaultTenantSlug}:{}},r=await this.http.request("GET","/api/v1/templates",a({ring:"admin",query:n},e));return R(r,i=>i)}};var Ye=class{crud;lifecycle;availability;envVars;publication;access;invitations;members;me;categories;discover;likes;comments;oauthClients;git;tables;templates;constructor(e,n,r,i){this.crud=new vt(e,n,r,i),this.lifecycle=new Pt(e),this.availability=new wt(e,r),this.envVars=new At(e),this.publication=new Ut(e),this.access=new Rt(e),this.invitations=new Tt(e),this.members=new qt(e),this.me=new Ot(e),this.categories=new _t(e),this.discover=new Ct(e,n,r),this.likes=new Et(e),this.comments=new xt(e),this.oauthClients=new Dt(e),this.git=new kt(e),this.tables=new Mt(e),this.templates=new Lt(e,n);}create=(...e)=>this.crud.create(...e);list=(...e)=>this.crud.list(...e);listAll=(...e)=>this.crud.listAll(...e);get=(...e)=>this.crud.get(...e);update=(...e)=>this.crud.update(...e);delete=(...e)=>this.crud.delete(...e);permanent=(...e)=>this.crud.permanent(...e);signIconUploadURL=(...e)=>this.crud.signIconUploadURL(...e);signIconDarkUploadURL=(...e)=>this.crud.signIconDarkUploadURL(...e);listMine=(...e)=>this.crud.listMine(...e);suspend=(...e)=>this.lifecycle.suspend(...e);resume=(...e)=>this.lifecycle.resume(...e);checkAvailability=(...e)=>this.availability.checkAvailability(...e);iconPreCreateUrl=(...e)=>this.availability.iconPreCreateUrl(...e);listEnvVars=(...e)=>this.envVars.listEnvVars(...e);setEnvVar=(...e)=>this.envVars.setEnvVar(...e);getEnvVar=(...e)=>this.envVars.getEnvVar(...e);deleteEnvVar=(...e)=>this.envVars.deleteEnvVar(...e)};var Je=class{constructor(e,n,r,i){this.slug=e;this.root=r;this.apps=new $t(e,n.http,i);}slug;root;apps;get gateway(){return this.root.gateway.scoped(this.slug)}app(e){return new Gt(this.slug,e,this.root)}},$t=class{constructor(e,n,r){this.tenantSlug=e;this.http=n;this.tenantResolver=r;}tenantSlug;http;tenantResolver;async create(e,n){let r=await this.tenantResolver.resolveTenantId(this.tenantSlug,n),i=await this.http.request("POST",`/api/v1/tenants/${c(r)}/apps`,a({ring:"admin",body:St(e),idempotent:false},n));return g(i)}async list(e){let n=await this.tenantResolver.resolveTenantId(this.tenantSlug,e),r=await this.http.request("GET",`/api/v1/tenants/${c(n)}/apps`,a({ring:"admin",query:D(e)},e));return R(r,g)}listAll(e){return T(n=>this.list({...e,...n}),e)}async get(e,n){let r=await this.http.request("GET",`/api/v1/apps/${c(e)}`,a({ring:"admin"},n));return g(r)}async update(e,n,r){let i=await this.http.request("PATCH",`/api/v1/apps/${c(e)}`,a({ring:"admin",body:It(n),idempotent:false},r));return g(i)}async delete(e,n){await this.http.request("DELETE",`/api/v1/apps/${c(e)}`,a({ring:"admin",idempotent:true},n));}},Gt=class{constructor(e,n,r){this.tenantSlug=e;this.appSlug=n;this.root=r;this.data=new Ft(e,n,r.data),this.tables=new ln(e,n,r.http);}tenantSlug;appSlug;root;data;tables},Ft=class{constructor(e,n,r){this.tenantSlug=e;this.appSlug=n;this.rootData=r;}tenantSlug;appSlug;rootData;table(e){return this.rootData.table(this.tenantSlug,this.appSlug,e)}discover(e,n){return this.rootData.discover(this.tenantSlug,this.appSlug,e,n)}invalidateSchema(e){e===void 0?this.rootData.invalidateSchema():this.rootData.invalidateSchema(this.tenantSlug,this.appSlug,e);}},ln=class{constructor(e,n,r){this.tenantSlug=e;this.appSlug=n;this.http=r;}tenantSlug;appSlug;http;async create(e,n){return this.http.request("POST",`/api/v1/tenants/${c(this.tenantSlug)}/apps/${c(this.appSlug)}/tables`,a({ring:"admin",body:e,idempotent:false},n))}async inspect(e,n){return this.http.request("GET",`/api/v1/tenants/${c(this.tenantSlug)}/apps/${c(this.appSlug)}/tables/${c(e)}/inspect`,a({ring:"admin"},n))}};function wi(t){let e={clientId:String(t.client_id??""),raw:t};return t.client_id_issued_at!==void 0&&(e.clientIdIssuedAt=t.client_id_issued_at),t.client_name!==void 0&&(e.clientName=t.client_name),t.redirect_uris!==void 0&&(e.redirectUris=t.redirect_uris),t.grant_types!==void 0&&(e.grantTypes=t.grant_types),t.response_types!==void 0&&(e.responseTypes=t.response_types),t.scope!==void 0&&(e.scope=t.scope),t.token_endpoint_auth_method!==void 0&&(e.tokenEndpointAuthMethod=t.token_endpoint_auth_method),e}function tr(t){return {...t,id:String(t.id),clientId:t.client_id??t.id,tenantId:t.tenant_id??t.tenantId,redirectUris:t.redirect_uris??t.redirectUris,scopes:t.scopes??t.allowed_scopes}}function Bt(t){return {accessToken:String(t.access_token??""),tokenType:String(t.token_type??"Bearer"),expiresIn:t.expires_in,refreshToken:t.refresh_token,scope:t.scope,raw:t}}function _i(t){if(!t.name||t.name.trim()==="")throw new d({message:"name is required and must be non-empty",code:"validation_failed",category:"validation",httpStatus:0,retryable:false,requestId:"",fields:[{name:"name",code:"empty"}]});if(t.expiresInDays!==void 0&&t.expiresInDays<0)throw new d({message:"expiresInDays must be non-negative",code:"validation_failed",category:"validation",httpStatus:0,retryable:false,requestId:"",fields:[{name:"expiresInDays",code:"invalid_value"}]})}function xi(t){if(typeof t!="object"||t===null)return false;let e=t.user;if(typeof e!="object"||e===null)return false;let n=e;return typeof n.id=="string"&&typeof n.email=="string"}var et=class{constructor(e,n){this.http=e;this.pat=new Ht(e,n),this.meClient=new te(e),this.oauth=new jt(e,n),this.oidc=new Nt(e,n),this.deviceCode=new Vt(e,n),this.systemOAuthClients=new Kt(e);}http;pat;meClient;oauth;oidc;deviceCode;systemOAuthClients;issuePersonalAccessToken(e,n){return this.pat.issue(e,n)}listPersonalAccessTokens(e){return this.pat.list(e)}revokePersonalAccessToken(e,n){return this.pat.revoke(e,n)}me(e){return this.meClient.get(e)}},Ht=class{constructor(e,n){this.http=e;this.defaultTenantSlug=n;}http;defaultTenantSlug;tenantQuery(){return this.defaultTenantSlug?{tenant_slug:this.defaultTenantSlug}:void 0}async issue(e,n){_i(e);let r={name:e.name};e.expiresInDays!==void 0&&(r.expires_in_days=e.expiresInDays);let i=await this.http.request("POST","/api/v1/me/personal-access-tokens",a({ring:"admin",query:this.tenantQuery(),body:r,idempotent:false},n));return {patId:i.id,name:i.name,rawToken:i.raw_token,createdAt:i.created_at,expiresAt:i.expires_at}}async list(e){return (await this.http.request("GET","/api/v1/me/personal-access-tokens",a({ring:"admin",query:this.tenantQuery()},e))).items.map(r=>({id:r.id,name:r.name,createdAt:r.created_at,expiresAt:r.expires_at,lastUsedAt:r.last_used_at}))}async revoke(e,n){await this.http.request("DELETE",`/api/v1/me/personal-access-tokens/${c(e)}`,a({ring:"admin",query:this.tenantQuery(),idempotent:true},n));}},te=class{constructor(e){this.http=e;}http;async get(e){let n=await this.http.request("GET","/api/v1/me",a({ring:"admin"},e));return xi(n)?{...n,userId:n.user.id,email:n.user.email,name:n.user.name,platformAdmin:n.user.platform_admin,tenants:n.tenants?.map(i=>({tenantId:i.tenant_id,tenantSlug:i.tenant_slug,role:i.role,isActive:i.is_active,iconUrl:i.icon_url}))}:n}},jt=class{constructor(e,n){this.http=e;this.defaultTenantSlug=n;}http;defaultTenantSlug;tenantQuery(e={}){let n=this.defaultTenantSlug?{...e,tenant_slug:this.defaultTenantSlug}:e;return Object.keys(n).length>0?n:void 0}authorizeUrl(e){let n=new URLSearchParams({response_type:"code",client_id:e.clientId,redirect_uri:e.redirectUri});return this.defaultTenantSlug&&n.set("tenant_slug",this.defaultTenantSlug),e.scope&&n.set("scope",e.scope),e.state&&n.set("state",e.state),e.codeChallenge&&n.set("code_challenge",e.codeChallenge),e.codeChallengeMethod&&n.set("code_challenge_method",e.codeChallengeMethod),e.resource&&n.set("resource",e.resource),`/oauth/authorize?${n.toString()}`}async exchangeCode(e,n){if(!e.codeVerifier)throw new d({message:"codeVerifier is required for PKCE",code:"required",category:"validation",httpStatus:0,retryable:false,requestId:"",fields:[{name:"codeVerifier",code:"required"}]});let r=await this.http.request("POST","/oauth/token",a({ring:"public",query:this.tenantQuery(),body:{grant_type:"authorization_code",code:e.code,client_id:e.clientId,redirect_uri:e.redirectUri,code_verifier:e.codeVerifier,client_secret:e.clientSecret,resource:e.resource},idempotent:false},n));return Bt(r)}async refreshTokens(e,n){let r=await this.http.request("POST","/oauth/token",a({ring:"public",query:this.tenantQuery(),body:{grant_type:"refresh_token",refresh_token:e.refreshToken,client_id:e.clientId,client_secret:e.clientSecret,resource:e.resource},idempotent:false},n));return Bt(r)}async revoke(e,n){await this.http.request("POST","/oauth/revoke",a({ring:"public",query:this.tenantQuery(),body:{token:e.token,token_type_hint:e.tokenTypeHint,client_id:e.clientId},idempotent:true},n));}userinfo(e){return this.http.request("GET","/oauth/userinfo",a({ring:"admin"},e))}async registerMcpClient(e,n){let r=ee({client_name:e.clientName,client_uri:e.clientUri,redirect_uris:e.redirectUris,grant_types:e.grantTypes,response_types:e.responseTypes,scope:e.scope,token_endpoint_auth_method:e.tokenEndpointAuthMethod,resource:e.resource,resources:e.resources,software_id:e.softwareId,software_version:e.softwareVersion}),i=await this.http.request("POST","/oauth/register",a({ring:"public",body:r,idempotent:false},n));return wi(i)}async getClient(e,n){let r=await this.http.request("GET",`/api/v1/oauth-clients/${c(e)}`,a({ring:"admin"},n));return tr(r)}async revokeOwnGrant(e,n){await this.http.request("DELETE",`/api/v1/oauth/clients/${c(e)}/grants/me`,a({ring:"admin",idempotent:true},n));}},Nt=class{constructor(e,n){this.http=e;this.defaultTenantSlug=n;}http;defaultTenantSlug;tenantQuery(e={}){let n=this.defaultTenantSlug?{...e,tenant_slug:this.defaultTenantSlug}:e;return Object.keys(n).length>0?n:void 0}discovery(e){return this.http.request("GET","/.well-known/openid-configuration",a({ring:"public"},e))}jwks(e){return this.http.request("GET","/.well-known/jwks.json",a({ring:"public"},e))}providers(e){return this.http.request("GET","/auth/providers",a({ring:"public",query:this.tenantQuery()},e))}async startURL(e,n,r){let i=await this.http.request("GET",`/auth/${c(e)}/start`,a({ring:"public",query:this.tenantQuery(ee({redirect_to:n?.redirectTo,state:n?.state,return_origin:n?.returnOrigin})),parseBody:true},r));return i.url??i.redirect_url??`/auth/${c(e)}/start`}googleStartUrl(e){let n=new URLSearchParams;this.defaultTenantSlug&&n.set("tenant_slug",this.defaultTenantSlug),e?.returnTo&&n.set("return_to",e.returnTo),e?.returnOrigin&&n.set("return_origin",e.returnOrigin);let r=n.toString();return r?`/auth/google_oauth2/start?${r}`:"/auth/google_oauth2/start"}exchangeCallback(e,n){return this.http.request("GET",e.provider?`/auth/${c(e.provider)}/callback`:"/auth/oidc/callback",a({ring:"public",query:this.tenantQuery(ee(e))},n)).then(Bt)}githubStartUrl(e){let n=new URLSearchParams;this.defaultTenantSlug&&n.set("tenant_slug",this.defaultTenantSlug),e?.returnTo&&n.set("return_to",e.returnTo);let r=n.toString();return r?`/auth/github?${r}`:"/auth/github"}githubCallbackUrl(e){let n=new URLSearchParams;this.defaultTenantSlug&&n.set("tenant_slug",this.defaultTenantSlug),e.code&&n.set("code",e.code),e.state&&n.set("state",e.state),e.error&&n.set("error",e.error);let r=n.toString();return r?`/auth/github/callback?${r}`:"/auth/github/callback"}},Vt=class{constructor(e,n){this.http=e;this.defaultTenantSlug=n;}http;defaultTenantSlug;tenantQuery(){return this.defaultTenantSlug?{tenant_slug:this.defaultTenantSlug}:void 0}async request(e,n){let r=await this.http.request("POST","/oauth/device_authorization",a({ring:"public",query:this.tenantQuery(),body:{client_id:e.clientId,scope:e.scope},idempotent:false},n));return {deviceCode:r.device_code,userCode:r.user_code,verificationUri:r.verification_uri,verificationUriComplete:r.verification_uri_complete,expiresIn:r.expires_in,interval:r.interval??5,raw:r}}async poll(e,n){let r=e.intervalMs??5e3;for(;;)try{let i=await this.http.request("POST","/oauth/token",a({ring:"public",query:this.tenantQuery(),body:{grant_type:"urn:ietf:params:oauth:grant-type:device_code",device_code:e.deviceCode,client_id:e.clientId},idempotent:!1},{...n,signal:n?.signal??e.signal}));return Bt(i)}catch(i){if(i instanceof V)r+=5e3;else if(!(i instanceof N))throw i;await new Promise((s,o)=>{let u=setTimeout(s,r);e.signal?.addEventListener("abort",()=>{clearTimeout(u),o(e.signal?.reason??i);},{once:true});});}}},Kt=class{constructor(e){this.http=e;}http;async get(e,n){let r=await this.http.request("GET",`/api/v1/oauth-clients/${c(e)}`,a({ring:"admin"},n));return tr(r)}};var vi=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,tt=class{me;cache=new Map;constructor(e){this.me=new te(e);}async resolveTenantId(e,n){if(vi.test(e))return e;let r=this.cache.get(e);if(r!==void 0)return r;let i=await this.me.get(n);for(let o of i.tenants??[])this.cache.set(o.tenantSlug,o.tenantId);let s=this.cache.get(e);if(s===void 0)throw new w({message:`tenant slug "${e}" not found among your memberships; pass a tenant UUID or join the tenant. Backend route /api/v1/tenants/{tenantID}/apps parses {tenantID} as a UUID.`,code:"tenant_id_required",category:"tenant_id_required",httpStatus:0,retryable:false,requestId:"",fields:[{name:"tenantId",code:"required"}]});return s}};function U(t,e){switch(e.op){case "eq":return e.value===null||t[e.column]===null||t[e.column]===void 0?false:t[e.column]===e.value;case "ne":return e.value===null||t[e.column]===null||t[e.column]===void 0?false:t[e.column]!==e.value;case "gt":{let n=t[e.column];return n==null||e.value===null||e.value===void 0?false:ne(n,e.value)>0}case "gte":{let n=t[e.column];return n==null||e.value===null||e.value===void 0?false:ne(n,e.value)>=0}case "lt":{let n=t[e.column];return n==null||e.value===null||e.value===void 0?false:ne(n,e.value)<0}case "lte":{let n=t[e.column];return n==null||e.value===null||e.value===void 0?false:ne(n,e.value)<=0}case "in":return t[e.column]===null||t[e.column]===void 0?false:e.values.filter(n=>n!==null).includes(t[e.column]);case "like":return Si(t[e.column],String(e.value));case "and":return e.clauses.every(n=>U(t,n));case "or":return e.clauses.some(n=>U(t,n));case "not":return !U(t,e.clause);case "raw":return true}}function ne(t,e){return t==null||e===null||e===void 0?Number.NaN:typeof t=="number"&&typeof e=="number"?t-e:String(t).localeCompare(String(e))}function Si(t,e){if(typeof t!="string")return false;let n="^";for(let r=0;r<e.length;r++){let i=e[r]??"";i==="\\"?(r+=1,n+=nr(e[r]??"")):i==="%"?n+=".*":i==="_"?n+=".":n+=nr(i);}return new RegExp(`${n}$`).test(t)}function nr(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function pn(t,e){if(Ii(t))return {...t,...e?.validate!==void 0?{validate:e.validate}:{}};let n={};for(let[i,s]of Object.entries(t.columns))n[i]={table:t.table,name:i,def:s};let r={table:t.table,columns:t.columns,cols:n};return e?.validate!==void 0&&(r.validate=e.validate),r}function Ii(t){return typeof t=="object"&&t!==null&&"table"in t&&"columns"in t&&"cols"in t}var rr=1024,Ci=4,Ai=6;function zt(t){return t.length===0?t:t.replace(/[\\%_]/g,e=>`\\${e}`)}function ki(t){if(t.length>rr)throw new d({message:`LIKE pattern exceeds ${rr} chars; refuse to compile`,code:"like_pattern_too_long",category:"validation",httpStatus:0,retryable:false,requestId:"",docUrl:"https://docs.axhub.dev/errors/validation/like-pattern"});let e=0,n=0;for(let r=0;r<t.length;r+=1){let i=t[r];if(i==="\\"){r+=1,e=0;continue}if(i==="%"){if(e+=1,e>=Ci)throw new d({message:`LIKE pattern has ${e} consecutive '%'; refuse to compile (ReDoS guard)`,code:"like_pattern_redos",category:"validation",httpStatus:0,retryable:false,requestId:"",docUrl:"https://docs.axhub.dev/errors/validation/like-pattern"})}else e===1&&(n+=1),e=0;}if(n>Ai)throw new d({message:`LIKE pattern has ${n} '%X%' alternation segments; refuse to compile (ReDoS guard)`,code:"like_pattern_redos",category:"validation",httpStatus:0,retryable:false,requestId:"",docUrl:"https://docs.axhub.dev/errors/validation/like-pattern"})}function Ti(t,e){return e?{op:"raw",sql:t,params:e}:{op:"raw",sql:t}}function Pi(...t){return {op:"and",clauses:t}}function Ei(...t){return {op:"or",clauses:t}}function qi(t){return {op:"not",clause:t}}function Oi(t){let e=typeof t=="string"?t:t.name,n=(r,i)=>({op:r,column:e,value:i});return {eq:r=>n("eq",r),ne:r=>n("ne",r),gt:r=>n("gt",r),gte:r=>n("gte",r),lt:r=>n("lt",r),lte:r=>n("lte",r),in:r=>({op:"in",column:e,values:r}),like:{contains:r=>n("like",`%${zt(r)}%`),startsWith:r=>n("like",`${zt(r)}%`),endsWith:r=>n("like",`%${zt(r)}`),raw:r=>(ki(r),n("like",r))}}}function M(t,e,n){let r=t?.validate;if(r===void 0)return;if(!Di(r))throw new X({message:"defineSchema validate option requires a Zod-compatible schema with safeParse()",code:"zod_missing",category:"configuration",httpStatus:0,retryable:false,requestId:"",resource:t?.table,docUrl:"https://docs.axhub.dev/errors/configuration/zod-missing"});let s=(n==="update"&&typeof r.partial=="function"?r.partial():r).safeParse(e);if(s.success)return;let o=s.error?.issues??[],u=o.map(l=>({name:l.path?.join(".")||"$",code:l.code??"invalid",message:l.message}));throw new d({message:`${o.length||1} validation failure${o.length===1?"":"s"} before network request`,code:"zod_validation_failed",category:"validation",httpStatus:0,retryable:false,requestId:"",resource:t?.table,fields:u,docUrl:"https://docs.axhub.dev/errors/validation/zod"})}function Di(t){return typeof t=="object"&&t!==null&&typeof t.safeParse=="function"}var ir=100,sr=10,or=5e3;async function ur(t,e,n,r,i){try{return await Ui(t,e,n,r,i)}catch(s){if(dr(s))try{return await Mi(t,e,n,r,i)}catch(o){throw ar(o,e,n,r)}throw ar(s,e,n,r)}}async function Ui(t,e,n,r,i){let s=await t.request("GET",`/api/v1/tenants/${c(e)}/apps/${c(n)}/tables/${c(r)}/inspect`,a({ring:"admin"},i));return cr(r,s)}async function Mi(t,e,n,r,i){let s=await Li(t,e,n,i);if(!s)throw new H({message:`Dynamic data table '${r}' was not found`,code:"table_not_found",category:"not_found",httpStatus:404,retryable:false,requestId:"",resource:`${e}/${n}/${r}`,docUrl:"https://docs.axhub.dev/sdk/data#discover"});let o=await t.request("GET",`/api/v1/apps/${c(s)}/tables/${c(r)}`,a({ring:"admin"},i));return cr(r,o)}async function Li(t,e,n,r){let i=Date.now(),s;for(let o=0;o<sr;o+=1){if(r?.signal?.aborted)throw new b({message:"discover aborted while resolving app id",code:"aborted",category:"abort",httpStatus:0,retryable:false,requestId:""});if(Date.now()-i>or)throw new j({message:`app lookup budget exceeded (${or}ms) while searching for slug '${n}' in tenant '${e}'`,code:"introspect_failed",category:"internal",httpStatus:0,retryable:false,requestId:"",resource:`${e}/${n}`,docUrl:"https://docs.axhub.dev/sdk/data#discover"});let u=await t.request("GET","/api/v1/apps",a({ring:"admin",query:{tenant_slug:e,limit:ir,cursor:s}},r)),l=u.items??[],A=l.find(p=>p.slug===n&&typeof p.id=="string");if(A?.id)return A.id;if(o===0&&l.length===0||!u.next_cursor)return;s=u.next_cursor;}throw new O({message:`App lookup exceeded ${sr} pages \xD7 ${ir} apps without finding slug '${n}'`,code:"scan_limit_exceeded",category:"internal",httpStatus:0,retryable:false,requestId:"",resource:`${e}/${n}`,docUrl:"https://docs.axhub.dev/errors/internal/scan-limit-exceeded"})}function ar(t,e,n,r){return t instanceof H||t instanceof j||t instanceof O||t instanceof b?t:dr(t)?new H({message:`Dynamic data table '${r}' was not found`,code:"table_not_found",category:"not_found",httpStatus:404,retryable:false,requestId:Bi(t),resource:`${e}/${n}/${r}`,cause:t,docUrl:"https://docs.axhub.dev/sdk/data#discover"}):mn(t)&&t.httpStatus>=500?new j({message:`Failed to introspect dynamic data table '${r}'`,code:"introspect_failed",category:"internal",httpStatus:t.httpStatus,retryable:t.retryable,requestId:t.requestId,resource:`${e}/${n}/${r}`,cause:t,docUrl:"https://docs.axhub.dev/sdk/data#discover"}):t instanceof Error?t:new Error(String(t))}var $i=new Set(["__proto__","constructor","prototype"]),Gi=/^[A-Za-z_][A-Za-z0-9_]*$/;function cr(t,e){let n=e.columns??[],r=Object.create(null);for(let i of n)$i.has(i.name)||Gi.test(i.name)&&(r[i.name]=Fi(i));return pn({table:e.tableName??e.table_name??e.name??t,columns:r})}function Fi(t){switch(t.type){case "uuid":return "uuid";case "int":case "integer":case "bigint":return "integer";case "float":case "numeric":case "double precision":case "real":return "number";case "bool":case "boolean":return "boolean";case "timestamp":case "timestamptz":case "timestamp with time zone":return "timestamp";case "json":case "jsonb":return "json";default:return "string"}}function dr(t){return t instanceof y||mn(t)&&t.httpStatus===404}function mn(t){return typeof t=="object"&&t!==null&&"httpStatus"in t&&"requestId"in t}function Bi(t){return mn(t)?t.requestId:""}function gn(t){if(t!==void 0)return [...t].join(",")}function re(t,e){if(e===void 0)return;if(e.length===0)throw new d({message:"select must include at least one column; omit select to fetch full rows",code:"select_empty",category:"validation",httpStatus:0,retryable:false,requestId:"",resource:t?.table,docUrl:"https://docs.axhub.dev/errors/validation/select-unknown-column"});if(!t)return;let n=new Set(Object.keys(t.columns)),r=e.filter(i=>!n.has(i));if(r.length!==0)throw new d({message:`select contains unknown column${r.length===1?"":"s"}: ${r.join(", ")}`,code:"select_unknown_column",category:"validation",httpStatus:0,retryable:false,requestId:"",resource:t.table,fields:r.map(i=>({name:i,code:"unknown_column"})),docUrl:"https://docs.axhub.dev/errors/validation/select-unknown-column"})}function nt(t,e){if(e===void 0)return t;let n={};for(let r of e)r in t&&(n[r]=t[r]);return n}function Wt(t,e){return e===void 0?t:t.map(n=>nt(n,e))}function Hi(t){if(typeof t!="object"||t===null)return false;let e=t.httpStatus;return typeof e=="number"&&e>=500}var ie=class{store=new Map;inflight=new Map;maxEntries;ttlMs;negativeTtlMs;writeCounter=0;constructor(e){this.maxEntries=Math.max(1,e?.maxEntries??1e3),this.ttlMs=Math.max(1,e?.ttlMs??3e5),this.negativeTtlMs=Math.max(0,e?.negativeTtlMs??3e4);}get size(){return this.store.size}get(e){let n=this.store.get(e);return n?n.expiresAt<=Date.now()?(this.store.delete(e),null):(this.store.delete(e),this.store.set(e,n),n.schema):null}set(e,n,r){this.writeCounter+=1;let i=this.writeCounter;this.store.delete(e),this.store.set(e,{schema:n,expiresAt:Date.now()+Math.max(1,r?.ttlMs??this.ttlMs),writeToken:i}),this.evictOverflow();}invalidate(e){if(e===void 0){this.store.clear(),this.inflight.clear();return}this.store.delete(e),this.inflight.delete(e);}async getOrSet(e,n,r){if(!r?.fresh){let u=this.get(e);if(u)return u;let l=this.inflight.get(e);if(l)return l}let i=this.store.get(e),s=this.writeCounter+1,o=n().then(u=>{let l=this.store.get(e);return (!l||l.writeToken<s)&&this.set(e,u,r),this.inflight.get(e)===o&&this.inflight.delete(e),u},u=>{throw this.inflight.get(e)===o&&this.inflight.delete(e),i&&this.negativeTtlMs>0&&Hi(u)&&(this.writeCounter+=1,this.store.delete(e),this.store.set(e,{schema:i.schema,expiresAt:Date.now()+this.negativeTtlMs,writeToken:this.writeCounter})),u});return this.inflight.set(e,o),o}evictOverflow(){for(;this.store.size>this.maxEntries;){let e=this.store.keys().next().value;if(e===void 0)return;this.store.delete(e);}}};function rt(t,e,n){return `${t}/${e}/${n}`}function ji(t,e){let n=ht(e);return n.length===0?[...t]:[...t].sort((r,i)=>{for(let s of n){let o=ne(r[s.field],i[s.field]);if(!(Number.isNaN(o)||o===0))return s.dir==="desc"?-o:o}return 0})}function lr(t,e){let n=ji(t,e?.orderBy),r=e?.after??e?.before??(e?.cursor?.startsWith("v2:")?e.cursor:void 0),i=r?yt(r):null;bt(i,e?.orderBy);let s=e?.pageSize??e?.limit??20,o=0;if(e?.after&&i?.tiebreaker){let p=n.findIndex(I=>I[i.tiebreaker.field]===i.tiebreaker.value);if(p===-1)throw new _({message:"Cursor references a row that no longer exists (deleted between requests)",code:"invalid_cursor",category:"validation",httpStatus:0,retryable:false,requestId:"",docUrl:"https://docs.axhub.dev/errors/validation/invalid-cursor"});o=p+1;}else if(e?.before&&i?.tiebreaker){let p=n.findIndex(I=>I[i.tiebreaker.field]===i.tiebreaker.value);if(p===-1)throw new _({message:"Cursor references a row that no longer exists (deleted between requests)",code:"invalid_cursor",category:"validation",httpStatus:0,retryable:false,requestId:"",docUrl:"https://docs.axhub.dev/errors/validation/invalid-cursor"});o=Math.max(0,p-s);}else if(e?.cursor&&!e.cursor.startsWith("v2:")){let p=Number(e.cursor);if(!Number.isInteger(p)||p<1)throw new _({message:"Plain mock cursor must be a positive integer page or v2: keyset token",code:"invalid_cursor",category:"validation",httpStatus:0,retryable:false,requestId:"",docUrl:"https://docs.axhub.dev/errors/validation/invalid-cursor"});o=(p-1)*s;}let u=n.slice(o,o+s),l=o+s<n.length,A=o>0;return {items:u,nextCursor:l?K(u[u.length-1],{direction:"forward",orderBy:e?.orderBy}):null,firstCursor:u.length?K(u[0],{direction:"backward",orderBy:e?.orderBy}):null,hasNext:l,hasPrev:A}}async function pr(t,e){W(e?.signal),re(t.schema,e?.select);let n=t.store.list(t.key);e?.where&&(n=n.filter(s=>U(s,e.where)));let r=lr(n,e);return {items:Wt(r.items,e?.select),nextCursor:r.nextCursor,firstCursor:r.firstCursor,hasNext:r.hasNext,hasPrev:r.hasPrev,total:n.length,totalIsExact:true}}async function mr(t,e){W(e?.signal);let n=t.store.list(t.key);return e?.where?n.filter(r=>U(r,e.where)).length:n.length}async function gr(t,e,n){W(n?.signal),re(t.schema,n?.select);let r=t.store.get(t.key,e);if(!r)throw new y({message:`Mock row not found: ${t.key}/${e}`,code:"row_not_found",category:"not_found",httpStatus:404,retryable:false,requestId:"",resource:`${t.key}/${e}`});return nt(r,n?.select)}async function fr(t,e,n){return W(n?.signal),M(t.schema,e,"insert"),t.store.insert(t.key,e)}async function yr(t,e,n){W(n?.signal);for(let i of e)M(t.schema,i,"insert");let r=e.map(i=>t.store.insert(t.key,i));return {items:r,count:r.length}}async function hr(t,e,n,r){return W(r?.signal),M(t.schema,n,"update"),t.store.update(t.key,e,n)}async function br(t,e,n){W(n?.signal),t.store.delete(t.key,e);}function W(t){if(t?.aborted)throw new b({message:"Mock operation aborted",code:"aborted",category:"abort",httpStatus:0,retryable:false,requestId:""})}var it=class{constructor(e,n){this.http=e;this.schemaCache=n?.schemaCache instanceof ie?n.schemaCache:new ie(n?.schemaCache),this.mockStore=n?.mockStore;}http;schemaCache;mockStore;table(e,n,r){let i=typeof r=="string"?void 0:r,s=typeof r=="string"?r:r.table;return new se(this.http,e,n,s,i,this.mockStore?{store:this.mockStore,key:rt(e,n,s),schema:i}:void 0)}scoped(e){return new fn(this,e)}async discover(e,n,r,i){let s=rt(e,n,r);if(this.mockStore){let u=this.mockStore.schema(s)??Ki(r,this.mockStore.list(s));return new se(this.http,e,n,u.table,u,{store:this.mockStore,key:s,schema:u})}let o=await this.schemaCache.getOrSet(s,()=>ur(this.http,e,n,r,i),{fresh:i?.fresh,ttlMs:i?.ttlMs});return new se(this.http,e,n,o.table,o)}invalidateSchema(e,n,r){if(e!==void 0&&n!==void 0&&r!==void 0){this.schemaCache.invalidate(rt(e,n,r));return}this.schemaCache.invalidate();}},fn=class{constructor(e,n){this.data=e;this.tenantSlug=n;}data;tenantSlug;app(e){return new yn(this.data,this.tenantSlug,e)}},yn=class{constructor(e,n,r){this.data=e;this.tenantSlug=n;this.appSlug=r;}data;tenantSlug;appSlug;table(e){return this.data.table(this.tenantSlug,this.appSlug,e)}discover(e,n){return this.data.discover(this.tenantSlug,this.appSlug,e,n)}invalidateSchema(e){e===void 0?this.data.invalidateSchema():this.data.invalidateSchema(this.tenantSlug,this.appSlug,e);}},se=class{constructor(e,n,r,i,s,o){this.http=e;this.tenantSlug=n;this.appSlug=r;this.tableName=i;this.schema=s;this.mockRuntime=o;this.contextFingerprint=Wi(n,r,i);}http;tenantSlug;appSlug;tableName;schema;mockRuntime;contextFingerprint;path(e){let n=`/data/${c(this.tenantSlug)}/${c(this.appSlug)}/${c(this.tableName)}`;return e===void 0?n:`${n}/${c(e)}`}async list(e){if(this.mockRuntime)return pr(this.mockRuntime,e);if(re(this.schema,e?.select),e?.after!==void 0&&e.before!==void 0)throw new d({message:"after and before cursors are mutually exclusive",code:"cursor_xor",category:"validation",httpStatus:0,retryable:false,requestId:"",resource:this.tableName,docUrl:"https://docs.axhub.dev/errors/validation/cursor-xor"});e?.cursor!==void 0&&Qi(e.cursor,this.tableName);let n=e?.after??e?.before??(e?.cursor&&z(e.cursor)?e.cursor:void 0),r=n?Un(n):null;bt(r,e?.orderBy),$n(r,this.contextFingerprint);let i=r?.page,s=typeof i=="number"&&Number.isInteger(i)&&i>0?i:void 0,o={},u=e?.pageSize??e?.limit;u!==void 0&&(o.per_page=Math.min(u,1e3)),s!==void 0?o.page=s:e?.after!==void 0?o.after=e.after:e?.before!==void 0?o.before=e.before:e?.cursor!==void 0&&(z(e.cursor)?o.after=e.cursor:o.page=e.cursor);let l=Mn(e?.orderBy);l&&(o.sort=l),e?.direction&&(o.direction=e.direction);let A=gn(e?.select);A!==void 0&&(o._select=A);let p=await this.http.request("GET",this.path(),a({ring:"data",query:o},e)),I=e?.where?p.items.filter(Ur=>U(Ur,e.where)):p.items;e?.where&&Zi(I.length,p.items.length,u);let x=Wt(I,e?.select),L=p.page??s??(e?.cursor!==void 0&&!z(e.cursor)?Number(e.cursor):1),v=!!(e?.after??e?.before??e?.orderBy??(e?.cursor&&z(e.cursor))),lt={orderBy:e?.orderBy,contextFingerprint:this.contextFingerprint},Tr=v?K(I[0],{...lt,direction:"backward",page:Math.max(1,L-1)}):null,Pr=v?K(I[I.length-1],{...lt,direction:"forward",page:L+1}):null,_n=p.next_cursor&&(z(p.next_cursor)||!v)?p.next_cursor:p.has_more===false?null:v?Pr:p.has_more?String(L+1):null,Er=p.has_more??_n!==null,qr=!!(e?.after??e?.before??(e?.cursor&&z(e.cursor))),Or=p.total??p.items.length,Dr=!e?.where;return {items:x,nextCursor:_n,firstCursor:Tr,hasNext:Er,hasPrev:qr,total:Or,totalIsExact:Dr}}listAll(e){return T(n=>this.list({...e,...n}),e)}async count(e){if(this.mockRuntime)return mr(this.mockRuntime,e);if(e?.where){let s=0,o,u=0;do{if(e.signal?.aborted)throw new d({message:"count aborted",code:"aborted",category:"validation",httpStatus:0,retryable:false,requestId:""});let l=await this.list({pageSize:1e3,cursor:o,where:e.where,signal:e.signal,timeoutMs:e.timeoutMs,idempotencyKey:e.idempotencyKey});if(s+=l.items.length,o=l.nextCursor??void 0,u+=1,u>=100&&o!==void 0)throw new O({message:`count({where}) exceeded scan limit of ${100*1e3} rows; use a more selective filter or wait for backend filter pushdown`,code:"scan_limit_exceeded",category:"internal",httpStatus:0,retryable:false,requestId:"",resource:this.tableName,docUrl:"https://docs.axhub.dev/errors/internal/scan-limit-exceeded"})}while(o!==void 0);return s}return (await this.http.request("GET",`${this.path()}/_count`,a({ring:"data"},e))).count}async get(e,n){if(this.mockRuntime)return gr(this.mockRuntime,e,n);re(this.schema,n?.select);let r=gn(n?.select),i=await this.http.request("GET",this.path(e),a({ring:"data",query:r===void 0?void 0:{_select:r}},n));return nt(i,n?.select)}async insert(e,n){return this.mockRuntime?fr(this.mockRuntime,e,n):(M(this.schema,e,"insert"),this.http.request("POST",this.path(),a({ring:"data",body:e,idempotent:false},n)))}async insertMany(e,n){if(this.mockRuntime)return yr(this.mockRuntime,e,n);for(let r of e)M(this.schema,r,"insert");try{let r=await this.http.request("POST",`${this.path()}/_bulk`,a({ring:"data",body:{rows:e},idempotent:!1},n));return {items:r.items,count:r.count??r.items.length}}catch(r){if(!zi(r))throw r;let i=[],s=n?.signal;for(let o of e){if(s?.aborted)throw new b({message:`insertMany aborted after ${i.length} of ${e.length} rows`,code:"aborted",category:"abort",httpStatus:0,retryable:false,requestId:"",resource:this.tableName});i.push(await this.insert(o,n));}return {items:i,count:i.length}}}async update(e,n,r){return this.mockRuntime?hr(this.mockRuntime,e,n,r):(M(this.schema,n,"update"),this.http.request("PATCH",this.path(e),a({ring:"data",body:n,idempotent:false},r)))}async delete(e,n){if(this.mockRuntime)return br(this.mockRuntime,e,n);await this.http.request("DELETE",this.path(e),a({ring:"data",idempotent:true},n));}},Vi=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function Ki(t,e){let n={},r=e[0]??{id:"mock_id"};for(let[s,o]of Object.entries(r))typeof o=="number"?n[s]="number":typeof o=="boolean"?n[s]="boolean":o!==null&&typeof o=="object"?n[s]="json":typeof o=="string"&&Vi.test(o)||s==="id"?n[s]="uuid":n[s]="string";let i=Object.fromEntries(Object.entries(n).map(([s,o])=>[s,{table:t,name:s,def:o}]));return {table:t,columns:n,cols:i}}function zi(t){return typeof t=="object"&&t!==null&&"httpStatus"in t&&(t.httpStatus===404||t.httpStatus===405)}function Wi(t,e,n){return crypto.createHash("sha256").update(`${t}/${e}/${n}`).digest("hex").slice(0,16)}function Qi(t,e){if(t.length>Xe)throw new _({message:`Cursor token exceeds maximum size (${Xe} chars)`,code:"invalid_cursor",category:"validation",httpStatus:0,retryable:false,requestId:"",resource:e,docUrl:"https://docs.axhub.dev/errors/validation/invalid-cursor"});if(t.startsWith("v1:"))throw new q({message:"Legacy v1: cursor token is not compatible with keyset pagination; restart pagination without cursor",code:"legacy_cursor",category:"validation",httpStatus:0,retryable:false,requestId:"",resource:e,docUrl:"https://docs.axhub.dev/errors/validation/legacy-cursor"});if(t.startsWith("v2:"))return;let n=Number(t);if(!Number.isInteger(n)||n<1)throw new _({message:"Plain cursor must be a positive integer page or a v2: keyset token",code:"invalid_cursor",category:"validation",httpStatus:0,retryable:false,requestId:"",resource:e,docUrl:"https://docs.axhub.dev/errors/validation/invalid-cursor"})}var Rr=false;function Zi(t,e,n){Rr||t!==e&&(n!==void 0&&e<n||(Rr=true,console.warn("[@ax-hub/sdk] partial SDK-side filtering: backend does not push down `where` yet, so pageSize bounds the unfiltered page and total may be inexact. Iterate with hasNext or count() with care. See https://docs.axhub.dev/sdk/data#client-side-filter")));}function hn(t){return {id:t.id,appId:t.app_id,commitSha:t.commit_sha,status:t.status,currentStage:t.current_stage??null,imageUri:t.image_uri??null,triggerSource:t.trigger_source,startedAt:t.started_at??null,completedAt:t.completed_at??null,failureReason:t.failure_reason??null}}var st=class{constructor(e,n){this.http=e;this.defaultTenantId=n;}http;defaultTenantId;async create(e,n){let r={};n?.commitSha!==void 0&&(r.commit_sha=n.commitSha),n?.forceRebuild!==void 0&&(r.force_rebuild=n.forceRebuild);let i=await this.http.request("POST",`/api/v1/apps/${encodeURIComponent(e)}/deployments`,{ring:"admin",body:r,idempotent:false});return hn(i)}async list(e,n){let r={};n?.pageSize!==void 0&&(r.limit=n.pageSize),n?.cursor!==void 0&&(r.cursor=n.cursor);let i=await this.http.request("GET",`/api/v1/apps/${encodeURIComponent(e)}/deployments`,{ring:"admin",query:r});return {items:i.items.map(hn),nextCursor:i.next_cursor,total:i.total}}listAll(e,n){return T(r=>this.list(e,r),n)}async get(e,n){let r=await this.http.request("GET",`/api/v1/apps/${encodeURIComponent(e)}/deployments/${encodeURIComponent(n)}`,{ring:"admin"});return hn(r)}async cancel(e,n){await this.http.request("POST",`/api/v1/apps/${encodeURIComponent(e)}/deployments/${encodeURIComponent(n)}/cancel`,{ring:"admin",body:{},idempotent:true});}async rollback(e,n){await this.http.request("POST",`/api/v1/apps/${encodeURIComponent(e)}/deployments/${encodeURIComponent(n)}/rollback`,{ring:"admin",body:{},idempotent:false});}async logs(e,n){let r={};n?.direction!==void 0&&(r.direction=n.direction),n?.cursor!==void 0&&(r.cursor=n.cursor),n?.since!==void 0&&(r.since=n.since),n?.until!==void 0&&(r.until=n.until),n?.limit!==void 0&&(r.limit=n.limit);let i=await this.http.request("GET",`/api/v1/apps/${encodeURIComponent(e)}/logs`,{ring:"admin",query:r});return {lines:(i.lines??[]).map(s=>({ts:s.ts??"",container:s.container??"",message:s.message??"",insertId:s.insert_id??""})),nextCursor:i.next_cursor??"",hasMore:i.has_more??false}}requireTenantId(e,n){if(this.defaultTenantId===void 0)throw new w({message:`deployments.${e} requires a tenant UUID: set defaultTenantId on AxHubClient. Backend route ${n} takes a tenant UUID, not a slug.`,code:"tenant_id_required",category:"tenant_id_required",httpStatus:0,retryable:false,requestId:"",fields:[{name:"tenantId",code:"required"}]});return this.defaultTenantId}async startBootstrap(e){let n=this.requireTenantId("startBootstrap","POST /api/v1/tenants/{tenantID}/app-bootstraps"),r={name:e.name,slug:e.slug,subdomain:e.subdomain,template_id:e.templateId,github_installation_id:e.githubInstallationId,github_owner:e.githubOwner,repo_name:e.repoName};e.repoPrivate!==void 0&&(r.repo_private=e.repoPrivate);let i=await this.http.request("POST",`/api/v1/tenants/${encodeURIComponent(n)}/app-bootstraps`,{ring:"admin",body:r,idempotent:false});return {bootstrapId:i.bootstrap_id,statusUrl:i.status_url}}async bootstrapStatus(e){let n=this.requireTenantId("bootstrapStatus","GET /api/v1/tenants/{tenantID}/app-bootstraps/{bootstrapID}"),r=await this.http.request("GET",`/api/v1/tenants/${encodeURIComponent(n)}/app-bootstraps/${encodeURIComponent(e)}`,{ring:"admin"}),i={id:r.id??e,stage:r.stage??"",status:r.status??""};return r.app_id&&(i.appId=r.app_id),r.deployment_id&&(i.deploymentId=r.deployment_id),r.repo_full_name&&(i.repoFullName=r.repo_full_name),r.error_code&&(i.errorCode=r.error_code),r.error_message&&(i.errorMessage=r.error_message),i}async githubAccounts(){return ((await this.http.request("GET","/api/v1/github/accounts",{ring:"admin"})).accounts??[]).map(n=>{let r={login:n.login??"",type:n.type??"",installed:n.installed??false};return n.installation_id!==void 0&&(r.installationId=n.installation_id),n.avatar_url!==void 0&&(r.avatarUrl=n.avatar_url),n.install_url!==void 0&&(r.installUrl=n.install_url),r})}async githubRepos(e,n){let r={};n?.page!==void 0&&(r.page=n.page),n?.perPage!==void 0&&(r.per_page=n.perPage);let i=await this.http.request("GET",`/api/v1/github/installations/${encodeURIComponent(String(e))}/repositories`,{ring:"admin",query:r});return {repositories:(i.repositories??[]).map(s=>({id:s.id??0,name:s.name??"",fullName:s.full_name??"",private:s.private??false,defaultBranch:s.default_branch??""})),totalCount:i.total_count??0}}};var ot=class{constructor(e){this.http=e;}http;scoped(e){return new Qt(this.http,e)}async engines(e){return (await this.http.request("GET","/api/v1/engines",a({ring:"admin"},e))??[]).map(r=>({engine:r.engine??"",kind:r.kind??"",displayName:r.display_name??"",supportedActions:r.supported_actions??[],allowedEffects:r.allowed_effects??{}}))}},Qt=class{query;catalog;constructor(e,n){let r=`/api/v1/tenants/${c(n)}`;this.query=new bn(e,`${r}/gateway/query`),this.catalog=new Zt(e,r);}};function _r(t){return (t??[]).map(e=>({name:e.name,dataType:e.data_type}))}function xr(t,e){return (e??[]).map(n=>{let r={};return t.forEach((i,s)=>{r[i.name]=n[s]??null;}),r})}var bn=class{constructor(e,n){this.http=e;this.base=n;}http;base;async run(e,n){try{let r=await this.http.request("POST",this.base,a({ring:"admin",body:{connector_id:e.connectorId??e.resourceId,path:e.path,sql:e.sql,params:e.params,row_limit:e.rowLimit},idempotent:!0},n)),i=_r(r.columns),s=xr(i,r.rows);return {allowed:r.allowed??!0,...r.deny_reason?{denyReason:r.deny_reason}:{},columns:i,rows:s,rowCount:s.length,...r.matched_policies?{matchedPolicies:r.matched_policies}:{}}}catch(r){throw typeof r=="object"&&r!==null&&"httpStatus"in r&&r.httpStatus===401?new B({message:"Gateway pool credentials are stale after refresh retry",code:"pool_stale",category:"unauthenticated",httpStatus:401,retryable:false,requestId:"requestId"in r?String(r.requestId):""}):r}}};function vr(t){return {allowed:t.allowed,...t.deny_reason?{denyReason:t.deny_reason}:{},...t.row_filter?{rowFilter:t.row_filter}:{},...t.mask?{mask:t.mask}:{},...t.input_schema!==void 0?{inputSchema:t.input_schema}:{},...t.result_schema!==void 0?{resultSchema:t.result_schema}:{}}}function Xi(t){return {...vr(t),...t.allowed_columns?{allowedColumns:t.allowed_columns}:{},...t.column_masks?{columnMasks:t.column_masks}:{}}}function Sr(t){return {id:t.id,connector:t.connector,connectorId:t.connector_id,path:t.path,url:t.url,...t.kind?{kind:t.kind}:{},type:t.type,name:t.name,attributes:t.attributes??{},tags:t.tags??[],permissions:{read:vr(t.permissions.read)}}}function Yi(t){return {id:t.id,connector:t.connector,connectorId:t.connector_id,path:t.path,url:t.url,...t.kind?{kind:t.kind}:{},type:t.type,name:t.name,attributes:t.attributes??{},tags:t.tags??[],ancestors:t.ancestors??[],children:(t.children??[]).map(Sr),permissions:{read:Xi(t.permissions.read)}}}function wr(t){return t.split("/").map(e=>c(e)).join("/")}var Zt=class{constructor(e,n){this.http=e;this.base=`${n}/catalog`;}http;base;async listKinds(e){return ((await this.http.request("GET","/api/v1/catalog/kinds",a({ring:"admin"},e))).items??[]).map(r=>({kind:r.kind,engine:r.engine,displayName:r.display_name,invokable:r.invokable,actions:Object.fromEntries(Object.entries(r.actions??{}).map(([i,s])=>[i,{allowedEffects:s.allowed_effects??[],...s.input_schema!==void 0?{inputSchema:s.input_schema}:{},...s.result_schema!==void 0?{resultSchema:s.result_schema}:{}}]))}))}async listConnectors(e){return ((await this.http.request("GET",`${this.base}/connectors`,a({ring:"admin"},e))).items??[]).map(r=>({id:r.id,name:r.name,engine:r.engine,url:r.url,...r.description?{description:r.description}:{}}))}async listResources(e,n){let r={};return e?.search&&(r.search=e.search),e?.kind&&(r.kind=e.kind),e?.connector&&(r.connector=e.connector),e?.connectorId&&(r.connector_id=e.connectorId),e?.limit!==void 0&&(r.limit=e.limit),((await this.http.request("GET",`${this.base}/resources`,a({ring:"admin",query:r},n))).items??[]).map(Sr)}getResource(e,n,r){return this.http.request("GET",`${this.base}/resources/${c(e)}/${wr(n)}`,a({ring:"admin"},r)).then(Yi)}async invoke(e,n,r,i){let s=await this.http.request("POST",`${this.base}/resources/${c(e)}/${wr(n)}:read`,a({ring:"admin",body:ee({sql:r.sql,params:r.params,row_limit:r.rowLimit}),idempotent:true},i)),o=_r(s.result?.columns),u=xr(o,s.result?.rows);return {allowed:s.allowed??false,action:s.action,...s.deny_reason?{denyReason:s.deny_reason}:{},columns:o,rows:u,rowCount:u.length,...s.matched_policies?{matchedPolicies:s.matched_policies}:{}}}async hasAccess(e,n,r){try{return await this.getResource(e,n,r),!0}catch(i){if(i instanceof y)return false;throw i}}async listResourcesWithDetail(e,n){let r=await this.listResources(e,n);return Promise.all(r.map(i=>this.getResource(i.connector,i.path,n)))}};function Ji(t){return t.allowed===true}function Ir(t){let e=t.denyReason??"";return t.allowed===false&&(e.startsWith("SQL \uD615\uC2DD \uC624\uB958:")||e.includes("safesql:"))}function es(t){return t.allowed===false&&!Ir(t)}function ts(t){return t.permissions.read.allowedColumns??[]}function ns(t,e){return t.permissions.read.columnMasks?.[e]??null}function rs(t){let e=t.split("/").filter(Boolean);return e[e.length-1]??""}function Xt(t){let e={id:t.id,appId:t.app_id,requesterId:t.requester_id,status:t.status,createdAt:t.created_at,updatedAt:t.updated_at};t.reason!==void 0&&(e.reason=t.reason),t.reviewer_id!==void 0&&(e.reviewerId=t.reviewer_id);let n=t.reviewer_comment??t.review_comment;return n!==void 0&&(e.reviewerComment=n),t.settled_at!==void 0&&(e.settledAt=t.settled_at),e}var at=class{constructor(e){this.http=e;}http;async get(e){let n=await this.http.request("GET",`/api/v1/review-requests/${encodeURIComponent(e)}`,{ring:"admin"});return Xt(n)}async approve(e,n){return this.settle(e,"approve",n)}async reject(e,n){return this.settle(e,"reject",n)}async settle(e,n,r){let i={};r?.comment!==void 0&&(i.comment=r.comment);let s=await this.http.request("POST",`/api/v1/review-requests/${encodeURIComponent(e)}/${n}`,{ring:"admin",body:i,idempotent:false});return Xt(s)}async listPending(e){let n={};e?.pageSize!==void 0&&(n.limit=e.pageSize),e?.cursor!==void 0&&(n.cursor=e.cursor);let r=await this.http.request("GET","/api/v1/review-requests/pending",{ring:"admin",query:n});return {items:r.items.map(Xt),nextCursor:r.next_cursor,total:r.total}}async history(e,n){if(!e||e.trim()==="")throw new F({message:"tenantId is required: GET /api/v1/review-requests/history needs a tenant_id query parameter",code:"required",category:"validation",httpStatus:0,retryable:false,requestId:"",fields:[{name:"tenantId",code:"required"}]});let r={tenant_id:e};n?.pageSize!==void 0&&(r.limit=n.pageSize),n?.cursor!==void 0&&(r.cursor=n.cursor);let i=await this.http.request("GET","/api/v1/review-requests/history",{ring:"admin",query:r});return {items:i.items.map(Xt),nextCursor:i.next_cursor,total:i.total}}};function is(t){return {...t,id:String(t.id),slug:String(t.slug),name:String(t.name),createdAt:t.created_at??t.createdAt,updatedAt:t.updated_at??t.updatedAt}}var ut=class{constructor(e){this.http=e;}http;async get(e,n){let r=await this.http.request("GET",`/api/v1/tenants/${c(e)}`,a({ring:"admin"},n));return is(r)}};var ct=class{constructor(e){this.http=e;}http;async public(e){let n=await this.http.request("GET","/config/public",a({ring:"public"},e));return {...n,baseDomain:n.base_domain??""}}};var dt=class{initialFixtures;tables=new Map;schemas;nextId=1;constructor(e,n){this.initialFixtures=ss(e??{}),this.schemas=n??{},this.reset();}keys(){return [...this.tables.keys()]}schema(e){return this.schemas[e]}list(e){return [...this.tables.get(e)?.values()??[]].map(n=>({...n}))}get(e,n){let r=this.tables.get(e)?.get(n);return r?{...r}:null}insert(e,n){let r=typeof n.id=="string"?n.id:`mock_${this.nextId++}`,i=this.ensureTable(e);if(i.has(r))throw new f({message:`Mock row already exists: ${e}/${r}`,code:"duplicate_key",category:"conflict",httpStatus:409,retryable:false,requestId:"",resource:`${e}/${r}`});let o={created_at:new Date().toISOString(),...n,id:r};return i.set(r,o),{...o}}update(e,n,r){let i=this.ensureTable(e),s=i.get(n);if(!s)throw new y({message:`Mock row not found: ${e}/${n}`,code:"row_not_found",category:"not_found",httpStatus:404,retryable:false,requestId:"",resource:`${e}/${n}`});let o={...s,...r,id:n,updated_at:new Date().toISOString()};return i.set(n,o),{...o}}delete(e,n){let r=this.tables.get(e);if(!r||!r.has(n))throw new y({message:`Mock row not found: ${e}/${n}`,code:"row_not_found",category:"not_found",httpStatus:404,retryable:false,requestId:"",resource:`${e}/${n}`});r.delete(n);}reset(e){if(e!==void 0){this.tables.set(e,Cr(this.initialFixtures[e]??[]));return}this.tables=new Map;for(let[n,r]of Object.entries(this.initialFixtures))this.tables.set(n,Cr(r));}ensureTable(e){let n=this.tables.get(e);return n||(n=new Map,this.tables.set(e,n)),n}};function Cr(t){let e=new Map;for(let n of t){let r=typeof n.id=="string"?n.id:`mock_${e.size+1}`;e.set(r,{...n,id:r});}return e}function ss(t){return Object.fromEntries(Object.entries(t).map(([e,n])=>[e,n.map(r=>({...r}))]))}function Rn(t){if(t.mode==="mock")return Ar(),new dt(t.fixtures,t.schemas)}var os=new Set(["1","true","yes","on"]);function as(t){return t?.trim().toLowerCase()==="production"}function us(t){return t===void 0?false:os.has(t.trim().toLowerCase())}function Ar(){if(as(process.env.NODE_ENV)){if(us(process.env.AX_HUB_ALLOW_MOCK_IN_PROD)){console.warn("[@ax-hub/sdk] WARNING: mock mode active in production (AX_HUB_ALLOW_MOCK_IN_PROD opt-in).");return}throw new $e({message:"Mock mode active in production without explicit opt-in",code:"mock_in_production",category:"configuration",httpStatus:0,retryable:false,requestId:"",docUrl:"https://docs.axhub.dev/errors/mock-in-production"})}}var kr="https://api.axhub.ai";function cs(t){return typeof t=="object"&&t!==null&&"__sharedHttp"in t}var wn=class t{http;defaultTenantSlug;defaultTenantId;logger;schemaCacheOptions;mock;tenantResolver;n;r;i;s;o;a;u;c;constructor(e){if(cs(e)){this.http=e.__sharedHttp,this.defaultTenantSlug=e.defaultTenantSlug,this.defaultTenantId=e.defaultTenantId,this.logger=e.logger,this.schemaCacheOptions=e.schemaCacheOptions,this.mock=e.mockStore,this.tenantResolver=e.tenantResolver??new tt(this.http);return}if(e.token!==void 0&&e.tokenType===void 0)throw new TypeError('AxHubClient requires tokenType when token is set ("pat" | "jwt")');let n=e.token!==void 0&&e.tokenType!==void 0?new Qe({token:e.token,tokenType:e.tokenType,onRefresh:e.onRefresh}):new Ze;this.http=new ft({baseUrl:e.baseUrl??kr,auth:n,fetch:e.fetch,logger:e.logger,debug:e.debug,timeoutMs:e.timeoutMs,idempotencyKey:e.idempotencyKey,retryPolicy:e.retryPolicy,rateLimitStrategy:e.rateLimitStrategy}),this.defaultTenantSlug=e.defaultTenantSlug,this.defaultTenantId=e.defaultTenantId,this.logger=e.logger??gt,this.schemaCacheOptions=e.schemaCache,this.mock=Rn(e),this.tenantResolver=new tt(this.http);}resolveTenantSlug(e){let n=e??this.defaultTenantSlug;if(!n)throw new Le({message:"tenantSlug is required: set defaultTenantSlug on AxHubClient or pass tenantSlug per-call",code:"tenant_slug_required",category:"tenant_slug_required",httpStatus:0,retryable:false,requestId:""});return n}get apps(){return this.n||(this.n=new Ye(this.http,this.defaultTenantSlug,this.defaultTenantId,this.tenantResolver)),this.n}get data(){return this.r||(this.r=new it(this.http,{schemaCache:this.schemaCacheOptions,mockStore:this.mock})),this.r}get deployments(){return this.i||(this.i=new st(this.http,this.defaultTenantId)),this.i}get config(){return this.c||(this.c=new ct(this.http)),this.c}get gateway(){return this.s||(this.s=new ot(this.http)),this.s}get identity(){return this.o||(this.o=new et(this.http,this.defaultTenantSlug)),this.o}get tenants(){return this.u||(this.u=new ut(this.http)),this.u}get publicationRequests(){return this.a||(this.a=new at(this.http)),this.a}withTenant(e){return new t({__sharedHttp:this.http,defaultTenantSlug:e,defaultTenantId:e===this.defaultTenantSlug?this.defaultTenantId:void 0,logger:this.logger,schemaCacheOptions:this.schemaCacheOptions,mockStore:this.mock,tenantResolver:this.tenantResolver})}tenant(e){return new Je(e,this.withTenant(e),this,this.tenantResolver)}};
2
- exports.AbortError=b;exports.AccessDeniedError=Y;exports.AlreadyAccessedError=_e;exports.AlreadyActiveError=Re;exports.AlreadyDeletedError=ce;exports.AlreadyInactiveError=we;exports.AlreadyMemberError=ue;exports.AlreadyRevokedError=he;exports.AlreadySettledError=be;exports.AppScopedClient=Gt;exports.AppScopedDataClient=Ft;exports.AppUnavailableError=De;exports.AppsClient=Ye;exports.AuthorizationPendingError=N;exports.AxHubClient=wn;exports.AxHubError=m;exports.BadRequestError=Ee;exports.ConfigClient=ct;exports.ConfigurationError=X;exports.ConflictError=f;exports.DEFAULT_BASE_URL=kr;exports.DataClient=it;exports.DataTableClient=se;exports.DecodeError=k;exports.DeploymentsClient=st;exports.DeviceFlowDeniedError=Jt;exports.DeviceFlowTimeoutError=en;exports.DomainTakenError=Ae;exports.DuplicateError=ke;exports.EmptyError=Pe;exports.ExpiredTokenError=J;exports.ForbiddenError=ge;exports.GatewayCatalogClient=Zt;exports.GatewayClient=ot;exports.IdentityClient=et;exports.IdentityDeviceCodeClient=Vt;exports.IdentityMeClient=te;exports.IdentityOAuthClient=jt;exports.IdentityOIDCClient=Nt;exports.IdentityPATClient=Ht;exports.IdentitySystemOAuthClientsClient=Kt;exports.InternalServerError=G;exports.IntrospectFailedError=j;exports.InvalidClientError=Be;exports.InvalidCursorError=_;exports.InvalidGrantError=Ge;exports.InvalidPathError=Z;exports.InvalidRequestError=He;exports.InvalidScopeError=je;exports.InvalidStateTransitionError=Ie;exports.InvalidTargetError=Fe;exports.InvalidTokenError=Ne;exports.InvalidValueError=Te;exports.InvitationExpiredError=ye;exports.LastAdminError=ve;exports.LegacyCursorError=q;exports.MockInProductionError=$e;exports.MockStore=dt;exports.NetworkError=Ue;exports.NoAuth=Ze;exports.NotAdminError=me;exports.NotAllowedError=Oe;exports.NotDeletedError=xe;exports.NotFoundError=y;exports.NotMemberError=qe;exports.OAuthError=h;exports.OAuthServerError=ze;exports.PendingExistsError=Se;exports.PermanentlyDeletedError=fe;exports.PermissionDeniedError=E;exports.PoolStaleError=B;exports.PreconditionFailedError=oe;exports.PublicationRequestsClient=at;exports.RateLimitedError=$;exports.RequiredError=F;exports.ScanLimitExceededError=O;exports.SchemaCache=ie;exports.SchemaNameTakenError=Ce;exports.SlowDownError=V;exports.SlugTakenError=ae;exports.StaticTokenAuth=Qe;exports.StreamConsumedError=pt;exports.TableNotFoundError=H;exports.TemporarilyUnavailableError=We;exports.TenantGatewayClient=Qt;exports.TenantIdRequiredError=w;exports.TenantScopedAppsClient=$t;exports.TenantScopedClient=Je;exports.TenantSlugRequiredError=Le;exports.TenantsClient=ut;exports.TimeoutError=Me;exports.TokenExpiredError=le;exports.TokenInvalidError=pe;exports.TokenMissingError=de;exports.UnauthenticatedError=P;exports.UnauthorizedClientError=Ve;exports.UnavailableError=Q;exports.UnsupportedGrantTypeError=Ke;exports.ValidationError=d;exports.WebhookVerificationError=Yt;exports.and=Pi;exports.asAppId=Fr;exports.asAppSlug=Nr;exports.asDeploymentId=Br;exports.asPatId=Vr;exports.asRequestId=zr;exports.asTenantId=Hr;exports.asTenantSlug=jr;exports.asUserId=Kr;exports.assertMockModeAllowed=Ar;exports.createMockStore=Rn;exports.cursorFromRow=K;exports.decodeCursor=yt;exports.defineSchema=pn;exports.encodeCursor=Dn;exports.escapeLike=zt;exports.formatErrorMessage=xn;exports.getAccessibleColumns=ts;exports.getMaskHint=ns;exports.id=Qr;exports.isAllowed=Ji;exports.isPolicyDeny=es;exports.isSqlFormatError=Ir;exports.not=qi;exports.or=Ei;exports.orderByFingerprint=Ln;exports.parseRetryAfter=nn;exports.raw=Ti;exports.schemaCacheKey=rt;exports.signWebhook=si;exports.tableFromPath=rs;exports.verifyWebhook=oi;exports.where=Oi;
1
+ 'use strict';var ulid=require('ulid'),crypto=require('crypto');var p=class extends Error{code;category;httpStatus;retryable;requestId;resource;fields;retry;docUrl;constructor(e){super(e.message,e.cause?{cause:e.cause}:void 0),this.name=this.constructor.name,this.code=e.code,this.category=e.category,this.httpStatus=e.httpStatus,this.retryable=e.retryable,this.requestId=e.requestId,e.resource!==void 0&&(this.resource=e.resource),e.fields!==void 0&&(this.fields=e.fields),e.retry!==void 0&&(this.retry=e.retry),e.docUrl!==void 0&&(this.docUrl=e.docUrl);}toJSON(){return {name:this.name,message:this.message,code:this.code,category:this.category,httpStatus:this.httpStatus,retryable:this.retryable,requestId:this.requestId,resource:this.resource,fields:this.fields,retry:this.retry,docUrl:this.docUrl}}toString(){return Sn(this)}};function Sn(t){let e=[`${t.name}[${t.code}]`];return t.requestId&&e.push(`req=${t.requestId}`),e.push(`problem=${t.message}`),t.fields?.length&&e.push(`cause=${t.fields.map(n=>`${n.name}:${n.code}`).join(",")}`),t.retry?.afterMs!==void 0?e.push(`fix=retry_after_${t.retry.afterMs}ms`):t.retryable?e.push("fix=retry_with_backoff"):e.push("fix=inspect_input_or_permissions"),t.docUrl&&e.push(`docs=${t.docUrl}`),e.join(" ")}var d=class extends p{},k=class extends p{},T=class extends p{},f=class extends p{},g=class extends p{},ie=class extends p{},D=class extends p{},U=class extends p{},N=class extends p{},se=class extends g{},oe=class extends g{},ae=class extends g{},ue=class extends k{},ce=class extends k{},de=class extends k{},le=class extends T{},pe=class extends T{},me=class extends f{},ge=class extends f{},fe=class extends f{},ye=class extends g{},he=class extends g{},be=class extends g{},Re=class extends g{},we=class extends g{},ve=class extends g{},_e=class extends g{},xe=class extends g{},Ce=class extends g{},Ie=class extends g{},Se=class extends g{},Ae=class extends g{},ke=class extends d{},Te=class extends d{},S=class extends d{},Pe=class extends d{},Ee=class extends d{},qe=class extends T{},Oe=class extends T{},De=class extends N{},Ue=class extends p{},Le=class extends p{},Q=class extends p{},h=class extends p{},V=class extends p{},ft=class extends p{},Me=class extends p{},R=class extends p{},K=class extends p{},L=class extends k{},tn=class extends d{},M=class extends f{},$=class extends U{},_=class extends d{},v=class extends d{},$e=class extends K{},z=class extends U{},y=class extends p{description;uri;constructor(e){super({message:e.description??e.code,code:e.code,category:"oauth",httpStatus:e.httpStatus,retryable:e.retryable,requestId:e.requestId}),e.description!==void 0&&(this.description=e.description),e.uri!==void 0&&(this.uri=e.uri);}},Ge=class extends y{},W=class extends y{},G=class extends y{},B=class extends y{},X=class extends y{},nn=class extends W{},rn=class extends X{},Be=class extends y{},He=class extends y{},je=class extends y{},Fe=class extends y{},Ne=class extends y{},Qe=class extends y{},Ve=class extends y{},Ke=class extends y{},ze=class extends y{};var An={slug_taken:se,already_member:oe,already_deleted:ae,already_revoked:ye,already_settled:he,already_active:be,already_inactive:Re,already_accessed:we,not_deleted:ve,last_admin:_e,pending_exists:xe,invalid_state_transition:Ce,schema_name_taken:Ie,domain_taken:Se,duplicate:Ae,token_missing:ue,token_expired:ce,token_invalid:de,pool_stale:L,not_admin:le,forbidden:pe,not_member:qe,not_allowed:Oe,permanently_deleted:me,invitation_expired:ge,link_invalid:fe,invalid_value:ke,invalid_expiry:Te,required:S,empty:Pe,bad_request:Ee,app_unavailable:De},kn={validation:d,unauthenticated:k,permission_denied:T,not_found:f,conflict:g,precondition_failed:ie,rate_limited:D,internal:U,unavailable:N},Tn={invalid_grant:Ge,access_denied:W,authorization_pending:G,slow_down:B,expired_token:X,invalid_target:Be,invalid_client:He,invalid_request:je,invalid_scope:Fe,invalid_token:Ne,unauthorized_client:Qe,unsupported_grant_type:Ve,server_error:Ke,temporarily_unavailable:ze},Pn={authorization_pending:true,slow_down:true,access_denied:false,invalid_grant:false,expired_token:false,server_error:true,temporarily_unavailable:true};function Ur(t){if(typeof t!="object"||t===null)return false;let e=t.error;if(typeof e!="object"||e===null)return false;let n=e;return typeof n.code=="string"&&typeof n.category=="string"&&typeof n.retryable=="boolean"}function Lr(t){return typeof t!="object"||t===null?false:typeof t.error=="string"}function En(t){return t.startsWith("/oauth/")||t.startsWith("/auth/")}function sn(t){return En(t.path)&&Lr(t.body)?$r(t):Ur(t.body)?Mr(t):new Q({message:"Unexpected error response shape",code:"decode_failed",category:"decode",httpStatus:t.status,retryable:false,requestId:t.fallbackRequestId})}function Mr(t){let n=t.body.error,r=n.retry?{afterMs:n.retry.after_ms}:void 0,i={message:n.message,code:n.code,category:n.category,httpStatus:t.status,retryable:n.retryable,requestId:n.request_id||t.fallbackRequestId,resource:n.resource,fields:n.fields,retry:r,docUrl:n.doc_url},s=An[n.code];if(s)return new s(i);let o=kn[n.category]??p;return new o(i)}function $r(t){let e=t.body,n=Tn[e.error]??y,r=Pn[e.error]??false;return new n({code:e.error,description:e.error_description,uri:e.error_uri,httpStatus:t.status,retryable:r,requestId:t.fallbackRequestId})}function Gr(t){return t}function Br(t){return t}function Hr(t){return t}function jr(t){return t}function Fr(t){return t}function Nr(t){return t}function Qr(t){return t}function Vr(t){return t}var Kr=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,qn=/^[a-z][a-z0-9-]{0,62}$/;function yt(t,e,n){return new d({message:t,code:n,category:"validation",httpStatus:0,retryable:false,requestId:"",fields:[{name:e,code:n}]})}function x(t,e){if(t.trim()==="")throw yt(`${e} must be non-empty`,e,"empty");if(!Kr.test(t))throw yt(`${e} must be a UUID`,e,"invalid_uuid")}function On(t,e){if(t.trim()==="")throw yt(`${e} must be non-empty`,e,"empty");if(!qn.test(t))throw yt(`${e} must match ${qn.source}`,e,"invalid_slug")}var zr={tenant(t){return x(t,"tenantId"),t},tenantSlug(t){return On(t,"tenantSlug"),t},app(t){return x(t,"appId"),t},appSlug(t){return On(t,"appSlug"),t},user(t){return x(t,"userId"),t},deployment(t){return x(t,"deploymentId"),t},pat(t){return x(t,"patId"),t},resource(t){return x(t,"resourceId"),t},connector(t){return x(t,"connectorId"),t},subject(t){return x(t,"subjectId"),t},grant(t){return x(t,"grantId"),t},tag(t){return x(t,"tagId"),t},auditEvent(t){return x(t,"auditEventId"),t},table(t){return x(t,"tableId"),t}};var We=class{token;tokenType;onRefresh;refreshing=null;constructor(e){this.token=e.token,this.tokenType=e.tokenType,this.onRefresh=e.onRefresh;}currentToken(){return this.token}headersFor(e){return e==="public"?{}:this.tokenType==="pat"?{"X-Api-Key":this.token}:{Authorization:`Bearer ${this.token}`}}async onUnauthorized(){return this.tokenType!=="jwt"||!this.onRefresh?false:this.refreshing?this.refreshing:(this.refreshing=(async()=>{try{let e=await this.onRefresh();return this.token=e,!0}catch{return false}finally{this.refreshing=null;}})(),this.refreshing)}},Xe=class{headersFor(e){return {}}async onUnauthorized(){return false}};var ht={debug(){},info(){},warn(){},error(){}};function on(t){if(!t)return 6e4;let e=t.trim();if(e==="")return 6e4;let n=Number(e);if(Number.isFinite(n))return n>=0?Math.floor(n*1e3):6e4;let r=Date.parse(e);return Number.isNaN(r)?6e4:Math.max(0,r-Date.now())}var Wr=new Set(["authorization","x-api-key","cookie","set-cookie","proxy-authorization"]),Xr="***REDACTED***";function Dn(t){let e={},n=(r,i)=>{e[r]=Wr.has(r.toLowerCase())?Xr:i;};if(typeof Headers<"u"&&t instanceof Headers)t.forEach((r,i)=>n(i,r));else for(let[r,i]of Object.entries(t))n(r,i);return e}var un={maxAttempts:3,baseMs:200,capMs:5e3,jitter:Math.random};function Zr(t){return t instanceof p?t.retryable:t instanceof TypeError}async function Un(t,e=un,n){let r;for(let i=0;i<e.maxAttempts;i++){if(n?.aborted)throw an("aborted before attempt",n.reason);try{return await t(i)}catch(s){if(r=s,!Zr(s)||i===e.maxAttempts-1)throw s;let o=Math.min(e.capMs,e.baseMs*2**i)*e.jitter();await cn(o,n);}}throw r}function cn(t,e){return new Promise((n,r)=>{if(e?.aborted){r(an("aborted before sleep",e.reason));return}let i=setTimeout(()=>{e?.removeEventListener("abort",s),n();},t),s=()=>{clearTimeout(i),r(an("aborted during sleep",e?.reason));};e?.addEventListener("abort",s,{once:true});})}function an(t,e){return new h({message:t,code:"aborted",category:"abort",httpStatus:0,retryable:false,requestId:"",cause:e})}var Yr=new Set(["GET","HEAD","OPTIONS"]),bt=class{baseUrl;auth;fetch;logger;debug;timeoutMs;idempotencyKey;retryPolicy;rateLimitStrategy;constructor(e){this.baseUrl=e.baseUrl.replace(/\/$/,""),this.auth=e.auth,this.fetch=e.fetch??globalThis.fetch,this.logger=e.logger??ht,this.debug=e.debug??false,this.timeoutMs=e.timeoutMs??3e4,this.idempotencyKey={autoGenerate:e.idempotencyKey?.autoGenerate??true,generator:e.idempotencyKey?.generator??ulid.ulid},this.retryPolicy=e.retryPolicy??un,this.rateLimitStrategy=e.rateLimitStrategy??"sleep";}async request(e,n,r){let i=Yr.has(e.toUpperCase()),s=this.withStableIdempotencyKey(r);return i||r.idempotent?Un(()=>this.requestOnce(e,n,s),this.retryPolicy,s.signal):this.requestOnce(e,n,s)}async requestOnce(e,n,r){let i=this.buildUrl(n,r.query),s=ulid.ulid(),o=this.buildHeaders(s,r);if(r.body!==void 0&&r.form!==void 0)throw new p({message:"body and form are mutually exclusive",code:"invalid_request_body",category:"validation",httpStatus:0,retryable:false,requestId:s});let c=r.form!==void 0?this.formBody(r.form):r.body!==void 0?JSON.stringify(r.body):void 0;c!==void 0&&(o["Content-Type"]=r.form!==void 0?"application/x-www-form-urlencoded":"application/json");let l=new AbortController,C=()=>l.abort(r.signal?.reason);r.signal?.addEventListener("abort",C,{once:true});let P=r.timeoutMs??this.timeoutMs,gt=setTimeout(()=>l.abort(new Error("timeout")),P),w;try{this.logRequest(e,i,o,s),w=await this.fetch(i,{method:e,headers:o,body:c,redirect:"manual",signal:l.signal});}catch(O){throw r.signal?.aborted?new h({message:"Request aborted",code:"aborted",category:"abort",httpStatus:0,retryable:false,requestId:s,cause:O}):l.signal.aborted?new Le({message:`Request timed out after ${P}ms`,code:"timeout",category:"timeout",httpStatus:0,retryable:true,requestId:s,cause:O}):new Ue({message:"Network error",code:"network",category:"network",httpStatus:0,retryable:true,requestId:s,cause:O})}finally{clearTimeout(gt),r.signal?.removeEventListener("abort",C);}if(w.status>=300&&w.status<400)return {status:w.status,location:w.headers.get("Location")??w.headers.get("location")};if(r.rawResponse&&w.ok)return {response:w,requestId:s};if(w.ok)return this.parseSuccess(w,r,s);let en=await this.safeParseJson(w);if(w.status===401&&r.ring==="admin"&&await this.auth.onUnauthorized())return this.requestOnce(e,n,r);if(w.status===429){let O=on(w.headers.get("Retry-After")),Dr=new D({message:Jr(en)??"Rate limited",code:ei(en)??"rate_limited",category:"rate_limited",httpStatus:429,retryable:true,requestId:s,retry:{afterMs:O}});if(this.rateLimitStrategy==="sleep")return await cn(O,r.signal),this.requestOnce(e,n,r);throw Dr}throw sn({path:n,status:w.status,body:en,fallbackRequestId:s})}async parseSuccess(e,n,r){if(e.status===204||n.parseBody===false)return;let i=await e.text();if(i!=="")try{return JSON.parse(i)}catch{return i}}async safeParseJson(e){try{let n=await e.text();return n===""?void 0:JSON.parse(n)}catch{return}}buildUrl(e,n){let r=e.startsWith("/")?e:`/${e}`,i=this.baseUrl+r;if(!n)return i;let s=new URLSearchParams;for(let[c,l]of Object.entries(n))if(l!==void 0)if(Array.isArray(l))for(let C of l)s.append(c,String(C));else s.set(c,String(l));let o=s.toString();return o?`${i}?${o}`:i}buildHeaders(e,n){let r=this.resolveIdempotencyKey(n);return {"X-Request-Id":e,Accept:"application/json",...n.ring!=="public"?this.auth.headersFor(n.ring):{},...r?{"Idempotency-Key":r}:{},...n.headers??{}}}resolveIdempotencyKey(e){if(e.idempotencyKey!==false){if(typeof e.idempotencyKey=="string"){if(e.idempotencyKey.trim()==="")throw new p({message:"idempotencyKey must be non-empty",code:"invalid_idempotency_key",category:"validation",httpStatus:0,retryable:false,requestId:""});return e.idempotencyKey}if(!(!e.idempotent||!this.idempotencyKey.autoGenerate))return this.idempotencyKey.generator()}}formBody(e){let n=new URLSearchParams;for(let[r,i]of Object.entries(e))i!==void 0&&n.set(r,String(i));return n.toString()}withStableIdempotencyKey(e){return e.idempotencyKey!==void 0||!e.idempotent||!this.idempotencyKey.autoGenerate?e:{...e,idempotencyKey:this.idempotencyKey.generator()}}logRequest(e,n,r,i){this.debug&&this.logger.debug({method:e,url:n,headers:Dn(r),requestId:i},"http.request");}};function Jr(t){if(typeof t!="object"||t===null)return;let e=t.error;if(typeof e=="object"&&e!==null){let n=e.message;if(typeof n=="string")return n}if(typeof e=="string")return e}function ei(t){if(typeof t!="object"||t===null)return;let e=t.error;if(typeof e=="object"&&e!==null){let n=e.code;if(typeof n=="string")return n}}var Ze=4096,Mn=false;function $n(t){return `v2:${Buffer.from(JSON.stringify(t),"utf8").toString("base64url")}`}function ti(t){if(t.length>Ze)throw new _({message:`Cursor token exceeds maximum size (${Ze} chars)`,code:"invalid_cursor",category:"validation",httpStatus:0,retryable:false,requestId:"",docUrl:"https://docs.axhub.dev/errors/validation/invalid-cursor"});if(t.startsWith("v1:"))throw new v({message:"Legacy v1: cursor token is not compatible with keyset pagination; restart pagination without cursor",code:"legacy_cursor",category:"validation",httpStatus:0,retryable:false,requestId:"",docUrl:"https://docs.axhub.dev/errors/validation/legacy-cursor"});if(!t.startsWith("v2:"))throw new v({message:"Cursor token is missing the v2: keyset prefix; restart pagination without cursor",code:"legacy_cursor",category:"validation",httpStatus:0,retryable:false,requestId:"",docUrl:"https://docs.axhub.dev/errors/validation/legacy-cursor"});try{let e=JSON.parse(Buffer.from(t.slice(3),"base64url").toString("utf8"));if(!ii(e))throw new Error("invalid cursor shape");return e}catch(e){throw new _({message:"Malformed keyset cursor token",code:"invalid_cursor",category:"validation",httpStatus:0,retryable:false,requestId:"",cause:e,docUrl:"https://docs.axhub.dev/errors/validation/invalid-cursor"})}}function Rt(t,e){let n=typeof t=="string"?t.split(",").map(r=>{let i=r.trim();return i.startsWith("-")?{field:i.slice(1),dir:"desc"}:i.startsWith("+")?{field:i.slice(1),dir:"asc"}:{field:i,dir:"asc"}}).filter(r=>r.field.length>0):[...t??[]].map(r=>({field:r.field,dir:r.dir??"asc"}));return n.length>0&&!n.some(r=>r.field==="id")&&(e?.warnOnTiebreaker&&!Mn&&(Mn=true,console.warn("AX Hub SDK: orderBy is not unique; appending id ASC as keyset cursor tiebreaker")),n.push({field:"id",dir:"asc"})),n}function Gn(t){let e=Rt(t,{warnOnTiebreaker:true});return e.length===0?typeof t=="string"?t:void 0:e.map(n=>`${n.dir==="desc"?"-":""}${n.field}`).join(",")}function ni(t){return JSON.stringify(Bn(t))}function ri(t,e){if(!t)return null;let n=Bn(e?.orderBy,{warnOnTiebreaker:true}),r={};for(let c of n){let l=t[c.field];(l===null||typeof l=="string"||typeof l=="number"||typeof l=="boolean")&&(r[c.field]=l);}let i=t.id,s={values:r,direction:e?.direction??"forward",orderBy:n,orderByFingerprint:JSON.stringify(n)};(typeof i=="string"||typeof i=="number")&&(s.tiebreaker={field:"id",value:i});let o=e?.page;return typeof o=="number"&&Number.isInteger(o)&&o>0&&(s.page=o),e?.contextFingerprint&&(s.contextFingerprint=e.contextFingerprint),$n(s)}function Bn(t,e){let n=Rt(t,e);return n.length>0?n:[{field:"id",dir:"asc"}]}function Hn(t){return typeof t=="string"&&t.startsWith("v2:")}function ii(t){return typeof t=="object"&&t!==null&&typeof t.values=="object"&&(t.direction==="forward"||t.direction==="backward")&&Array.isArray(t.orderBy)&&typeof t.orderByFingerprint=="string"}async function*A(t,e){let n=e?.cursor,r,i;for(;;){if(e?.signal?.aborted)throw new h({message:"listAll aborted",code:"aborted",category:"abort",httpStatus:0,retryable:false,requestId:""});let s=await t({pageSize:e?.pageSize,cursor:n});s.total!==void 0&&(r===void 0?(r=s.total,i=s.total):s.total>(i??r)&&(yield {type:"drift",addedSince:s.total-(i??r)},i=s.total));for(let o of s.items)yield {type:"item",value:o};if(s.nextCursor==null)return;n=s.nextCursor;}}function dn(t){return Buffer.isBuffer(t)?t:Buffer.from(t)}function oi(t){let e=t.startsWith("sha256=")?t.slice(7):t;return /^[0-9a-f]{64}$/i.test(e)?Buffer.from(e,"hex"):null}function ai(t,e,n){let r=n?Buffer.concat([Buffer.from(`${n}.`),dn(t)]):dn(t);return `sha256=${crypto.createHmac("sha256",e).update(r).digest("hex")}`}function ui(t){if(!t.secret)return {ok:false,reason:"missing_secret"};let e=oi(t.signature);if(!e)return {ok:false,reason:"malformed_signature"};let n=Math.floor((t.now?.()??Date.now())/1e3),r=dn(t.rawBody);if(t.timestamp!==void 0){let s=Number(t.timestamp);if(!Number.isFinite(s))return {ok:false,reason:"timestamp_skew"};let o=t.tolerance??300;if(Math.abs(n-s)>o)return {ok:false,reason:"timestamp_skew"};let c=`${t.timestamp}:${t.signature}`;if(t.replayCache?.has(c))return {ok:false,reason:"replay"};r=Buffer.concat([Buffer.from(`${t.timestamp}.`),r]);}let i=crypto.createHmac("sha256",t.secret).update(r).digest();return e.byteLength!==i.byteLength?{ok:false,reason:"signature_mismatch"}:crypto.timingSafeEqual(e,i)?(t.timestamp!==void 0&&t.replayCache?.add(`${t.timestamp}:${t.signature}`),{ok:true}):{ok:false,reason:"signature_mismatch"}}function a(t,e){return {...t,signal:e?.signal,timeoutMs:e?.timeoutMs,idempotencyKey:e?.idempotencyKey}}function E(t){let e={};return t?.pageSize!==void 0&&(e.limit=t.pageSize),t?.cursor!==void 0&&(e.cursor=t.cursor),e}function b(t,e){return {items:t.items.map(e),nextCursor:t.next_cursor,total:t.total}}function H(t){let e={};for(let[n,r]of Object.entries(t))r!==void 0&&(e[n]=r);return e}function u(t){return encodeURIComponent(t)}function Fn(t){return {id:t.id,appId:t.app_id,userId:t.user_id,grantedAt:t.granted_at}}var wt=class{constructor(e){this.http=e;}http;async grant(e){let n=await this.http.request("POST",`/api/v1/apps/${encodeURIComponent(e)}/access`,{ring:"admin",idempotent:false});return Fn(n)}async revoke(e){await this.http.request("DELETE",`/api/v1/apps/${encodeURIComponent(e)}/access`,{ring:"admin",idempotent:true});}async me(e){try{let n=await this.http.request("GET",`/api/v1/apps/${encodeURIComponent(e)}/access/me`,{ring:"admin"});return Fn(n)}catch(n){if(ci(n))return null;throw n}}};function ci(t){return typeof t=="object"&&t!==null&&"httpStatus"in t&&t.httpStatus===404}function Nn(t){let e={available:t.available};return t.reason!==void 0&&(e.reason=t.reason),e}var vt=class{constructor(e,n){this.http=e;this.defaultTenantId=n;}http;defaultTenantId;requireTenantId(e,n){if(this.defaultTenantId===void 0)throw new R({message:`apps.${e} requires a tenant UUID: set defaultTenantId on AxHubClient. Backend route ${n} takes a tenant UUID, not a slug.`,code:"tenant_id_required",category:"tenant_id_required",httpStatus:0,retryable:false,requestId:"",fields:[{name:"tenantId",code:"required"}]});return this.defaultTenantId}async checkAvailability(e){let n=this.requireTenantId("checkAvailability","GET /api/v1/tenants/{tenantID}/apps/check-availability"),r={};e.slug!==void 0&&(r.slug=e.slug),e.subdomain!==void 0&&(r.subdomain=e.subdomain);let i=await this.http.request("GET",`/api/v1/tenants/${encodeURIComponent(n)}/apps/check-availability`,{ring:"admin",query:r}),s={};return i.slug!==void 0&&(s.slug=Nn(i.slug)),i.subdomain!==void 0&&(s.subdomain=Nn(i.subdomain)),s}async iconPreCreateUrl(e){let n=this.requireTenantId("iconPreCreateUrl","POST /api/v1/tenants/{tenantID}/apps/icon/upload-url"),r={content_type:e.contentType,slug:e.slug};e.variant!==void 0&&(r.variant=e.variant);let i=await this.http.request("POST",`/api/v1/tenants/${encodeURIComponent(n)}/apps/icon/upload-url`,{ring:"admin",body:r,idempotent:false}),s={uploadUrl:i.put_url??"",getUrl:i.public_url??""};return i.expires_at!==void 0&&(s.expiresAt=i.expires_at),s}};var _t=class{constructor(e){this.http=e;}http;async list(e,n){let r=await this.http.request("GET",`/api/v1/tenants/${u(e)}/categories`,a({ring:"admin",query:E(n)},n));return b(r,i=>i)}get(e,n,r){return this.http.request("GET",`/api/v1/tenants/${u(e)}/categories/${u(n)}`,a({ring:"admin"},r))}};function Qn(t){return {id:t.id,appId:t.app_id,authorId:t.author_id,body:t.body,createdAt:t.created_at,updatedAt:t.updated_at,deletedAt:t.deleted_at}}var Vn=500;function di(t){if(typeof t!="string"||t.length===0)throw new d({message:"Comment body must be a non-empty string",code:"empty",category:"validation",httpStatus:0,retryable:false,requestId:"",fields:[{name:"body",code:"empty"}]});if(t.length>Vn)throw new d({message:`Comment body must be \u2264 ${Vn} characters (got ${t.length})`,code:"too_long",category:"validation",httpStatus:0,retryable:false,requestId:"",fields:[{name:"body",code:"too_long"}]})}var xt=class{constructor(e){this.http=e;}http;async add(e,n){di(n.body);let r=await this.http.request("POST",`/api/v1/apps/${encodeURIComponent(e)}/comments`,{ring:"admin",body:{body:n.body},idempotent:false});return Qn(r)}async list(e,n){let r={};n?.pageSize!==void 0&&(r.limit=n.pageSize),n?.cursor!==void 0&&(r.cursor=n.cursor);let i=await this.http.request("GET",`/api/v1/apps/${encodeURIComponent(e)}/comments`,{ring:"admin",query:r});return {items:i.items.map(Qn),nextCursor:i.next_cursor,total:i.total}}listAll(e,n){return A(r=>this.list(e,r),n)}async delete(e){await this.http.request("DELETE",`/api/v1/comments/${encodeURIComponent(e)}`,{ring:"admin",idempotent:true});}};var Kn=/^[a-z0-9-]+$/;function Wn(t,e){if(!t||!Kn.test(t))throw new V({message:`Invalid ${e}: must match ${Kn}`,code:"invalid_path",category:"invalid_path",httpStatus:0,retryable:false,requestId:""})}var zn=/^[a-z][a-z0-9]{0,62}$/;function I(t,e="name"){if(!t||!zn.test(t))throw new V({message:`Invalid ${e}: must match ${zn}`,code:"invalid_path",category:"invalid_path",httpStatus:0,retryable:false,requestId:""})}function Xn(t){if(t.publication_status!==void 0)return t.publication_status;switch(t.review_status){case "pending":return "pending_review";case "approved":return "approved";default:return "draft"}}function li(t){let e={id:t.id??"",slug:t.slug??"",name:t.name??""};return t.tenant_id!==void 0&&(e.tenantId=t.tenant_id),t.description!==void 0&&(e.description=t.description),t.color!==void 0&&(e.color=t.color),t.icon_url!==void 0&&(e.iconUrl=t.icon_url),t.display_order!==void 0&&(e.displayOrder=t.display_order),t.apps_count!==void 0&&(e.appsCount=t.apps_count),t.discoverable_apps_count!==void 0&&(e.discoverableAppsCount=t.discoverable_apps_count),t.created_at!==void 0&&(e.createdAt=t.created_at),t.updated_at!==void 0&&(e.updatedAt=t.updated_at),e}function pi(t){let e={id:t.id??""};return t.name!==void 0&&(e.name=t.name),t.avatar_url!==void 0&&(e.avatarUrl=t.avatar_url),e}function m(t){let e={id:t.id??"",tenantId:t.tenant_id??"",ownerId:t.owner_id??"",slug:t.slug??"",name:t.name??"",schemaName:t.schema_name??"",status:t.status??"draft",visibility:t.visibility??"private",publicationStatus:Xn(t),likeCount:t.like_count??0,subscriberCount:t.subscriber_count??0,createdAt:t.created_at??"",updatedAt:t.updated_at??"",deletedAt:t.deleted_at??null};return t.description!==void 0&&(e.description=t.description),t.icon_url!==void 0&&(e.iconUrl=t.icon_url),t.icon_dark_url!==void 0&&(e.iconDarkUrl=t.icon_dark_url),t.review_status!==void 0&&(e.reviewStatus=t.review_status),t.auth_mode!==void 0&&(e.authMode=t.auth_mode),t.data_scopes!==void 0&&(e.dataScopes=t.data_scopes),t.deploy_method!==void 0&&(e.deployMethod=t.deploy_method),t.resource_tier!==void 0&&(e.resourceTier=t.resource_tier),t.subdomain!==void 0&&(e.subdomain=t.subdomain),t.access_url!==void 0&&(e.accessUrl=t.access_url),t.last_deployment_status!==void 0&&(e.lastDeploymentStatus=t.last_deployment_status),t.operating_status!==void 0&&(e.operatingStatus=t.operating_status),t.suspended_at!==void 0&&(e.suspendedAt=t.suspended_at),t.resumed_at!==void 0&&(e.resumedAt=t.resumed_at),t.category_id!==void 0&&(e.categoryId=t.category_id),t.cost_center!==void 0&&(e.costCenter=t.cost_center),t.category!==void 0&&(e.category=li(t.category)),t.owner!==void 0&&(e.owner=pi(t.owner)),t.calls_count!==void 0&&(e.callsCount=t.calls_count),t.shared_tables_count!==void 0&&(e.sharedTablesCount=t.shared_tables_count),e}function It(t){let e={slug:t.slug,name:t.name};return t.description!==void 0&&(e.description=t.description),t.iconUrl!==void 0&&(e.icon_url=t.iconUrl),t.iconDarkUrl!==void 0&&(e.icon_dark_url=t.iconDarkUrl),t.categoryId!==void 0&&(e.category_id=t.categoryId),t.costCenter!==void 0&&(e.cost_center=t.costCenter),t.authMode!==void 0&&(e.auth_mode=t.authMode),t.dataScopes!==void 0&&(e.data_scopes=t.dataScopes),t.deployMethod!==void 0&&(e.deploy_method=t.deployMethod),t.resourceTier!==void 0&&(e.resource_tier=t.resourceTier),t.subdomain!==void 0&&(e.subdomain=t.subdomain),e}function St(t){let e={};return t.name!==void 0&&(e.name=t.name),t.description!==void 0&&(e.description=t.description),t.iconUrl!==void 0&&(e.icon_url=t.iconUrl),t.iconDarkUrl!==void 0&&(e.icon_dark_url=t.iconDarkUrl),t.visibility!==void 0&&(e.visibility=t.visibility),t.categoryId!==void 0&&(e.category_id=t.categoryId),t.clearCategory!==void 0&&(e.clear_category=t.clearCategory),t.costCenter!==void 0&&(e.cost_center=t.costCenter),t.clearCostCenter!==void 0&&(e.clear_cost_center=t.clearCostCenter),t.authMode!==void 0&&(e.auth_mode=t.authMode),t.dataScopes!==void 0&&(e.data_scopes=t.dataScopes),t.deployMethod!==void 0&&(e.deploy_method=t.deployMethod),t.resourceTier!==void 0&&(e.resource_tier=t.resourceTier),t.subdomain!==void 0&&(e.subdomain=t.subdomain),t.clearSubdomain!==void 0&&(e.clear_subdomain=t.clearSubdomain),e}function Zn(t,e,n){if(t===void 0)return null;let r=Number(e??1),i=Number(n??20);return r*i<t?String(r+1):null}var Ct=class{constructor(e,n,r,i){this.http=e;this.defaultTenantSlug=n;this.defaultTenantId=r;this.tenantResolver=i;}http;defaultTenantSlug;defaultTenantId;tenantResolver;async resolveTenantId(){if(this.defaultTenantId!==void 0)return this.defaultTenantId;if(this.defaultTenantSlug!==void 0&&this.tenantResolver!==void 0)return this.tenantResolver.resolveTenantId(this.defaultTenantSlug)}async create(e){Wn(e.slug,"slug");let n=await this.resolveTenantId();if(n===void 0)throw new R({message:"apps.create requires a tenant: set defaultTenantId or defaultTenantSlug on AxHubClient. Backend route POST /api/v1/tenants/{tenantID}/apps takes a tenant UUID, not a slug.",code:"tenant_id_required",category:"tenant_id_required",httpStatus:0,retryable:false,requestId:"",fields:[{name:"tenantId",code:"required"}]});let r=It(e),i=await this.http.request("POST",`/api/v1/tenants/${encodeURIComponent(n)}/apps`,{ring:"admin",body:r,idempotent:false});return m(i)}async list(e){let n={},r=e?.perPage??e?.pageSize;r!==void 0&&(n.per_page=r),e?.page!==void 0?n.page=e.page:e?.cursor!==void 0&&(n.page=e.cursor),e?.q!==void 0&&(n.q=e.q),e?.categoryId!==void 0&&(n.category_id=e.categoryId),e?.status!==void 0&&(n.status=e.status),e?.statusIn!==void 0&&(n.status_in=e.statusIn.join(",")),e?.reviewStatus!==void 0&&(n.review_status=e.reviewStatus),e?.reviewStatusIn!==void 0&&(n.review_status_in=e.reviewStatusIn.join(",")),e?.operatingStatus!==void 0&&(n.operating_status=e.operatingStatus),e?.operatingStatusIn!==void 0&&(n.operating_status_in=e.operatingStatusIn.join(",")),e?.sort!==void 0&&(n.sort=e.sort),e?.page!==void 0&&(n.page=e.page),e?.perPage!==void 0&&(n.per_page=e.perPage);let i=await this.resolveTenantId();if(i===void 0)throw new R({message:"apps.list requires a tenant: set defaultTenantId or defaultTenantSlug on AxHubClient. Use apps.listMine() for the caller workspace feed without tenant context.",code:"tenant_id_required",category:"tenant_id_required",httpStatus:0,retryable:false,requestId:"",fields:[{name:"tenantId",code:"required"}]});let s=await this.http.request("GET",`/api/v1/tenants/${encodeURIComponent(i)}/apps`,{ring:"admin",query:n});return {items:s.items.map(m),nextCursor:s.next_cursor??Zn(s.total,n.page,n.per_page),total:s.total,hasNext:(s.next_cursor??Zn(s.total,n.page,n.per_page))!==null,hasPrev:Number(n.page??1)>1}}listAll(e){return A(n=>this.list(n),e)}async get(e){let n=await this.http.request("GET",`/api/v1/apps/${encodeURIComponent(e)}`,{ring:"admin"});return m(n)}async update(e,n){let r=St(n),i=await this.http.request("PATCH",`/api/v1/apps/${encodeURIComponent(e)}`,{ring:"admin",body:r,idempotent:false});return m(i)}async delete(e){await this.http.request("DELETE",`/api/v1/apps/${encodeURIComponent(e)}`,{ring:"admin",idempotent:true});}async permanent(e){await this.http.request("DELETE",`/api/v1/apps/${encodeURIComponent(e)}/permanent`,{ring:"admin",idempotent:false});}async signIconUploadURL(e,n){return this.signIconImpl(e,n,"icon")}async signIconDarkUploadURL(e,n){return this.signIconImpl(e,n,"icon-dark")}async signIconImpl(e,n,r){let i=await this.http.request("POST",`/api/v1/apps/${encodeURIComponent(e)}/${r}/upload-url`,{ring:"admin",body:{content_type:n.contentType},idempotent:false}),s={uploadUrl:i.upload_url??i.put_url??"",getUrl:i.get_url??i.public_url??""};return i.expires_at!==void 0&&(s.expiresAt=i.expires_at),s}async listMine(){return (await this.http.request("GET","/api/v1/me/apps/workspace",{ring:"admin"})).items.map(m)}};var At=class{constructor(e,n,r){this.http=e;this.defaultTenantSlug=n;this.defaultTenantId=r;}http;defaultTenantSlug;defaultTenantId;async search(e){let n={...E(e),q:e?.q,category:e?.category,sort:e?.sort,visibility:e?.visibility,...this.defaultTenantSlug?{tenant_slug:this.defaultTenantSlug}:{}},r=await this.http.request("GET","/api/v1/apps/search",a({ring:"admin",query:n},e));return b(r,m)}feedQuery(e){let n={};return e?.q!==void 0&&(n.q=e.q),e?.category!==void 0&&(n.category=e.category),e?.sort!==void 0&&(n.sort=e.sort),e?.createdWithinDays!==void 0&&(n.created_within_days=e.createdWithinDays),e?.page!==void 0&&(n.page=e.page),e?.perPage!==void 0&&(n.per_page=e.perPage),n}async discoverGlobal(e){let n=await this.http.request("GET","/api/v1/apps/discover",a({ring:"admin",query:this.feedQuery(e)}));return b(n,m)}async discoverTenant(e){if(this.defaultTenantId===void 0)throw new R({message:"apps.discoverTenant requires a tenant UUID: set defaultTenantId on AxHubClient. Backend route GET /api/v1/tenants/{tenantID}/discover/apps takes a tenant UUID, not a slug.",code:"tenant_id_required",category:"tenant_id_required",httpStatus:0,retryable:false,requestId:"",fields:[{name:"tenantId",code:"required"}]});let n=await this.http.request("GET",`/api/v1/tenants/${encodeURIComponent(this.defaultTenantId)}/discover/apps`,a({ring:"admin",query:this.feedQuery(e)}));return b(n,m)}};function mi(t){return {key:t.key,value:t.value,createdAt:t.created_at,updatedAt:t.updated_at}}var Yn=/^[A-Z_][A-Z0-9_]*$/;function ln(t){if(!Yn.test(t))throw new d({message:`Env var key must match ${Yn}`,code:"validation_failed",category:"validation",httpStatus:0,retryable:false,requestId:"",fields:[{name:"key",code:"invalid_format"}]})}var kt=class{constructor(e){this.http=e;}http;async listEnvVars(e){return (await this.http.request("GET",`/api/v1/apps/${encodeURIComponent(e)}/env-vars`,{ring:"admin"})).items.map(mi)}async setEnvVar(e,n,r,i){ln(n);let s={key:n,value:r};i!==void 0&&(s.stage=i),await this.http.request("POST",`/api/v1/apps/${encodeURIComponent(e)}/env-vars`,{ring:"admin",body:s,idempotent:true});}async getEnvVar(e,n){ln(n);let r=(await this.listEnvVars(e)).find(i=>i.key===n);if(!r)throw new f({message:`Env var ${n} not found`,code:"not_found",category:"not_found",httpStatus:404,retryable:false,requestId:"",resource:"env_var"});return r}async deleteEnvVar(e,n){ln(n),await this.http.request("DELETE",`/api/v1/apps/${encodeURIComponent(e)}/env-vars/${encodeURIComponent(n)}`,{ring:"admin",idempotent:true});}};function pn(t){return {connected:true,...t.provider!==void 0?{provider:t.provider}:{},repoFullName:t.repo_full_name,branch:t.branch,installationId:t.installation_id}}function gi(t){return "connected"in t&&t.connected===false?{connected:false,installUrl:t.install_url}:pn(t)}var Tt=class{constructor(e){this.http=e;}http;async get(e){let n=await this.http.request("GET",`/api/v1/apps/${encodeURIComponent(e)}/git-connection`,{ring:"admin"});return gi(n)}async connect(e,n){let r=await this.http.request("POST",`/api/v1/apps/${encodeURIComponent(e)}/git-connection`,{ring:"admin",body:{repo_full_name:n.repoFullName,branch:n.branch,installation_id:n.installationId,state:n.state},idempotent:false});return pn(r)}async update(e,n){let r=await this.http.request("PATCH",`/api/v1/apps/${encodeURIComponent(e)}/git-connection`,{ring:"admin",body:{branch:n.branch},idempotent:false});return pn(r)}async disconnect(e){await this.http.request("DELETE",`/api/v1/apps/${encodeURIComponent(e)}/git-connection`,{ring:"admin",idempotent:true});}async installStart(e,n){let r=await this.http.request("GET",`/api/v1/apps/${encodeURIComponent(e)}/git/github/install/start`,{ring:"admin",query:void 0});if(typeof r=="string")return {redirectUrl:r};let i=r;return {redirectUrl:i.redirect_url??i.install_url??i.location??""}}};function fi(t){return {id:t.id,appId:t.app_id,userId:t.user_id,allowedScopes:t.allowed_scopes??[],grantedAt:t.granted_at??"",createdAt:t.created_at??""}}var Pt=class{constructor(e){this.http=e;}http;async create(e,n){let r=await this.http.request("POST",`/api/v1/apps/${encodeURIComponent(e)}/invitations`,{ring:"admin",body:{user_id:n.userId},idempotent:false});return fi(r)}async delete(e,n){await this.http.request("DELETE",`/api/v1/apps/${encodeURIComponent(e)}/invitations/${encodeURIComponent(n)}`,{ring:"admin",idempotent:true});}};var Et=class{constructor(e){this.http=e;}http;async suspend(e){let n=await this.http.request("POST",`/api/v1/apps/${encodeURIComponent(e)}/suspend`,{ring:"admin",body:{},idempotent:false});return m(n)}async resume(e){let n=await this.http.request("POST",`/api/v1/apps/${encodeURIComponent(e)}/resume`,{ring:"admin",body:{},idempotent:false});return m(n)}};var qt=class{constructor(e){this.http=e;}http;async like(e){return {inserted:(await this.http.request("POST",`/api/v1/apps/${encodeURIComponent(e)}/likes`,{ring:"admin",idempotent:true}))?.inserted??true}}async unlike(e){try{return {deleted:(await this.http.request("DELETE",`/api/v1/apps/${encodeURIComponent(e)}/likes`,{ring:"admin",idempotent:!0}))?.deleted??!0}}catch(n){if(yi(n))return {deleted:false};throw n}}async me(e){return {liked:(await this.http.request("GET",`/api/v1/apps/${encodeURIComponent(e)}/likes/me`,{ring:"admin"})).liked}}};function yi(t){return typeof t=="object"&&t!==null&&"httpStatus"in t&&t.httpStatus===404}function hi(t){let e={id:t.id,appId:t.app_id,userId:t.user_id,allowedScopes:t.allowed_scopes??[],grantedAt:t.granted_at??""};return t.email!==void 0&&(e.email=t.email),t.granted_by_id!==void 0&&(e.grantedById=t.granted_by_id),e}var Ot=class{constructor(e){this.http=e;}http;async list(e,n){let r={};n?.page!==void 0&&(r.page=n.page),n?.perPage!==void 0&&(r.per_page=n.perPage);let i=await this.http.request("GET",`/api/v1/apps/${encodeURIComponent(e)}/members`,a({ring:"admin",query:r},n));return b(i,hi)}};var Dt=class{constructor(e){this.http=e;}http;async owned(e){let n=await this.http.request("GET","/api/v1/me/apps/owned",a({ring:"admin"},e));return b(n,m)}async received(e){let n=await this.http.request("GET","/api/v1/me/apps/received",a({ring:"admin"},e));return b(n,m)}};function Jn(t){return {id:t.id,appId:t.app_id,name:t.name,clientId:t.client_id??t.id,redirectUris:t.redirect_uris,scopes:t.scopes??t.allowed_scopes??[],createdAt:t.created_at}}function bi(t){return {...Jn(t),clientSecret:t.client_secret}}var Ut=class{constructor(e){this.http=e;}http;async create(e,n){if(!n.scopes||n.scopes.length===0)throw new d({message:"scopes must be a non-empty array",code:"empty",category:"validation",httpStatus:0,retryable:false,requestId:"",fields:[{name:"scopes",code:"empty"}]});let r=await this.http.request("POST",`/api/v1/apps/${encodeURIComponent(e)}/oauth-clients`,{ring:"admin",body:{name:n.name,type:n.type??"confidential",token_endpoint_auth_method:n.tokenEndpointAuthMethod??(n.type==="public"?"none":"client_secret_post"),redirect_uris:n.redirectUris,allowed_scopes:n.scopes,allowed_grant_types:n.allowedGrantTypes??["authorization_code","refresh_token"],...n.allowedResources!==void 0?{allowed_resources:n.allowedResources}:{}},idempotent:false});return bi(r)}async get(e){let n=await this.http.request("GET",`/api/v1/oauth-clients/${encodeURIComponent(e)}`,{ring:"admin"});return Jn(n)}};function er(t){let e={id:t.id,appId:t.app_id,requesterId:t.requester_id,status:t.status,createdAt:t.created_at,updatedAt:t.updated_at};t.reason!==void 0&&(e.reason=t.reason),t.reviewer_id!==void 0&&(e.reviewerId=t.reviewer_id);let n=t.reviewer_comment??t.review_comment;return n!==void 0&&(e.reviewerComment=n),e}var Lt=class{constructor(e){this.http=e;}http;async submit(e,n){let r={};n?.reason!==void 0&&(r.reason=n.reason);let i=await this.http.request("POST",`/api/v1/apps/${encodeURIComponent(e)}/review-requests`,{ring:"admin",body:r,idempotent:false});return er(i)}async list(e,n){let r={};n?.pageSize!==void 0&&(r.limit=n.pageSize),n?.cursor!==void 0&&(r.cursor=n.cursor);let i=await this.http.request("GET",`/api/v1/apps/${encodeURIComponent(e)}/review-requests`,{ring:"admin",query:r});return {items:i.items.map(er),nextCursor:i.next_cursor,total:i.total}}async unpublish(e,n){let r={visibility:"private"};n?.comment!==void 0&&(r.review_comment=n.comment);let i=await this.http.request("PATCH",`/api/v1/apps/${encodeURIComponent(e)}`,{ring:"admin",body:r,idempotent:false});return m(i)}};function tr(t){switch(t){case "timestamp":return "timestamptz";case "json":return "jsonb";default:return t}}function nr(t){if(t!==void 0)return t===null?null:String(t)}function Ri(t){switch(t){case "integer":return "int";case "timestamp with time zone":return "timestamptz";case "jsonb":return "jsonb";case "numeric":return "float";default:return t}}function wi(t){let e={name:t.name,type:Ri(t.type)};return t.nullable!==void 0&&(e.nullable=t.nullable),t.default!==void 0&&(e.default=t.default),e}function mn(t){return {appId:t.app_id,schemaName:t.schema_name??"",tableName:t.table_name??t.name??"",ownerColumn:t.owner_column??"",columns:(t.columns??[]).map(wi),createdAt:t.created_at??"",updatedAt:t.updated_at??""}}function vi(t){return {...mn(t),indexes:t.indexes??[],constraints:t.constraints??[],rowCount:t.row_count,sizeBytes:t.size_bytes}}function rr(t,e=""){return {id:t.id,appId:t.app_id,tableName:t.table_name??e,principalType:t.principal_type,principalId:t.principal_id,scopes:t.scopes??t.actions??[],createdAt:t.granted_at??t.created_at??""}}var Mt=class{constructor(e){this.http=e;}http;async list(e){return (await this.http.request("GET",`/api/v1/apps/${encodeURIComponent(e)}/tables`,{ring:"admin"})).items.map(mn)}async create(e,n){I(n.name,"name");let r=await this.http.request("POST",`/api/v1/apps/${encodeURIComponent(e)}/tables`,{ring:"admin",body:{table_name:n.name,owner_column:n.ownerColumn,...n.description!==void 0?{description:n.description}:{},columns:n.columns.map(i=>({name:i.name,type:tr(i.type),...i.nullable!==void 0?{nullable:i.nullable}:{},...i.default!==void 0?{default:nr(i.default)}:{}}))},idempotent:false});return mn(r)}async delete(e,n){I(n,"tableName"),await this.http.request("DELETE",`/api/v1/apps/${encodeURIComponent(e)}/tables/${encodeURIComponent(n)}`,{ring:"admin",idempotent:true});}async addColumn(e,n,r){I(n,"tableName");let i={name:r.name,type:tr(r.type)};r.nullable!==void 0&&(i.nullable=r.nullable),r.default!==void 0&&(i.default=nr(r.default)),await this.http.request("POST",`/api/v1/apps/${encodeURIComponent(e)}/tables/${encodeURIComponent(n)}/columns`,{ring:"admin",body:{column:i},idempotent:false});}async dropColumn(e,n,r){I(n,"tableName"),await this.http.request("DELETE",`/api/v1/apps/${encodeURIComponent(e)}/tables/${encodeURIComponent(n)}/columns/${encodeURIComponent(r)}`,{ring:"admin",idempotent:true});}async listGrants(e,n){return I(n,"tableName"),(await this.http.request("GET",`/api/v1/apps/${encodeURIComponent(e)}/tables/${encodeURIComponent(n)}/grants`,{ring:"admin"})).items.map(i=>rr(i,n))}async addGrant(e,n,r){I(n,"tableName");let i=await this.http.request("POST",`/api/v1/apps/${encodeURIComponent(e)}/tables/${encodeURIComponent(n)}/grants`,{ring:"admin",body:{principal_type:r.principalType,principal_id:r.principalId,actions:r.scopes},idempotent:false});return rr(i,n)}async revokeGrant(e,n,r){I(n,"tableName"),await this.http.request("DELETE",`/api/v1/apps/${encodeURIComponent(e)}/tables/${encodeURIComponent(n)}/grants/${encodeURIComponent(r)}`,{ring:"admin",idempotent:true});}async inspect(e,n){I(n,"tableName");let r=await this.http.request("GET",`/api/v1/apps/${encodeURIComponent(e)}/tables/${encodeURIComponent(n)}`,{ring:"admin"});return vi(r)}async checkAvailability(e,n){I(n,"tableName");let r=await this.http.request("GET",`/api/v1/apps/${encodeURIComponent(e)}/tables/check-availability`,{ring:"admin",query:{table_name:n}});return {available:r.available,reason:r.reason??""}}async columnTypes(e){return ((await this.http.request("GET",`/api/v1/apps/${encodeURIComponent(e)}/tables/column-types`,{ring:"admin"})).types??[]).map(r=>({value:r.value,label:r.label}))}async browseRows(e,n,r){I(n,"tableName");let i={};r?.page!==void 0&&(i.page=r.page),r?.perPage!==void 0&&(i.per_page=r.perPage);let s=await this.http.request("GET",`/api/v1/apps/${encodeURIComponent(e)}/tables/${encodeURIComponent(n)}/rows`,a({ring:"admin",query:i},r));return {columns:(s.columns??[]).map(o=>({name:o.name,type:o.type,nullable:o.nullable})),rows:s.rows??[],meta:{page:s.meta?.page??1,perPage:s.meta?.per_page??0,total:s.meta?.total??0,totalPages:s.meta?.total_pages??0}}}};var $t=class{constructor(e,n){this.http=e;this.defaultTenantSlug=n;}http;defaultTenantSlug;async list(e){let n={...E(e),...this.defaultTenantSlug?{tenant_slug:this.defaultTenantSlug}:{}},r=await this.http.request("GET","/api/v1/templates",a({ring:"admin",query:n},e));return b(r,i=>i)}};var Ye=class{crud;lifecycle;availability;envVars;publication;access;invitations;members;me;categories;discover;likes;comments;oauthClients;git;tables;templates;constructor(e,n,r,i){this.crud=new Ct(e,n,r,i),this.lifecycle=new Et(e),this.availability=new vt(e,r),this.envVars=new kt(e),this.publication=new Lt(e),this.access=new wt(e),this.invitations=new Pt(e),this.members=new Ot(e),this.me=new Dt(e),this.categories=new _t(e),this.discover=new At(e,n,r),this.likes=new qt(e),this.comments=new xt(e),this.oauthClients=new Ut(e),this.git=new Tt(e),this.tables=new Mt(e),this.templates=new $t(e,n);}create=(...e)=>this.crud.create(...e);list=(...e)=>this.crud.list(...e);listAll=(...e)=>this.crud.listAll(...e);get=(...e)=>this.crud.get(...e);update=(...e)=>this.crud.update(...e);delete=(...e)=>this.crud.delete(...e);permanent=(...e)=>this.crud.permanent(...e);signIconUploadURL=(...e)=>this.crud.signIconUploadURL(...e);signIconDarkUploadURL=(...e)=>this.crud.signIconDarkUploadURL(...e);listMine=(...e)=>this.crud.listMine(...e);suspend=(...e)=>this.lifecycle.suspend(...e);resume=(...e)=>this.lifecycle.resume(...e);checkAvailability=(...e)=>this.availability.checkAvailability(...e);iconPreCreateUrl=(...e)=>this.availability.iconPreCreateUrl(...e);listEnvVars=(...e)=>this.envVars.listEnvVars(...e);setEnvVar=(...e)=>this.envVars.setEnvVar(...e);getEnvVar=(...e)=>this.envVars.getEnvVar(...e);deleteEnvVar=(...e)=>this.envVars.deleteEnvVar(...e)};var et=class{constructor(e,n,r){this.http=e;this.defaultTenantId=n;this.tenantResolver=r;}http;defaultTenantId;tenantResolver;tenant(e){return new j(this.http,e,this.tenantResolver)}summary(e){return this.defaultTenant().summary(e)}byCostCenter(e){return this.defaultTenant().byCostCenter(e)}byApp(e){return this.defaultTenant().byApp(e)}timeseries(e){return this.defaultTenant().timeseries(e)}export(e){return this.defaultTenant().export(e)}defaultTenant(){if(!this.defaultTenantId)throw new R({message:"sdk.cost requires defaultTenantId or sdk.cost.tenant(tenantIdOrSlug)",code:"tenant_id_required",category:"tenant_id_required",httpStatus:0,retryable:false,requestId:"",fields:[{name:"tenantId",code:"required"}]});return new j(this.http,this.defaultTenantId,this.tenantResolver)}},j=class{constructor(e,n,r){this.http=e;this.tenantIdOrSlug=n;this.tenantResolver=r;}http;tenantIdOrSlug;tenantResolver;async summary(e){let n=await this.http.request("GET",`${await this.base()}/summary`,a({ring:"admin",query:Je(e)},e));return _i(n)}async byCostCenter(e){let n=await this.http.request("GET",`${await this.base()}/by-cost-center`,a({ring:"admin",query:Je(e)},e));return {rows:(n.rows??[]).map(xi),unassigned:{appCount:n.unassigned?.app_count??0,cost:n.unassigned?.cost??0}}}async byApp(e){return {rows:((await this.http.request("GET",`${await this.base()}/by-app`,a({ring:"admin",query:{...Je(e),...e?.sort?{sort:e.sort}:{}}},e))).rows??[]).map(Ci)}}async timeseries(e){return {series:((await this.http.request("GET",`${await this.base()}/timeseries`,a({ring:"admin",query:{...Je(e),...e?.appId?{app_id:e.appId}:{}}},e))).series??[]).map(r=>({date:r.date??"",total:r.total??0,byResource:r.by_resource??{}}))}}async export(e){return this.http.request("GET",`${await this.base()}/export`,a({ring:"admin",query:{...Je(e),format:e?.format??"csv"}},e))}async base(){let e=this.tenantResolver?await this.tenantResolver.resolveTenantId(this.tenantIdOrSlug):this.tenantIdOrSlug;return `/api/v1/tenants/${u(e)}/cost`}};function Je(t){return t?.month?{month:t.month}:{}}function _i(t){let e={month:t.month??"",currency:t.currency??"KRW",total:t.total??0,billedTotal:t.billed_total??0,forecastMonthEnd:t.forecast_month_end??0,partialMonth:t.partial_month??false};return t.top_driver&&(e.topDriver={resourceKind:t.top_driver.resource_kind??"",share:t.top_driver.share??0}),t.last_rolled_up_at!==void 0&&(e.lastRolledUpAt=t.last_rolled_up_at),e}function xi(t){return {costCenter:t.cost_center??"",appCount:t.app_count??0,cost:t.cost??0,...t.budget!==void 0?{budget:t.budget}:{},...t.budget_pct!==void 0?{budgetPct:t.budget_pct}:{},...t.over!==void 0?{over:t.over}:{},byResource:t.by_resource??{},byResourceQty:t.by_resource_qty??{}}}function Ci(t){return {appId:t.app_id??"",name:t.name??"",...t.cost_center!==void 0?{costCenter:t.cost_center}:{},cost:t.cost??0,byResource:t.by_resource??{},byResourceQty:t.by_resource_qty??{}}}var tt=class{constructor(e,n){this.http=e;this.tenantResolver=n;}http;tenantResolver;tenant(e){return new Z(this.http,e,this.tenantResolver)}async preview(e,n){let r=await this.http.request("GET",`/api/v1/invite-links/${u(e)}`,a({ring:"public"},n));return Ii(r)}async accept(e,n){let r=await this.http.request("POST",`/api/v1/invite-links/${u(e)}/accept`,a({ring:"admin",body:{},idempotent:true},n));return {tenantId:r.tenant_id??"",tenantSlug:r.tenant_slug??"",joined:r.joined??false,alreadyMember:r.already_member??false}}},Z=class{constructor(e,n,r){this.http=e;this.tenantIdOrSlug=n;this.tenantResolver=r;}http;tenantIdOrSlug;tenantResolver;async create(e,n){let r={};e?.expiresAt!==void 0&&(r.expires_at=e.expiresAt);let i=await this.http.request("POST",await this.base(),a({ring:"admin",body:r,idempotent:false},n));return ir(i)}async list(e){let n=await this.http.request("GET",await this.base(),a({ring:"admin"},e));return b({items:n.items,next_cursor:n.next_cursor??null,total:n.total??n.items.length},ir)}async revoke(e,n){await this.http.request("DELETE",`${await this.base()}/${u(e)}`,a({ring:"admin",idempotent:true},n));}async base(){let e=this.tenantResolver?await this.tenantResolver.resolveTenantId(this.tenantIdOrSlug):this.tenantIdOrSlug;return `/api/v1/tenants/${u(e)}/invite-links`}};function ir(t){return {id:t.id??"",tenantId:t.tenant_id??"",...t.url!==void 0?{url:t.url}:{},role:t.role??"",status:t.status??"",...t.expires_at!==void 0?{expiresAt:t.expires_at}:{},joinCount:t.join_count??0,createdAt:t.created_at??""}}function Ii(t){let e={valid:t.valid??false};return t.tenant&&(e.tenant={name:t.tenant.name??"",...t.tenant.icon_url!==void 0?{iconUrl:t.tenant.icon_url}:{}}),e}var nt=class{constructor(e,n,r,i){this.slug=e;this.root=r;this.apps=new Gt(e,n.http,i),this.cost=new j(n.http,e,i),this.inviteLinks=new Z(n.http,e,i);}slug;root;apps;cost;inviteLinks;get gateway(){return this.root.gateway.scoped(this.slug)}app(e){return new Bt(this.slug,e,this.root)}},Gt=class{constructor(e,n,r){this.tenantSlug=e;this.http=n;this.tenantResolver=r;}tenantSlug;http;tenantResolver;async create(e,n){let r=await this.tenantResolver.resolveTenantId(this.tenantSlug,n),i=await this.http.request("POST",`/api/v1/tenants/${u(r)}/apps`,a({ring:"admin",body:It(e),idempotent:false},n));return m(i)}async list(e){let n=await this.tenantResolver.resolveTenantId(this.tenantSlug,e),r=await this.http.request("GET",`/api/v1/tenants/${u(n)}/apps`,a({ring:"admin",query:E(e)},e));return b(r,m)}listAll(e){return A(n=>this.list({...e,...n}),e)}async get(e,n){let r=await this.http.request("GET",`/api/v1/apps/${u(e)}`,a({ring:"admin"},n));return m(r)}async update(e,n,r){let i=await this.http.request("PATCH",`/api/v1/apps/${u(e)}`,a({ring:"admin",body:St(n),idempotent:false},r));return m(i)}async delete(e,n){await this.http.request("DELETE",`/api/v1/apps/${u(e)}`,a({ring:"admin",idempotent:true},n));}},Bt=class{constructor(e,n,r){this.tenantSlug=e;this.appSlug=n;this.root=r;this.data=new Ht(e,n,r.data);}tenantSlug;appSlug;root;data},Ht=class{constructor(e,n,r){this.tenantSlug=e;this.appSlug=n;this.rootData=r;}tenantSlug;appSlug;rootData;table(e){return this.rootData.table(this.tenantSlug,this.appSlug,e)}discover(e,n){return this.rootData.discover(this.tenantSlug,this.appSlug,e,n)}invalidateSchema(e){e===void 0?this.rootData.invalidateSchema():this.rootData.invalidateSchema(this.tenantSlug,this.appSlug,e);}};function Si(t){let e={clientId:String(t.client_id??""),raw:t};return t.client_id_issued_at!==void 0&&(e.clientIdIssuedAt=t.client_id_issued_at),t.client_name!==void 0&&(e.clientName=t.client_name),t.redirect_uris!==void 0&&(e.redirectUris=t.redirect_uris),t.grant_types!==void 0&&(e.grantTypes=t.grant_types),t.response_types!==void 0&&(e.responseTypes=t.response_types),t.scope!==void 0&&(e.scope=t.scope),t.token_endpoint_auth_method!==void 0&&(e.tokenEndpointAuthMethod=t.token_endpoint_auth_method),e}function sr(t){return {...t,id:String(t.id),clientId:t.client_id??t.id,tenantId:t.tenant_id??t.tenantId,redirectUris:t.redirect_uris??t.redirectUris,scopes:t.scopes??t.allowed_scopes}}function jt(t){return {accessToken:String(t.access_token??""),tokenType:String(t.token_type??"Bearer"),expiresIn:t.expires_in,refreshToken:t.refresh_token,scope:t.scope,raw:t}}function Ai(t){if(!t.name||t.name.trim()==="")throw new d({message:"name is required and must be non-empty",code:"validation_failed",category:"validation",httpStatus:0,retryable:false,requestId:"",fields:[{name:"name",code:"empty"}]});if(t.expiresInDays!==void 0&&t.expiresInDays<0)throw new d({message:"expiresInDays must be non-negative",code:"validation_failed",category:"validation",httpStatus:0,retryable:false,requestId:"",fields:[{name:"expiresInDays",code:"invalid_value"}]})}function ki(t){if(typeof t!="object"||t===null)return false;let e=t.user;if(typeof e!="object"||e===null)return false;let n=e;return typeof n.id=="string"&&typeof n.email=="string"}var rt=class{constructor(e,n){this.http=e;this.pat=new Ft(e,n),this.meClient=new Y(e),this.oauth=new Nt(e,n),this.oidc=new Vt(e,n),this.deviceCode=new Kt(e,n),this.systemOAuthClients=new zt(e),this.invitations=new Qt(e);}http;pat;meClient;oauth;oidc;deviceCode;systemOAuthClients;invitations;issuePersonalAccessToken(e,n){return this.pat.issue(e,n)}listPersonalAccessTokens(e){return this.pat.list(e)}revokePersonalAccessToken(e,n){return this.pat.revoke(e,n)}me(e){return this.meClient.get(e)}},Ft=class{constructor(e,n){this.http=e;this.defaultTenantSlug=n;}http;defaultTenantSlug;tenantQuery(){return this.defaultTenantSlug?{tenant_slug:this.defaultTenantSlug}:void 0}async issue(e,n){Ai(e);let r={name:e.name};e.expiresInDays!==void 0&&(r.expires_in_days=e.expiresInDays);let i=await this.http.request("POST","/api/v1/me/personal-access-tokens",a({ring:"admin",query:this.tenantQuery(),body:r,idempotent:false},n));return {patId:i.id,name:i.name,rawToken:i.raw_token,createdAt:i.created_at,expiresAt:i.expires_at}}async list(e){return (await this.http.request("GET","/api/v1/me/personal-access-tokens",a({ring:"admin",query:this.tenantQuery()},e))).items.map(r=>({id:r.id,name:r.name,createdAt:r.created_at,expiresAt:r.expires_at,lastUsedAt:r.last_used_at}))}async revoke(e,n){await this.http.request("DELETE",`/api/v1/me/personal-access-tokens/${u(e)}`,a({ring:"admin",query:this.tenantQuery(),idempotent:true},n));}},Y=class{constructor(e){this.http=e;}http;async get(e){let n=await this.http.request("GET","/api/v1/me",a({ring:"admin"},e));return ki(n)?{...n,userId:n.user.id,email:n.user.email,name:n.user.name,platformAdmin:n.user.platform_admin,tenants:n.tenants?.map(i=>({tenantId:i.tenant_id,tenantSlug:i.tenant_slug,role:i.role,isActive:i.is_active,iconUrl:i.icon_url}))}:n}},Nt=class{constructor(e,n){this.http=e;this.defaultTenantSlug=n;}http;defaultTenantSlug;tenantQuery(e={}){let n=this.defaultTenantSlug?{...e,tenant_slug:this.defaultTenantSlug}:e;return Object.keys(n).length>0?n:void 0}authorizeUrl(e){let n=new URLSearchParams({response_type:"code",client_id:e.clientId,redirect_uri:e.redirectUri});return this.defaultTenantSlug&&n.set("tenant_slug",this.defaultTenantSlug),e.scope&&n.set("scope",e.scope),e.state&&n.set("state",e.state),e.codeChallenge&&n.set("code_challenge",e.codeChallenge),e.codeChallengeMethod&&n.set("code_challenge_method",e.codeChallengeMethod),e.resource&&n.set("resource",e.resource),`/oauth/authorize?${n.toString()}`}async exchangeCode(e,n){if(!e.codeVerifier)throw new d({message:"codeVerifier is required for PKCE",code:"required",category:"validation",httpStatus:0,retryable:false,requestId:"",fields:[{name:"codeVerifier",code:"required"}]});let r=await this.http.request("POST","/oauth/token",a({ring:"public",query:this.tenantQuery(),form:{grant_type:"authorization_code",code:e.code,client_id:e.clientId,redirect_uri:e.redirectUri,code_verifier:e.codeVerifier,client_secret:e.clientSecret,resource:e.resource},idempotent:false},n));return jt(r)}async refreshTokens(e,n){let r=await this.http.request("POST","/oauth/token",a({ring:"public",query:this.tenantQuery(),form:{grant_type:"refresh_token",refresh_token:e.refreshToken,client_id:e.clientId,client_secret:e.clientSecret,resource:e.resource},idempotent:false},n));return jt(r)}async revoke(e,n){await this.http.request("POST","/oauth/revoke",a({ring:"public",query:this.tenantQuery(),form:{token:e.token,token_type_hint:e.tokenTypeHint,client_id:e.clientId},idempotent:true},n));}userinfo(e){return this.http.request("GET","/oauth/userinfo",a({ring:"admin"},e))}async registerMcpClient(e,n){let r=H({client_name:e.clientName,client_uri:e.clientUri,redirect_uris:e.redirectUris,grant_types:e.grantTypes,response_types:e.responseTypes,scope:e.scope,token_endpoint_auth_method:e.tokenEndpointAuthMethod,resource:e.resource,resources:e.resources,software_id:e.softwareId,software_version:e.softwareVersion}),i=await this.http.request("POST","/oauth/register",a({ring:"public",body:r,idempotent:false},n));return Si(i)}async selectTenant(e,n){return {redirectTo:(await this.http.request("POST","/oauth/authorize/tenant",a({ring:"admin",body:H({client_id:e.clientId,redirect_uri:e.redirectUri,tenant_id:e.tenantId,scope:e.scope,state:e.state,code_challenge:e.codeChallenge,code_challenge_method:e.codeChallengeMethod,nonce:e.nonce,resource:e.resource}),idempotent:false},n))).redirect_to??""}}async getClient(e,n){let r=await this.http.request("GET",`/api/v1/oauth-clients/${u(e)}`,a({ring:"admin"},n));return sr(r)}async revokeOwnGrant(e,n){await this.http.request("DELETE",`/api/v1/oauth/clients/${u(e)}/grants/me`,a({ring:"admin",idempotent:true},n));}},Qt=class{constructor(e){this.http=e;}http;async accept(e,n){await this.http.request("POST",`/api/v1/me/invitations/${u(e)}/accept`,a({ring:"admin",body:{},idempotent:false},n));}},Vt=class{constructor(e,n){this.http=e;this.defaultTenantSlug=n;}http;defaultTenantSlug;tenantQuery(e={}){let n=this.defaultTenantSlug?{...e,tenant_slug:this.defaultTenantSlug}:e;return Object.keys(n).length>0?n:void 0}discovery(e){return this.http.request("GET","/.well-known/openid-configuration",a({ring:"public"},e))}jwks(e){return this.http.request("GET","/.well-known/jwks.json",a({ring:"public"},e))}providers(e){return this.http.request("GET","/auth/providers",a({ring:"public",query:this.tenantQuery()},e))}async startURL(e,n,r){let i=await this.http.request("GET",`/auth/${u(e)}/start`,a({ring:"public",query:this.tenantQuery(H({redirect_to:n?.redirectTo,state:n?.state,return_origin:n?.returnOrigin})),parseBody:true},r));return i.url??i.redirect_url??`/auth/${u(e)}/start`}googleStartUrl(e){let n=new URLSearchParams;this.defaultTenantSlug&&n.set("tenant_slug",this.defaultTenantSlug),e?.returnTo&&n.set("return_to",e.returnTo),e?.returnOrigin&&n.set("return_origin",e.returnOrigin);let r=n.toString();return r?`/auth/google_oauth2/start?${r}`:"/auth/google_oauth2/start"}exchangeCallback(e,n){return this.http.request("GET",e.provider?`/auth/${u(e.provider)}/callback`:"/auth/oidc/callback",a({ring:"public",query:this.tenantQuery(H(e))},n)).then(jt)}githubStartUrl(e){let n=new URLSearchParams;this.defaultTenantSlug&&n.set("tenant_slug",this.defaultTenantSlug),e?.returnTo&&n.set("return_to",e.returnTo);let r=n.toString();return r?`/auth/github?${r}`:"/auth/github"}githubCallbackUrl(e){let n=new URLSearchParams;this.defaultTenantSlug&&n.set("tenant_slug",this.defaultTenantSlug),e.code&&n.set("code",e.code),e.state&&n.set("state",e.state),e.error&&n.set("error",e.error);let r=n.toString();return r?`/auth/github/callback?${r}`:"/auth/github/callback"}},Kt=class{constructor(e,n){this.http=e;this.defaultTenantSlug=n;}http;defaultTenantSlug;tenantQuery(){return this.defaultTenantSlug?{tenant_slug:this.defaultTenantSlug}:void 0}async request(e,n){let r=await this.http.request("POST","/oauth/device_authorization",a({ring:"public",query:this.tenantQuery(),form:{client_id:e.clientId,scope:e.scope},idempotent:false},n));return {deviceCode:r.device_code,userCode:r.user_code,verificationUri:r.verification_uri,verificationUriComplete:r.verification_uri_complete,expiresIn:r.expires_in,interval:r.interval??5,raw:r}}async poll(e,n){let r=e.intervalMs??5e3;for(;;)try{let i=await this.http.request("POST","/oauth/token",a({ring:"public",query:this.tenantQuery(),form:{grant_type:"urn:ietf:params:oauth:grant-type:device_code",device_code:e.deviceCode,client_id:e.clientId},idempotent:!1},{...n,signal:n?.signal??e.signal}));return jt(i)}catch(i){if(i instanceof B)r+=5e3;else if(!(i instanceof G))throw i;await new Promise((s,o)=>{let c=setTimeout(s,r);e.signal?.addEventListener("abort",()=>{clearTimeout(c),o(e.signal?.reason??i);},{once:true});});}}},zt=class{constructor(e){this.http=e;}http;async get(e,n){let r=await this.http.request("GET",`/api/v1/oauth-clients/${u(e)}`,a({ring:"admin"},n));return sr(r)}};var Ti=/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,it=class{me;cache=new Map;constructor(e){this.me=new Y(e);}async resolveTenantId(e,n){if(Ti.test(e))return e;let r=this.cache.get(e);if(r!==void 0)return r;let i=await this.me.get(n);for(let o of i.tenants??[])this.cache.set(o.tenantSlug,o.tenantId);let s=this.cache.get(e);if(s===void 0)throw new R({message:`tenant slug "${e}" not found among your memberships; pass a tenant UUID or join the tenant. Backend route /api/v1/tenants/{tenantID}/apps parses {tenantID} as a UUID.`,code:"tenant_id_required",category:"tenant_id_required",httpStatus:0,retryable:false,requestId:"",fields:[{name:"tenantId",code:"required"}]});return s}};function gn(t,e){if(Pi(t))return {...t,...e?.validate!==void 0?{validate:e.validate}:{}};let n={};for(let[i,s]of Object.entries(t.columns))n[i]={table:t.table,name:i,def:s};let r={table:t.table,columns:t.columns,cols:n};return e?.validate!==void 0&&(r.validate=e.validate),r}function Pi(t){return typeof t=="object"&&t!==null&&"table"in t&&"columns"in t&&"cols"in t}var or=1024,Ei=4,qi=6;function Wt(t){return t.length===0?t:t.replace(/[\\%_]/g,e=>`\\${e}`)}function Oi(t){if(t.length>or)throw new d({message:`LIKE pattern exceeds ${or} chars; refuse to compile`,code:"like_pattern_too_long",category:"validation",httpStatus:0,retryable:false,requestId:"",docUrl:"https://docs.axhub.dev/errors/validation/like-pattern"});let e=0,n=0;for(let r=0;r<t.length;r+=1){let i=t[r];if(i==="\\"){r+=1,e=0;continue}if(i==="%"){if(e+=1,e>=Ei)throw new d({message:`LIKE pattern has ${e} consecutive '%'; refuse to compile (ReDoS guard)`,code:"like_pattern_redos",category:"validation",httpStatus:0,retryable:false,requestId:"",docUrl:"https://docs.axhub.dev/errors/validation/like-pattern"})}else e===1&&(n+=1),e=0;}if(n>qi)throw new d({message:`LIKE pattern has ${n} '%X%' alternation segments; refuse to compile (ReDoS guard)`,code:"like_pattern_redos",category:"validation",httpStatus:0,retryable:false,requestId:"",docUrl:"https://docs.axhub.dev/errors/validation/like-pattern"})}function Di(t,e){return e?{op:"raw",sql:t,params:e}:{op:"raw",sql:t}}function Ui(...t){return {op:"and",clauses:t}}function Li(...t){return {op:"or",clauses:t}}function Mi(t){return {op:"not",clause:t}}function $i(t){let e=typeof t=="string"?t:t.name,n=(r,i)=>({op:r,column:e,value:i});return {eq:r=>n("eq",r),ne:r=>n("ne",r),gt:r=>n("gt",r),gte:r=>n("gte",r),lt:r=>n("lt",r),lte:r=>n("lte",r),in:r=>({op:"in",column:e,values:r}),like:{contains:r=>n("like",`%${Wt(r)}%`),startsWith:r=>n("like",`${Wt(r)}%`),endsWith:r=>n("like",`%${Wt(r)}`),raw:r=>(Oi(r),n("like",r))}}}function q(t,e,n){let r=t?.validate;if(r===void 0)return;if(!Gi(r))throw new K({message:"defineSchema validate option requires a Zod-compatible schema with safeParse()",code:"zod_missing",category:"configuration",httpStatus:0,retryable:false,requestId:"",resource:t?.table,docUrl:"https://docs.axhub.dev/errors/configuration/zod-missing"});let s=(n==="update"&&typeof r.partial=="function"?r.partial():r).safeParse(e);if(s.success)return;let o=s.error?.issues??[],c=o.map(l=>({name:l.path?.join(".")||"$",code:l.code??"invalid",message:l.message}));throw new d({message:`${o.length||1} validation failure${o.length===1?"":"s"} before network request`,code:"zod_validation_failed",category:"validation",httpStatus:0,retryable:false,requestId:"",resource:t?.table,fields:c,docUrl:"https://docs.axhub.dev/errors/validation/zod"})}function Gi(t){return typeof t=="object"&&t!==null&&typeof t.safeParse=="function"}var ar=100,ur=10,cr=5e3;async function dr(t,e,n,r,i){try{return await Hi(t,e,n,r,i)}catch(s){try{return await Bi(t,e,n,r,i)}catch{throw Fi(s,e,n,r)}}}async function Bi(t,e,n,r,i){let s=await t.request("GET",`/api/v1/tenants/${u(e)}/apps/${u(n)}/tables/${u(r)}/inspect`,a({ring:"admin"},i));return lr(r,s)}async function Hi(t,e,n,r,i){let s=await ji(t,e,n,i);if(!s)throw new M({message:`Dynamic data table '${r}' was not found`,code:"table_not_found",category:"not_found",httpStatus:404,retryable:false,requestId:"",resource:`${e}/${n}/${r}`,docUrl:"https://docs.axhub.dev/sdk/data#discover"});let o=await t.request("GET",`/api/v1/apps/${u(s)}/tables/${u(r)}`,a({ring:"admin"},i));return lr(r,o)}async function ji(t,e,n,r){let i=Date.now(),s;for(let o=0;o<ur;o+=1){if(r?.signal?.aborted)throw new h({message:"discover aborted while resolving app id",code:"aborted",category:"abort",httpStatus:0,retryable:false,requestId:""});if(Date.now()-i>cr)throw new $({message:`app lookup budget exceeded (${cr}ms) while searching for slug '${n}' in tenant '${e}'`,code:"introspect_failed",category:"internal",httpStatus:0,retryable:false,requestId:"",resource:`${e}/${n}`,docUrl:"https://docs.axhub.dev/sdk/data#discover"});let c=await t.request("GET","/api/v1/apps",a({ring:"admin",query:{tenant_slug:e,limit:ar,cursor:s}},r)),l=c.items??[],C=l.find(P=>P.slug===n&&typeof P.id=="string");if(C?.id)return C.id;if(o===0&&l.length===0||!c.next_cursor)return;s=c.next_cursor;}throw new z({message:`App lookup exceeded ${ur} pages \xD7 ${ar} apps without finding slug '${n}'`,code:"scan_limit_exceeded",category:"internal",httpStatus:0,retryable:false,requestId:"",resource:`${e}/${n}`,docUrl:"https://docs.axhub.dev/errors/internal/scan-limit-exceeded"})}function Fi(t,e,n,r){return t instanceof M||t instanceof $||t instanceof z||t instanceof h?t:Ki(t)?new M({message:`Dynamic data table '${r}' was not found`,code:"table_not_found",category:"not_found",httpStatus:404,retryable:false,requestId:zi(t),resource:`${e}/${n}/${r}`,cause:t,docUrl:"https://docs.axhub.dev/sdk/data#discover"}):fn(t)&&t.httpStatus>=500?new $({message:`Failed to introspect dynamic data table '${r}'`,code:"introspect_failed",category:"internal",httpStatus:t.httpStatus,retryable:t.retryable,requestId:t.requestId,resource:`${e}/${n}/${r}`,cause:t,docUrl:"https://docs.axhub.dev/sdk/data#discover"}):t instanceof Error?t:new Error(String(t))}var Ni=new Set(["__proto__","constructor","prototype"]),Qi=/^[A-Za-z_][A-Za-z0-9_]*$/;function lr(t,e){let n=e.columns??[],r=Object.create(null);for(let i of n)Ni.has(i.name)||Qi.test(i.name)&&(r[i.name]=Vi(i));return gn({table:e.tableName??e.table_name??e.name??t,columns:r})}function Vi(t){switch(t.type){case "uuid":return "uuid";case "int":case "integer":case "bigint":return "integer";case "float":case "numeric":case "double precision":case "real":return "number";case "bool":case "boolean":return "boolean";case "timestamp":case "timestamptz":case "timestamp with time zone":return "timestamp";case "json":case "jsonb":return "json";default:return "string"}}function Ki(t){return t instanceof f||fn(t)&&t.httpStatus===404}function fn(t){return typeof t=="object"&&t!==null&&"httpStatus"in t&&"requestId"in t}function zi(t){return fn(t)?t.requestId:""}function yn(t){if(t!==void 0)return [...t].join(",")}function J(t,e){if(e===void 0)return;if(e.length===0)throw new d({message:"select must include at least one column; omit select to fetch full rows",code:"select_empty",category:"validation",httpStatus:0,retryable:false,requestId:"",resource:t?.table,docUrl:"https://docs.axhub.dev/errors/validation/select-unknown-column"});if(!t)return;let n=new Set(Object.keys(t.columns)),r=e.filter(i=>!n.has(i));if(r.length!==0)throw new d({message:`select contains unknown column${r.length===1?"":"s"}: ${r.join(", ")}`,code:"select_unknown_column",category:"validation",httpStatus:0,retryable:false,requestId:"",resource:t.table,fields:r.map(i=>({name:i,code:"unknown_column"})),docUrl:"https://docs.axhub.dev/errors/validation/select-unknown-column"})}function st(t,e){if(e===void 0)return t;let n={};for(let r of e)r in t&&(n[r]=t[r]);return n}function Xt(t,e){return e===void 0?t:t.map(n=>st(n,e))}function Wi(t){if(typeof t!="object"||t===null)return false;let e=t.httpStatus;return typeof e=="number"&&e>=500}var ee=class{store=new Map;inflight=new Map;maxEntries;ttlMs;negativeTtlMs;writeCounter=0;constructor(e){this.maxEntries=Math.max(1,e?.maxEntries??1e3),this.ttlMs=Math.max(1,e?.ttlMs??3e5),this.negativeTtlMs=Math.max(0,e?.negativeTtlMs??3e4);}get size(){return this.store.size}get(e){let n=this.store.get(e);return n?n.expiresAt<=Date.now()?(this.store.delete(e),null):(this.store.delete(e),this.store.set(e,n),n.schema):null}set(e,n,r){this.writeCounter+=1;let i=this.writeCounter;this.store.delete(e),this.store.set(e,{schema:n,expiresAt:Date.now()+Math.max(1,r?.ttlMs??this.ttlMs),writeToken:i}),this.evictOverflow();}invalidate(e){if(e===void 0){this.store.clear(),this.inflight.clear();return}this.store.delete(e),this.inflight.delete(e);}async getOrSet(e,n,r){if(!r?.fresh){let c=this.get(e);if(c)return c;let l=this.inflight.get(e);if(l)return l}let i=this.store.get(e),s=this.writeCounter+1,o=n().then(c=>{let l=this.store.get(e);return (!l||l.writeToken<s)&&this.set(e,c,r),this.inflight.get(e)===o&&this.inflight.delete(e),c},c=>{throw this.inflight.get(e)===o&&this.inflight.delete(e),i&&this.negativeTtlMs>0&&Wi(c)&&(this.writeCounter+=1,this.store.delete(e),this.store.set(e,{schema:i.schema,expiresAt:Date.now()+this.negativeTtlMs,writeToken:this.writeCounter})),c});return this.inflight.set(e,o),o}evictOverflow(){for(;this.store.size>this.maxEntries;){let e=this.store.keys().next().value;if(e===void 0)return;this.store.delete(e);}}};function ot(t,e,n){return `${t}/${e}/${n}`}function hn(t){t!==void 0&&Rn(t,{allowAnd:true});}function bn(t){if(t===void 0)return {};let e={};for(let n of Rn(t,{allowAnd:true}))Xi(e,n.column,n.value);return e}function Xi(t,e,n){let r=t[e];r===void 0?t[e]=n:Array.isArray(r)?r.push(n):t[e]=[r,n];}function Rn(t,e){switch(t.op){case "eq":case "ne":case "gt":case "gte":case "lt":case "lte":case "like":return [{column:t.column,value:`${t.op}.${pr(t.value)}`}];case "in":{let n=t.values.map(i=>pr(i)),r=n.find(i=>i.includes(","));if(r!==void 0)throw mr(`IN filter values cannot contain commas because the live backend uses comma-separated IN lists (bad value: ${r})`,"filter_in_comma",t.column,"https://docs.axhub.dev/sdk/data#filter-in-comma");return [{column:t.column,value:`in.${n.join(",")}`}]}case "and":if(e.allowAnd)return t.clauses.flatMap(n=>Rn(n,{allowAnd:false}));break;}throw mr(`Data where clause '${t.op}' cannot be pushed to the live backend; use top-level and(eq/ne/gt/gte/lt/lte/in/like) only`,"unsupported_filter",void 0,"https://docs.axhub.dev/sdk/data#pushable-filters")}function pr(t){return t instanceof Date?t.toISOString():t===null?"null":typeof t=="string"||typeof t=="number"||typeof t=="boolean"||typeof t=="bigint"?String(t):JSON.stringify(t)}function mr(t,e,n,r){return new d({message:t,code:e,category:"validation",httpStatus:0,retryable:false,requestId:"",...n!==void 0?{resource:n}:{},...r!==void 0?{docUrl:r}:{}})}function ne(t,e){switch(e.op){case "eq":return e.value===null||t[e.column]===null||t[e.column]===void 0?false:t[e.column]===e.value;case "ne":return e.value===null||t[e.column]===null||t[e.column]===void 0?false:t[e.column]!==e.value;case "gt":{let n=t[e.column];return n==null||e.value===null||e.value===void 0?false:te(n,e.value)>0}case "gte":{let n=t[e.column];return n==null||e.value===null||e.value===void 0?false:te(n,e.value)>=0}case "lt":{let n=t[e.column];return n==null||e.value===null||e.value===void 0?false:te(n,e.value)<0}case "lte":{let n=t[e.column];return n==null||e.value===null||e.value===void 0?false:te(n,e.value)<=0}case "in":return t[e.column]===null||t[e.column]===void 0?false:e.values.filter(n=>n!==null).includes(t[e.column]);case "like":return Zi(t[e.column],String(e.value));case "and":return e.clauses.every(n=>ne(t,n));case "or":return e.clauses.some(n=>ne(t,n));case "not":return !ne(t,e.clause);case "raw":return true}}function te(t,e){return t==null||e===null||e===void 0?Number.NaN:typeof t=="number"&&typeof e=="number"?t-e:String(t).localeCompare(String(e))}function Zi(t,e){if(typeof t!="string")return false;let n="^";for(let r=0;r<e.length;r++){let i=e[r]??"";i==="\\"?(r+=1,n+=gr(e[r]??"")):i==="%"?n+=".*":i==="_"?n+=".":n+=gr(i);}return new RegExp(`${n}$`).test(t)}function gr(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Yi(t,e){let n=Rt(e);return n.length===0?[...t]:[...t].sort((r,i)=>{for(let s of n){let o=te(r[s.field],i[s.field]);if(!(Number.isNaN(o)||o===0))return s.dir==="desc"?-o:o}return 0})}function fr(t,e){let n=Yi(t,e?.orderBy);if(e?.after!==void 0||e?.before!==void 0)throw new v({message:"after/before keyset cursors are not supported by AX Hub offset pagination",code:"legacy_cursor",category:"validation",httpStatus:0,retryable:false,requestId:""});let r=Math.min(100,Math.max(1,Math.trunc(e?.pageSize??e?.limit??20))),i=e?.cursor===void 0?1:Ji(e.cursor),s=(i-1)*r,o=n.slice(s,s+r),c=s+r<n.length,l=i>1;return {items:o,nextCursor:c?String(i+1):null,firstCursor:l?String(i-1):null,hasNext:c,hasPrev:l}}function Ji(t){if(t.startsWith("v1:")||t.startsWith("v2:"))throw new v({message:"keyset cursor tokens are not supported by AX Hub offset pagination",code:"legacy_cursor",category:"validation",httpStatus:0,retryable:false,requestId:""});let e=Number(t);if(!Number.isInteger(e)||e<1)throw new _({message:"Plain mock cursor must be a positive integer page",code:"invalid_cursor",category:"validation",httpStatus:0,retryable:false,requestId:"",docUrl:"https://docs.axhub.dev/errors/validation/invalid-cursor"});return e}async function yr(t,e){F(e?.signal),J(t.schema,e?.select),hn(e?.where);let n=t.store.list(t.key);e?.where&&(n=n.filter(s=>ne(s,e.where)));let r=fr(n,e);return {items:Xt(r.items,e?.select),nextCursor:r.nextCursor,firstCursor:r.firstCursor,hasNext:r.hasNext,hasPrev:r.hasPrev,total:n.length,totalIsExact:true}}async function hr(t,e){F(e?.signal),hn(e?.where);let n=t.store.list(t.key);return e?.where?n.filter(r=>ne(r,e.where)).length:n.length}async function br(t,e,n){F(n?.signal),J(t.schema,n?.select);let r=t.store.get(t.key,e);if(!r)throw new f({message:`Mock row not found: ${t.key}/${e}`,code:"row_not_found",category:"not_found",httpStatus:404,retryable:false,requestId:"",resource:`${t.key}/${e}`});return st(r,n?.select)}async function Rr(t,e,n){return F(n?.signal),q(t.schema,e,"insert"),t.store.insert(t.key,e)}async function wr(t,e,n){F(n?.signal);for(let i of e)q(t.schema,i,"insert");let r=e.map(i=>t.store.insert(t.key,i));return {items:r,count:r.length}}async function vr(t,e,n,r){return F(r?.signal),q(t.schema,n,"update"),t.store.update(t.key,e,n)}async function _r(t,e,n){F(n?.signal),t.store.delete(t.key,e);}function F(t){if(t?.aborted)throw new h({message:"Mock operation aborted",code:"aborted",category:"abort",httpStatus:0,retryable:false,requestId:""})}var at=class{constructor(e,n){this.http=e;this.schemaCache=n?.schemaCache instanceof ee?n.schemaCache:new ee(n?.schemaCache),this.mockStore=n?.mockStore;}http;schemaCache;mockStore;table(e,n,r){let i=typeof r=="string"?void 0:r,s=typeof r=="string"?r:r.table;return new re(this.http,e,n,s,i,this.mockStore?{store:this.mockStore,key:ot(e,n,s),schema:i}:void 0)}scoped(e){return new wn(this,e)}async discover(e,n,r,i){let s=ot(e,n,r);if(this.mockStore){let c=this.mockStore.schema(s)??ts(r,this.mockStore.list(s));return new re(this.http,e,n,c.table,c,{store:this.mockStore,key:s,schema:c})}let o=await this.schemaCache.getOrSet(s,()=>dr(this.http,e,n,r,i),{fresh:i?.fresh,ttlMs:i?.ttlMs});return new re(this.http,e,n,o.table,o)}invalidateSchema(e,n,r){if(e!==void 0&&n!==void 0&&r!==void 0){this.schemaCache.invalidate(ot(e,n,r));return}this.schemaCache.invalidate();}},wn=class{constructor(e,n){this.data=e;this.tenantSlug=n;}data;tenantSlug;app(e){return new vn(this.data,this.tenantSlug,e)}},vn=class{constructor(e,n,r){this.data=e;this.tenantSlug=n;this.appSlug=r;}data;tenantSlug;appSlug;table(e){return this.data.table(this.tenantSlug,this.appSlug,e)}discover(e,n){return this.data.discover(this.tenantSlug,this.appSlug,e,n)}invalidateSchema(e){e===void 0?this.data.invalidateSchema():this.data.invalidateSchema(this.tenantSlug,this.appSlug,e);}},re=class{constructor(e,n,r,i,s,o){this.http=e;this.tenantSlug=n;this.appSlug=r;this.tableName=i;this.schema=s;this.mockRuntime=o;}http;tenantSlug;appSlug;tableName;schema;mockRuntime;path(e){let n=`/data/${u(this.tenantSlug)}/${u(this.appSlug)}/${u(this.tableName)}`;return e===void 0?n:`${n}/${u(e)}`}async list(e){if(this.mockRuntime)return yr(this.mockRuntime,e);J(this.schema,e?.select),rs(e,this.tableName);let n=ns(e?.cursor,e?.page,this.tableName),r=is(e?.pageSize??e?.limit);xr(e?.where,this.tableName,"list");let i={...bn(e?.where)};r!==void 0&&(i.per_page=r),n!==1&&(i.page=n);let s=Gn(e?.orderBy);s&&(i.sort=s);let o=yn(e?.select);o!==void 0&&(i._select=o);let c=await this.http.request("GET",this.path(),a({ring:"data",query:i},e)),l=Xt(c.items,e?.select),C=c.page??n,P=c.has_more??false,gt=C>1;return {items:l,nextCursor:P?String(C+1):null,firstCursor:gt?String(C-1):null,hasNext:P,hasPrev:gt,totalIsExact:false}}listAll(e){return A(n=>this.list({...e,...n}),e)}async count(e){return this.mockRuntime?hr(this.mockRuntime,e):(xr(e?.where,this.tableName,"count"),(await this.http.request("GET",`${this.path()}/_count`,a({ring:"data",query:bn(e?.where)},e))).count)}async get(e,n){if(this.mockRuntime)return br(this.mockRuntime,e,n);J(this.schema,n?.select);let r=yn(n?.select),i=await this.http.request("GET",this.path(e),a({ring:"data",query:r===void 0?void 0:{_select:r}},n));return st(i,n?.select)}async insert(e,n){return this.mockRuntime?Rr(this.mockRuntime,e,n):(q(this.schema,e,"insert"),this.http.request("POST",this.path(),a({ring:"data",body:e,idempotent:false},n)))}async insertMany(e,n){if(this.mockRuntime)return wr(this.mockRuntime,e,n);for(let s of e)q(this.schema,s,"insert");let r=[],i=n?.signal;for(let s of e){if(i?.aborted)throw new h({message:`insertMany aborted after ${r.length} of ${e.length} rows`,code:"aborted",category:"abort",httpStatus:0,retryable:false,requestId:"",resource:this.tableName});r.push(await this.insert(s,n));}return {items:r,count:r.length}}async update(e,n,r){return this.mockRuntime?vr(this.mockRuntime,e,n,r):(q(this.schema,n,"update"),this.http.request("PATCH",this.path(e),a({ring:"data",body:n,idempotent:false},r)))}async delete(e,n){if(this.mockRuntime)return _r(this.mockRuntime,e,n);await this.http.request("DELETE",this.path(e),a({ring:"data",idempotent:true},n));}},es=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function ts(t,e){let n={},r=e[0]??{id:"mock_id"};for(let[s,o]of Object.entries(r))typeof o=="number"?n[s]="number":typeof o=="boolean"?n[s]="boolean":o!==null&&typeof o=="object"?n[s]="json":typeof o=="string"&&es.test(o)||s==="id"?n[s]="uuid":n[s]="string";let i=Object.fromEntries(Object.entries(n).map(([s,o])=>[s,{table:t,name:s,def:o}]));return {table:t,columns:n,cols:i}}function ns(t,e,n){if(t!==void 0)return ss(t,n),Number(t);if(e===void 0)return 1;if(!Number.isInteger(e)||e<1)throw os("page must be a positive integer",n);return e}function xr(t,e,n){if(t===void 0)throw new d({message:`AxHub data ${n} requires at least one WHERE filter (the backend rejects unfiltered scans). Pass \`where: ...\`.`,code:"where_required",category:"validation",httpStatus:0,retryable:false,requestId:"",resource:e,docUrl:"https://docs.axhub.dev/sdk/data#filters"})}function rs(t,e){let n=t;if(n?.after!==void 0||n?.before!==void 0||n?.direction!==void 0)throw new v({message:"after/before keyset cursors are not supported by the live AX Hub data API; use cursor/page numeric offset pagination",code:"legacy_cursor",category:"validation",httpStatus:0,retryable:false,requestId:"",resource:e,docUrl:"https://docs.axhub.dev/errors/validation/legacy-cursor"})}function is(t){if(t!==void 0)return Number.isFinite(t)?Math.min(100,Math.max(1,Math.trunc(t))):100}function ss(t,e){if(t.length>Ze)throw new _({message:`Cursor token exceeds maximum size (${Ze} chars)`,code:"invalid_cursor",category:"validation",httpStatus:0,retryable:false,requestId:"",resource:e,docUrl:"https://docs.axhub.dev/errors/validation/invalid-cursor"});if(t.startsWith("v1:"))throw new v({message:"Legacy v1: cursor token is not compatible with AX Hub offset-only pagination; restart pagination without cursor",code:"legacy_cursor",category:"validation",httpStatus:0,retryable:false,requestId:"",resource:e,docUrl:"https://docs.axhub.dev/errors/validation/legacy-cursor"});if(Hn(t))throw new v({message:"v2 keyset cursors are not supported by the live AX Hub data API; restart pagination and use the numeric cursor returned by list()",code:"legacy_cursor",category:"validation",httpStatus:0,retryable:false,requestId:"",resource:e,docUrl:"https://docs.axhub.dev/errors/validation/legacy-cursor"});let n=Number(t);if(!Number.isInteger(n)||n<1)throw new _({message:"Plain cursor must be a positive integer page or a v2: keyset token",code:"invalid_cursor",category:"validation",httpStatus:0,retryable:false,requestId:"",resource:e,docUrl:"https://docs.axhub.dev/errors/validation/invalid-cursor"})}function os(t,e){return new _({message:t,code:"invalid_cursor",category:"validation",httpStatus:0,retryable:false,requestId:"",resource:e,docUrl:"https://docs.axhub.dev/errors/validation/invalid-cursor"})}function _n(t){return {id:t.id,appId:t.app_id,commitSha:t.commit_sha,status:t.status,currentStage:t.current_stage??null,imageUri:t.image_uri??null,triggerSource:t.trigger_source,startedAt:t.started_at??null,completedAt:t.completed_at??null,failureReason:t.failure_reason??null}}var ut=class{constructor(e,n){this.http=e;this.defaultTenantId=n;}http;defaultTenantId;async create(e,n){let r={};n?.commitSha!==void 0&&(r.commit_sha=n.commitSha),n?.forceRebuild!==void 0&&(r.force_rebuild=n.forceRebuild);let i=await this.http.request("POST",`/api/v1/apps/${encodeURIComponent(e)}/deployments`,{ring:"admin",body:r,idempotent:false});return _n(i)}async list(e,n){let r={};n?.pageSize!==void 0&&(r.per_page=n.pageSize),n?.cursor!==void 0&&(r.page=n.cursor);let i=await this.http.request("GET",`/api/v1/apps/${encodeURIComponent(e)}/deployments`,{ring:"admin",query:r});return {items:i.items.map(_n),nextCursor:i.next_cursor??(i.has_more??(i.page??Number(r.page??1))*(i.per_page??Number(r.per_page??20))<(i.total??0)?String((i.page??Number(r.page??1))+1):null),total:i.total}}listAll(e,n){return A(r=>this.list(e,r),n)}async get(e,n){let r=await this.http.request("GET",`/api/v1/apps/${encodeURIComponent(e)}/deployments/${encodeURIComponent(n)}`,{ring:"admin"});return _n(r)}async cancel(e,n){await this.http.request("POST",`/api/v1/apps/${encodeURIComponent(e)}/deployments/${encodeURIComponent(n)}/cancel`,{ring:"admin",body:{},idempotent:true});}async rollback(e,n){await this.http.request("POST",`/api/v1/apps/${encodeURIComponent(e)}/deployments/${encodeURIComponent(n)}/rollback`,{ring:"admin",body:{},idempotent:false});}async logs(e,n){let r={};n?.direction!==void 0&&(r.direction=n.direction),n?.cursor!==void 0&&(r.cursor=n.cursor),n?.since!==void 0&&(r.since=n.since),n?.until!==void 0&&(r.until=n.until),n?.limit!==void 0&&(r.limit=n.limit);let i=await this.http.request("GET",`/api/v1/apps/${encodeURIComponent(e)}/logs`,{ring:"admin",query:r});return {lines:(i.lines??[]).map(s=>({ts:s.ts??"",container:s.container??"",message:s.message??"",insertId:s.insert_id??""})),nextCursor:i.next_cursor??"",hasMore:i.has_more??false}}requireTenantId(e,n){if(this.defaultTenantId===void 0)throw new R({message:`deployments.${e} requires a tenant UUID: set defaultTenantId on AxHubClient. Backend route ${n} takes a tenant UUID, not a slug.`,code:"tenant_id_required",category:"tenant_id_required",httpStatus:0,retryable:false,requestId:"",fields:[{name:"tenantId",code:"required"}]});return this.defaultTenantId}async startBootstrap(e){let n=this.requireTenantId("startBootstrap","POST /api/v1/tenants/{tenantID}/app-bootstraps"),r={name:e.name,slug:e.slug,subdomain:e.subdomain,template_id:e.templateId,github_installation_id:e.githubInstallationId,github_owner:e.githubOwner,repo_name:e.repoName};e.repoPrivate!==void 0&&(r.repo_private=e.repoPrivate);let i=await this.http.request("POST",`/api/v1/tenants/${encodeURIComponent(n)}/app-bootstraps`,{ring:"admin",body:r,idempotent:false});return {bootstrapId:i.bootstrap_id,statusUrl:i.status_url}}async bootstrapStatus(e){let n=this.requireTenantId("bootstrapStatus","GET /api/v1/tenants/{tenantID}/app-bootstraps/{bootstrapID}"),r=await this.http.request("GET",`/api/v1/tenants/${encodeURIComponent(n)}/app-bootstraps/${encodeURIComponent(e)}`,{ring:"admin"}),i={id:r.id??e,stage:r.stage??"",status:r.status??""};return r.app_id&&(i.appId=r.app_id),r.deployment_id&&(i.deploymentId=r.deployment_id),r.repo_full_name&&(i.repoFullName=r.repo_full_name),r.error_code&&(i.errorCode=r.error_code),r.error_message&&(i.errorMessage=r.error_message),i}async githubAccounts(){return ((await this.http.request("GET","/api/v1/github/accounts",{ring:"admin"})).accounts??[]).map(n=>{let r={login:n.login??"",type:n.type??"",installed:n.installed??false};return n.installation_id!==void 0&&(r.installationId=n.installation_id),n.avatar_url!==void 0&&(r.avatarUrl=n.avatar_url),n.install_url!==void 0&&(r.installUrl=n.install_url),r})}async githubRepos(e,n){let r={};n?.page!==void 0&&(r.page=n.page),n?.perPage!==void 0&&(r.per_page=n.perPage);let i=await this.http.request("GET",`/api/v1/github/installations/${encodeURIComponent(String(e))}/repositories`,{ring:"admin",query:r});return {repositories:(i.repositories??[]).map(s=>({id:s.id??0,name:s.name??"",fullName:s.full_name??"",private:s.private??false,defaultBranch:s.default_branch??""})),totalCount:i.total_count??0}}};var ct=class{constructor(e,n){this.http=e;this.tenantResolver=n;}http;tenantResolver;scoped(e){return new Zt(this.http,e,this.tenantResolver)}async engines(e){return (await this.http.request("GET","/api/v1/engines",a({ring:"admin"},e))??[]).map(r=>({engine:r.engine??"",kind:r.kind??"",displayName:r.display_name??"",supportedActions:r.supported_actions??[],allowedEffects:r.allowed_effects??{}}))}},Zt=class{query;catalog;constructor(e,n,r){this.query=new xn(e,n,r),this.catalog=new Yt(e,n,r);}};function Cr(t,e){return new S({message:e,code:"required",category:"validation",httpStatus:0,retryable:false,requestId:"",fields:[{name:t,code:"required"}]})}function Sr(t){return (t??[]).map(e=>({name:e.name,dataType:e.data_type}))}function Ar(t,e){return (e??[]).map(n=>{let r={};return t.forEach((i,s)=>{r[i.name]=n[s]??null;}),r})}var xn=class{constructor(e,n,r){this.http=e;this.tenantIdOrSlug=n;this.tenantResolver=r;}http;tenantIdOrSlug;tenantResolver;async run(e,n){try{let r=e.connectorId??e.resourceId;if(!r)throw Cr("connectorId","gateway.query.run requires connectorId (or legacy resourceId)");if(!e.path)throw Cr("path","gateway.query.run requires resource path");let i=await this.http.request("POST",await this.base(),a({ring:"admin",body:{connector_id:r,path:e.path,sql:e.sql,params:e.params,row_limit:e.rowLimit},idempotent:!0},n)),s=Sr(i.columns),o=Ar(s,i.rows);return {allowed:i.allowed??!0,...i.deny_reason?{denyReason:i.deny_reason}:{},columns:s,rows:o,rowCount:o.length,...i.matched_policies?{matchedPolicies:i.matched_policies}:{}}}catch(r){throw typeof r=="object"&&r!==null&&"httpStatus"in r&&r.httpStatus===401?new L({message:"Gateway pool credentials are stale after refresh retry",code:"pool_stale",category:"unauthenticated",httpStatus:401,retryable:false,requestId:"requestId"in r?String(r.requestId):""}):r}}async base(){let e=this.tenantResolver?await this.tenantResolver.resolveTenantId(this.tenantIdOrSlug):this.tenantIdOrSlug;return `/api/v1/tenants/${u(e)}/gateway/query`}};function kr(t){return {allowed:t.allowed,...t.deny_reason?{denyReason:t.deny_reason}:{},...t.row_filter?{rowFilter:t.row_filter}:{},...t.mask?{mask:t.mask}:{},...t.input_schema!==void 0?{inputSchema:t.input_schema}:{},...t.result_schema!==void 0?{resultSchema:t.result_schema}:{}}}function as(t){return {...kr(t),...t.allowed_columns?{allowedColumns:t.allowed_columns}:{},...t.column_masks?{columnMasks:t.column_masks}:{}}}function Tr(t){return {id:t.id,connector:t.connector,connectorId:t.connector_id,path:t.path,url:t.url,...t.kind?{kind:t.kind}:{},type:t.type,name:t.name,attributes:t.attributes??{},tags:t.tags??[],permissions:{read:kr(t.permissions.read)}}}function us(t){return {id:t.id,connector:t.connector,connectorId:t.connector_id,path:t.path,url:t.url,...t.kind?{kind:t.kind}:{},type:t.type,name:t.name,attributes:t.attributes??{},tags:t.tags??[],ancestors:t.ancestors??[],children:(t.children??[]).map(Tr),permissions:{read:as(t.permissions.read)}}}function Ir(t){return t.split("/").map(e=>u(e)).join("/")}var Yt=class{constructor(e,n,r){this.http=e;this.tenantIdOrSlug=n;this.tenantResolver=r;}http;tenantIdOrSlug;tenantResolver;async listKinds(e){return ((await this.http.request("GET","/api/v1/catalog/kinds",a({ring:"admin"},e))).items??[]).map(r=>({kind:r.kind,engine:r.engine,displayName:r.display_name,invokable:r.invokable,actions:Object.fromEntries(Object.entries(r.actions??{}).map(([i,s])=>[i,{allowedEffects:s.allowed_effects??[],...s.input_schema!==void 0?{inputSchema:s.input_schema}:{},...s.result_schema!==void 0?{resultSchema:s.result_schema}:{}}]))}))}async listConnectors(e){return ((await this.http.request("GET",`${await this.base()}/connectors`,a({ring:"admin"},e))).items??[]).map(r=>({id:r.id,name:r.name,engine:r.engine,url:r.url,...r.description?{description:r.description}:{}}))}async listResources(e,n){let r={};return e?.search&&(r.search=e.search),e?.kind&&(r.kind=e.kind),e?.connector&&(r.connector=e.connector),e?.connectorId&&(r.connector_id=e.connectorId),e?.limit!==void 0&&(r.limit=e.limit),((await this.http.request("GET",`${await this.base()}/resources`,a({ring:"admin",query:r},n))).items??[]).map(Tr)}async getResource(e,n,r){return this.http.request("GET",`${await this.base()}/resources/${u(e)}/${Ir(n)}`,a({ring:"admin"},r)).then(us)}async invoke(e,n,r,i){let s=await this.http.request("POST",`${await this.base()}/resources/${u(e)}/${Ir(n)}:read`,a({ring:"admin",body:H({sql:r.sql,params:r.params,row_limit:r.rowLimit}),idempotent:true},i)),o=Sr(s.result?.columns),c=Ar(o,s.result?.rows);return {allowed:s.allowed??false,action:s.action,...s.deny_reason?{denyReason:s.deny_reason}:{},columns:o,rows:c,rowCount:c.length,...s.matched_policies?{matchedPolicies:s.matched_policies}:{}}}async hasAccess(e,n,r){try{return await this.getResource(e,n,r),!0}catch(i){if(i instanceof f)return false;throw i}}async base(){let e=this.tenantResolver?await this.tenantResolver.resolveTenantId(this.tenantIdOrSlug):this.tenantIdOrSlug;return `/api/v1/tenants/${u(e)}/catalog`}async listResourcesWithDetail(e,n){let r=await this.listResources(e,n);return Promise.all(r.map(i=>this.getResource(i.connector,i.path,n)))}};function cs(t){return t.allowed===true}function Pr(t){let e=t.denyReason??"";return t.allowed===false&&(e.startsWith("SQL \uD615\uC2DD \uC624\uB958:")||e.includes("safesql:"))}function ds(t){return t.allowed===false&&!Pr(t)}function ls(t){return t.permissions.read.allowedColumns??[]}function ps(t,e){return t.permissions.read.columnMasks?.[e]??null}function ms(t){let e=t.split("/").filter(Boolean);return e[e.length-1]??""}function Jt(t){let e={id:t.id,appId:t.app_id,requesterId:t.requester_id,status:t.status,createdAt:t.created_at,updatedAt:t.updated_at};t.reason!==void 0&&(e.reason=t.reason),t.reviewer_id!==void 0&&(e.reviewerId=t.reviewer_id);let n=t.reviewer_comment??t.review_comment;return n!==void 0&&(e.reviewerComment=n),e}var dt=class{constructor(e){this.http=e;}http;async get(e){let n=await this.http.request("GET",`/api/v1/review-requests/${encodeURIComponent(e)}`,{ring:"admin"});return Jt(n)}async approve(e,n){return this.settle(e,"approve",n)}async reject(e,n){return this.settle(e,"reject",n)}async settle(e,n,r){let i={};r?.comment!==void 0&&(i.comment=r.comment);let s=await this.http.request("POST",`/api/v1/review-requests/${encodeURIComponent(e)}/${n}`,{ring:"admin",body:i,idempotent:false});return Jt(s)}async listPending(e,n){if(!e||e.trim()==="")throw new S({message:"tenantId is required: GET /api/v1/review-requests/pending needs a tenant_id query parameter",code:"required",category:"validation",httpStatus:0,retryable:false,requestId:"",fields:[{name:"tenantId",code:"required"}]});let r={tenant_id:e};n?.pageSize!==void 0&&(r.per_page=n.pageSize),n?.cursor!==void 0&&(r.page=n.cursor);let i=await this.http.request("GET","/api/v1/review-requests/pending",{ring:"admin",query:r});return {items:i.items.map(Jt),nextCursor:i.next_cursor,total:i.total}}async history(e,n){if(!e||e.trim()==="")throw new S({message:"tenantId is required: GET /api/v1/review-requests/history needs a tenant_id query parameter",code:"required",category:"validation",httpStatus:0,retryable:false,requestId:"",fields:[{name:"tenantId",code:"required"}]});let r={tenant_id:e};n?.pageSize!==void 0&&(r.per_page=n.pageSize),n?.cursor!==void 0&&(r.page=n.cursor);let i=await this.http.request("GET","/api/v1/review-requests/history",{ring:"admin",query:r});return {items:i.items.map(Jt),nextCursor:i.next_cursor,total:i.total}}};function gs(t){return {...t,id:String(t.id),slug:String(t.slug),name:String(t.name),createdAt:t.created_at??t.createdAt,updatedAt:t.updated_at??t.updatedAt}}var lt=class{constructor(e){this.http=e;}http;async get(e,n){let r=await this.http.request("GET",`/api/v1/tenants/${u(e)}`,a({ring:"admin"},n));return gs(r)}};var pt=class{constructor(e){this.http=e;}http;async public(e){let n=await this.http.request("GET","/config/public",a({ring:"public"},e));return {...n,baseDomain:n.base_domain??""}}};var mt=class{initialFixtures;tables=new Map;schemas;nextId=1;constructor(e,n){this.initialFixtures=fs(e??{}),this.schemas=n??{},this.reset();}keys(){return [...this.tables.keys()]}schema(e){return this.schemas[e]}list(e){return [...this.tables.get(e)?.values()??[]].map(n=>({...n}))}get(e,n){let r=this.tables.get(e)?.get(n);return r?{...r}:null}insert(e,n){let r=typeof n.id=="string"?n.id:`mock_${this.nextId++}`,i=this.ensureTable(e);if(i.has(r))throw new g({message:`Mock row already exists: ${e}/${r}`,code:"duplicate_key",category:"conflict",httpStatus:409,retryable:false,requestId:"",resource:`${e}/${r}`});let o={created_at:new Date().toISOString(),...n,id:r};return i.set(r,o),{...o}}update(e,n,r){let i=this.ensureTable(e),s=i.get(n);if(!s)throw new f({message:`Mock row not found: ${e}/${n}`,code:"row_not_found",category:"not_found",httpStatus:404,retryable:false,requestId:"",resource:`${e}/${n}`});let o={...s,...r,id:n,updated_at:new Date().toISOString()};return i.set(n,o),{...o}}delete(e,n){let r=this.tables.get(e);if(!r||!r.has(n))throw new f({message:`Mock row not found: ${e}/${n}`,code:"row_not_found",category:"not_found",httpStatus:404,retryable:false,requestId:"",resource:`${e}/${n}`});r.delete(n);}reset(e){if(e!==void 0){this.tables.set(e,Er(this.initialFixtures[e]??[]));return}this.tables=new Map;for(let[n,r]of Object.entries(this.initialFixtures))this.tables.set(n,Er(r));}ensureTable(e){let n=this.tables.get(e);return n||(n=new Map,this.tables.set(e,n)),n}};function Er(t){let e=new Map;for(let n of t){let r=typeof n.id=="string"?n.id:`mock_${e.size+1}`;e.set(r,{...n,id:r});}return e}function fs(t){return Object.fromEntries(Object.entries(t).map(([e,n])=>[e,n.map(r=>({...r}))]))}function Cn(t){if(t.mode==="mock")return qr(),new mt(t.fixtures,t.schemas)}var ys=new Set(["1","true","yes","on"]);function hs(t){return t?.trim().toLowerCase()==="production"}function bs(t){return t===void 0?false:ys.has(t.trim().toLowerCase())}function qr(){if(hs(process.env.NODE_ENV)){if(bs(process.env.AX_HUB_ALLOW_MOCK_IN_PROD)){console.warn("[@ax-hub/sdk] WARNING: mock mode active in production (AX_HUB_ALLOW_MOCK_IN_PROD opt-in).");return}throw new $e({message:"Mock mode active in production without explicit opt-in",code:"mock_in_production",category:"configuration",httpStatus:0,retryable:false,requestId:"",docUrl:"https://docs.axhub.dev/errors/mock-in-production"})}}var Or="https://api.axhub.ai";function Rs(t){return typeof t=="object"&&t!==null&&"__sharedHttp"in t}var In=class t{http;defaultTenantSlug;defaultTenantId;logger;schemaCacheOptions;mock;tenantResolver;n;r;i;s;o;a;u;c;d;l;constructor(e){if(Rs(e)){this.http=e.__sharedHttp,this.defaultTenantSlug=e.defaultTenantSlug,this.defaultTenantId=e.defaultTenantId,this.logger=e.logger,this.schemaCacheOptions=e.schemaCacheOptions,this.mock=e.mockStore,this.tenantResolver=e.tenantResolver??new it(this.http);return}if(e.token!==void 0&&e.tokenType===void 0)throw new TypeError('AxHubClient requires tokenType when token is set ("pat" | "jwt")');let n=e.token!==void 0&&e.tokenType!==void 0?new We({token:e.token,tokenType:e.tokenType,onRefresh:e.onRefresh}):new Xe;this.http=new bt({baseUrl:e.baseUrl??Or,auth:n,fetch:e.fetch,logger:e.logger,debug:e.debug,timeoutMs:e.timeoutMs,idempotencyKey:e.idempotencyKey,retryPolicy:e.retryPolicy,rateLimitStrategy:e.rateLimitStrategy}),this.defaultTenantSlug=e.defaultTenantSlug,this.defaultTenantId=e.defaultTenantId,this.logger=e.logger??ht,this.schemaCacheOptions=e.schemaCache,this.mock=Cn(e),this.tenantResolver=new it(this.http);}resolveTenantSlug(e){let n=e??this.defaultTenantSlug;if(!n)throw new Me({message:"tenantSlug is required: set defaultTenantSlug on AxHubClient or pass tenantSlug per-call",code:"tenant_slug_required",category:"tenant_slug_required",httpStatus:0,retryable:false,requestId:""});return n}get apps(){return this.n||(this.n=new Ye(this.http,this.defaultTenantSlug,this.defaultTenantId,this.tenantResolver)),this.n}get data(){return this.r||(this.r=new at(this.http,{schemaCache:this.schemaCacheOptions,mockStore:this.mock})),this.r}get deployments(){return this.i||(this.i=new ut(this.http,this.defaultTenantId)),this.i}get config(){return this.c||(this.c=new pt(this.http)),this.c}get gateway(){return this.s||(this.s=new ct(this.http,this.tenantResolver)),this.s}get identity(){return this.o||(this.o=new rt(this.http,this.defaultTenantSlug)),this.o}get tenants(){return this.u||(this.u=new lt(this.http)),this.u}get cost(){return this.d||(this.d=new et(this.http,this.defaultTenantId,this.tenantResolver)),this.d}get inviteLinks(){return this.l||(this.l=new tt(this.http,this.tenantResolver)),this.l}get publicationRequests(){return this.a||(this.a=new dt(this.http)),this.a}withTenant(e){return new t({__sharedHttp:this.http,defaultTenantSlug:e,defaultTenantId:e===this.defaultTenantSlug?this.defaultTenantId:void 0,logger:this.logger,schemaCacheOptions:this.schemaCacheOptions,mockStore:this.mock,tenantResolver:this.tenantResolver})}tenant(e){return new nt(e,this.withTenant(e),this,this.tenantResolver)}};
2
+ exports.AbortError=h;exports.AccessDeniedError=W;exports.AlreadyAccessedError=we;exports.AlreadyActiveError=be;exports.AlreadyDeletedError=ae;exports.AlreadyInactiveError=Re;exports.AlreadyMemberError=oe;exports.AlreadyRevokedError=ye;exports.AlreadySettledError=he;exports.AppScopedClient=Bt;exports.AppScopedDataClient=Ht;exports.AppUnavailableError=De;exports.AppsClient=Ye;exports.AuthorizationPendingError=G;exports.AxHubClient=In;exports.AxHubError=p;exports.BadRequestError=Ee;exports.ConfigClient=pt;exports.ConfigurationError=K;exports.ConflictError=g;exports.CostClient=et;exports.DEFAULT_BASE_URL=Or;exports.DataClient=at;exports.DataTableClient=re;exports.DecodeError=Q;exports.DeploymentsClient=ut;exports.DeviceFlowDeniedError=nn;exports.DeviceFlowTimeoutError=rn;exports.DomainTakenError=Se;exports.DuplicateError=Ae;exports.EmptyError=Pe;exports.ExpiredTokenError=X;exports.ForbiddenError=pe;exports.GatewayCatalogClient=Yt;exports.GatewayClient=ct;exports.IdentityClient=rt;exports.IdentityDeviceCodeClient=Kt;exports.IdentityInvitationsClient=Qt;exports.IdentityMeClient=Y;exports.IdentityOAuthClient=Nt;exports.IdentityOIDCClient=Vt;exports.IdentityPATClient=Ft;exports.IdentitySystemOAuthClientsClient=zt;exports.InternalServerError=U;exports.IntrospectFailedError=$;exports.InvalidClientError=He;exports.InvalidCursorError=_;exports.InvalidExpiryError=Te;exports.InvalidGrantError=Ge;exports.InvalidPathError=V;exports.InvalidRequestError=je;exports.InvalidScopeError=Fe;exports.InvalidStateTransitionError=Ce;exports.InvalidTargetError=Be;exports.InvalidTokenError=Ne;exports.InvalidValueError=ke;exports.InvitationExpiredError=ge;exports.InviteLinksClient=tt;exports.LastAdminError=_e;exports.LegacyCursorError=v;exports.LinkInvalidError=fe;exports.MockInProductionError=$e;exports.MockStore=mt;exports.NetworkError=Ue;exports.NoAuth=Xe;exports.NotAdminError=le;exports.NotAllowedError=Oe;exports.NotDeletedError=ve;exports.NotFoundError=f;exports.NotMemberError=qe;exports.OAuthError=y;exports.OAuthServerError=Ke;exports.PendingExistsError=xe;exports.PermanentlyDeletedError=me;exports.PermissionDeniedError=T;exports.PoolStaleError=L;exports.PreconditionFailedError=ie;exports.PublicationRequestsClient=dt;exports.RateLimitedError=D;exports.RequiredError=S;exports.ScanLimitExceededError=z;exports.SchemaCache=ee;exports.SchemaNameTakenError=Ie;exports.SlowDownError=B;exports.SlugTakenError=se;exports.StaticTokenAuth=We;exports.StreamConsumedError=ft;exports.TableNotFoundError=M;exports.TemporarilyUnavailableError=ze;exports.TenantCostClient=j;exports.TenantGatewayClient=Zt;exports.TenantIdRequiredError=R;exports.TenantInviteLinksClient=Z;exports.TenantScopedAppsClient=Gt;exports.TenantScopedClient=nt;exports.TenantSlugRequiredError=Me;exports.TenantsClient=lt;exports.TimeoutError=Le;exports.TokenExpiredError=ce;exports.TokenInvalidError=de;exports.TokenMissingError=ue;exports.UnauthenticatedError=k;exports.UnauthorizedClientError=Qe;exports.UnavailableError=N;exports.UnsupportedGrantTypeError=Ve;exports.ValidationError=d;exports.WebhookVerificationError=tn;exports.and=Ui;exports.asAppId=Gr;exports.asAppSlug=Fr;exports.asDeploymentId=Br;exports.asPatId=Nr;exports.asRequestId=Vr;exports.asTenantId=Hr;exports.asTenantSlug=jr;exports.asUserId=Qr;exports.assertMockModeAllowed=qr;exports.createMockStore=Cn;exports.cursorFromRow=ri;exports.decodeCursor=ti;exports.defineSchema=gn;exports.encodeCursor=$n;exports.escapeLike=Wt;exports.formatErrorMessage=Sn;exports.getAccessibleColumns=ls;exports.getMaskHint=ps;exports.id=zr;exports.isAllowed=cs;exports.isPolicyDeny=ds;exports.isSqlFormatError=Pr;exports.not=Mi;exports.or=Li;exports.orderByFingerprint=ni;exports.parseRetryAfter=on;exports.raw=Di;exports.schemaCacheKey=ot;exports.signWebhook=ai;exports.tableFromPath=ms;exports.verifyWebhook=ui;exports.where=$i;