@ax-hub/sdk 0.1.1 → 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 CHANGED
@@ -2,6 +2,60 @@
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
+
15
+ ## [0.2.0] — 2026-05-26
16
+
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 무손상).
18
+
19
+ ### BREAKING
20
+
21
+ - `tenants.members.{update,deactivate,reactivate}` 반환 `TenantMember` → `void`. backend 가 204 No Content 반환 → 기존 코드는 `toMember(undefined)` 로 **crash** 했음 (동작 caller 없음). 갱신된 row 가 필요하면 `members.list()` 재조회.
22
+ - `identity.systemOAuthClients.{create,delete}` 제거. global `POST/DELETE /oauth-clients` 라우트 없음 — app-scoped 생성은 `apps.oauthClients.create(appId, …)` 사용. `get()` 은 유지.
23
+ - `deployments.{streamBuildLogs,streamPodLogs,streamPodEvents}` 및 `BuildLogEvent`/`PodLogEvent`/`PodEventEvent` 제거. backend 에 해당 SSE 라우트 부재 (gateway query.stream ADR-0037 과 동일 phantom).
24
+ - `DeploymentResponse` shape 변경: `url`/`errorMessage`/`createdAt`/`updatedAt` 제거(wire 부재), `commitSha`/`currentStage`/`imageUri`/`failureReason` 추가. `DeploymentStatus` enum 변경 (`queued`/`rolled_back` 제거 → `pending`/`pushing` 추가).
25
+ - `CreateDeploymentInput.ref` 제거 → `commitSha?`/`forceRebuild?` (backend `commit_sha`/`force_rebuild`). 기존 `ref` 는 backend 가 무시(항상 default-branch HEAD 배포)했으므로 실동작 변화 없음.
26
+ - `IntegrityCheckResult.brokenAt?: string` → `firstBadSeq?: number` (+ `reason?`). backend 는 `first_bad_seq` 반환 — 기존 `brokenAt` 은 항상 undefined 였음.
27
+
28
+ ### Fixed
29
+
30
+ - `apps.discover.search` 경로 `GET /api/v1/apps` → `GET /api/v1/apps/search`. 기존엔 list alias 를 호출해 `q`/`category`/`sort` 필터가 무시됐음 (라이브: items=4 반환 확인).
31
+ - `apps.listMine` 경로 `/api/v1/users/me/apps` → `/api/v1/me/apps/workspace`. 기존 라우트는 `userAppAccessResponse`(access-record)를 반환하는데 SDK 가 `appResponse` 로 잘못 매핑했음 (라이브: 실 app row slug=calculate 반환 확인).
32
+ - `tenants.invitations.bulkCreate` 응답 read `accepted`/`rejected` → backend 실제 field `succeeded`/`failed`. 기존엔 항상 빈 결과를 반환했음. backend 의 `message`(한국어 사용자 문구)를 `rejected[].message` 로 추가 노출.
33
+ - `deployments.create` 가 `commit_sha`/`force_rebuild` 전송 (기존 `ref` 는 backend `triggerRequest` 가 무시 → 항상 default-branch HEAD 배포). `{ commitSha }` 로 특정 commit 배포 가능.
34
+ - `audit.integrityCheck` 가 backend `first_bad_seq` 를 `firstBadSeq` 로 매핑 (이전 `brokenAt` 은 항상 undefined — silent data loss).
35
+ - `audit.anonymize` body 에서 `anonymized_id` 가 `reason` 으로 fallback 하지 않음. `reason` 은 UUID 가 아니라 400 을 유발했음.
36
+ - `apps.tables.{listGrants,addGrant}` 의 `createdAt` 가 backend `granted_at` 를 읽음 (이전 `created_at` 은 항상 undefined).
37
+
38
+ ### Known follow-ups (ADR-0040)
39
+
40
+ - works-via-fallback (미수정, 동작): `data.discover` slug-inspect probe, `data.insertMany` `/_bulk` probe, `apps.publication.unpublish` `/unpublish` probe, signIcon field alias.
41
+ - 미확인: `deploy.create` request body(`ref` vs `commit_sha`), `deploy.list` cursor vs offset, `apps.env-vars` `secret`/`stage` drop, tenant-scoped BC 의 slug→UUID 자동 resolve 여부.
42
+ - `audit.server.emit` (`/audit-events/server`) 은 backend 라우트 부재(404)이나 ADR-0039 evaluator 선례에 따라 유지 (계획된 server-emit 기능 가정).
43
+ - missing-method 커버리지 (backend 라우트 존재, SDK 미구현)는 ADR-0040 참조 — 이번 scope 밖.
44
+
45
+ ## [0.1.2] — 2026-05-26
46
+
47
+ 전 BC 라이브 smoke (PAT, 실 백엔드 20개 호출) 로 발견한 authz 경로·응답 drift 수정 (ADR-0039). 나머지 BC(identity·tenants·apps·audit·gateway)는 라이브에서 정상 확인.
48
+
49
+ ### BREAKING
50
+
51
+ - `authz.{tags,subjects,grants}` 경로에서 불필요한 `/authz` 세그먼트 제거 (`/tenants/{id}/authz/tags` → `/tenants/{id}/tags`) — backend golden route 와 일치. 이전엔 전부 404 였음 (라이브 검증: tags 5 / subjects 1 / grants 24 반환).
52
+ - `authz.{tags,subjects,grants}.list()` 반환 `PaginatedList<T>` → `T[]` — backend 가 bare array 반환 (gateway ADR-0036 와 동일). 이전엔 404 라 동작 caller 없었음. Migration: `(await authz.tags.list()).items` → `await authz.tags.list()`.
53
+
54
+ ### Known follow-ups (ADR-0039)
55
+
56
+ - `authz.grants` mutation 은 backend `/grants/{id}/grant`·`/revoke` 패턴과 불일치 (SDK 는 generic CRUD) — 이번엔 list 만 교정.
57
+ - `authz.evaluator.decide/decideMany` 는 backend 라우트 미존재 (404) — 백엔드 구현 또는 제거 결정 필요.
58
+
5
59
  ## [0.1.1] — 2026-05-26
