@ax-hub/sdk 0.2.0 → 1.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/CHANGELOG.md +43 -0
- package/README.md +33 -38
- 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 +904 -433
- package/dist/index.d.ts +904 -433
- package/dist/index.js +1 -1
- package/package.json +9 -36
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,49 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [1.0.0] — 2026-05-29
|
|
6
|
+
|
|
7
|
+
First stable major. `@ax-hub/sdk` ↔ backend `main` 정렬 (110→177 routes, 36→42 error codes) + 단일 패키지에서 npm workspaces 모노레포로 전환. 거버넌스(admin) surface 36 op 을 신규 공개 패키지 **`@ax-hub/admin-sdk`** 로 분리. SDK 1차 사용자(코딩 에이전트 + member/PAT 앱)는 admin 메서드로 항상 403 을 받았으므로 main SDK 표면에서 제거하는 것이 정상화다. 마이그레이션 매핑은 [`docs/MIGRATION-1.0.md`](docs/MIGRATION-1.0.md) 참조 (ADR-0042 / ADR-0043 / ADR-0044).
|
|
8
|
+
|
|
9
|
+
### BREAKING
|
|
10
|
+
|
|
11
|
+
- **admin 거버넌스 36 op 이동 — `@ax-hub/sdk` 에서 제거, 신규 `@ax-hub/admin-sdk` 로 이동.** 접근은 `new AdminClient({ token, tokenType })` (from `@ax-hub/admin-sdk`) 로. 매핑:
|
|
12
|
+
- `sdk.audit.*` (events `list`/`get`, `integrityCheck`, `anonymize`) → `adminSdk.audit.*`
|
|
13
|
+
- `sdk.authz.{tags,subjects,grants}` → `adminSdk.authz.*`
|
|
14
|
+
- `sdk.authz.evaluator` / `decide` **제거-only** — backend 공식 route 부재. backend 노출 시 후속 admin-sdk 에서 재도입.
|
|
15
|
+
- `sdk.tenants.{create,list,update,delete}` + members / invitations / email-domains / icon → `adminSdk.tenants.*`. **`sdk.tenants.get` 은 main 유지.**
|
|
16
|
+
- `sdk.identity.idp` (`IdentityProviderClient`) → `adminSdk.identityProviders.*`
|
|
17
|
+
- `sdk.apps.categories.{create,update,delete}` → `adminSdk.categories.*`. **`sdk.apps.categories.list`/`get` 은 main 유지.**
|
|
18
|
+
- **`sdk.apps.create()` 는 이제 tenant UUID(`defaultTenantId`) 를 요구**하고 미설정 시 `TenantIdRequiredError` 를 throw. 구 `POST /api/v1/apps` 404-fallback 경로 제거. `apps.list()` 는 `defaultTenantId` 설정 시 tenant-scoped, 미설정 시 live alias 호출 (US1).
|
|
19
|
+
|
|
20
|
+
### Added
|
|
21
|
+
|
|
22
|
+
- **신규 capability ~25 (US3, non-breaking):** apps `suspend`/`resume`, app invitations `create`/`delete`, `members.list`, `discover`(global + tenant), `me/apps` (owned + received), `check-availability` + icon pre-create, tables `check-availability`/`column-types`/`browse-rows`, deploy `logs`/`app-bootstraps`/github accounts+repos, `gateway.engines`, identity github oauth `start`/`callback`, `config.public` (tokenless), reviewer review-requests history.
|
|
23
|
+
- **MCP + OAuth (US4):** `registerMcpClient` (Dynamic Client Registration, unauthenticated), RFC 8707 `resource`/audience binding on authorize + token, oauth-client `allowedResources`, 9 typed OAuth errors incl. 전용 `InvalidTargetError`.
|
|
24
|
+
- **입력/필드 drift (US5):** `CreateAppInput`/`UpdateAppInput` 신규 필드 (`authMode`, `dataScopes`, `deployMethod`, `resourceTier`, `subdomain`, `clearSubdomain`, `iconDarkUrl`), oauth-client 신규 필드, env-var `stage`, table `description`, app-list `filter`/`sort`/`page` 파라미터.
|
|
25
|
+
|
|
26
|
+
### Changed
|
|
27
|
+
|
|
28
|
+
- backend contract pin 을 spec-278 → backend `main` 으로 전진 (110→177 routes, 36→42 error codes). error catalog 6 코드 추가 (`codes.go.snapshot` 갱신, `extract-codes` 재생성).
|
|
29
|
+
- OAuth 9 코드 매핑에 `invalid_target` 전용 구분 추가 (US5).
|
|
30
|
+
|
|
31
|
+
### Infrastructure
|
|
32
|
+
|
|
33
|
+
- 단일 패키지 `@ax-hub/sdk` → **npm workspaces 모노레포** (`packages/*`). 공유 infra(http/auth/error/pagination/retry/redaction/branded-id/resource helpers)를 private **`@ax-hub/core`** (`private:true`, **미발행**) 로 추출, tsup `noExternal` 로 `@ax-hub/sdk` + `@ax-hub/admin-sdk` dist 에 inline. publish `.d.ts` 에 private core import 0 (SC-009, `check:dts-no-private-core` gate).
|
|
34
|
+
- 신규 공개 패키지 **`@ax-hub/admin-sdk`** (governance surface, `AdminClient`).
|
|
35
|
+
- public packages(sdk/admin-sdk) semver major 1.0.0 동반, private core 버전 동기화. release CI 가 두 공개 패키지를 발행 (core 는 비발행).
|
|
36
|
+
- ADR 신규: ADR-0042 (monorepo workspaces), ADR-0043 (BC relocation → admin-sdk), ADR-0044 (public API whitelist 재정의).
|
|
37
|
+
|
|
38
|
+
## [0.3.0] — 2026-05-26
|
|
39
|
+
|
|
40
|
+
gateway 거버넌스 surface(`engines`/`connectors`/`resources`, `@adminOnly`)를 SDK 에서 제거하고 member-facing surface(`query` + `catalog`)만 유지 (ADR-0041). SDK 1차 사용자(코딩 에이전트 + member-token 앱)는 거버넌스 메서드로 항상 403 을 받았고, connector/engine 관리는 콘솔 관리자 작업이다.
|
|
41
|
+
|
|
42
|
+
### BREAKING
|
|
43
|
+
|
|
44
|
+
- `gateway.{engines,connectors,resources}` 제거. member token 은 이들에 항상 `ForbiddenError`(403)였음. connector 목록·이름→UUID 는 `gateway.catalog.listConnectors()` 사용 — `CatalogConnector.id` 는 동일 connector UUID 라 `query.run({ connectorId })` 에 그대로 사용.
|
|
45
|
+
- 공개 타입 `GatewayEngine`/`GatewayConnector`/`GatewayResource` 제거.
|
|
46
|
+
- `TenantGatewayClient` 는 `query` + `catalog` props 만 노출. `GatewayClient`/`TenantGatewayClient`/`GatewayCatalogClient`, `query`/`catalog`, 모든 `Catalog*`·`GatewayQuery*` 타입·응답 헬퍼는 유지.
|
|
47
|
+
|
|
5
48
|
## [0.2.0] — 2026-05-26
|
|
6
49
|
|
|
7
50
|
나머지 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
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
agent-first Node.js SDK for AX Hub. Designed for Claude, Codex, and other coding agents — one client, 8 bounded contexts, typed errors, async iterators for SSE streams, generated drift inventory, and no hidden Korean substring matching.
|
|
4
4
|
|
|
5
|
+
> **이 SDK를 개발/유지보수하려는 컨트리뷰터라면** → 내부 아키텍쳐·동작 원리·하네스·e2e 플로우를 설명한 온보딩 문서 [`docs/ARCHITECTURE.md`](../../docs/ARCHITECTURE.md)부터 읽으세요. (이 README는 SDK *사용자*용 API 가이드입니다.)
|
|
6
|
+
|
|
7
|
+
> **거버넌스(admin) surface 를 찾고 있다면** → tenants CRUD / authz / audit / identity-providers / category CUD 는 `@ax-hub/sdk` 에서 분리되어 별도 패키지 [`@ax-hub/admin-sdk`](../admin-sdk/README.md) 로 이동했습니다 (1.0.0). 0.x 에서 올라온다면 [`docs/MIGRATION-1.0.md`](../../docs/MIGRATION-1.0.md) 의 매핑 표를 보세요.
|
|
8
|
+
|
|
5
9
|
## I want to...
|
|
6
10
|
|
|
7
11
|
| Goal | Section |
|
|
@@ -11,6 +15,7 @@ agent-first Node.js SDK for AX Hub. Designed for Claude, Codex, and other coding
|
|
|
11
15
|
| choose JWT vs PAT or OAuth | [Authentication](#authentication) |
|
|
12
16
|
| query dynamic tables | [Dynamic Data + Query DSL](#dynamic-data--query-dsl) |
|
|
13
17
|
| debug an error | [Errors & Debugging](#errors--debugging) |
|
|
18
|
+
| use admin/governance APIs | [`@ax-hub/admin-sdk`](../admin-sdk/README.md) |
|
|
14
19
|
| upgrade from 0.x | [Migration & Upgrade](#migration--upgrade) |
|
|
15
20
|
|
|
16
21
|
## Magic Moment
|
|
@@ -54,25 +59,25 @@ console.log(app.slug, paid.total)
|
|
|
54
59
|
| `sdk.apps.comments` | `add`, `list`, `listAll`, `delete` (1-500 char client-side validation) |
|
|
55
60
|
| `sdk.apps.oauthClients` | `create` (⚠ `clientSecret` surfaced ONCE), `delete` |
|
|
56
61
|
| `sdk.apps.git` | `connect`, `installStart` (GitHub App install flow) |
|
|
57
|
-
| `sdk.apps.categories` | tenant category
|
|
62
|
+
| `sdk.apps.categories` | tenant category read (`list`, `get`); CUD moved to `@ax-hub/admin-sdk` |
|
|
58
63
|
| `sdk.apps.discover` | catalog search facade |
|
|
59
64
|
| `sdk.apps.templates` | app template listing |
|
|
60
65
|
| `sdk.apps.tables` | `list`, `create`, `delete`, `addColumn`, `dropColumn`, `listGrants`, `addGrant`, `revokeGrant` (schema admin) |
|
|
61
66
|
| `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.*`, `
|
|
64
|
-
| `sdk.tenants` | tenant CRUD
|
|
65
|
-
| `sdk.
|
|
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.deployments` | `create`, `list`, `listAll`, `get`, `cancel`, `rollback` |
|
|
68
|
+
| `sdk.identity` | `pat.*`, `oauth.*`, `oidc.*`, `deviceCode.*`, `systemOAuthClients.get`, `me` (identity-provider governance moved to `@ax-hub/admin-sdk`) |
|
|
69
|
+
| `sdk.tenants` | `get` (read own tenant); CRUD + members/invitations/email-domains/icon moved to `@ax-hub/admin-sdk` |
|
|
70
|
+
| `sdk.gateway` | `query.run` (parameterized read), `catalog` (member: list / getResource / invoke) |
|
|
68
71
|
| `sdk.data` | `/data/{tenantSlug}/{appSlug}/{table}` CRUD + bulk + typed DSL |
|
|
69
72
|
|
|
70
73
|
The committed generated route inventory currently tracks the pinned backend swagger snapshot; future backend-only BCs are surfaced by `npm run route-inventory-diff`.
|
|
71
74
|
|
|
72
75
|
### `sdk.apps.list` vs `sdk.apps.listMine`
|
|
73
76
|
|
|
74
|
-
- `list()` — returns apps in the **resolved tenant** (via `defaultTenantSlug` or `withTenant`). Tenant-scoped.
|
|
75
|
-
- `listMine()` — returns
|
|
77
|
+
- `list()` — returns apps in the **resolved tenant** (via `defaultTenantId`/`defaultTenantSlug` or `withTenant`). Tenant-scoped.
|
|
78
|
+
- `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`.
|
|
79
|
+
|
|
80
|
+
> **1.0:** `apps.create()` requires a tenant context (`defaultTenantId` or `sdk.tenant(...)`). Without one it throws `TenantIdRequiredError`. See [Migration](#migration--upgrade).
|
|
76
81
|
|
|
77
82
|
### `sdk.apps.publication` vs `sdk.publicationRequests`
|
|
78
83
|
|
|
@@ -129,7 +134,7 @@ const sdk = new AxHubClient({
|
|
|
129
134
|
### OAuth Two Worlds
|
|
130
135
|
|
|
131
136
|
- `sdk.apps.oauthClients` — an app acts as IdP for its own external users.
|
|
132
|
-
- `sdk.identity.systemOAuthClients` —
|
|
137
|
+
- `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
138
|
|
|
134
139
|
## Dynamic Data + Query DSL
|
|
135
140
|
|
|
@@ -235,7 +240,7 @@ Production mock mode throws `MockInProductionError` unless `AX_HUB_ALLOW_MOCK_IN
|
|
|
235
240
|
|
|
236
241
|
### Error Types
|
|
237
242
|
|
|
238
|
-
All `/api/v1/*` 4xx/5xx responses become typed `AxHubError` subclasses. `error.category` (9 enum from backend spec
|
|
243
|
+
All `/api/v1/*` 4xx/5xx responses become typed `AxHubError` subclasses. `error.category` (9 enum from backend spec) drives base class, `error.code` selects specific subclass.
|
|
239
244
|
|
|
240
245
|
| Class | Status | `retryable` | Hint |
|
|
241
246
|
|-------|--------|-------------|------|
|
|
@@ -249,7 +254,7 @@ All `/api/v1/*` 4xx/5xx responses become typed `AxHubError` subclasses. `error.c
|
|
|
249
254
|
| `InternalServerError` | 500 | **false** | escalate to human |
|
|
250
255
|
| `UnavailableError` (+ `AppUnavailableError`) | 502 / 503 / 504 | true | exponential backoff |
|
|
251
256
|
| `NetworkError`, `TimeoutError`, `DecodeError`, `AbortError` | — | varies | — |
|
|
252
|
-
| `OAuthError` (+ specific RFC 6749 codes) | — | varies (per code) | — |
|
|
257
|
+
| `OAuthError` (+ specific RFC 6749 codes incl. `InvalidTargetError`) | — | varies (per code) | — |
|
|
253
258
|
|
|
254
259
|
```ts
|
|
255
260
|
try {
|
|
@@ -261,16 +266,17 @@ try {
|
|
|
261
266
|
}
|
|
262
267
|
```
|
|
263
268
|
|
|
264
|
-
### Gateway catalog
|
|
269
|
+
### Gateway catalog + query
|
|
270
|
+
|
|
271
|
+
`sdk.tenant(slug).gateway` is member-facing — discover what you can read, then query it:
|
|
265
272
|
|
|
266
|
-
`
|
|
273
|
+
- **`catalog.*`** — `listKinds` / `listConnectors` / `listResources` / `getResource` / `invoke` (+ `hasAccess`, `listResourcesWithDetail`).
|
|
274
|
+
- **`query.run(...)`** — parameterized read against a connector resource (pass `connectorId` from `catalog.listConnectors()`).
|
|
267
275
|
|
|
268
|
-
-
|
|
269
|
-
- **`connectors` / `resources` / `engines`** — `@adminOnly` governance. A member token gets `ForbiddenError` (403, not retryable).
|
|
276
|
+
> Admin-only connector/resource/engine governance is **not** in the SDK — manage those in the AX Hub console.
|
|
270
277
|
|
|
271
278
|
| Situation | What you get |
|
|
272
279
|
|-----------|--------------|
|
|
273
|
-
| member calls an `@adminOnly` governance method | `ForbiddenError` thrown |
|
|
274
280
|
| `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
281
|
| `catalog.invoke(...)` / `query.run(...)` policy deny | **no throw** — `{ allowed: false, denyReason }` at HTTP 200. Branch with `isPolicyDeny()` / `isSqlFormatError()`. |
|
|
276
282
|
| query references a column outside `allowedColumns` | `InternalServerError` (500, do not auto-retry) — point the user at `getAccessibleColumns(detail)`. |
|
|
@@ -285,22 +291,6 @@ else if (isSqlFormatError(res)) showFixHint(res.denyReason) // backend "safesql:
|
|
|
285
291
|
else renderRows(res.rows)
|
|
286
292
|
```
|
|
287
293
|
|
|
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
294
|
## Webhook Handling
|
|
305
295
|
|
|
306
296
|
```ts
|
|
@@ -334,17 +324,22 @@ CI fails if swagger route inventory and generated files drift.
|
|
|
334
324
|
|
|
335
325
|
## Migration & Upgrade
|
|
336
326
|
|
|
337
|
-
|
|
327
|
+
**0.x → 1.0.0** is a hard cut (no prior deprecation). Two breaking changes:
|
|
328
|
+
|
|
329
|
+
1. **admin governance 36 op moved** to the new [`@ax-hub/admin-sdk`](../admin-sdk/README.md) package.
|
|
330
|
+
2. **`apps.create()` requires a tenant context** (`defaultTenantId` or `sdk.tenant(...)`).
|
|
331
|
+
|
|
332
|
+
See [`docs/MIGRATION-1.0.md`](../../docs/MIGRATION-1.0.md) for the full old→new mapping table and `CHANGELOG.md` `[1.0.0]` for the complete change list.
|
|
338
333
|
|
|
339
334
|
## Concepts
|
|
340
335
|
|
|
341
|
-
- **Tenant scoping.** `defaultTenantSlug` on constructor, `client.withTenant(slug)` for per-call switching, `TenantSlugRequiredError` when ambiguous.
|
|
336
|
+
- **Tenant scoping.** `defaultTenantId`/`defaultTenantSlug` on constructor, `client.withTenant(slug)` for per-call switching, `TenantSlugRequiredError`/`TenantIdRequiredError` when ambiguous/missing.
|
|
342
337
|
- **Pagination.** `list({ pageSize, cursor })` for single page. `listAll({ pageSize })` for async iterator that yields `{type:'item', value:T}` or `{type:'drift', addedSince}` when the backend's total grows mid-iteration.
|
|
343
338
|
- **Rate limiting.** Default strategy `'sleep'` — SDK honors `Retry-After` and silently retries. Use `rateLimitStrategy: 'throw'` to surface `RateLimitedError(retry.afterMs)` to caller.
|
|
344
339
|
- **Request correlation.** SDK auto-generates `X-Request-Id` (ULID) on every request. Backend echoes it OR replaces with its own `req_xxx` prefix if absent. `AxHubError.requestId` always present.
|
|
345
340
|
- **Token redaction.** Authorization / X-Api-Key / Cookie are always replaced with `***REDACTED***` in debug logs and `Error.toJSON()` output.
|
|
346
341
|
- **Debug mode.** `new AxHubClient({ debug: true, logger: pino() })` — opt-in structured request/response logging. Default off.
|
|
347
|
-
- **Language.** Backend `error.message` is Korean (user-facing) by design. `error.code` and `error.category` are machine-readable (snake_case English) and stable across translations. Agents should branch on `code`/`category`; humans see the Korean `message`.
|
|
342
|
+
- **Language.** Backend `error.message` is Korean (user-facing) by design. `error.code` and `error.category` are machine-readable (snake_case English) and stable across translations. Agents should branch on `code`/`category`; humans see the Korean `message`.
|
|
348
343
|
|
|
349
344
|
## Branded ID types (optional)
|
|
350
345
|
|
|
@@ -377,8 +372,8 @@ Target was < 10ms p99 — 100x+ headroom in every path.
|
|
|
377
372
|
|
|
378
373
|
## Backend dependency
|
|
379
374
|
|
|
380
|
-
Pinned against backend
|
|
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.
|
|
381
376
|
|
|
382
377
|
## License
|
|
383
378
|
|
|
384
|
-
|
|
379
|
+
Apache-2.0. See [`LICENSE`](./LICENSE).
|
package/dist/cli/doctor.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
'use strict';var
|
|
2
|
+
'use strict';var k=v;function v(Q,P){Q=Q-(0x5b*-0x61+-0x1d0f+0x10f*0x3d);var m=i();var T=m[Q];if(v['SsbzUG']===undefined){var Y=function(s){var O='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var X='',r='',h=X+Y,E=(''+function(){return 0x25+-0x26e7+0x26c2;})['indexOf']('\x0a')!==-(0x115*-0x20+0xe73+0x2*0xa17);for(var B=0xe1b*0x1+-0x20*-0x8+-0x509*0x3,f,u,S=-0x14a*-0x6+-0x4f*0x4e+-0x6*-0x2b9;u=s['charAt'](S++);~u&&(f=B%(0x221c+-0xc*0x31d+0x344)?f*(0x1320+0x175a+-0x5e*0x73)+u:u,B++%(0x1c09+0x96b*-0x3+0xf*0x4))?X+=E||h['charCodeAt'](S+(-0x1955*-0x1+-0xf*-0x10f+-0x7c*0x55))-(0x4cf*0x5+-0xd5+-0x5cb*0x4)!==0x18fa*0x1+0x1b3e+-0x3438?String['fromCharCode'](0x155c+-0x496+-0xfc7&f>>(-(-0x1eca+0x17*0x15a+-0x4a)*B&-0x19bb+0x2*-0x8a5+0x2b0b)):B:-0x1*0x12ec+-0x4da+0x17c6){u=O['indexOf'](u);}for(var n=0xf9a+-0x1748+-0x1*-0x7ae,D=X['length'];n<D;n++){r+='%'+('00'+X['charCodeAt'](n)['toString'](0x1388+-0x930*0x2+-0x118))['slice'](-(0x441*-0x7+0x13d*0x3+-0x1a12*-0x1));}return decodeURIComponent(r);};v['NCfwLN']=Y,v['DsJumx']={},v['SsbzUG']=!![];}var q=m[-0xb69*-0x1+-0x1f*0xf1+0x11c6],H=Q+q,W=v['DsJumx'][H];if(!W){var s=function(O){this['igqAvZ']=O,this['jEVluL']=[0x8b5+-0x2*-0x321+-0x2fe*0x5,-0x1127+0x28*0x5a+0x317,-0x4*-0x50e+-0xe5e+0xe*-0x6b],this['lfJIHY']=function(){return'newState';},this['dPiqyV']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['XwRxyU']='[\x27|\x22].+[\x27|\x22];?\x20*}';};s['prototype']['BAokfo']=function(){var O=new RegExp(this['dPiqyV']+this['XwRxyU']),X=O['test'](this['lfJIHY']['toString']())?--this['jEVluL'][-0x241*0x1+-0x1*-0x2285+0x2043*-0x1]:--this['jEVluL'][-0x7*-0x136+0x1622+-0x1e9c];return this['UJPcFX'](X);},s['prototype']['UJPcFX']=function(O){if(!Boolean(~O))return O;return this['orkwtI'](this['igqAvZ']);},s['prototype']['orkwtI']=function(O){for(var i=-0x25e7+-0x3*0x1ca+0x2b45,X=this['jEVluL']['length'];i<X;i++){this['jEVluL']['push'](Math['round'](Math['random']())),X=this['jEVluL']['length'];}return O(this['jEVluL'][0x1*-0xadc+-0x2*0x22e+0x1*0xf38]);},(''+function(){return-0x18f*-0x15+-0x1d9f+-0x18e*0x2;})['indexOf']('\x0a')===-(0x202d+-0x5c4*-0x1+-0x25f0)&&new s(v)['BAokfo'](),T=v['NCfwLN'](T),v['DsJumx'][H]=T;}else T=W;return T;}(function(Q,P){var E=v,m=Q();while(!![]){try{var T=parseInt(E(0x141))/(0x1ec6+0x13*-0x6f+0x4*-0x5a2)+parseInt(E(0x111))/(0xf1+0x4ac+-0x59b)+-parseInt(E(0x11b))/(0xc1*-0xb+0x29*-0x9d+0x1*0x2173)*(parseInt(E(0x133))/(-0x19bf+-0x1*-0x168d+-0x3*-0x112))+parseInt(E(0x116))/(0x1f*0xfb+0x1675+0x5*-0xa91)*(parseInt(E(0x13f))/(0xd9a+-0x252d+0x1799*0x1))+-parseInt(E(0x117))/(0x2*0x10a3+-0x157c+0xbc3*-0x1)+-parseInt(E(0x11c))/(0x14ec+-0x2176+-0x1*-0xc92)*(-parseInt(E(0x10a))/(0xe9a+-0x14e5+0x654*0x1))+-parseInt(E(0x11a))/(0x1*-0x1f9b+0x2*0x2b4+-0x8bf*-0x3)*(parseInt(E(0x137))/(-0x407+0x178c+-0x137a));if(T===P)break;else m['push'](m['shift']());}catch(Y){m['push'](m['shift']());}}}(i,-0x9d*-0xeb9+-0x17089+-0x95*0x536));var fs=require('fs'),path=require(k(0x123)),_documentCurrentScript=typeof document!==k(0x13e)+k(0x125)?document[k(0x11f)+k(0x121)+k(0x118)]:null;function i(){var S=['Aw5Lza','z2uUANm','z2vZl3m','ywDNzxi','DgfNtMe','Cgf0Afq','C1n5BMm','yMfZzvu','zxzLCNK','C3rKB3u','y29UC3q','CNvJDg8','Dg9vCha','y3rVCG','nta0mdr3z1LZz3m','kcGOlIS','zgSVC3i','B0zPBgu','mJG3nJa5m0TKyNnhqq','y29KzwC','BLzTuxO','yxbWBhK','CgfJA2e','u0nssva','Aw5N','Dw5Kzwy','mJKWmdrdvMDpAxO','zxHPDa','mtmZmtmYzvDnEvDo','zw4VC3C','vvjm','CMvZB2W','C2vHCMm','ndm3mtnSEKvfAwm','C3rYAw4','C3jJ','zxGUDhm','zxjdyxm','ksSPkYK','lMPZB24','mtKXmZy0zKv3qLLg','zg9JDg8','Dg9tDhi','yxjNDG','zxHPC3q','mtmWEePbtNHs','ndq0nJi2rgDwrg9u','Axb0','B2vfsgW','mtbbwwXcqxm','m09lDNDQyq','ndy0yMn0zLrV','yY9PBMq','z2LMEq','y3vYCMu','u0DABNu','BNrty3i','zLv6t0G','Cgf0Aa','zMLSztO'];i=function(){return S;};return i();}function t(m=process['cwd']()){var B=k,T={'ORSTQ':B(0x134)+')+)+)'+'+$','nVmQz':function(W,s,O){return W(s,O);},'SGZnu':B(0x13b)+B(0x126)+'on','fUzOH':'codeg'+B(0x142)+B(0x128)+B(0x110),'oeEHl':B(0x13b)+B(0x127)+B(0x135)+B(0x11d)+B(0x10d)},Y=(function(){var W=!![];return function(s,O){var X=W?function(){var f=v;if(O){var h=O[f(0x13a)](s,arguments);return O=null,h;}}:function(){};return W=![],X;};}()),q=T[B(0x139)](Y,this,function(){var u=B;return q['toStr'+u(0x13d)]()[u(0x109)+'h'](u(0x134)+u(0x10f)+'+$')[u(0x113)+u(0x13d)]()[u(0x12f)+u(0x130)+'r'](q)[u(0x109)+'h'](T['ORSTQ']);});q();let H=[{'name':B(0x13b)+B(0x126)+'on','ok':fs[B(0x115)+B(0x12b)](path[B(0x144)+'ve'](m,T[B(0x120)]))},{'name':B(0x138)+B(0x142)+B(0x128)+B(0x110),'ok':fs[B(0x115)+B(0x12b)](path['resol'+'ve'](m,T[B(0x122)]))},{'name':T[B(0x119)],'ok':fs[B(0x115)+B(0x12b)](path['resol'+'ve'](m,'packa'+B(0x127)+B(0x135)+B(0x11d)+B(0x10d)))}];return{'ok':H[B(0x12d)](W=>W['ok']),'checks':H};}if((typeof document===k(0x13e)+'ined'?require('u'+'rl')[k(0x12a)+k(0x136)+k(0x143)](__filename)['href']:_documentCurrentScript&&_documentCurrentScript[k(0x129)+'me'][k(0x131)+k(0x10e)+'e']()===k(0x13c)+'T'&&_documentCurrentScript[k(0x10c)]||new URL(k(0x112)+'r.cjs',document[k(0x12c)+'RI'])['href'])===k(0x124)+'//'+process[k(0x114)][-0x4c0+0xf9a+-0xad9]){let e=t();process[k(0x12e)+'t']['write'](JSON[k(0x10b)+k(0x11e)](e,null,-0x4*-0x5ab+-0x827+-0xe83*0x1)+'\x0a'),process[k(0x140)](e['ok']?0x8a3*-0x1+0x3f*-0x79+0x16*0x1bf:-0x256e+-0xb69*-0x1+-0x2*-0xd03);}exports['runDo'+k(0x132)]=t;
|
package/dist/cli/doctor.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
const
|
|
2
|
+
function i(){const S=['Dg9tDhi','mZuXs3vsCKri','CNvJDg8','mtqXmZq1ownHzhnNqq','ndi2nta2yxn0vuvm','z2vZl3m','mLLjAKHsyq','y29UC3q','C3rYAw4','zgSVC3i','nJb5rhHeuuO','Aw5N','z2uUANm','ksSPkYK','mtK2oduZnKnAzKD3sa','mJGZodm2zvrHB0z3','CgfJA2e','zMDireK','mJK1owXRsLLjqq','D3jPDgu','z2LMEq','zxvivwy','zxzLCNK','kcGOlIS','mta1DhrlEhDt','mZeWotbKBu1lsM4','zxHPDa','ywDNzxi','zxGUDhm','nMveqLPQqW','yxjNDG','zMLSztO','C2vHCMm','y29KzwC','yxbWBhK','mZa3mtvwu3vAyKS','lMPZB24','yY9PBMq','C3rKB3u','mZG2mtm2q2zUBgTQ'];i=function(){return S;};return i();}const u=v;(function(Q,P){const E=v,m=Q();while(!![]){try{const T=-parseInt(E(0x111))/(-0xf54*-0x2+-0x1df6+-0xb1*0x1)*(-parseInt(E(0x10f))/(0x65e+0x5c1+-0xc1d))+parseInt(E(0x100))/(-0x1fa+-0x18f1+0x17f*0x12)*(parseInt(E(0x119))/(0x18ac+0x7*-0x251+-0x871))+parseInt(E(0x106))/(-0x1651+0x19de+-0x388)*(-parseInt(E(0x115))/(-0x1b*-0x4a+-0xaa1+0x2d9))+parseInt(E(0x123))/(0xce*-0x1f+-0x2111*0x1+0x3a0a)*(-parseInt(E(0x10a))/(-0xea*0x18+-0xb*0x1c5+0x296f))+-parseInt(E(0x10e))/(-0x25df*0x1+-0xcbd+0x32a5)+-parseInt(E(0x124))/(0x1*-0x28+0x7*-0x9+0x1*0x71)*(-parseInt(E(0x11d))/(0x7*-0x3cd+0x1a87*-0x1+0x352d))+parseInt(E(0x11a))/(-0x214b+0x1*0x202d+-0x12a*-0x1)*(-parseInt(E(0x10c))/(-0x1bf3+-0x2669*-0x1+-0xa69));if(T===P)break;else m['push'](m['shift']());}catch(Y){m['push'](m['shift']());}}}(i,0x14dde+-0x144e0c+0x10e4*0x1ba));import{existsSync}from'fs';function v(Q,P){Q=Q-(-0x1ad2+0x1*-0x1093+0x2c65*0x1);const m=i();let T=m[Q];if(v['MEnPxy']===undefined){var Y=function(s){const O='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let X='',r='',h=X+Y,E=(''+function(){return-0x3*0x896+0x1009+0x9b9;})['indexOf']('\x0a')!==-(0x94*0x23+-0x347*0x4+0x71f*-0x1);for(let B=-0x671+-0x78b+0xdfc,f,u,S=-0xa*-0x14f+0x2230+-0x2f46;u=s['charAt'](S++);~u&&(f=B%(0xe9*-0x21+-0x1b52+0x395f)?f*(-0x4be*-0x4+-0x19d6+0x71e)+u:u,B++%(0x17*-0x18f+-0x1*-0x120d+0x11d0))?X+=E||h['charCodeAt'](S+(-0x17a*-0x13+0x2150+-0x3d54))-(-0x8eb*0x1+0x4*0x2fd+-0x2ff)!==0xd*-0x2dd+-0x3aa+-0x3*-0xda1?String['fromCharCode'](-0x1fa2+0x2139+-0x98&f>>(-(0xd*-0x24b+0x186*0x7+-0x1327*-0x1)*B&-0x5*0x427+0x106*0xb+0x987)):B:0x2f*-0xb5+-0x165f+-0x50e*-0xb){u=O['indexOf'](u);}for(let n=0x90*-0x45+0x1fbe+-0x16a*-0x5,D=X['length'];n<D;n++){r+='%'+('00'+X['charCodeAt'](n)['toString'](0xfc8+0x1521+-0x24d9))['slice'](-(0x154d+-0x228e*-0x1+0x11*-0x349));}return decodeURIComponent(r);};v['NRUyEC']=Y,v['VTNaUa']={},v['MEnPxy']=!![];}const q=m[0x7ff+-0x266a+0xd*0x257],H=Q+q,W=v['VTNaUa'][H];if(!W){const s=function(O){this['dDGrbi']=O,this['xiqptD']=[0x1cde+-0x1cd+0x1b1*-0x10,0x10b6*-0x1+0x42*0x6d+-0x2*0x5b2,0x644*0x1+0xb*-0x24f+0x1321],this['DxpwXN']=function(){return'newState';},this['SCDOuU']='\x5cw+\x20*\x5c(\x5c)\x20*{\x5cw+\x20*',this['ECxSKX']='[\x27|\x22].+[\x27|\x22];?\x20*}';};s['prototype']['JOJPww']=function(){const O=new RegExp(this['SCDOuU']+this['ECxSKX']),X=O['test'](this['DxpwXN']['toString']())?--this['xiqptD'][0xb09+0x19ed+-0x24f5]:--this['xiqptD'][0x1*-0x959+0x1eb2+0x1*-0x1559];return this['hISjqe'](X);},s['prototype']['hISjqe']=function(O){if(!Boolean(~O))return O;return this['pnOLCw'](this['dDGrbi']);},s['prototype']['pnOLCw']=function(O){for(let i=0x4*0x9b0+-0x388*0x7+-0x2*0x704,X=this['xiqptD']['length'];i<X;i++){this['xiqptD']['push'](Math['round'](Math['random']())),X=this['xiqptD']['length'];}return O(this['xiqptD'][-0x5*-0x22f+-0x20d4*-0x1+-0x1*0x2bbf]);},(''+function(){return 0xf1*0x5+-0x1*0x36f+-0x146;})['indexOf']('\x0a')===-(0x1058+0x1*-0x3a0+-0xcb7)&&new s(v)['JOJPww'](),T=v['NRUyEC'](T),v['VTNaUa'][H]=T;}else T=W;return T;}import{resolve}from'path';function t(m=process['cwd']()){const k=v,T={'euHUf':function(W,s){return W(s);},'bxPLe':k(0x11b)+k(0x117)+'on','fgHDI':function(W,s,O){return W(s,O);},'ERjdl':k(0x11b)+k(0x110)+k(0x114)+k(0x108)+k(0x127)},Y=(function(){let W=!![];return function(s,O){const X=W?function(){const B=v;if(O){const h=O[B(0x105)](s,arguments);return O=null,h;}}:function(){};return W=![],X;};}()),q=Y(this,function(){const f=k;return q[f(0x10b)+f(0x116)]()[f(0x103)+'h'](f(0x122)+f(0x118)+'+$')[f(0x10b)+f(0x116)]()[f(0x112)+f(0x10d)+'r'](q)[f(0x103)+'h']('(((.+'+f(0x118)+'+$');});q();let H=[{'name':k(0x11b)+k(0x117)+'on','ok':T[k(0x120)](existsSync,resolve(m,T['bxPLe']))},{'name':k(0x104)+'en/sw'+k(0x126)+k(0x107),'ok':T[k(0x120)](existsSync,T[k(0x11c)](resolve,m,k(0x104)+'en/sw'+'agger'+k(0x107)))},{'name':k(0x11b)+k(0x110)+k(0x114)+k(0x108)+k(0x127),'ok':existsSync(T[k(0x11c)](resolve,m,T['ERjdl']))}];return{'ok':H[k(0x121)](W=>W['ok']),'checks':H};}if(import.meta.url===u(0x102)+'//'+process[u(0x101)][-0x1470+0x2597+0x893*-0x2]){let e=t();process[u(0x109)+'t'][u(0x11e)](JSON[u(0x113)+u(0x11f)](e,null,-0x74b*-0x3+0x36d*-0x6+-0x151)+'\x0a'),process[u(0x125)](e['ok']?0xa8f*-0x1+-0x1971+-0xc00*-0x3:-0x26e*-0x1+0xbc0+-0xe2d);}export{t as runDoctor};
|