@agentscope-ai/platform-cli 1.0.1 → 1.0.3
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 +3 -5
- package/dist/{chunk-ZWIGSPQ7.js → chunk-4I5YYR2G.js} +7 -4
- package/dist/chunk-4I5YYR2G.js.map +1 -0
- package/dist/{chunk-R6ENZ5K2.js → chunk-IWWTP4LN.js} +7 -4
- package/dist/chunk-IWWTP4LN.js.map +1 -0
- package/dist/cli.js +2 -2
- package/dist/cli.js.map +1 -1
- package/dist/{credentials-JQEHX5KD.js → credentials-LIUOYT7K.js} +2 -2
- package/dist/{credentials-SA7AOLNR.js → credentials-TT7CW3HF.js} +2 -2
- package/dist/index.d.ts +3 -3
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/dist/chunk-R6ENZ5K2.js.map +0 -1
- package/dist/chunk-ZWIGSPQ7.js.map +0 -1
- /package/dist/{credentials-JQEHX5KD.js.map → credentials-LIUOYT7K.js.map} +0 -0
- /package/dist/{credentials-SA7AOLNR.js.map → credentials-TT7CW3HF.js.map} +0 -0
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
isTokenExpired,
|
|
5
5
|
loadCredentials,
|
|
6
6
|
saveCredentials
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-4I5YYR2G.js";
|
|
8
8
|
export {
|
|
9
9
|
clearCredentials,
|
|
10
10
|
credentialsFromTokenResponse,
|
|
@@ -12,4 +12,4 @@ export {
|
|
|
12
12
|
loadCredentials,
|
|
13
13
|
saveCredentials
|
|
14
14
|
};
|
|
15
|
-
//# sourceMappingURL=credentials-
|
|
15
|
+
//# sourceMappingURL=credentials-LIUOYT7K.js.map
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
isTokenExpired,
|
|
6
6
|
loadCredentials,
|
|
7
7
|
saveCredentials
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-IWWTP4LN.js";
|
|
9
9
|
export {
|
|
10
10
|
clearCredentials,
|
|
11
11
|
credentialsFromTokenResponse,
|
|
@@ -13,4 +13,4 @@ export {
|
|
|
13
13
|
loadCredentials,
|
|
14
14
|
saveCredentials
|
|
15
15
|
};
|
|
16
|
-
//# sourceMappingURL=credentials-
|
|
16
|
+
//# sourceMappingURL=credentials-TT7CW3HF.js.map
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
declare const CLI_VERSION: string;
|
|
2
|
-
declare const PLATFORM_URL = "https://platform
|
|
3
|
-
declare const DEFAULT_PLATFORM_URL = "https://platform
|
|
2
|
+
declare const PLATFORM_URL = "https://platform.agentscope.io";
|
|
3
|
+
declare const DEFAULT_PLATFORM_URL = "https://platform.agentscope.io";
|
|
4
4
|
/** @deprecated Use {@link PLATFORM_URL} */
|
|
5
|
-
declare const PRE_PLATFORM_URL = "https://platform
|
|
5
|
+
declare const PRE_PLATFORM_URL = "https://platform.agentscope.io";
|
|
6
6
|
|
|
7
7
|
interface GlobalOptions {
|
|
8
8
|
platformUrl?: string;
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/errors.ts","../src/auth/session.ts","../src/api/client.ts","../src/api/cli-api.ts"],"sourcesContent":["export interface ApiErrorBody {\n request_id?: string;\n error: {\n code: string;\n message: string;\n hint?: string;\n };\n}\n\nexport class AspError extends Error {\n readonly code: string;\n readonly hint?: string;\n readonly requestId?: string;\n readonly statusCode?: number;\n readonly exitCode: number;\n\n constructor(\n message: string,\n options: {\n code?: string;\n hint?: string;\n requestId?: string;\n statusCode?: number;\n exitCode?: number;\n cause?: unknown;\n } = {},\n ) {\n super(message, { cause: options.cause });\n this.name = \"AspError\";\n this.code = options.code ?? \"UNKNOWN\";\n this.hint = options.hint;\n this.requestId = options.requestId;\n this.statusCode = options.statusCode;\n this.exitCode = options.exitCode ?? 1;\n }\n\n static fromResponse(status: number, body: unknown): AspError {\n const parsed = body as Partial<ApiErrorBody> & {\n error?: ApiErrorBody[\"error\"] & { detail?: string };\n };\n if (parsed?.error) {\n const exitCode = mapErrorCodeToExit(parsed.error.code, status);\n let hint = parsed.error.hint ?? parsed.error.detail;\n if (parsed.error.code === \"ASP.COMM.NOT_FOUND\") {\n hint = hint ?? \"The API endpoint is not available on this Platform environment.\";\n }\n return new AspError(parsed.error.message, {\n code: parsed.error.code,\n hint,\n requestId: parsed.request_id,\n statusCode: status,\n exitCode,\n });\n }\n return new AspError(`HTTP ${status}`, {\n code: \"HTTP_ERROR\",\n statusCode: status,\n exitCode: status >= 500 ? 2 : 1,\n });\n }\n}\n\nfunction mapErrorCodeToExit(code: string, status: number): number {\n if (\n code === \"UNAUTHORIZED\" ||\n code === \"UNAUTHENTICATED\" ||\n code === \"ASP.AUTH.UNAUTHORIZED\" ||\n code === \"ASP.AUTH.SESSION_INVALID\" ||\n code === \"SESSION_INVALID\"\n ) {\n return 3;\n }\n if (code === \"FORBIDDEN\") return 4;\n if (status >= 500) return 2;\n return 1;\n}\n\nexport function maskSecrets(text: string): string {\n return text\n .replace(/Bearer\\s+[A-Za-z0-9._-]+/gi, \"Bearer [REDACTED]\")\n .replace(/\"access_token\"\\s*:\\s*\"[^\"]+\"/gi, '\"access_token\":\"[REDACTED]\"')\n .replace(/\"refresh_token\"\\s*:\\s*\"[^\"]+\"/gi, '\"refresh_token\":\"[REDACTED]\"')\n .replace(/\"token\"\\s*:\\s*\"[^\"]+\"/gi, '\"token\":\"[REDACTED]\"');\n}\n","import type { ResolvedConfig } from \"../config.js\";\nimport { CliApiClient, type TokenResponse } from \"../api/cli-api.js\";\nimport {\n credentialsFromTokenResponse,\n saveCredentials,\n type StoredCredentials,\n} from \"./credentials.js\";\nimport { AspError } from \"../utils/errors.js\";\n\nexport function isSessionInvalidError(err: unknown): boolean {\n if (!(err instanceof AspError)) return false;\n return err.code === \"ASP.AUTH.SESSION_INVALID\" || err.code === \"SESSION_INVALID\";\n}\n\nexport async function refreshStoredSession(\n config: ResolvedConfig,\n refreshToken: string,\n platformUrl: string,\n): Promise<StoredCredentials> {\n const client = new CliApiClient({\n ...config,\n token: undefined,\n platformUrl: platformUrl.replace(/\\/$/, \"\"),\n });\n const refreshed = await client.refresh(refreshToken);\n const creds = credentialsFromTokenResponse(platformUrl, refreshed);\n await saveCredentials(creds);\n return creds;\n}\n\n/** Login 返回的 access_token 在 pre 环境需先 refresh 才能访问 /me */\nexport async function finalizeLogin(\n config: ResolvedConfig,\n loginResponse: TokenResponse,\n): Promise<StoredCredentials> {\n if (!loginResponse.refresh_token) {\n const creds = credentialsFromTokenResponse(config.platformUrl, loginResponse);\n await saveCredentials(creds);\n return creds;\n }\n\n try {\n return await refreshStoredSession(\n config,\n loginResponse.refresh_token,\n config.platformUrl,\n );\n } catch {\n const creds = credentialsFromTokenResponse(config.platformUrl, loginResponse);\n await saveCredentials(creds);\n return creds;\n }\n}\n\nexport async function ensureValidSession(config: ResolvedConfig): Promise<StoredCredentials> {\n const { loadCredentials, isTokenExpired } = await import(\"./credentials.js\");\n const creds = await loadCredentials();\n if (!creds) {\n throw new AspError(\"Not logged in.\", {\n code: \"UNAUTHORIZED\",\n hint: \"Run `asp auth login`.\",\n exitCode: 3,\n });\n }\n\n if (!isTokenExpired(creds) && creds.access_token) {\n return creds;\n }\n\n if (!creds.refresh_token) {\n throw new AspError(\"Session expired.\", {\n code: \"ASP.AUTH.SESSION_INVALID\",\n hint: \"Run `asp auth login`.\",\n exitCode: 3,\n });\n }\n\n return refreshStoredSession(config, creds.refresh_token, creds.platform_url);\n}\n","import { AspError, maskSecrets } from \"../utils/errors.js\";\nimport type { ResolvedConfig } from \"../config.js\";\nimport {\n loadCredentials,\n isTokenExpired,\n type StoredCredentials,\n} from \"../auth/credentials.js\";\nimport { refreshStoredSession, isSessionInvalidError } from \"../auth/session.js\";\n\nexport interface RequestOptions {\n method?: string;\n path: string;\n body?: unknown;\n headers?: Record<string, string>;\n auth?: boolean;\n prefix?: string;\n _retried?: boolean;\n}\n\nexport class HttpClient {\n constructor(private readonly config: ResolvedConfig) {}\n\n async request<T>(opts: RequestOptions): Promise<T> {\n try {\n return await this.doRequest<T>(opts);\n } catch (err) {\n if (\n opts.auth !== false &&\n !opts._retried &&\n isSessionInvalidError(err) &&\n !this.config.token\n ) {\n const creds = await loadCredentials();\n if (creds?.refresh_token) {\n await refreshStoredSession(configWithPlatform(this.config, creds), creds.refresh_token, creds.platform_url);\n return this.doRequest<T>({ ...opts, _retried: true });\n }\n }\n throw err;\n }\n }\n\n private async doRequest<T>(opts: RequestOptions): Promise<T> {\n const creds = opts.auth !== false && !this.config.token ? await loadCredentials() : null;\n const platformUrl = creds?.platform_url ?? this.config.platformUrl;\n const prefix = opts.prefix ?? \"\";\n const url = `${platformUrl}${prefix}${opts.path}`;\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n ...opts.headers,\n };\n\n if (opts.body !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n\n if (opts.auth !== false) {\n const token = await this.resolveAccessToken(creds);\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n }\n\n if (this.config.verbose) {\n console.error(`[verbose] ${opts.method ?? \"GET\"} ${url}`);\n if (opts.body) console.error(maskSecrets(JSON.stringify(opts.body)));\n }\n\n const res = await fetch(url, {\n method: opts.method ?? \"GET\",\n headers,\n body: opts.body !== undefined ? JSON.stringify(opts.body) : undefined,\n });\n\n const text = await res.text();\n let data: unknown = {};\n if (text) {\n try {\n data = JSON.parse(text);\n } catch {\n data = { raw: text };\n }\n }\n\n if (this.config.verbose) {\n console.error(`[verbose] ${res.status}`, maskSecrets(text.slice(0, 2000)));\n }\n\n if (!res.ok) {\n throw AspError.fromResponse(res.status, data);\n }\n\n return data as T;\n }\n\n async resolveAccessToken(existing?: StoredCredentials | null): Promise<string | undefined> {\n if (this.config.token) return this.config.token;\n\n const creds = existing ?? (await loadCredentials());\n if (!creds) return undefined;\n\n if (isTokenExpired(creds) && creds.refresh_token) {\n const refreshed = await refreshStoredSession(\n configWithPlatform(this.config, creds),\n creds.refresh_token,\n creds.platform_url,\n );\n return refreshed.access_token;\n }\n\n return creds.access_token;\n }\n}\n\nfunction configWithPlatform(config: ResolvedConfig, creds: StoredCredentials): ResolvedConfig {\n return { ...config, platformUrl: creds.platform_url || config.platformUrl };\n}\n","import { CLI_API_PREFIX } from \"../constants.js\";\nimport type { ResolvedConfig } from \"../config.js\";\nimport { HttpClient } from \"./client.js\";\n\nexport interface MetaResponse {\n request_id: string;\n service: string;\n api_version: string;\n platform_url: string;\n environment: string;\n min_cli_version: string;\n recommended_cli_version: string;\n features: Record<string, boolean>;\n}\n\nexport interface MeResponse {\n request_id: string;\n user_id?: string;\n account?: string;\n email?: string;\n username?: string;\n is_admin?: boolean;\n user?: {\n id: string;\n display_name?: string;\n email?: string;\n };\n scopes?: string[];\n}\n\nexport interface TokenResponse {\n request_id: string;\n access_token: string;\n refresh_token?: string;\n token_type: string;\n expires_in?: number;\n scope?: string;\n user?: {\n id: string;\n display_name?: string;\n email?: string;\n };\n}\n\n\nexport interface RequestLogItem {\n request_id?: string;\n method: string;\n path: string;\n request_body?: unknown;\n response_status?: number;\n duration_ms?: number;\n created_at: string;\n}\n\nexport interface RequestLogsResponse {\n request_id: string;\n items: RequestLogItem[];\n next_cursor?: string | null;\n}\n\nexport interface PluginListItem {\n plugin_id: string;\n name?: string;\n description?: string;\n summary?: string;\n source?: \"official\" | \"verified\" | \"community\";\n tech_type?: string;\n category?: string;\n author_display_name?: string;\n latest_version?: string;\n downloads?: number;\n public_url?: string;\n updated_at?: string;\n [key: string]: unknown;\n}\n\nexport interface PluginListResponse {\n request_id: string;\n items: PluginListItem[];\n next_cursor?: string | null;\n}\n\nexport interface PluginVersionItem {\n version: string;\n published_at?: string;\n deprecated?: boolean;\n [key: string]: unknown;\n}\n\nexport interface PluginVersionsResponse {\n request_id: string;\n plugin_id: string;\n items: PluginVersionItem[];\n}\n\nexport interface PluginInfoResponse {\n request_id: string;\n plugin_id: string;\n install_command?: string;\n public_url?: string;\n latest_version?: string;\n scan_status?: string;\n min_qwenpaw_version?: string;\n [key: string]: unknown;\n}\n\nexport interface SkillListItem {\n skill_id: string;\n skill_code?: string;\n name?: string;\n description?: string;\n summary?: string;\n category?: string;\n category_label?: string;\n source?: \"official\" | \"verified\" | \"community\";\n author_display_name?: string;\n latest_version?: string;\n downloads?: number;\n public_url?: string;\n updated_at?: string;\n [key: string]: unknown;\n}\n\nexport interface SkillListResponse {\n request_id: string;\n items: SkillListItem[];\n next_cursor?: string | null;\n}\n\nexport interface SkillVersionItem {\n version: string;\n published_at?: string;\n deprecated?: boolean;\n [key: string]: unknown;\n}\n\nexport interface SkillVersionsResponse {\n request_id: string;\n skill_id: string;\n items: SkillVersionItem[];\n}\n\nexport interface SkillInfoResponse {\n request_id: string;\n skill_id: string;\n install_command?: string;\n public_url?: string;\n latest_version?: string;\n scan_status?: string;\n [key: string]: unknown;\n}\n\nexport interface InstallIntentResponse {\n request_id: string;\n download_url: string;\n sha512?: string;\n expires_at?: string;\n signature?: string | null;\n scan_status?: string;\n version?: string;\n}\n\nexport interface CliSubmissionUpload {\n method?: string;\n url: string;\n headers?: Record<string, string>;\n expires_at?: string;\n}\n\nexport interface CliSubmissionScan {\n status?: \"queued\" | \"running\" | \"passed\" | \"failed\";\n summary?: string;\n [key: string]: unknown;\n}\n\nexport interface CliSubmissionPublish {\n status?: string;\n public_url?: string;\n [key: string]: unknown;\n}\n\nexport interface CliSubmissionFailure {\n code?: string;\n message?: string;\n}\n\nexport interface CliSubmissionResponse {\n request_id: string;\n submission_id: string;\n status:\n | \"upload_url_issued\"\n | \"queued_for_scan\"\n | \"scanning\"\n | \"published\"\n | \"scan_failed\"\n | \"upload_failed\"\n | \"expired\";\n terminal: boolean;\n upload?: CliSubmissionUpload | null;\n scan?: CliSubmissionScan | null;\n publish?: CliSubmissionPublish | null;\n failure?: CliSubmissionFailure | null;\n links?: { status?: string; logs?: string };\n next_poll_after_seconds?: number;\n}\n\nexport interface CliSubmissionLogItem {\n level: \"info\" | \"error\" | string;\n message: string;\n timestamp: string;\n}\n\nexport interface CliSubmissionLogsResponse {\n request_id: string;\n submission_id: string;\n items: CliSubmissionLogItem[];\n}\n\nexport class CliApiClient {\n private readonly http: HttpClient;\n\n constructor(config: ResolvedConfig) {\n this.http = new HttpClient(config);\n }\n\n private req<T>(opts: Parameters<HttpClient[\"request\"]>[0]): Promise<T> {\n return this.http.request<T>({ ...opts, prefix: CLI_API_PREFIX });\n }\n\n getMeta(): Promise<MetaResponse> {\n return this.req({ path: \"/meta\", auth: false });\n }\n\n getMe(): Promise<MeResponse> {\n return this.req({ path: \"/me\" });\n }\n\n login(account: string, password: string): Promise<TokenResponse> {\n return this.req({\n method: \"POST\",\n path: \"/auth/login\",\n auth: false,\n body: { account, password },\n });\n }\n\n refresh(refreshToken: string): Promise<TokenResponse> {\n return this.req({\n method: \"POST\",\n path: \"/auth/refresh\",\n auth: false,\n body: { refresh_token: refreshToken },\n });\n }\n\n oauthToken(body: Record<string, string>): Promise<TokenResponse> {\n return this.req({ method: \"POST\", path: \"/oauth/token\", auth: false, body });\n }\n\n oauthRevoke(token: string, tokenTypeHint = \"refresh_token\"): Promise<{ ok: boolean }> {\n return this.req<{ ok: boolean }>({\n method: \"POST\",\n path: \"/oauth/revoke\",\n body: { token, token_type_hint: tokenTypeHint },\n });\n }\n\n async logout(): Promise<{ ok: boolean }> {\n try {\n return await this.req<{ ok: boolean }>({ method: \"POST\", path: \"/auth/logout\" });\n } catch {\n return this.oauthRevoke(\"\", \"access_token\");\n }\n }\n\n getRequestLogs(params?: {\n page_size?: number;\n cursor?: string;\n }): Promise<RequestLogsResponse> {\n const query = new URLSearchParams();\n if (params?.page_size !== undefined) query.set(\"page_size\", String(params.page_size));\n if (params?.cursor) query.set(\"cursor\", params.cursor);\n const suffix = query.toString();\n return this.req({ path: `/request-logs${suffix ? `?${suffix}` : \"\"}` });\n }\n\n searchPlugins(params?: {\n q?: string;\n category?: string;\n source?: \"official\" | \"verified\" | \"community\";\n sort?: \"recommended\" | \"downloads\" | \"updated_at\";\n page_size?: number;\n cursor?: string;\n }): Promise<PluginListResponse> {\n const query = new URLSearchParams();\n if (params?.q) query.set(\"q\", params.q);\n if (params?.category) query.set(\"category\", params.category);\n if (params?.source) query.set(\"source\", params.source);\n if (params?.sort) query.set(\"sort\", params.sort);\n if (params?.page_size !== undefined) query.set(\"page_size\", String(params.page_size));\n if (params?.cursor) query.set(\"cursor\", params.cursor);\n const suffix = query.toString();\n return this.req({ path: `/plugins${suffix ? `?${suffix}` : \"\"}`, auth: false });\n }\n\n getPluginInfo(pluginId: string, version?: string): Promise<PluginInfoResponse> {\n const query = new URLSearchParams();\n if (version) query.set(\"version\", version);\n const suffix = query.toString();\n return this.req({\n path: `/plugins/${encodeURIComponent(pluginId)}${suffix ? `?${suffix}` : \"\"}`,\n auth: false,\n });\n }\n\n getPluginVersions(pluginId: string): Promise<PluginVersionsResponse> {\n return this.req({\n path: `/plugins/${encodeURIComponent(pluginId)}/versions`,\n auth: false,\n });\n }\n\n createInstallIntent(pluginId: string, version?: string): Promise<InstallIntentResponse> {\n return this.req({\n method: \"POST\",\n path: `/plugins/${encodeURIComponent(pluginId)}/install-intent`,\n body: version ? { version } : {},\n });\n }\n\n searchSkills(params?: {\n q?: string;\n category?: string;\n source?: \"official\" | \"verified\" | \"community\";\n tag?: string;\n sort?: \"recommended\" | \"downloads\" | \"updated_at\";\n page_size?: number;\n cursor?: string;\n }): Promise<SkillListResponse> {\n const query = new URLSearchParams();\n if (params?.q) query.set(\"q\", params.q);\n if (params?.category) query.set(\"category\", params.category);\n if (params?.source) query.set(\"source\", params.source);\n if (params?.tag) query.set(\"tag\", params.tag);\n if (params?.sort) query.set(\"sort\", params.sort);\n if (params?.page_size !== undefined) query.set(\"page_size\", String(params.page_size));\n if (params?.cursor) query.set(\"cursor\", params.cursor);\n const suffix = query.toString();\n return this.req({ path: `/skills${suffix ? `?${suffix}` : \"\"}`, auth: false });\n }\n\n getSkillInfo(skillId: string, version?: string): Promise<SkillInfoResponse> {\n const query = new URLSearchParams();\n if (version) query.set(\"version\", version);\n const suffix = query.toString();\n return this.req({\n path: `/skills/${encodeURIComponent(skillId)}${suffix ? `?${suffix}` : \"\"}`,\n auth: false,\n });\n }\n\n getSkillVersions(skillId: string): Promise<SkillVersionsResponse> {\n return this.req({\n path: `/skills/${encodeURIComponent(skillId)}/versions`,\n auth: false,\n });\n }\n\n createSkillInstallIntent(skillId: string, version?: string): Promise<InstallIntentResponse> {\n return this.req({\n method: \"POST\",\n path: `/skills/${encodeURIComponent(skillId)}/install-intent`,\n body: version ? { version } : {},\n });\n }\n\n createArtifactSubmission(body: Record<string, unknown>): Promise<CliSubmissionResponse> {\n return this.req({\n method: \"POST\",\n path: \"/artifact-submissions\",\n body,\n });\n }\n\n completeArtifactSubmission(\n submissionId: string,\n body: { sha512: string; size_bytes: number },\n ): Promise<CliSubmissionResponse> {\n return this.req({\n method: \"POST\",\n path: `/artifact-submissions/${encodeURIComponent(submissionId)}/complete`,\n body,\n });\n }\n\n getArtifactSubmission(submissionId: string): Promise<CliSubmissionResponse> {\n return this.req({\n path: `/artifact-submissions/${encodeURIComponent(submissionId)}`,\n });\n }\n\n getArtifactSubmissionLogs(submissionId: string): Promise<CliSubmissionLogsResponse> {\n return this.req({\n path: `/artifact-submissions/${encodeURIComponent(submissionId)}/logs`,\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AASO,IAAM,WAAN,MAAM,kBAAiB,MAAM;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YACE,SACA,UAOI,CAAC,GACL;AACA,UAAM,SAAS,EAAE,OAAO,QAAQ,MAAM,CAAC;AACvC,SAAK,OAAO;AACZ,SAAK,OAAO,QAAQ,QAAQ;AAC5B,SAAK,OAAO,QAAQ;AACpB,SAAK,YAAY,QAAQ;AACzB,SAAK,aAAa,QAAQ;AAC1B,SAAK,WAAW,QAAQ,YAAY;AAAA,EACtC;AAAA,EAEA,OAAO,aAAa,QAAgB,MAAyB;AAC3D,UAAM,SAAS;AAGf,QAAI,QAAQ,OAAO;AACjB,YAAM,WAAW,mBAAmB,OAAO,MAAM,MAAM,MAAM;AAC7D,UAAI,OAAO,OAAO,MAAM,QAAQ,OAAO,MAAM;AAC7C,UAAI,OAAO,MAAM,SAAS,sBAAsB;AAC9C,eAAO,QAAQ;AAAA,MACjB;AACA,aAAO,IAAI,UAAS,OAAO,MAAM,SAAS;AAAA,QACxC,MAAM,OAAO,MAAM;AAAA,QACnB;AAAA,QACA,WAAW,OAAO;AAAA,QAClB,YAAY;AAAA,QACZ;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO,IAAI,UAAS,QAAQ,MAAM,IAAI;AAAA,MACpC,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,UAAU,UAAU,MAAM,IAAI;AAAA,IAChC,CAAC;AAAA,EACH;AACF;AAEA,SAAS,mBAAmB,MAAc,QAAwB;AAChE,MACE,SAAS,kBACT,SAAS,qBACT,SAAS,2BACT,SAAS,8BACT,SAAS,mBACT;AACA,WAAO;AAAA,EACT;AACA,MAAI,SAAS,YAAa,QAAO;AACjC,MAAI,UAAU,IAAK,QAAO;AAC1B,SAAO;AACT;AAEO,SAAS,YAAY,MAAsB;AAChD,SAAO,KACJ,QAAQ,8BAA8B,mBAAmB,EACzD,QAAQ,kCAAkC,6BAA6B,EACvE,QAAQ,mCAAmC,8BAA8B,EACzE,QAAQ,2BAA2B,sBAAsB;AAC9D;;;AC1EO,SAAS,sBAAsB,KAAuB;AAC3D,MAAI,EAAE,eAAe,UAAW,QAAO;AACvC,SAAO,IAAI,SAAS,8BAA8B,IAAI,SAAS;AACjE;AAEA,eAAsB,qBACpB,QACA,cACA,aAC4B;AAC5B,QAAM,SAAS,IAAI,aAAa;AAAA,IAC9B,GAAG;AAAA,IACH,OAAO;AAAA,IACP,aAAa,YAAY,QAAQ,OAAO,EAAE;AAAA,EAC5C,CAAC;AACD,QAAM,YAAY,MAAM,OAAO,QAAQ,YAAY;AACnD,QAAM,QAAQ,6BAA6B,aAAa,SAAS;AACjE,QAAM,gBAAgB,KAAK;AAC3B,SAAO;AACT;;;ACTO,IAAM,aAAN,MAAiB;AAAA,EACtB,YAA6B,QAAwB;AAAxB;AAAA,EAAyB;AAAA,EAAzB;AAAA,EAE7B,MAAM,QAAW,MAAkC;AACjD,QAAI;AACF,aAAO,MAAM,KAAK,UAAa,IAAI;AAAA,IACrC,SAAS,KAAK;AACZ,UACE,KAAK,SAAS,SACd,CAAC,KAAK,YACN,sBAAsB,GAAG,KACzB,CAAC,KAAK,OAAO,OACb;AACA,cAAM,QAAQ,MAAM,gBAAgB;AACpC,YAAI,OAAO,eAAe;AACxB,gBAAM,qBAAqB,mBAAmB,KAAK,QAAQ,KAAK,GAAG,MAAM,eAAe,MAAM,YAAY;AAC1G,iBAAO,KAAK,UAAa,EAAE,GAAG,MAAM,UAAU,KAAK,CAAC;AAAA,QACtD;AAAA,MACF;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAc,UAAa,MAAkC;AAC3D,UAAM,QAAQ,KAAK,SAAS,SAAS,CAAC,KAAK,OAAO,QAAQ,MAAM,gBAAgB,IAAI;AACpF,UAAM,cAAc,OAAO,gBAAgB,KAAK,OAAO;AACvD,UAAM,SAAS,KAAK,UAAU;AAC9B,UAAM,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,KAAK,IAAI;AAC/C,UAAM,UAAkC;AAAA,MACtC,QAAQ;AAAA,MACR,GAAG,KAAK;AAAA,IACV;AAEA,QAAI,KAAK,SAAS,QAAW;AAC3B,cAAQ,cAAc,IAAI;AAAA,IAC5B;AAEA,QAAI,KAAK,SAAS,OAAO;AACvB,YAAM,QAAQ,MAAM,KAAK,mBAAmB,KAAK;AACjD,UAAI,OAAO;AACT,gBAAQ,gBAAgB,UAAU,KAAK;AAAA,MACzC;AAAA,IACF;AAEA,QAAI,KAAK,OAAO,SAAS;AACvB,cAAQ,MAAM,aAAa,KAAK,UAAU,KAAK,IAAI,GAAG,EAAE;AACxD,UAAI,KAAK,KAAM,SAAQ,MAAM,YAAY,KAAK,UAAU,KAAK,IAAI,CAAC,CAAC;AAAA,IACrE;AAEA,UAAM,MAAM,MAAM,MAAM,KAAK;AAAA,MAC3B,QAAQ,KAAK,UAAU;AAAA,MACvB;AAAA,MACA,MAAM,KAAK,SAAS,SAAY,KAAK,UAAU,KAAK,IAAI,IAAI;AAAA,IAC9D,CAAC;AAED,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,QAAI,OAAgB,CAAC;AACrB,QAAI,MAAM;AACR,UAAI;AACF,eAAO,KAAK,MAAM,IAAI;AAAA,MACxB,QAAQ;AACN,eAAO,EAAE,KAAK,KAAK;AAAA,MACrB;AAAA,IACF;AAEA,QAAI,KAAK,OAAO,SAAS;AACvB,cAAQ,MAAM,aAAa,IAAI,MAAM,IAAI,YAAY,KAAK,MAAM,GAAG,GAAI,CAAC,CAAC;AAAA,IAC3E;AAEA,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,SAAS,aAAa,IAAI,QAAQ,IAAI;AAAA,IAC9C;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,mBAAmB,UAAkE;AACzF,QAAI,KAAK,OAAO,MAAO,QAAO,KAAK,OAAO;AAE1C,UAAM,QAAQ,YAAa,MAAM,gBAAgB;AACjD,QAAI,CAAC,MAAO,QAAO;AAEnB,QAAI,eAAe,KAAK,KAAK,MAAM,eAAe;AAChD,YAAM,YAAY,MAAM;AAAA,QACtB,mBAAmB,KAAK,QAAQ,KAAK;AAAA,QACrC,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AACA,aAAO,UAAU;AAAA,IACnB;AAEA,WAAO,MAAM;AAAA,EACf;AACF;AAEA,SAAS,mBAAmB,QAAwB,OAA0C;AAC5F,SAAO,EAAE,GAAG,QAAQ,aAAa,MAAM,gBAAgB,OAAO,YAAY;AAC5E;;;ACuGO,IAAM,eAAN,MAAmB;AAAA,EACP;AAAA,EAEjB,YAAY,QAAwB;AAClC,SAAK,OAAO,IAAI,WAAW,MAAM;AAAA,EACnC;AAAA,EAEQ,IAAO,MAAwD;AACrE,WAAO,KAAK,KAAK,QAAW,EAAE,GAAG,MAAM,QAAQ,eAAe,CAAC;AAAA,EACjE;AAAA,EAEA,UAAiC;AAC/B,WAAO,KAAK,IAAI,EAAE,MAAM,SAAS,MAAM,MAAM,CAAC;AAAA,EAChD;AAAA,EAEA,QAA6B;AAC3B,WAAO,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;AAAA,EACjC;AAAA,EAEA,MAAM,SAAiB,UAA0C;AAC/D,WAAO,KAAK,IAAI;AAAA,MACd,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM,EAAE,SAAS,SAAS;AAAA,IAC5B,CAAC;AAAA,EACH;AAAA,EAEA,QAAQ,cAA8C;AACpD,WAAO,KAAK,IAAI;AAAA,MACd,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM,EAAE,eAAe,aAAa;AAAA,IACtC,CAAC;AAAA,EACH;AAAA,EAEA,WAAW,MAAsD;AAC/D,WAAO,KAAK,IAAI,EAAE,QAAQ,QAAQ,MAAM,gBAAgB,MAAM,OAAO,KAAK,CAAC;AAAA,EAC7E;AAAA,EAEA,YAAY,OAAe,gBAAgB,iBAA2C;AACpF,WAAO,KAAK,IAAqB;AAAA,MAC/B,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM,EAAE,OAAO,iBAAiB,cAAc;AAAA,IAChD,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,SAAmC;AACvC,QAAI;AACF,aAAO,MAAM,KAAK,IAAqB,EAAE,QAAQ,QAAQ,MAAM,eAAe,CAAC;AAAA,IACjF,QAAQ;AACN,aAAO,KAAK,YAAY,IAAI,cAAc;AAAA,IAC5C;AAAA,EACF;AAAA,EAEA,eAAe,QAGkB;AAC/B,UAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAI,QAAQ,cAAc,OAAW,OAAM,IAAI,aAAa,OAAO,OAAO,SAAS,CAAC;AACpF,QAAI,QAAQ,OAAQ,OAAM,IAAI,UAAU,OAAO,MAAM;AACrD,UAAM,SAAS,MAAM,SAAS;AAC9B,WAAO,KAAK,IAAI,EAAE,MAAM,gBAAgB,SAAS,IAAI,MAAM,KAAK,EAAE,GAAG,CAAC;AAAA,EACxE;AAAA,EAEA,cAAc,QAOkB;AAC9B,UAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAI,QAAQ,EAAG,OAAM,IAAI,KAAK,OAAO,CAAC;AACtC,QAAI,QAAQ,SAAU,OAAM,IAAI,YAAY,OAAO,QAAQ;AAC3D,QAAI,QAAQ,OAAQ,OAAM,IAAI,UAAU,OAAO,MAAM;AACrD,QAAI,QAAQ,KAAM,OAAM,IAAI,QAAQ,OAAO,IAAI;AAC/C,QAAI,QAAQ,cAAc,OAAW,OAAM,IAAI,aAAa,OAAO,OAAO,SAAS,CAAC;AACpF,QAAI,QAAQ,OAAQ,OAAM,IAAI,UAAU,OAAO,MAAM;AACrD,UAAM,SAAS,MAAM,SAAS;AAC9B,WAAO,KAAK,IAAI,EAAE,MAAM,WAAW,SAAS,IAAI,MAAM,KAAK,EAAE,IAAI,MAAM,MAAM,CAAC;AAAA,EAChF;AAAA,EAEA,cAAc,UAAkB,SAA+C;AAC7E,UAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAI,QAAS,OAAM,IAAI,WAAW,OAAO;AACzC,UAAM,SAAS,MAAM,SAAS;AAC9B,WAAO,KAAK,IAAI;AAAA,MACd,MAAM,YAAY,mBAAmB,QAAQ,CAAC,GAAG,SAAS,IAAI,MAAM,KAAK,EAAE;AAAA,MAC3E,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA,EAEA,kBAAkB,UAAmD;AACnE,WAAO,KAAK,IAAI;AAAA,MACd,MAAM,YAAY,mBAAmB,QAAQ,CAAC;AAAA,MAC9C,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA,EAEA,oBAAoB,UAAkB,SAAkD;AACtF,WAAO,KAAK,IAAI;AAAA,MACd,QAAQ;AAAA,MACR,MAAM,YAAY,mBAAmB,QAAQ,CAAC;AAAA,MAC9C,MAAM,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,IACjC,CAAC;AAAA,EACH;AAAA,EAEA,aAAa,QAQkB;AAC7B,UAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAI,QAAQ,EAAG,OAAM,IAAI,KAAK,OAAO,CAAC;AACtC,QAAI,QAAQ,SAAU,OAAM,IAAI,YAAY,OAAO,QAAQ;AAC3D,QAAI,QAAQ,OAAQ,OAAM,IAAI,UAAU,OAAO,MAAM;AACrD,QAAI,QAAQ,IAAK,OAAM,IAAI,OAAO,OAAO,GAAG;AAC5C,QAAI,QAAQ,KAAM,OAAM,IAAI,QAAQ,OAAO,IAAI;AAC/C,QAAI,QAAQ,cAAc,OAAW,OAAM,IAAI,aAAa,OAAO,OAAO,SAAS,CAAC;AACpF,QAAI,QAAQ,OAAQ,OAAM,IAAI,UAAU,OAAO,MAAM;AACrD,UAAM,SAAS,MAAM,SAAS;AAC9B,WAAO,KAAK,IAAI,EAAE,MAAM,UAAU,SAAS,IAAI,MAAM,KAAK,EAAE,IAAI,MAAM,MAAM,CAAC;AAAA,EAC/E;AAAA,EAEA,aAAa,SAAiB,SAA8C;AAC1E,UAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAI,QAAS,OAAM,IAAI,WAAW,OAAO;AACzC,UAAM,SAAS,MAAM,SAAS;AAC9B,WAAO,KAAK,IAAI;AAAA,MACd,MAAM,WAAW,mBAAmB,OAAO,CAAC,GAAG,SAAS,IAAI,MAAM,KAAK,EAAE;AAAA,MACzE,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA,EAEA,iBAAiB,SAAiD;AAChE,WAAO,KAAK,IAAI;AAAA,MACd,MAAM,WAAW,mBAAmB,OAAO,CAAC;AAAA,MAC5C,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA,EAEA,yBAAyB,SAAiB,SAAkD;AAC1F,WAAO,KAAK,IAAI;AAAA,MACd,QAAQ;AAAA,MACR,MAAM,WAAW,mBAAmB,OAAO,CAAC;AAAA,MAC5C,MAAM,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,IACjC,CAAC;AAAA,EACH;AAAA,EAEA,yBAAyB,MAA+D;AACtF,WAAO,KAAK,IAAI;AAAA,MACd,QAAQ;AAAA,MACR,MAAM;AAAA,MACN;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,2BACE,cACA,MACgC;AAChC,WAAO,KAAK,IAAI;AAAA,MACd,QAAQ;AAAA,MACR,MAAM,yBAAyB,mBAAmB,YAAY,CAAC;AAAA,MAC/D;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,sBAAsB,cAAsD;AAC1E,WAAO,KAAK,IAAI;AAAA,MACd,MAAM,yBAAyB,mBAAmB,YAAY,CAAC;AAAA,IACjE,CAAC;AAAA,EACH;AAAA,EAEA,0BAA0B,cAA0D;AAClF,WAAO,KAAK,IAAI;AAAA,MACd,MAAM,yBAAyB,mBAAmB,YAAY,CAAC;AAAA,IACjE,CAAC;AAAA,EACH;AACF;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/errors.ts","../src/auth/session.ts","../src/api/client.ts","../src/api/cli-api.ts"],"sourcesContent":["export interface ApiErrorBody {\n request_id?: string;\n error: {\n code: string;\n message: string;\n hint?: string;\n };\n}\n\nexport class AspError extends Error {\n readonly code: string;\n readonly hint?: string;\n readonly requestId?: string;\n readonly statusCode?: number;\n readonly exitCode: number;\n\n constructor(\n message: string,\n options: {\n code?: string;\n hint?: string;\n requestId?: string;\n statusCode?: number;\n exitCode?: number;\n cause?: unknown;\n } = {},\n ) {\n super(message, { cause: options.cause });\n this.name = \"AspError\";\n this.code = options.code ?? \"UNKNOWN\";\n this.hint = options.hint;\n this.requestId = options.requestId;\n this.statusCode = options.statusCode;\n this.exitCode = options.exitCode ?? 1;\n }\n\n static fromResponse(status: number, body: unknown): AspError {\n const parsed = body as Partial<ApiErrorBody> & {\n error?: ApiErrorBody[\"error\"] & { detail?: string };\n };\n if (parsed?.error) {\n const exitCode = mapErrorCodeToExit(parsed.error.code, status);\n let hint = parsed.error.hint ?? parsed.error.detail;\n if (parsed.error.code === \"ASP.COMM.NOT_FOUND\") {\n hint = hint ?? \"The API endpoint is not available on this Platform environment.\";\n }\n return new AspError(parsed.error.message, {\n code: parsed.error.code,\n hint,\n requestId: parsed.request_id,\n statusCode: status,\n exitCode,\n });\n }\n return new AspError(`HTTP ${status}`, {\n code: \"HTTP_ERROR\",\n statusCode: status,\n exitCode: status >= 500 ? 2 : 1,\n });\n }\n}\n\nfunction mapErrorCodeToExit(code: string, status: number): number {\n if (\n code === \"UNAUTHORIZED\" ||\n code === \"UNAUTHENTICATED\" ||\n code === \"ASP.AUTH.UNAUTHORIZED\" ||\n code === \"ASP.AUTH.SESSION_INVALID\" ||\n code === \"SESSION_INVALID\"\n ) {\n return 3;\n }\n if (code === \"FORBIDDEN\") return 4;\n if (status >= 500) return 2;\n return 1;\n}\n\nexport function maskSecrets(text: string): string {\n return text\n .replace(/Bearer\\s+[A-Za-z0-9._-]+/gi, \"Bearer [REDACTED]\")\n .replace(/\"access_token\"\\s*:\\s*\"[^\"]+\"/gi, '\"access_token\":\"[REDACTED]\"')\n .replace(/\"refresh_token\"\\s*:\\s*\"[^\"]+\"/gi, '\"refresh_token\":\"[REDACTED]\"')\n .replace(/\"token\"\\s*:\\s*\"[^\"]+\"/gi, '\"token\":\"[REDACTED]\"');\n}\n","import type { ResolvedConfig } from \"../config.js\";\nimport { CliApiClient, type TokenResponse } from \"../api/cli-api.js\";\nimport {\n credentialsFromTokenResponse,\n saveCredentials,\n type StoredCredentials,\n} from \"./credentials.js\";\nimport { AspError } from \"../utils/errors.js\";\n\nexport function isSessionInvalidError(err: unknown): boolean {\n if (!(err instanceof AspError)) return false;\n return err.code === \"ASP.AUTH.SESSION_INVALID\" || err.code === \"SESSION_INVALID\";\n}\n\nexport async function refreshStoredSession(\n config: ResolvedConfig,\n refreshToken: string,\n platformUrl: string,\n): Promise<StoredCredentials> {\n const client = new CliApiClient({\n ...config,\n token: undefined,\n platformUrl: platformUrl.replace(/\\/$/, \"\"),\n });\n const refreshed = await client.refresh(refreshToken);\n const creds = credentialsFromTokenResponse(platformUrl, refreshed);\n await saveCredentials(creds);\n return creds;\n}\n\n/** Login 返回的 access_token 需先 refresh 才能访问 /me */\nexport async function finalizeLogin(\n config: ResolvedConfig,\n loginResponse: TokenResponse,\n): Promise<StoredCredentials> {\n if (!loginResponse.refresh_token) {\n const creds = credentialsFromTokenResponse(config.platformUrl, loginResponse);\n await saveCredentials(creds);\n return creds;\n }\n\n try {\n return await refreshStoredSession(\n config,\n loginResponse.refresh_token,\n config.platformUrl,\n );\n } catch {\n const creds = credentialsFromTokenResponse(config.platformUrl, loginResponse);\n await saveCredentials(creds);\n return creds;\n }\n}\n\nexport async function ensureValidSession(config: ResolvedConfig): Promise<StoredCredentials> {\n const { loadCredentials, isTokenExpired } = await import(\"./credentials.js\");\n const creds = await loadCredentials();\n if (!creds) {\n throw new AspError(\"Not logged in.\", {\n code: \"UNAUTHORIZED\",\n hint: \"Run `asp auth login`.\",\n exitCode: 3,\n });\n }\n\n if (!isTokenExpired(creds) && creds.access_token) {\n return creds;\n }\n\n if (!creds.refresh_token) {\n throw new AspError(\"Session expired.\", {\n code: \"ASP.AUTH.SESSION_INVALID\",\n hint: \"Run `asp auth login`.\",\n exitCode: 3,\n });\n }\n\n return refreshStoredSession(config, creds.refresh_token, creds.platform_url);\n}\n","import { AspError, maskSecrets } from \"../utils/errors.js\";\nimport type { ResolvedConfig } from \"../config.js\";\nimport {\n loadCredentials,\n isTokenExpired,\n type StoredCredentials,\n} from \"../auth/credentials.js\";\nimport { refreshStoredSession, isSessionInvalidError } from \"../auth/session.js\";\n\nexport interface RequestOptions {\n method?: string;\n path: string;\n body?: unknown;\n headers?: Record<string, string>;\n auth?: boolean;\n prefix?: string;\n _retried?: boolean;\n}\n\nexport class HttpClient {\n constructor(private readonly config: ResolvedConfig) {}\n\n async request<T>(opts: RequestOptions): Promise<T> {\n try {\n return await this.doRequest<T>(opts);\n } catch (err) {\n if (\n opts.auth !== false &&\n !opts._retried &&\n isSessionInvalidError(err) &&\n !this.config.token\n ) {\n const creds = await loadCredentials();\n if (creds?.refresh_token) {\n await refreshStoredSession(configWithPlatform(this.config, creds), creds.refresh_token, creds.platform_url);\n return this.doRequest<T>({ ...opts, _retried: true });\n }\n }\n throw err;\n }\n }\n\n private async doRequest<T>(opts: RequestOptions): Promise<T> {\n const creds = opts.auth !== false && !this.config.token ? await loadCredentials() : null;\n const platformUrl = creds?.platform_url ?? this.config.platformUrl;\n const prefix = opts.prefix ?? \"\";\n const url = `${platformUrl}${prefix}${opts.path}`;\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n ...opts.headers,\n };\n\n if (opts.body !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n\n if (opts.auth !== false) {\n const token = await this.resolveAccessToken(creds);\n if (token) {\n headers.Authorization = `Bearer ${token}`;\n }\n }\n\n if (this.config.verbose) {\n console.error(`[verbose] ${opts.method ?? \"GET\"} ${url}`);\n if (opts.body) console.error(maskSecrets(JSON.stringify(opts.body)));\n }\n\n const res = await fetch(url, {\n method: opts.method ?? \"GET\",\n headers,\n body: opts.body !== undefined ? JSON.stringify(opts.body) : undefined,\n });\n\n const text = await res.text();\n let data: unknown = {};\n if (text) {\n try {\n data = JSON.parse(text);\n } catch {\n data = { raw: text };\n }\n }\n\n if (this.config.verbose) {\n console.error(`[verbose] ${res.status}`, maskSecrets(text.slice(0, 2000)));\n }\n\n if (!res.ok) {\n throw AspError.fromResponse(res.status, data);\n }\n\n return data as T;\n }\n\n async resolveAccessToken(existing?: StoredCredentials | null): Promise<string | undefined> {\n if (this.config.token) return this.config.token;\n\n const creds = existing ?? (await loadCredentials());\n if (!creds) return undefined;\n\n if (isTokenExpired(creds) && creds.refresh_token) {\n const refreshed = await refreshStoredSession(\n configWithPlatform(this.config, creds),\n creds.refresh_token,\n creds.platform_url,\n );\n return refreshed.access_token;\n }\n\n return creds.access_token;\n }\n}\n\nfunction configWithPlatform(config: ResolvedConfig, creds: StoredCredentials): ResolvedConfig {\n return { ...config, platformUrl: creds.platform_url || config.platformUrl };\n}\n","import { CLI_API_PREFIX } from \"../constants.js\";\nimport type { ResolvedConfig } from \"../config.js\";\nimport { HttpClient } from \"./client.js\";\n\nexport interface MetaResponse {\n request_id: string;\n service: string;\n api_version: string;\n platform_url: string;\n environment: string;\n min_cli_version: string;\n recommended_cli_version: string;\n features: Record<string, boolean>;\n}\n\nexport interface MeResponse {\n request_id: string;\n user_id?: string;\n account?: string;\n email?: string;\n username?: string;\n is_admin?: boolean;\n user?: {\n id: string;\n display_name?: string;\n email?: string;\n };\n scopes?: string[];\n}\n\nexport interface TokenResponse {\n request_id: string;\n access_token: string;\n refresh_token?: string;\n token_type: string;\n expires_in?: number;\n scope?: string;\n user?: {\n id: string;\n display_name?: string;\n email?: string;\n };\n}\n\n\nexport interface RequestLogItem {\n request_id?: string;\n method: string;\n path: string;\n request_body?: unknown;\n response_status?: number;\n duration_ms?: number;\n created_at: string;\n}\n\nexport interface RequestLogsResponse {\n request_id: string;\n items: RequestLogItem[];\n next_cursor?: string | null;\n}\n\nexport interface PluginListItem {\n plugin_id: string;\n name?: string;\n description?: string;\n summary?: string;\n source?: \"official\" | \"verified\" | \"community\";\n tech_type?: string;\n category?: string;\n author_display_name?: string;\n latest_version?: string;\n downloads?: number;\n public_url?: string;\n updated_at?: string;\n [key: string]: unknown;\n}\n\nexport interface PluginListResponse {\n request_id: string;\n items: PluginListItem[];\n next_cursor?: string | null;\n}\n\nexport interface PluginVersionItem {\n version: string;\n published_at?: string;\n deprecated?: boolean;\n [key: string]: unknown;\n}\n\nexport interface PluginVersionsResponse {\n request_id: string;\n plugin_id: string;\n items: PluginVersionItem[];\n}\n\nexport interface PluginInfoResponse {\n request_id: string;\n plugin_id: string;\n install_command?: string;\n public_url?: string;\n latest_version?: string;\n scan_status?: string;\n min_qwenpaw_version?: string;\n [key: string]: unknown;\n}\n\nexport interface SkillListItem {\n skill_id: string;\n skill_code?: string;\n name?: string;\n description?: string;\n summary?: string;\n category?: string;\n category_label?: string;\n source?: \"official\" | \"verified\" | \"community\";\n author_display_name?: string;\n latest_version?: string;\n downloads?: number;\n public_url?: string;\n updated_at?: string;\n [key: string]: unknown;\n}\n\nexport interface SkillListResponse {\n request_id: string;\n items: SkillListItem[];\n next_cursor?: string | null;\n}\n\nexport interface SkillVersionItem {\n version: string;\n published_at?: string;\n deprecated?: boolean;\n [key: string]: unknown;\n}\n\nexport interface SkillVersionsResponse {\n request_id: string;\n skill_id: string;\n items: SkillVersionItem[];\n}\n\nexport interface SkillInfoResponse {\n request_id: string;\n skill_id: string;\n install_command?: string;\n public_url?: string;\n latest_version?: string;\n scan_status?: string;\n [key: string]: unknown;\n}\n\nexport interface InstallIntentResponse {\n request_id: string;\n download_url: string;\n sha512?: string;\n expires_at?: string;\n signature?: string | null;\n scan_status?: string;\n version?: string;\n}\n\nexport interface CliSubmissionUpload {\n method?: string;\n url: string;\n headers?: Record<string, string>;\n expires_at?: string;\n}\n\nexport interface CliSubmissionScan {\n status?: \"queued\" | \"running\" | \"passed\" | \"failed\";\n summary?: string;\n [key: string]: unknown;\n}\n\nexport interface CliSubmissionPublish {\n status?: string;\n public_url?: string;\n [key: string]: unknown;\n}\n\nexport interface CliSubmissionFailure {\n code?: string;\n message?: string;\n}\n\nexport interface CliSubmissionResponse {\n request_id: string;\n submission_id: string;\n status:\n | \"upload_url_issued\"\n | \"queued_for_scan\"\n | \"scanning\"\n | \"published\"\n | \"scan_failed\"\n | \"upload_failed\"\n | \"expired\";\n terminal: boolean;\n upload?: CliSubmissionUpload | null;\n scan?: CliSubmissionScan | null;\n publish?: CliSubmissionPublish | null;\n failure?: CliSubmissionFailure | null;\n links?: { status?: string; logs?: string };\n next_poll_after_seconds?: number;\n}\n\nexport interface CliSubmissionLogItem {\n level: \"info\" | \"error\" | string;\n message: string;\n timestamp: string;\n}\n\nexport interface CliSubmissionLogsResponse {\n request_id: string;\n submission_id: string;\n items: CliSubmissionLogItem[];\n}\n\nexport class CliApiClient {\n private readonly http: HttpClient;\n\n constructor(config: ResolvedConfig) {\n this.http = new HttpClient(config);\n }\n\n private req<T>(opts: Parameters<HttpClient[\"request\"]>[0]): Promise<T> {\n return this.http.request<T>({ ...opts, prefix: CLI_API_PREFIX });\n }\n\n getMeta(): Promise<MetaResponse> {\n return this.req({ path: \"/meta\", auth: false });\n }\n\n getMe(): Promise<MeResponse> {\n return this.req({ path: \"/me\" });\n }\n\n login(account: string, password: string): Promise<TokenResponse> {\n return this.req({\n method: \"POST\",\n path: \"/auth/login\",\n auth: false,\n body: { account, password },\n });\n }\n\n refresh(refreshToken: string): Promise<TokenResponse> {\n return this.req({\n method: \"POST\",\n path: \"/auth/refresh\",\n auth: false,\n body: { refresh_token: refreshToken },\n });\n }\n\n oauthToken(body: Record<string, string>): Promise<TokenResponse> {\n return this.req({ method: \"POST\", path: \"/oauth/token\", auth: false, body });\n }\n\n oauthRevoke(token: string, tokenTypeHint = \"refresh_token\"): Promise<{ ok: boolean }> {\n return this.req<{ ok: boolean }>({\n method: \"POST\",\n path: \"/oauth/revoke\",\n body: { token, token_type_hint: tokenTypeHint },\n });\n }\n\n async logout(): Promise<{ ok: boolean }> {\n try {\n return await this.req<{ ok: boolean }>({ method: \"POST\", path: \"/auth/logout\" });\n } catch {\n return this.oauthRevoke(\"\", \"access_token\");\n }\n }\n\n getRequestLogs(params?: {\n page_size?: number;\n cursor?: string;\n }): Promise<RequestLogsResponse> {\n const query = new URLSearchParams();\n if (params?.page_size !== undefined) query.set(\"page_size\", String(params.page_size));\n if (params?.cursor) query.set(\"cursor\", params.cursor);\n const suffix = query.toString();\n return this.req({ path: `/request-logs${suffix ? `?${suffix}` : \"\"}` });\n }\n\n searchPlugins(params?: {\n q?: string;\n category?: string;\n source?: \"official\" | \"verified\" | \"community\";\n sort?: \"recommended\" | \"downloads\" | \"updated_at\";\n page_size?: number;\n cursor?: string;\n }): Promise<PluginListResponse> {\n const query = new URLSearchParams();\n if (params?.q) query.set(\"q\", params.q);\n if (params?.category) query.set(\"category\", params.category);\n if (params?.source) query.set(\"source\", params.source);\n if (params?.sort) query.set(\"sort\", params.sort);\n if (params?.page_size !== undefined) query.set(\"page_size\", String(params.page_size));\n if (params?.cursor) query.set(\"cursor\", params.cursor);\n const suffix = query.toString();\n return this.req({ path: `/plugins${suffix ? `?${suffix}` : \"\"}`, auth: false });\n }\n\n getPluginInfo(pluginId: string, version?: string): Promise<PluginInfoResponse> {\n const query = new URLSearchParams();\n if (version) query.set(\"version\", version);\n const suffix = query.toString();\n return this.req({\n path: `/plugins/${encodeURIComponent(pluginId)}${suffix ? `?${suffix}` : \"\"}`,\n auth: false,\n });\n }\n\n getPluginVersions(pluginId: string): Promise<PluginVersionsResponse> {\n return this.req({\n path: `/plugins/${encodeURIComponent(pluginId)}/versions`,\n auth: false,\n });\n }\n\n createInstallIntent(pluginId: string, version?: string): Promise<InstallIntentResponse> {\n return this.req({\n method: \"POST\",\n path: `/plugins/${encodeURIComponent(pluginId)}/install-intent`,\n body: version ? { version } : {},\n });\n }\n\n searchSkills(params?: {\n q?: string;\n category?: string;\n source?: \"official\" | \"verified\" | \"community\";\n tag?: string;\n sort?: \"recommended\" | \"downloads\" | \"updated_at\";\n page_size?: number;\n cursor?: string;\n }): Promise<SkillListResponse> {\n const query = new URLSearchParams();\n if (params?.q) query.set(\"q\", params.q);\n if (params?.category) query.set(\"category\", params.category);\n if (params?.source) query.set(\"source\", params.source);\n if (params?.tag) query.set(\"tag\", params.tag);\n if (params?.sort) query.set(\"sort\", params.sort);\n if (params?.page_size !== undefined) query.set(\"page_size\", String(params.page_size));\n if (params?.cursor) query.set(\"cursor\", params.cursor);\n const suffix = query.toString();\n return this.req({ path: `/skills${suffix ? `?${suffix}` : \"\"}`, auth: false });\n }\n\n getSkillInfo(skillId: string, version?: string): Promise<SkillInfoResponse> {\n const query = new URLSearchParams();\n if (version) query.set(\"version\", version);\n const suffix = query.toString();\n return this.req({\n path: `/skills/${encodeURIComponent(skillId)}${suffix ? `?${suffix}` : \"\"}`,\n auth: false,\n });\n }\n\n getSkillVersions(skillId: string): Promise<SkillVersionsResponse> {\n return this.req({\n path: `/skills/${encodeURIComponent(skillId)}/versions`,\n auth: false,\n });\n }\n\n createSkillInstallIntent(skillId: string, version?: string): Promise<InstallIntentResponse> {\n return this.req({\n method: \"POST\",\n path: `/skills/${encodeURIComponent(skillId)}/install-intent`,\n body: version ? { version } : {},\n });\n }\n\n createArtifactSubmission(body: Record<string, unknown>): Promise<CliSubmissionResponse> {\n return this.req({\n method: \"POST\",\n path: \"/artifact-submissions\",\n body,\n });\n }\n\n completeArtifactSubmission(\n submissionId: string,\n body: { sha512: string; size_bytes: number },\n ): Promise<CliSubmissionResponse> {\n return this.req({\n method: \"POST\",\n path: `/artifact-submissions/${encodeURIComponent(submissionId)}/complete`,\n body,\n });\n }\n\n getArtifactSubmission(submissionId: string): Promise<CliSubmissionResponse> {\n return this.req({\n path: `/artifact-submissions/${encodeURIComponent(submissionId)}`,\n });\n }\n\n getArtifactSubmissionLogs(submissionId: string): Promise<CliSubmissionLogsResponse> {\n return this.req({\n path: `/artifact-submissions/${encodeURIComponent(submissionId)}/logs`,\n });\n }\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentscope-ai/platform-cli",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "AgentScope Platform CLI (asp) — authentication for
|
|
3
|
+
"version": "1.0.3",
|
|
4
|
+
"description": "AgentScope Platform CLI (asp) — authentication for AgentScope Platform",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
7
7
|
"bin": {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/auth/credentials.ts","../src/config.ts","../src/constants.ts"],"sourcesContent":["import { chmod, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { getCredentialsPath } from \"../config.js\";\n\nexport interface StoredCredentials {\n access_token: string;\n refresh_token?: string;\n token_type: string;\n expires_at?: string;\n scope?: string;\n platform_url: string;\n user?: {\n id: string;\n display_name?: string;\n email?: string;\n };\n}\n\nexport async function loadCredentials(): Promise<StoredCredentials | null> {\n try {\n const raw = await readFile(getCredentialsPath(), \"utf8\");\n return JSON.parse(raw) as StoredCredentials;\n } catch {\n return null;\n }\n}\n\nexport async function saveCredentials(creds: StoredCredentials): Promise<void> {\n const path = getCredentialsPath();\n await mkdir(dirname(path), { recursive: true, mode: 0o700 });\n await writeFile(path, JSON.stringify(creds, null, 2), { mode: 0o600 });\n await chmod(path, 0o600);\n}\n\nexport async function clearCredentials(): Promise<void> {\n try {\n const { unlink } = await import(\"node:fs/promises\");\n await unlink(getCredentialsPath());\n } catch {\n // ignore\n }\n}\n\nexport function isTokenExpired(creds: StoredCredentials): boolean {\n if (!creds.expires_at) return false;\n return Date.now() >= new Date(creds.expires_at).getTime() - 60_000;\n}\n\nexport function credentialsFromTokenResponse(\n platformUrl: string,\n response: {\n access_token: string;\n refresh_token?: string;\n token_type: string;\n expires_in?: number;\n scope?: string;\n user?: StoredCredentials[\"user\"];\n },\n): StoredCredentials {\n const creds: StoredCredentials = {\n access_token: response.access_token,\n refresh_token: response.refresh_token,\n token_type: response.token_type,\n scope: response.scope,\n platform_url: platformUrl,\n user: response.user,\n };\n if (response.expires_in) {\n creds.expires_at = new Date(Date.now() + response.expires_in * 1000).toISOString();\n }\n return creds;\n}\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { DEFAULT_PLATFORM_URL } from \"./constants.js\";\n\nexport interface GlobalOptions {\n platformUrl?: string;\n token?: string;\n verbose?: boolean;\n json?: boolean;\n}\n\nexport interface ResolvedConfig {\n platformUrl: string;\n token?: string;\n verbose: boolean;\n json: boolean;\n}\n\nexport function resolveConfig(opts: GlobalOptions = {}): ResolvedConfig {\n const platformUrl =\n opts.platformUrl ??\n process.env.ASP_PLATFORM_URL ??\n process.env.PLATFORM_URL ??\n DEFAULT_PLATFORM_URL;\n\n const token = opts.token ?? process.env.ASP_TOKEN;\n\n return {\n platformUrl: platformUrl.replace(/\\/$/, \"\"),\n token,\n verbose: opts.verbose ?? false,\n json: opts.json ?? false,\n };\n}\n\nexport function getAspConfigDir(): string {\n return process.env.ASP_CONFIG_DIR ?? join(homedir(), \".asp\");\n}\n\nexport function getCredentialsPath(): string {\n return join(getAspConfigDir(), \"credentials.json\");\n}\n","import { createRequire } from \"node:module\";\n\nconst require = createRequire(import.meta.url);\nconst pkg = require(\"../package.json\") as { version: string };\n\nexport const CLI_VERSION = pkg.version;\nexport const CLIENT_ID = \"agentscope-platform-cli\";\nexport const DEFAULT_SCOPE = \"platform:control\";\n\nexport const PLATFORM_URL = \"https://platform-pre.agentscope.io\";\nexport const DEFAULT_PLATFORM_URL = PLATFORM_URL;\n/** @deprecated Use {@link PLATFORM_URL} */\nexport const PRE_PLATFORM_URL = PLATFORM_URL;\n\nexport const CLI_API_PREFIX = \"/api/cli/v1\";\n"],"mappings":";;;AAAA,SAAS,OAAO,OAAO,UAAU,iBAAiB;AAClD,SAAS,eAAe;;;ACDxB,SAAS,eAAe;AACxB,SAAS,YAAY;;;ACDrB,SAAS,qBAAqB;AAE9B,IAAMA,WAAU,cAAc,YAAY,GAAG;AAC7C,IAAM,MAAMA,SAAQ,iBAAiB;AAE9B,IAAM,cAAc,IAAI;AACxB,IAAM,YAAY;AAClB,IAAM,gBAAgB;AAEtB,IAAM,eAAe;AACrB,IAAM,uBAAuB;AAI7B,IAAM,iBAAiB;;;ADIvB,SAAS,cAAc,OAAsB,CAAC,GAAmB;AACtE,QAAM,cACJ,KAAK,eACL,QAAQ,IAAI,oBACZ,QAAQ,IAAI,gBACZ;AAEF,QAAM,QAAQ,KAAK,SAAS,QAAQ,IAAI;AAExC,SAAO;AAAA,IACL,aAAa,YAAY,QAAQ,OAAO,EAAE;AAAA,IAC1C;AAAA,IACA,SAAS,KAAK,WAAW;AAAA,IACzB,MAAM,KAAK,QAAQ;AAAA,EACrB;AACF;AAEO,SAAS,kBAA0B;AACxC,SAAO,QAAQ,IAAI,kBAAkB,KAAK,QAAQ,GAAG,MAAM;AAC7D;AAEO,SAAS,qBAA6B;AAC3C,SAAO,KAAK,gBAAgB,GAAG,kBAAkB;AACnD;;;ADvBA,eAAsB,kBAAqD;AACzE,MAAI;AACF,UAAM,MAAM,MAAM,SAAS,mBAAmB,GAAG,MAAM;AACvD,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,gBAAgB,OAAyC;AAC7E,QAAM,OAAO,mBAAmB;AAChC,QAAM,MAAM,QAAQ,IAAI,GAAG,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AAC3D,QAAM,UAAU,MAAM,KAAK,UAAU,OAAO,MAAM,CAAC,GAAG,EAAE,MAAM,IAAM,CAAC;AACrE,QAAM,MAAM,MAAM,GAAK;AACzB;AAEA,eAAsB,mBAAkC;AACtD,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM,OAAO,aAAkB;AAClD,UAAM,OAAO,mBAAmB,CAAC;AAAA,EACnC,QAAQ;AAAA,EAER;AACF;AAEO,SAAS,eAAe,OAAmC;AAChE,MAAI,CAAC,MAAM,WAAY,QAAO;AAC9B,SAAO,KAAK,IAAI,KAAK,IAAI,KAAK,MAAM,UAAU,EAAE,QAAQ,IAAI;AAC9D;AAEO,SAAS,6BACd,aACA,UAQmB;AACnB,QAAM,QAA2B;AAAA,IAC/B,cAAc,SAAS;AAAA,IACvB,eAAe,SAAS;AAAA,IACxB,YAAY,SAAS;AAAA,IACrB,OAAO,SAAS;AAAA,IAChB,cAAc;AAAA,IACd,MAAM,SAAS;AAAA,EACjB;AACA,MAAI,SAAS,YAAY;AACvB,UAAM,aAAa,IAAI,KAAK,KAAK,IAAI,IAAI,SAAS,aAAa,GAAI,EAAE,YAAY;AAAA,EACnF;AACA,SAAO;AACT;","names":["require"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/auth/credentials.ts","../src/config.ts","../src/constants.ts"],"sourcesContent":["import { chmod, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { getCredentialsPath } from \"../config.js\";\n\nexport interface StoredCredentials {\n access_token: string;\n refresh_token?: string;\n token_type: string;\n expires_at?: string;\n scope?: string;\n platform_url: string;\n user?: {\n id: string;\n display_name?: string;\n email?: string;\n };\n}\n\nexport async function loadCredentials(): Promise<StoredCredentials | null> {\n try {\n const raw = await readFile(getCredentialsPath(), \"utf8\");\n return JSON.parse(raw) as StoredCredentials;\n } catch {\n return null;\n }\n}\n\nexport async function saveCredentials(creds: StoredCredentials): Promise<void> {\n const path = getCredentialsPath();\n await mkdir(dirname(path), { recursive: true, mode: 0o700 });\n await writeFile(path, JSON.stringify(creds, null, 2), { mode: 0o600 });\n await chmod(path, 0o600);\n}\n\nexport async function clearCredentials(): Promise<void> {\n try {\n const { unlink } = await import(\"node:fs/promises\");\n await unlink(getCredentialsPath());\n } catch {\n // ignore\n }\n}\n\nexport function isTokenExpired(creds: StoredCredentials): boolean {\n if (!creds.expires_at) return false;\n return Date.now() >= new Date(creds.expires_at).getTime() - 60_000;\n}\n\nexport function credentialsFromTokenResponse(\n platformUrl: string,\n response: {\n access_token: string;\n refresh_token?: string;\n token_type: string;\n expires_in?: number;\n scope?: string;\n user?: StoredCredentials[\"user\"];\n },\n): StoredCredentials {\n const creds: StoredCredentials = {\n access_token: response.access_token,\n refresh_token: response.refresh_token,\n token_type: response.token_type,\n scope: response.scope,\n platform_url: platformUrl,\n user: response.user,\n };\n if (response.expires_in) {\n creds.expires_at = new Date(Date.now() + response.expires_in * 1000).toISOString();\n }\n return creds;\n}\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { DEFAULT_PLATFORM_URL } from \"./constants.js\";\n\nexport interface GlobalOptions {\n platformUrl?: string;\n token?: string;\n verbose?: boolean;\n json?: boolean;\n}\n\nexport interface ResolvedConfig {\n platformUrl: string;\n token?: string;\n verbose: boolean;\n json: boolean;\n}\n\nexport function resolveConfig(opts: GlobalOptions = {}): ResolvedConfig {\n const platformUrl =\n opts.platformUrl ??\n process.env.ASP_PLATFORM_URL ??\n process.env.PLATFORM_URL ??\n DEFAULT_PLATFORM_URL;\n\n const token = opts.token ?? process.env.ASP_TOKEN;\n\n return {\n platformUrl: platformUrl.replace(/\\/$/, \"\"),\n token,\n verbose: opts.verbose ?? false,\n json: opts.json ?? false,\n };\n}\n\nexport function getAspConfigDir(): string {\n return process.env.ASP_CONFIG_DIR ?? join(homedir(), \".asp\");\n}\n\nexport function getCredentialsPath(): string {\n return join(getAspConfigDir(), \"credentials.json\");\n}\n","import { createRequire } from \"node:module\";\n\nconst require = createRequire(import.meta.url);\nconst pkg = require(\"../package.json\") as { version: string };\n\nexport const CLI_VERSION = pkg.version;\nexport const CLIENT_ID = \"agentscope-platform-cli\";\nexport const DEFAULT_SCOPE = \"platform:control\";\n\nexport const PLATFORM_URL = \"https://platform-pre.agentscope.io\";\nexport const DEFAULT_PLATFORM_URL = PLATFORM_URL;\n/** @deprecated Use {@link PLATFORM_URL} */\nexport const PRE_PLATFORM_URL = PLATFORM_URL;\n\nexport const CLI_API_PREFIX = \"/api/cli/v1\";\n"],"mappings":";AAAA,SAAS,OAAO,OAAO,UAAU,iBAAiB;AAClD,SAAS,eAAe;;;ACDxB,SAAS,eAAe;AACxB,SAAS,YAAY;;;ACDrB,SAAS,qBAAqB;AAE9B,IAAMA,WAAU,cAAc,YAAY,GAAG;AAC7C,IAAM,MAAMA,SAAQ,iBAAiB;AAE9B,IAAM,cAAc,IAAI;AAIxB,IAAM,eAAe;AACrB,IAAM,uBAAuB;AAE7B,IAAM,mBAAmB;AAEzB,IAAM,iBAAiB;;;ADIvB,SAAS,cAAc,OAAsB,CAAC,GAAmB;AACtE,QAAM,cACJ,KAAK,eACL,QAAQ,IAAI,oBACZ,QAAQ,IAAI,gBACZ;AAEF,QAAM,QAAQ,KAAK,SAAS,QAAQ,IAAI;AAExC,SAAO;AAAA,IACL,aAAa,YAAY,QAAQ,OAAO,EAAE;AAAA,IAC1C;AAAA,IACA,SAAS,KAAK,WAAW;AAAA,IACzB,MAAM,KAAK,QAAQ;AAAA,EACrB;AACF;AAEO,SAAS,kBAA0B;AACxC,SAAO,QAAQ,IAAI,kBAAkB,KAAK,QAAQ,GAAG,MAAM;AAC7D;AAEO,SAAS,qBAA6B;AAC3C,SAAO,KAAK,gBAAgB,GAAG,kBAAkB;AACnD;;;ADvBA,eAAsB,kBAAqD;AACzE,MAAI;AACF,UAAM,MAAM,MAAM,SAAS,mBAAmB,GAAG,MAAM;AACvD,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,gBAAgB,OAAyC;AAC7E,QAAM,OAAO,mBAAmB;AAChC,QAAM,MAAM,QAAQ,IAAI,GAAG,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AAC3D,QAAM,UAAU,MAAM,KAAK,UAAU,OAAO,MAAM,CAAC,GAAG,EAAE,MAAM,IAAM,CAAC;AACrE,QAAM,MAAM,MAAM,GAAK;AACzB;AAEA,eAAsB,mBAAkC;AACtD,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM,OAAO,aAAkB;AAClD,UAAM,OAAO,mBAAmB,CAAC;AAAA,EACnC,QAAQ;AAAA,EAER;AACF;AAEO,SAAS,eAAe,OAAmC;AAChE,MAAI,CAAC,MAAM,WAAY,QAAO;AAC9B,SAAO,KAAK,IAAI,KAAK,IAAI,KAAK,MAAM,UAAU,EAAE,QAAQ,IAAI;AAC9D;AAEO,SAAS,6BACd,aACA,UAQmB;AACnB,QAAM,QAA2B;AAAA,IAC/B,cAAc,SAAS;AAAA,IACvB,eAAe,SAAS;AAAA,IACxB,YAAY,SAAS;AAAA,IACrB,OAAO,SAAS;AAAA,IAChB,cAAc;AAAA,IACd,MAAM,SAAS;AAAA,EACjB;AACA,MAAI,SAAS,YAAY;AACvB,UAAM,aAAa,IAAI,KAAK,KAAK,IAAI,IAAI,SAAS,aAAa,GAAI,EAAE,YAAY;AAAA,EACnF;AACA,SAAO;AACT;","names":["require"]}
|
|
File without changes
|
|
File without changes
|