@ax-hub/sdk 1.0.2 → 2.0.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/README.md CHANGED
@@ -104,8 +104,8 @@ Prefer scoped clients in examples:
104
104
 
105
105
  ```ts
106
106
  const acme = sdk.tenant('acme')
107
- await acme.apps.create({ slug: 'crm', name: 'CRM' })
108
- await acme.app('crm').tables.inspect('orders')
107
+ const app = await acme.apps.create({ slug: 'crm', name: 'CRM' })
108
+ await sdk.apps.tables.inspect(app.id, 'orders')
109
109
  await acme.app('crm').data.table('orders').list()
110
110
  ```
111
111
 
@@ -207,24 +207,25 @@ const minimal = await ordersProjection.list({ select: ['id', 'total'] as const }
207
207
  minimal.items[0].total // number
208
208
  ```
209
209
 
210
- ### Bidirectional cursor pagination
210
+ ### Offset pagination
211
211
 
212
- `list({ after, before, orderBy, limit })` supports v2 keyset cursor tokens, first-row cursors for "previous page", and order fingerprint validation. Numeric `cursor` remains as a legacy page alias for Phase-D callers.
212
+ Backend-main data routes are offset/page based. Use `pageSize` with the numeric string `cursor` returned by the previous page. `after`, `before`, `direction`, and `v1:`/`v2:` keyset tokens are rejected with `LegacyCursorError` because the backend does not support keyset cursors.
213
213
 
214
- Cursor format: SDK-generated tokens use `v2:<base64-url>` and carry an order-fingerprint + table-scope binding. The SDK rejects `v1:` tokens with `LegacyCursorError`, malformed/oversized (> 4096 chars) tokens with `InvalidCursorError`, and a cursor minted on table A replayed against table B with `InvalidCursorError` (`code: cursor_context_mismatch`). When the SDK applies a `where` clause client-side, `PaginatedList.totalIsExact` is `false` and `total` reflects the backend's unfiltered total — iterate or wait for backend filter pushdown before relying on `total`.
214
+ `total` is optional: use `items` and `nextCursor` for iteration, or call `count()` when you need a backend count for the same pushable `where` filter.
215
215
 
216
216
  ```ts
217
217
  const OrdersCursor = defineSchema({ table: 'orders', columns: { id: 'uuid' } })
218
218
  const ordersCursor = sdk.tenant('acme').app('crm').data.table(OrdersCursor)
219
- const first = await ordersCursor.list({ limit: 50, orderBy: [{ field: 'id', dir: 'asc' }] })
220
- const next = await ordersCursor.list({ after: first.nextCursor!, orderBy: [{ field: 'id', dir: 'asc' }] })
221
- const prev = await ordersCursor.list({ before: next.firstCursor!, orderBy: [{ field: 'id', dir: 'asc' }] })
222
- void prev
219
+ const first = await ordersCursor.list({ pageSize: 50 })
220
+ const next = first.nextCursor
221
+ ? await ordersCursor.list({ cursor: first.nextCursor, pageSize: 50 })
222
+ : null
223
+ void next
223
224
  ```
224
225
 
225
226
  ### Mock mode
226
227
 
227
- Use mock mode for backend-free unit tests, examples, and agent CI. Fixtures are isolated per client and still exercise where/projection/cursor/Zod behavior. Keep fixture sets small enough for in-memory tests (recommended ≤10K rows per process); use the real backend for load/perf scenarios.
228
+ Use mock mode for backend-free unit tests, examples, and agent CI. Fixtures are isolated per client and still exercise where/projection/offset pagination/Zod behavior. Keep fixture sets small enough for in-memory tests (recommended ≤10K rows per process); use the real backend for load/perf scenarios.
228
229
 
229
230
  ```ts
230
231
  const sdk = new AxHubClient({
@@ -372,7 +373,7 @@ Target was < 10ms p99 — 100x+ headroom in every path.
372
373
 
373
374
  ## Backend dependency
374
375
 
375
- Pinned against backend `main` (177 routes, 42 error codes). Re-generate types via `npm run generate` + `npm run extract-codes` after backend swagger updates.
376
+ Pinned against backend `main` (189 routes, 43 error codes). Re-generate types via `npm run generate` + `npm run extract-codes` after backend swagger updates.
376
377
 
377
378
  ## License
378
379
 
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 Lr(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 Mr(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)&&Mr(t.body)?Gr(t):Lr(t.body)?$r(t):new Q({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=An[n.code];if(s)return new s(i);let o=kn[n.category]??p;return new o(i)}function Gr(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 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}function Kr(t){return t}var zr=/^[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(!zr.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 Wr={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 Xr=new Set(["authorization","x-api-key","cookie","set-cookie","proxy-authorization"]),Zr="***REDACTED***";function Dn(t){let e={},n=(r,i)=>{e[r]=Xr.has(r.toLowerCase())?Zr: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 Yr(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,!Yr(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 Jr=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=Jr.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")),Ur=new D({message:ei(en)??"Rate limited",code:ti(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 Ur}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 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 Ze=4096,Mn=false;function $n(t){return `v2:${Buffer.from(JSON.stringify(t),"utf8").toString("base64url")}`}function ni(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(!si(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 ri(t){return JSON.stringify(Bn(t))}function ii(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 si(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 ai(t){let e=t.startsWith("sha256=")?t.slice(7):t;return /^[0-9a-f]{64}$/i.test(e)?Buffer.from(e,"hex"):null}function ui(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 ci(t){if(!t.secret)return {ok:false,reason:"missing_secret"};let e=ai(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(di(n))return null;throw n}}};function di(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 li(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){li(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 pi(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 mi(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=pi(t.category)),t.owner!==void 0&&(e.owner=mi(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 gi(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(gi)}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 fi(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 fi(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 yi(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 yi(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(hi(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 hi(t){return typeof t=="object"&&t!==null&&"httpStatus"in t&&t.httpStatus===404}function bi(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,bi)}};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 Ri(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 Ri(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 wi(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 vi(t){let e={name:t.name,type:wi(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(vi),createdAt:t.created_at??"",updatedAt:t.updated_at??""}}function _i(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 _i(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 xi(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(Ci),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(Ii)}}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 xi(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 Ci(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 Ii(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 Si(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 Si(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 Ai(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 ki(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 Ti(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){ki(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 Ti(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 Ai(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 Pi=/^[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(Pi.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(Ei(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 Ei(t){return typeof t=="object"&&t!==null&&"table"in t&&"columns"in t&&"cols"in t}var or=1024,qi=4,Oi=6;function Wt(t){return t.length===0?t:t.replace(/[\\%_]/g,e=>`\\${e}`)}function Di(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>=qi)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>Oi)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 Ui(t,e){return e?{op:"raw",sql:t,params:e}:{op:"raw",sql:t}}function Li(...t){return {op:"and",clauses:t}}function Mi(...t){return {op:"or",clauses:t}}function $i(t){return {op:"not",clause:t}}function Gi(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=>(Di(r),n("like",r))}}}function q(t,e,n){let r=t?.validate;if(r===void 0)return;if(!Bi(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 Bi(t){return typeof t=="object"&&t!==null&&typeof t.safeParse=="function"}var ar=100,ur=10,cr=5e3;async function lr(t,e,n,r,i){try{return await Hi(t,e,n,r,i)}catch(s){if(mr(s))try{return await ji(t,e,n,r,i)}catch(o){throw dr(o,e,n,r)}throw dr(s,e,n,r)}}async function Hi(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 pr(r,s)}async function ji(t,e,n,r,i){let s=await Fi(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 pr(r,o)}async function Fi(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 dr(t,e,n,r){return t instanceof M||t instanceof $||t instanceof z||t instanceof h?t:mr(t)?new M({message:`Dynamic data table '${r}' was not found`,code:"table_not_found",category:"not_found",httpStatus:404,retryable:false,requestId:Ki(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 pr(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 mr(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 Ki(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 zi(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&&zi(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}))Wi(e,n.column,n.value);return e}function Wi(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}.${gr(t.value)}`}];case "in":{let n=t.values.map(i=>gr(i)),r=n.find(i=>i.includes(","));if(r!==void 0)throw fr(`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 fr(`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 gr(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 fr(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 Xi(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 Xi(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+=yr(e[r]??"")):i==="%"?n+=".*":i==="_"?n+=".":n+=yr(i);}return new RegExp(`${n}$`).test(t)}function yr(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Zi(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 hr(t,e){let n=Zi(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:Yi(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 Yi(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 br(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=hr(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 Rr(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 wr(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 vr(t,e,n){return F(n?.signal),q(t.schema,e,"insert"),t.store.insert(t.key,e)}async function _r(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 xr(t,e,n,r){return F(r?.signal),q(t.schema,n,"update"),t.store.update(t.key,e,n)}async function Cr(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)??es(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,()=>lr(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 br(this.mockRuntime,e);J(this.schema,e?.select),ns(e,this.tableName);let n=ts(e?.cursor,e?.page,this.tableName),r=rs(e?.pageSize??e?.limit),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?Rr(this.mockRuntime,e):(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 wr(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?vr(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 _r(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?xr(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 Cr(this.mockRuntime,e,n);await this.http.request("DELETE",this.path(e),a({ring:"data",idempotent:true},n));}},Ji=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function es(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"&&Ji.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 ts(t,e,n){if(t!==void 0)return is(t,n),Number(t);if(e===void 0)return 1;if(!Number.isInteger(e)||e<1)throw ss("page must be a positive integer",n);return e}function ns(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 rs(t){if(t!==void 0)return Number.isFinite(t)?Math.min(100,Math.max(1,Math.trunc(t))):100}function is(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 ss(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 Ir(t,e){return new S({message:e,code:"required",category:"validation",httpStatus:0,retryable:false,requestId:"",fields:[{name:t,code:"required"}]})}function Ar(t){return (t??[]).map(e=>({name:e.name,dataType:e.data_type}))}function kr(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 Ir("connectorId","gateway.query.run requires connectorId (or legacy resourceId)");if(!e.path)throw Ir("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=Ar(i.columns),o=kr(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 Tr(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 os(t){return {...Tr(t),...t.allowed_columns?{allowedColumns:t.allowed_columns}:{},...t.column_masks?{columnMasks:t.column_masks}:{}}}function Pr(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:Tr(t.permissions.read)}}}function as(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(Pr),permissions:{read:os(t.permissions.read)}}}function Sr(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(Pr)}async getResource(e,n,r){return this.http.request("GET",`${await this.base()}/resources/${u(e)}/${Sr(n)}`,a({ring:"admin"},r)).then(as)}async invoke(e,n,r,i){let s=await this.http.request("POST",`${await this.base()}/resources/${u(e)}/${Sr(n)}:read`,a({ring:"admin",body:H({sql:r.sql,params:r.params,row_limit:r.rowLimit}),idempotent:true},i)),o=Ar(s.result?.columns),c=kr(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 us(t){return t.allowed===true}function Er(t){let e=t.denyReason??"";return t.allowed===false&&(e.startsWith("SQL \uD615\uC2DD \uC624\uB958:")||e.includes("safesql:"))}function cs(t){return t.allowed===false&&!Er(t)}function ds(t){return t.permissions.read.allowedColumns??[]}function ls(t,e){return t.permissions.read.columnMasks?.[e]??null}function ps(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 ms(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 ms(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=gs(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,qr(this.initialFixtures[e]??[]));return}this.tables=new Map;for(let[n,r]of Object.entries(this.initialFixtures))this.tables.set(n,qr(r));}ensureTable(e){let n=this.tables.get(e);return n||(n=new Map,this.tables.set(e,n)),n}};function qr(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 gs(t){return Object.fromEntries(Object.entries(t).map(([e,n])=>[e,n.map(r=>({...r}))]))}function Cn(t){if(t.mode==="mock")return Or(),new mt(t.fixtures,t.schemas)}var fs=new Set(["1","true","yes","on"]);function ys(t){return t?.trim().toLowerCase()==="production"}function hs(t){return t===void 0?false:fs.has(t.trim().toLowerCase())}function Or(){if(ys(process.env.NODE_ENV)){if(hs(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 Dr="https://api.axhub.ai";function bs(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(bs(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??Dr,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=Dr;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=Li;exports.asAppId=Br;exports.asAppSlug=Nr;exports.asDeploymentId=Hr;exports.asPatId=Qr;exports.asRequestId=Kr;exports.asTenantId=jr;exports.asTenantSlug=Fr;exports.asUserId=Vr;exports.assertMockModeAllowed=Or;exports.createMockStore=Cn;exports.cursorFromRow=ii;exports.decodeCursor=ni;exports.defineSchema=gn;exports.encodeCursor=$n;exports.escapeLike=Wt;exports.formatErrorMessage=Sn;exports.getAccessibleColumns=ds;exports.getMaskHint=ls;exports.id=Wr;exports.isAllowed=us;exports.isPolicyDeny=cs;exports.isSqlFormatError=Er;exports.not=$i;exports.or=Mi;exports.orderByFingerprint=ri;exports.parseRetryAfter=on;exports.raw=Ui;exports.schemaCacheKey=ot;exports.signWebhook=ui;exports.tableFromPath=ps;exports.verifyWebhook=ci;exports.where=Gi;