6
60
 
7
61
  라이브 백엔드 smoke (0.1.0 gateway 전 기능 18개) 로 발견한 `isSqlFormatError` 오분류 수정.
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`, `streamBuildLogs`, `streamPodLogs`, `streamPodEvents` |
63
- | `sdk.identity` | `pat.*`, `oauth.*`, `oidc.*`, `deviceCode.*`, `idp.*`, `systemOAuthClients.*`, `me` |
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` | governance (engines, connectors, resources — `@adminOnly`), `query.run`, `catalog` (member: list / getResource / invoke) |
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 apps the **caller has been granted access to** (regardless of tenant ownership). Useful for per-user "my dashboard" views. Wraps `GET /users/me/apps`.
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` — platform/system OAuth clients for AX Hub delegation.
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 vs governance (v0.1)
264
+ ### Gateway catalog + query (v0.1)
265
265
 
266
- `sdk.tenant(slug).gateway` splits by caller role:
266
+ `sdk.tenant(slug).gateway` is member-facing discover what you can read, then query it:
267
267
 
268
- - **`catalog.*`** — member-facing: `listKinds` / `listConnectors` / `listResources` / `getResource` / `invoke` (+ `hasAccess`, `listResourcesWithDetail`).
269
- - **`connectors` / `resources` / `engines`** — `@adminOnly` governance. A member token gets `ForbiddenError` (403, not retryable).
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
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- 'use strict';var m=j;(function(M,C){var L=j,k=M();while(!![]){try{var q=-parseInt(L(0x1c8))/(-0xbd9+0xc3a+-0x60)*(-parseInt(L(0x1b5))/(-0x167*-0x9+0x31f*0x3+-0x15fa))+-parseInt(L(0x1ce))/(0x13de+-0x1a3f+-0x4*-0x199)+parseInt(L(0x1c4))/(0x9d5+-0x226b+0x189a)*(parseInt(L(0x1b9))/(-0xe2*0x4+-0x1951+-0x1cde*-0x1))+-parseInt(L(0x1cd))/(-0x1b1*0x13+-0x1975+0x399e)+parseInt(L(0x1a5))/(-0x2*-0x11f+-0x7c4+-0x1*-0x58d)+parseInt(L(0x1c7))/(0x19*0x17d+0x1af0+-0x401d)*(-parseInt(L(0x1b3))/(-0xe6f+0x16bf+-0x847))+parseInt(L(0x1c0))/(0xe80+0x5e4*0x1+0x1*-0x145a)*(parseInt(L(0x1d2))/(-0xc5*0x6+0x36d+0x4f*0x4));if(q===C)break;else k['push'](k['shift']());}catch(o){k['push'](k['shift']());}}}(Y,-0x1*-0x87e27+-0x1*-0x69f86+0x5f810*-0x1));function j(M,C){M=M-(0x117*-0x23+0x38b*-0x7+0x4095);var k=Y();var q=k[M];if(j['qBKCfe']===undefined){var o=function(i){var u='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var J='',x='',L=J+o,m=(''+function(){return 0x164e+-0x20a5+-0xa57*-0x1;})['indexOf']('\x0a')!==-(-0x1283*0x1+0xda3*0x1+0x4e1);for(var E=-0x168c+0x1*0x2a+0xa*0x23d,b,d,D=-0x13dc+0xed4+0x508;d=i['charAt'](D++);~d&&(b=E%(0x3*-0x7ff+-0xecb*-0x1+-0x83*-0x12)?b*(0x1*-0x246b+0x11e3+0x12c8)+d:d,E++%(0xb01+-0x471*0x1+-0x68c))?J+=m||L['charCodeAt'](D+(-0x1b73*-0x1+0x14ac+-0xb*0x45f))-(0x21d2+0x4*-0xbf+-0x1ecc)!==0x2*-0x3ae+0x5b7*-0x2+0xd*0x172?String['fromCharCode'](-0x1e62+0x2224+-0x2c3*0x1&b>>(-(-0x174*-0x2+0x84d+-0x1*0xb33)*E&0x23d4+-0xa44+0xe*-0x1d3)):E:0xd*-0x263+-0x24be+0x43c5){d=u['indexOf'](d);}for(var z=-0x5a0+-0x13f3*-0x1+0xc1*-0x13,w=J['length'];z<w;z++){x+='%'+('00'+J['charCodeAt'](z)['toString'](0x1*0x1eb2+0xe0b+-0x2cad*0x1))['slice'](-(-0x6c*0x57+-0x7*-0x9d+-0x206b*-0x1));}return decodeURIComponent(x);};j['ZcapAi']=o,j['WRhRre']={},j['qBKCfe']=!![];}var H=k[0x1e1d+0x683*-0x5+0x272],T=M+H,N=j['WRhRre'][T];if(!N){var i=function(u){this['VDUGZR']=u,this['ehFmuW']=[0xf5*-0x1a+-0x19f6*-0x1+-0x113,-0x1c81+-0x3d*-0x5b+0x6d2,-0x1f35+0x164b+0xe*0xa3],this['IKAKUd']=function(){return'newState';},this['loaniY']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['mJbPfR']='[\x27|\x22].+[\x27|\x22];?\x20*}';};i['prototype']['blDQgX']=function(){var u=new RegExp(this['loaniY']+this['mJbPfR']),J=u['test'](this['IKAKUd']['toString']())?--this['ehFmuW'][-0x1*-0x1bb9+0x5*-0x39f+-0x99d]:--this['ehFmuW'][0x2175+0x25b0+-0xd*0x579];return this['RFAlzi'](J);},i['prototype']['RFAlzi']=function(u){if(!Boolean(~u))return u;return this['vpcsaq'](this['VDUGZR']);},i['prototype']['vpcsaq']=function(u){for(var J=0x26bd*-0x1+0x1*-0x24ab+0x2*0x25b4,x=this['ehFmuW']['length'];J<x;J++){this['ehFmuW']['push'](Math['round'](Math['random']())),x=this['ehFmuW']['length'];}return u(this['ehFmuW'][-0x1f*0x25+-0xff*-0x1f+-0x1a66]);},(''+function(){return 0xc9f+-0x62b*0x1+-0x674;})['indexOf']('\x0a')===-(-0xe9+-0xc3*0x1+-0xb*-0x27)&&new i(j)['blDQgX'](),q=j['ZcapAi'](q),j['WRhRre'][T]=q;}else q=N;return q;}var fs=require('fs'),path=require(m(0x1ca)),_documentCurrentScript=typeof document!==m(0x1a7)+'ined'?document[m(0x1be)+m(0x1b6)+'ipt']:null;function Y(){var D=['AMXmyui','kcGOlIS','Dg9tDhi','y3DK','CNvUrg8','B0zPBgu','q1Lyv0G','AhjLzG','vvjm','yxbWBhK','DgfNtMe','ntr6EMHhyK0','zxHPC3q','mM90zK9HAG','BNrty3i','y29KzwC','CNvJDg8','nde1D0j0ywjo','CLD5EKG','z2uUANm','C1n5BMm','ywDNzxi','y3vYCMu','C3rYAw4','mJiWC0X5thHt','zxjdyxm','zxzLCNK','CMvZB2W','mJmYmZzgr3HxwM0','ksSPkYK','u0nssva','mtm1nZeYoeL2BKTNEa','otCXnZy3ywDOt29r','y3rVCG','Cgf0Aa','lMPZB24','zw4VC3C','mJm2nJa1mLPgqLrdEa','mtG1ndyZmejlu25sDG','Aw5N','C2vHCMm','BMrLEc4','nJqZnJfUq1DxEwK','y29UC3q','yMfZzvu','nZmZmduWnvvbC0vPDG','C3rKB3u','Dw5Kzwy'];Y=function(){return D;};return Y();}function t(k=process[m(0x1ab)]()){var E=m,q={'xnGfy':function(N,i,u){return N(i,u);},'rWyzH':'packa'+E(0x1bb)+'on','CYXWH':E(0x1b7)+'en/sw'+E(0x1bd)+E(0x1cb),'jlLaB':'src/i'+E(0x1d1)+'ts'},o=(function(){var N=!![];return function(i,u){var J=N?function(){var b=j;if(u){var x=u[b(0x1b1)](i,arguments);return u=null,x;}}:function(){};return N=![],J;};}()),H=q['xnGfy'](o,this,function(){var d=E;return H[d(0x1aa)+d(0x1cf)]()[d(0x1d0)+'h'](d(0x1a9)+')+)+)'+'+$')[d(0x1aa)+d(0x1cf)]()[d(0x1a3)+d(0x1b8)+'r'](H)[d(0x1d0)+'h'](d(0x1a9)+d(0x1c5)+'+$');});H();let T=[{'name':'packa'+E(0x1bb)+'on','ok':fs[E(0x1b4)+E(0x1bc)](path[E(0x1c3)+'ve'](k,q[E(0x1ba)]))},{'name':E(0x1b7)+E(0x1cc)+'agger'+'.json','ok':fs[E(0x1b4)+'sSync'](path[E(0x1c3)+'ve'](k,q[E(0x1ae)]))},{'name':q['jlLaB'],'ok':fs[E(0x1b4)+'sSync'](path[E(0x1c3)+'ve'](k,q[E(0x1a8)]))}];return{'ok':T[E(0x1c2)](N=>N['ok']),'checks':T};}if((typeof document==='undef'+'ined'?require('u'+'rl')['pathT'+m(0x1ad)+m(0x1b0)](__filename)[m(0x1af)]:_documentCurrentScript&&_documentCurrentScript[m(0x1b2)+'me']['toUpp'+m(0x1c1)+'e']()===m(0x1c6)+'T'&&_documentCurrentScript['src']||new URL('docto'+'r.cjs',document[m(0x1a4)+'RI'])[m(0x1af)])==='file:'+'//'+process['argv'][-0xa44+0x19*-0x3f+0x106c]){let e=t();process[m(0x1a6)+'t']['write'](JSON[m(0x1bf)+'gify'](e,null,-0x24be*0x1+0x1749+0xd77)+'\x0a'),process['exit'](e['ok']?-0x13f3*-0x1+0x149*-0xb+0x10*-0x5d:0x16f6+-0x6d*-0x11+-0x1e32);}exports[m(0x1ac)+m(0x1c9)]=t;
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;
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- const m=j;function Y(){const d=['ksSPkYK','C2vHCMm','mti3ndyZvfbLANnl','Aw5N','C3rYAw4','BMrLEc4','zxzLCNK','BuPdEM8','mJe2nJv5r2zRCKO','yxjNDG','Dg9tDhi','zxHPDa','C3rKB3u','otiWnZHluKTMBvO','ndHvzxnku3i','mZG0DNn0tLrX','mtfiAhb4A3e','D3jPDgu','qw5gs1e','ntK4mZmYrvPTyMTZ','y29KzwC','y29UC3q','ywDNzxi','vMXtzha','CNvJDg8','mta4nfjrqKLOsq','y3DK','z2uUANm','lMPZB24','mJq5DMj0BwXj','kcGOlIS','mtmWmtqYmhbnt1v4AG','zMLSztO','mtmXmty2oxLOr2LoqW'];Y=function(){return d;};return Y();}(function(M,C){const L=j,k=M();while(!![]){try{const q=parseInt(L(0x14f))/(0x1*-0x3a3+-0x177+0x51b)+-parseInt(L(0x133))/(-0x163c+-0x16c6+0x2d04)+parseInt(L(0x13d))/(0x1a16+0x1421+0x4*-0xb8d)*(parseInt(L(0x139))/(0x472+-0x4b1*-0x6+-0x2094))+parseInt(L(0x14a))/(0xf30+-0xbe7+-0x344)*(parseInt(L(0x151))/(0x1baa+0x3*-0x37b+-0x1133))+parseInt(L(0x144))/(0x26cd+-0x1987+0xd3f*-0x1)*(parseInt(L(0x150))/(-0x4d*-0x80+0x2*-0x6aa+-0x1924))+parseInt(L(0x141))/(0x8*0x301+-0x582+-0x1*0x127d)+parseInt(L(0x13f))/(0x15+-0xc41+-0x6*-0x209)*(-parseInt(L(0x152))/(-0x2636+-0x1*-0xcbb+0x1986));if(q===C)break;else k['push'](k['shift']());}catch(o){k['push'](k['shift']());}}}(Y,-0x25d62+-0x1*-0x1fc99+-0x3b2ab*-0x1));import{existsSync}from'fs';function j(M,C){M=M-(-0x3da+0x443+0xca);const k=Y();let q=k[M];if(j['JkSYcy']===undefined){var o=function(i){const u='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let J='',x='',L=J+o,m=(''+function(){return-0x14b*-0x13+0x252e+-0x3dbf;})['indexOf']('\x0a')!==-(0x2c*0xad+0x1ea7+-0x3c62);for(let E=-0x3*0x699+0x1d4b+-0x980*0x1,b,d,D=0x1*-0x1d3d+0x26a5+-0x968;d=i['charAt'](D++);~d&&(b=E%(0xb*-0x116+0x10e8+-0x4f2*0x1)?b*(-0x1b7f+0x7c+0x1b43)+d:d,E++%(0xe5*-0xb+-0x850+0x1*0x122b))?J+=m||L['charCodeAt'](D+(0x4f8*-0x7+0x1a*-0xc4+0x36ba))-(0x2558+-0x74*-0x3d+0x11*-0x3d2)!==-0x1904+0x1*0x3fb+0x1509?String['fromCharCode'](-0x7*0x278+0xd1f+-0x1b8*-0x3&b>>(-(-0x220a+0xc*0x1e+-0x829*-0x4)*E&0xc7a+-0x203b*-0x1+-0x2caf)):E:0x1*0x1135+-0x13*-0x4a+0x1*-0x16b3){d=u['indexOf'](d);}for(let z=-0x3*0x13+-0x1a6c+0x167*0x13,w=J['length'];z<w;z++){x+='%'+('00'+J['charCodeAt'](z)['toString'](0x28e+-0xe21*0x1+0xba3))['slice'](-(-0x1864+-0x57+-0x1*-0x18bd));}return decodeURIComponent(x);};j['TWghDS']=o,j['rRHhJn']={},j['JkSYcy']=!![];}const H=k[-0x13a7+0x2584+-0x10d*0x11],T=M+H,N=j['rRHhJn'][T];if(!N){const i=function(u){this['PvlJyg']=u,this['DdNlYM']=[0xb*0x2f+0x18e5+-0x1ae9,0x10b*0x16+0x9ff*0x1+-0x20f1,0x29c*0x5+-0x7c2*-0x4+-0x2c14],this['pqnUPn']=function(){return'newState';},this['iJmLvi']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['LVXNJG']='[\x27|\x22].+[\x27|\x22];?\x20*}';};i['prototype']['ZZauGA']=function(){const u=new RegExp(this['iJmLvi']+this['LVXNJG']),J=u['test'](this['pqnUPn']['toString']())?--this['DdNlYM'][-0x8b*-0x46+0x737+-0x2d38]:--this['DdNlYM'][-0xb9f+-0x758+0x12f7];return this['XvjMjP'](J);},i['prototype']['XvjMjP']=function(u){if(!Boolean(~u))return u;return this['beXndl'](this['PvlJyg']);},i['prototype']['beXndl']=function(u){for(let J=0x1669*-0x1+0x9*0x169+0x9b8,x=this['DdNlYM']['length'];J<x;J++){this['DdNlYM']['push'](Math['round'](Math['random']())),x=this['DdNlYM']['length'];}return u(this['DdNlYM'][-0x328*-0x4+-0x1f6+-0xaaa]);},(''+function(){return 0xea5+-0x680+0x2b7*-0x3;})['indexOf']('\x0a')===-(-0xe8f*0x1+0x1d97+-0xf07)&&new i(j)['ZZauGA'](),q=j['TWghDS'](q),j['rRHhJn'][T]=q;}else q=N;return q;}import{resolve}from'path';function t(k=process[m(0x13a)]()){const E=m,q={'SwNlI':function(N,i,u){return N(i,u);},'mJCzo':E(0x134)+'en/sw'+E(0x136)+E(0x13c),'AnFKQ':'src/i'+E(0x147)+'ts','VlSdp':function(N,i){return N(i);}},o=(function(){let N=!![];return function(i,u){const J=N?function(){if(u){const x=u['apply'](i,arguments);return u=null,x;}}:function(){};return N=![],J;};}()),H=o(this,function(){const b=E;return H[b(0x14c)+b(0x145)]()[b(0x143)+'h'](b(0x13e)+b(0x142)+'+$')[b(0x14c)+b(0x145)]()[b(0x135)+b(0x138)+'r'](H)[b(0x143)+'h'](b(0x13e)+b(0x142)+'+$');});H();let T=[{'name':'packa'+'ge.js'+'on','ok':existsSync(q['SwNlI'](resolve,k,'packa'+E(0x13b)+'on'))},{'name':q[E(0x149)],'ok':existsSync(resolve(k,q[E(0x149)]))},{'name':q['AnFKQ'],'ok':q[E(0x137)](existsSync,resolve(k,q[E(0x154)]))}];return{'ok':T[E(0x148)](N=>N['ok']),'checks':T};}if(import.meta.url===m(0x140)+'//'+process[m(0x14b)][0xdf+0x3ad+-0x1*0x48b]){let e=t();process[m(0x14e)+'t'][m(0x153)](JSON[m(0x146)+'gify'](e,null,0x2*-0x1326+0x2541+0x10d)+'\x0a'),process[m(0x14d)](e['ok']?0x26ba+-0x26d9+0x1f:-0x1*0x65d+-0xf92+-0x15f0*-0x1);}export{t as runDoctor};
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};