@ax-hub/sdk 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/README.md +11 -26
- package/dist/cli/doctor.cjs +1 -1
- package/dist/cli/doctor.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +1 -46
- package/dist/index.d.ts +1 -46
- package/dist/index.js +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [0.3.0] — 2026-05-26
|
|
6
|
+
|
|
7
|
+
gateway 거버넌스 surface(`engines`/`connectors`/`resources`, `@adminOnly`)를 SDK 에서 제거하고 member-facing surface(`query` + `catalog`)만 유지 (ADR-0041). SDK 1차 사용자(코딩 에이전트 + member-token 앱)는 거버넌스 메서드로 항상 403 을 받았고, connector/engine 관리는 콘솔 관리자 작업이다.
|
|
8
|
+
|
|
9
|
+
### BREAKING
|
|
10
|
+
|
|
11
|
+
- `gateway.{engines,connectors,resources}` 제거. member token 은 이들에 항상 `ForbiddenError`(403)였음. connector 목록·이름→UUID 는 `gateway.catalog.listConnectors()` 사용 — `CatalogConnector.id` 는 동일 connector UUID 라 `query.run({ connectorId })` 에 그대로 사용.
|
|
12
|
+
- 공개 타입 `GatewayEngine`/`GatewayConnector`/`GatewayResource` 제거.
|
|
13
|
+
- `TenantGatewayClient` 는 `query` + `catalog` props 만 노출. `GatewayClient`/`TenantGatewayClient`/`GatewayCatalogClient`, `query`/`catalog`, 모든 `Catalog*`·`GatewayQuery*` 타입·응답 헬퍼는 유지.
|
|
14
|
+
|
|
5
15
|
## [0.2.0] — 2026-05-26
|
|
6
16
|
|
|
7
17
|
나머지 6개 BC(identity·tenants·audit·apps·deploy·schema)를 backend golden routes + handler shape 와 전수 대조해 발견한 drift 일괄 수정 (ADR-0040). 라이브 PAT smoke 로 fixed read + 회귀 검증 (`discover.search`/`listMine`/`integrityCheck` 동작, authz/gateway/audit 무손상).
|
package/README.md
CHANGED
|
@@ -59,12 +59,12 @@ console.log(app.slug, paid.total)
|
|
|
59
59
|
| `sdk.apps.templates` | app template listing |
|
|
60
60
|
| `sdk.apps.tables` | `list`, `create`, `delete`, `addColumn`, `dropColumn`, `listGrants`, `addGrant`, `revokeGrant` (schema admin) |
|
|
61
61
|
| `sdk.publicationRequests` | `get`, `approve`, `reject`, `listPending` (reviewer/admin namespace — separate from owner-scoped `sdk.apps.publication`) |
|
|
62
|
-
| `sdk.deployments` | `create`, `list`, `listAll`, `get`, `cancel`, `rollback
|
|
63
|
-
| `sdk.identity` | `pat.*`, `oauth.*`, `oidc.*`, `deviceCode.*`, `idp.*`, `systemOAuthClients
|
|
62
|
+
| `sdk.deployments` | `create`, `list`, `listAll`, `get`, `cancel`, `rollback` |
|
|
63
|
+
| `sdk.identity` | `pat.*`, `oauth.*`, `oidc.*`, `deviceCode.*`, `idp.*`, `systemOAuthClients.get`, `me` |
|
|
64
64
|
| `sdk.tenants` | tenant CRUD, members, invitations, email domains, icon upload |
|
|
65
65
|
| `sdk.authz` | PBAC tags/subjects/grants + `evaluator.decide/decideMany` |
|
|
66
66
|
| `sdk.audit` | events, integrity check, anonymize, server-only emit |
|
|
67
|
-
| `sdk.gateway` |
|
|
67
|
+
| `sdk.gateway` | `query.run` (parameterized read), `catalog` (member: list / getResource / invoke) |
|
|
68
68
|
| `sdk.data` | `/data/{tenantSlug}/{appSlug}/{table}` CRUD + bulk + typed DSL |
|
|
69
69
|
|
|
70
70
|
The committed generated route inventory currently tracks the pinned backend swagger snapshot; future backend-only BCs are surfaced by `npm run route-inventory-diff`.
|
|
@@ -72,7 +72,7 @@ The committed generated route inventory currently tracks the pinned backend swag
|
|
|
72
72
|
### `sdk.apps.list` vs `sdk.apps.listMine`
|
|
73
73
|
|
|
74
74
|
- `list()` — returns apps in the **resolved tenant** (via `defaultTenantSlug` or `withTenant`). Tenant-scoped.
|
|
75
|
-
- `listMine()` — returns
|
|
75
|
+
- `listMine()` — returns the caller's **workspace** apps (owned + apps they've been granted access to), regardless of tenant ownership. Useful for per-user "my dashboard" views. Wraps `GET /me/apps/workspace`.
|
|
76
76
|
|
|
77
77
|
### `sdk.apps.publication` vs `sdk.publicationRequests`
|
|
78
78
|
|
|
@@ -129,7 +129,7 @@ const sdk = new AxHubClient({
|
|
|
129
129
|
### OAuth Two Worlds
|
|
130
130
|
|
|
131
131
|
- `sdk.apps.oauthClients` — an app acts as IdP for its own external users.
|
|
132
|
-
- `sdk.identity.systemOAuthClients` —
|
|
132
|
+
- `sdk.identity.systemOAuthClients.get` — fetch a system OAuth client by id (the only global OAuth-client route). Creating one is **app-scoped** via `sdk.apps.oauthClients.create`.
|
|
133
133
|
|
|
134
134
|
## Dynamic Data + Query DSL
|
|
135
135
|
|
|
@@ -261,16 +261,17 @@ try {
|
|
|
261
261
|
}
|
|
262
262
|
```
|
|
263
263
|
|
|
264
|
-
### Gateway catalog
|
|
264
|
+
### Gateway catalog + query (v0.1)
|
|
265
265
|
|
|
266
|
-
`sdk.tenant(slug).gateway`
|
|
266
|
+
`sdk.tenant(slug).gateway` is member-facing — discover what you can read, then query it:
|
|
267
267
|
|
|
268
|
-
- **`catalog.*`** —
|
|
269
|
-
- **`
|
|
268
|
+
- **`catalog.*`** — `listKinds` / `listConnectors` / `listResources` / `getResource` / `invoke` (+ `hasAccess`, `listResourcesWithDetail`).
|
|
269
|
+
- **`query.run(...)`** — parameterized read against a connector resource (pass `connectorId` from `catalog.listConnectors()`).
|
|
270
|
+
|
|
271
|
+
> Admin-only connector/resource/engine governance is **not** in the SDK (removed in 0.3.0, ADR-0041) — manage those in the AX Hub console.
|
|
270
272
|
|
|
271
273
|
| Situation | What you get |
|
|
272
274
|
|-----------|--------------|
|
|
273
|
-
| member calls an `@adminOnly` governance method | `ForbiddenError` thrown |
|
|
274
275
|
| `catalog.getResource(c, p)` on a denied/absent path | `NotFoundError` thrown — denial and absence are indistinguishable (strict zero-trust). Use `hasAccess()` for a non-throwing boolean. |
|
|
275
276
|
| `catalog.invoke(...)` / `query.run(...)` policy deny | **no throw** — `{ allowed: false, denyReason }` at HTTP 200. Branch with `isPolicyDeny()` / `isSqlFormatError()`. |
|
|
276
277
|
| query references a column outside `allowedColumns` | `InternalServerError` (500, do not auto-retry) — point the user at `getAccessibleColumns(detail)`. |
|
|
@@ -285,22 +286,6 @@ else if (isSqlFormatError(res)) showFixHint(res.denyReason) // backend "safesql:
|
|
|
285
286
|
else renderRows(res.rows)
|
|
286
287
|
```
|
|
287
288
|
|
|
288
|
-
## Streaming (SSE)
|
|
289
|
-
|
|
290
|
-
```ts
|
|
291
|
-
const controller = new AbortController()
|
|
292
|
-
for await (const ev of sdk.deployments.streamBuildLogs(appId, deploymentId, { signal: controller.signal })) {
|
|
293
|
-
if (ev.type === 'item') {
|
|
294
|
-
console.log(ev.value.line)
|
|
295
|
-
if (ev.value.line.includes('ERROR')) controller.abort()
|
|
296
|
-
} else if (ev.type === 'gap') {
|
|
297
|
-
console.warn('lost some log frames since', ev.sinceId)
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
```
|
|
301
|
-
|
|
302
|
-
Single-consumer iterator. Calling `for await` twice throws `StreamConsumedError`. Backend currently re-replays the ring buffer on every reconnect (200 events cap), so SDK does client-side dedupe + gap detection. `Last-Event-ID` header is sent for forward compatibility.
|
|
303
|
-
|
|
304
289
|
## Webhook Handling
|
|
305
290
|
|
|
306
291
|
```ts
|
package/dist/cli/doctor.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
'use strict';var
|
|
2
|
+
'use strict';var r=I;(function(Q,p){var E=I,m=Q();while(!![]){try{var H=parseInt(E(0x164))/(-0xa0*-0x3a+-0x871+-0x1bce)+parseInt(E(0x16c))/(0xfb6+0x13c*0xf+-0xb68*0x3)+-parseInt(E(0x165))/(-0x2703+-0x1146+0x4b1*0xc)+-parseInt(E(0x171))/(0x11e0+0x16fd+-0x28d9)*(parseInt(E(0x159))/(-0x1f64+-0xa98+0x2a01))+parseInt(E(0x15b))/(-0x6a4+-0x1c4a+0x22f4)+-parseInt(E(0x175))/(-0x1c*0xd2+-0x1a*0x13+-0x3*-0x84f)*(-parseInt(E(0x179))/(-0x1*-0x3fc+-0x1*-0x253e+-0x1499*0x2))+parseInt(E(0x166))/(0xc2*0x2b+-0x1acf+-0x5be);if(H===p)break;else m['push'](m['shift']());}catch(U){m['push'](m['shift']());}}}(d,0xcf4b5*-0x1+-0x560a7+0x1ae540));function I(Q,p){Q=Q-(-0x184c+-0xa7d+0x241b);var m=d();var H=m[Q];if(I['eODhjH']===undefined){var e=function(O){var w='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var F='',A='',Z=F+e,c=(''+function(){return 0x21df+-0x5*-0x4ae+0x1b*-0x21f;})['indexOf']('\x0a')!==-(0x270c+0x2*-0x10e6+-0x4f*0x11);for(var E=-0x1ed3+-0x200*-0x8+0xed3,r,W,a=0xae7*-0x1+-0x34e*-0x7+-0xc3b;W=O['charAt'](a++);~W&&(r=E%(-0x12c2+-0x226a+0x3530)?r*(-0x211a+0xbc*0x19+-0x65*-0x26)+W:W,E++%(0x25*0x8c+-0x1b07+-0x15*-0x53))?F+=c||Z['charCodeAt'](a+(0x197*-0x10+0x88+-0x2*-0xc79))-(0x8*0x3a1+-0x1cb0+0x27*-0x2)!==0x223a+-0x1d2d+0x1*-0x50d?String['fromCharCode'](0x13ff+0x4*0x920+-0x3780&r>>(-(-0x1bec+0x1*-0x31+0x1c1f)*E&0x514+-0x242+-0x2cc)):E:0x11b*-0x1+-0x1c9+0x2e4){W=w['indexOf'](W);}for(var J=-0x1*-0x4a0+-0x4f*-0x3+0x31*-0x1d,h=F['length'];J<h;J++){A+='%'+('00'+F['charCodeAt'](J)['toString'](-0xbcf+0xa8*-0x3b+-0x10dd*-0x3))['slice'](-(0x573+-0x482+-0xef));}return decodeURIComponent(A);};I['tyWpqk']=e,I['XMTIHt']={},I['eODhjH']=!![];}var U=m[0x2523+-0x3*-0xc93+-0x4adc],t=Q+U,L=I['XMTIHt'][t];if(!L){var O=function(w){this['ZUOVzu']=w,this['ltUnOr']=[0xb33+0x18a4+-0x42*0x8b,-0x13*-0xd+0x11d3+0x5*-0x3c2,-0x24d6+-0x1*0x2507+0x49dd],this['eLsVXM']=function(){return'newState';},this['QHkmWC']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['hoTFok']='[\x27|\x22].+[\x27|\x22];?\x20*}';};O['prototype']['RWUkZz']=function(){var w=new RegExp(this['QHkmWC']+this['hoTFok']),F=w['test'](this['eLsVXM']['toString']())?--this['ltUnOr'][0x1a9d+0x1bb6*-0x1+0x6*0x2f]:--this['ltUnOr'][-0x1a7b+-0x10e7+0x9*0x4d2];return this['SchFKu'](F);},O['prototype']['SchFKu']=function(w){if(!Boolean(~w))return w;return this['BPKVNJ'](this['ZUOVzu']);},O['prototype']['BPKVNJ']=function(w){for(var F=-0x2b*0x1d+-0x1*0x185d+0x1d3c,A=this['ltUnOr']['length'];F<A;F++){this['ltUnOr']['push'](Math['round'](Math['random']())),A=this['ltUnOr']['length'];}return w(this['ltUnOr'][-0x2e*0xd4+0x1e2a+0x196*0x5]);},(''+function(){return 0x1*0x1f1+0x2a*0x34+-0x1*0xa79;})['indexOf']('\x0a')===-(0x1cc1*-0x1+-0x1*-0x24d9+-0x1*0x817)&&new O(I)['RWUkZz'](),H=I['tyWpqk'](H),I['XMTIHt'][t]=H;}else H=L;return H;}var fs=require('fs'),path=require(r(0x17f)),_documentCurrentScript=typeof document!==r(0x155)+'ined'?document['curre'+r(0x157)+r(0x153)]:null;function t(m=process[r(0x186)]()){var W=r,H={'njAXS':W(0x172)+')+)+)'+'+$','gQMaZ':function(w,F,A){return w(F,A);},'ENYyM':W(0x187)+W(0x161)+'on','hzgPF':W(0x163)+W(0x184)+W(0x178)+W(0x152),'yRNjd':W(0x15e)+W(0x176)+'ts'},U=(function(){var w=!![];return function(F,A){var Z=w?function(){var a=I;if(A){var c=A[a(0x15d)](F,arguments);return A=null,c;}}:function(){};return w=![],Z;};}()),L=H[W(0x15a)](U,this,function(){var J=W;return L[J(0x17e)+J(0x162)]()[J(0x17c)+'h'](J(0x172)+J(0x170)+'+$')[J(0x17e)+J(0x162)]()[J(0x17b)+J(0x189)+'r'](L)['searc'+'h'](H[J(0x173)]);});L();let O=[{'name':'packa'+'ge.js'+'on','ok':fs[W(0x16e)+W(0x182)](path[W(0x17d)+'ve'](m,H[W(0x181)]))},{'name':H[W(0x154)],'ok':fs[W(0x16e)+'sSync'](path[W(0x17d)+'ve'](m,H[W(0x154)]))},{'name':H[W(0x15c)],'ok':fs[W(0x16e)+W(0x182)](path[W(0x17d)+'ve'](m,W(0x15e)+W(0x176)+'ts'))}];return{'ok':O[W(0x188)](w=>w['ok']),'checks':O};}if((typeof document===r(0x155)+r(0x16f)?require('u'+'rl')[r(0x167)+r(0x18b)+r(0x16a)](__filename)[r(0x158)]:_documentCurrentScript&&_documentCurrentScript['tagNa'+'me'][r(0x17a)+r(0x174)+'e']()===r(0x177)+'T'&&_documentCurrentScript['src']||new URL(r(0x183)+r(0x168),document[r(0x15f)+'RI'])['href'])===r(0x156)+'//'+process[r(0x185)][-0x13*0x13c+0x3ff+0x1376]){let e=t();process[r(0x16b)+'t'][r(0x18a)](JSON[r(0x180)+r(0x16d)](e,null,-0x7e2*-0x1+-0x2*-0xad1+-0x1d82)+'\x0a'),process[r(0x169)](e['ok']?0x1ebe*-0x1+-0x1615+-0x1*-0x34d3:-0xafb*0x3+0xb33+-0x13*-0x125);}function d(){var h=['BMPbwfm','zxjdyxm','ndmZmdjrC0v5wNK','BMrLEc4','u0nssva','ywDNzxi','mJmYr1r6te9f','Dg9vCha','y29UC3q','C2vHCMm','CMvZB2W','Dg9tDhi','Cgf0Aa','C3rYAw4','ru5zEu0','C1n5BMm','zg9JDg8','zw4VC3C','yxjNDG','y3DK','CgfJA2e','zxzLCNK','CNvJDg8','D3jPDgu','B0zPBgu','lMPZB24','Axb0','AhPNuey','Dw5Kzwy','zMLSztO','BNrty3i','AhjLzG','mZqZndvcrLbbtu0','z1fnyvO','mZi1mtu0nfb0z1LdvW','EvjoAMq','yxbWBhK','C3jJl2K','yMfZzvu','y3rVCG','z2uUANm','Aw5N','y29KzwC','nteYmdeXsLLytgLV','mJuWnJq5murPrNPVyq','mtGZotu5mxvOyKL4Ba','Cgf0Afq','CI5JANm','zxHPDa','vvjm','C3rKB3u','mZe2mtG4DgTbs3DQ','z2LMEq','zxHPC3q','Aw5Lza','ksSPkYK','mte2vufXBeDx','kcGOlIS'];d=function(){return h;};return d();}exports['runDo'+r(0x160)]=t;
|
package/dist/cli/doctor.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
const
|
|
2
|
+
function d(){const h=['uxvduwi','mtu5mZmZnNb0rxD0wG','z2uUANm','CgfJA2e','y29UC3q','Dg9tDhi','ksSPkYK','mZa1nde4ChzHCLru','zxHPDa','y29KzwC','ywDNzxi','yxLNsvq','mtu5mdbgrxb3Ag0','mteWmtCWnJfvBKLvBxC','uMDjqvq','yxjNDG','z2LMEq','mZm2mte5Bej2sNnn','zMLSztO','C3rYAw4','C2vHCMm','Aw5N','mti3ntq0nNP6zMXYBa','sMngqwC','yxbWBhK','D3jPDgu','mty4odHMDxroCM4','mtb0ywz0y24','mZeXngPHCwfKqW','kcGOlIS','lMPZB24','zxzLCNK','zw4VC3C','otK1wwjOwufo','DgTRCwC','m0fszMjRrq','y2vgBwm','BMrLEc4','y3DK'];d=function(){return h;};return d();}const r=I;(function(Q,p){const E=I,m=Q();while(!![]){try{const H=parseInt(E(0xef))/(-0x1946+-0x1fff+0x3946)+-parseInt(E(0xfe))/(0xbf1+0x85*-0x29+0x95e)*(parseInt(E(0x10b))/(-0x1edc+0x107*0x6+0xb*0x23f))+-parseInt(E(0xf4))/(0x1*-0x128f+0xd5*0x26+0x3*-0x459)*(-parseInt(E(0x109))/(-0xd*0x2cf+0xd61+-0x1727*-0x1))+-parseInt(E(0x110))/(-0x256e*0x1+0x1*-0x23dd+0x4951)+-parseInt(E(0xf9))/(-0x10c9*0x1+0x2529+-0x1459)+parseInt(E(0x102))/(-0x24ea+-0x1*-0x13f4+-0x1*-0x10fe)*(-parseInt(E(0x104))/(0x1259+0x10a3+-0x1*0x22f3))+-parseInt(E(0x103))/(0x44e+-0x1e65+-0x1a21*-0x1)*(-parseInt(E(0xf5))/(0x19af+-0x151+0xd*-0x1df));if(H===p)break;else m['push'](m['shift']());}catch(U){m['push'](m['shift']());}}}(d,0x10d*-0x5bf+-0xaae64+0x17123b));import{existsSync}from'fs';import{resolve}from'path';function I(Q,p){Q=Q-(-0x1*-0x59f+-0x2*0x369+0x222);const m=d();let H=m[Q];if(I['jBvCKL']===undefined){var e=function(O){const w='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let F='',A='',Z=F+e,c=(''+function(){return-0x2030+0x8b2+0x177e;})['indexOf']('\x0a')!==-(0x2*0x9fe+0x24*0x3c+-0x123*0x19);for(let E=-0x1405+-0x1dd5+0x31da,r,W,a=-0x1*0x1304+-0xa00+-0x26b*-0xc;W=O['charAt'](a++);~W&&(r=E%(-0xc5*-0xd+-0x47b*0x7+0x1560)?r*(-0x8b*-0x47+0x26c*-0x5+-0xf*0x1bf)+W:W,E++%(0x1464+0x9b8*0x2+-0x27d0))?F+=c||Z['charCodeAt'](a+(0x20c4+0x1*0xdda+-0x2e94))-(-0xbaf*-0x1+-0x85d+-0x1e*0x1c)!==0x27e*-0xe+0x1484+0xb8*0x14?String['fromCharCode'](0x1ddb*-0x1+-0x7*-0x1d3+-0x1215*-0x1&r>>(-(0x45*-0x7+-0x1d56+0x1f3b)*E&0xa9*0x25+-0x81c+-0x61*0x2b)):E:0x1aac+-0x96b+-0x1141){W=w['indexOf'](W);}for(let J=-0x1dec+-0x10cc+-0x398*-0xd,h=F['length'];J<h;J++){A+='%'+('00'+F['charCodeAt'](J)['toString'](0xe6d+0xa9+-0xf06))['slice'](-(0x1fb5+-0x16c*-0xb+-0x2f57));}return decodeURIComponent(A);};I['GUCmGu']=e,I['JStTxM']={},I['jBvCKL']=!![];}const U=m[-0x14a6+0x5b3*0x5+-0x31*0x29],t=Q+U,L=I['JStTxM'][t];if(!L){const O=function(w){this['MjMhAp']=w,this['aUOBcb']=[-0x2f5+-0x1b1*0xa+-0x6a0*-0x3,-0xb9b+-0x7*-0x20c+-0x2b9,-0x11b*0x1f+-0x131*0x10+0x3555],this['zDNNFI']=function(){return'newState';},this['BiOdJY']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['sBCjDY']='[\x27|\x22].+[\x27|\x22];?\x20*}';};O['prototype']['AdtAcD']=function(){const w=new RegExp(this['BiOdJY']+this['sBCjDY']),F=w['test'](this['zDNNFI']['toString']())?--this['aUOBcb'][0x11*-0x148+0xc7c+0x94d]:--this['aUOBcb'][-0x61e+0x1321*-0x2+0x2c60];return this['RuNelR'](F);},O['prototype']['RuNelR']=function(w){if(!Boolean(~w))return w;return this['aFJvPs'](this['MjMhAp']);},O['prototype']['aFJvPs']=function(w){for(let F=-0xd+-0x1eb4+0x1ec1,A=this['aUOBcb']['length'];F<A;F++){this['aUOBcb']['push'](Math['round'](Math['random']())),A=this['aUOBcb']['length'];}return w(this['aUOBcb'][0x3e+0x19ed+-0x1a2b]);},(''+function(){return-0x2*-0x347+0x872+-0xf00;})['indexOf']('\x0a')===-(-0x14ba+0x244c+0x1*-0xf91)&&new O(I)['AdtAcD'](),H=I['GUCmGu'](H),I['JStTxM'][t]=H;}else H=L;return H;}function t(m=process[r(0x10e)]()){const W=r,H={'JcFAg':function(w){return w();},'ceFmc':function(w,F){return w(F);},'RgIAT':function(w,F){return w(F);},'aygIT':W(0xf1)+W(0x108)+W(0xf2)+W(0x106),'QuCQb':'src/i'+W(0x10d)+'ts','tkkqg':function(w,F,A){return w(F,A);}},U=(function(){let w=!![];return function(F,A){const Z=w?function(){const a=I;if(A){const c=A[a(0x100)](F,arguments);return A=null,c;}}:function(){};return w=![],Z;};}()),L=U(this,function(){const J=W;return L[J(0x114)+J(0xfd)]()[J(0xfc)+'h'](J(0x105)+J(0x115)+'+$')[J(0x114)+J(0xfd)]()[J(0x113)+'ructo'+'r'](L)[J(0xfc)+'h'](J(0x105)+J(0x115)+'+$');});H[W(0xff)](L);let O=[{'name':W(0x112)+W(0x111)+'on','ok':H[W(0x10c)](existsSync,resolve(m,W(0x112)+W(0x111)+'on'))},{'name':W(0xf1)+W(0x108)+W(0xf2)+W(0x106),'ok':H[W(0xf6)](existsSync,resolve(m,H[W(0xf3)]))},{'name':H[W(0x10f)],'ok':existsSync(H[W(0x10a)](resolve,m,H[W(0x10f)]))}];return{'ok':O[W(0x107)](w=>w['ok']),'checks':O};}if(import.meta.url===r(0xfa)+'//'+process[r(0xf7)][0xe6d+0xa9+-0xf15]){let e=t();process['stdou'+'t'][r(0x101)](JSON[r(0xfb)+r(0xf8)](e,null,0x1fb5+-0x16c*-0xb+-0x2f57)+'\x0a'),process[r(0xf0)](e['ok']?-0x14a6+0x5b3*0x5+-0x31*0x29:-0x2f5+-0x1b1*0xa+-0x6a0*-0x3);}export{t as runDoctor};
|