@obov/mext 0.5.0 → 0.6.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/dist/approval.d.ts +33 -0
- package/dist/approval.js +36 -0
- package/dist/approval.js.map +1 -0
- package/dist/audit.d.ts +123 -0
- package/dist/audit.js +221 -0
- package/dist/audit.js.map +1 -0
- package/dist/build-cli.d.ts +1 -0
- package/dist/build-cli.js.map +1 -1
- package/dist/build.d.ts +2 -0
- package/dist/build.js +30 -3
- package/dist/build.js.map +1 -1
- package/dist/caller.d.ts +53 -0
- package/dist/caller.js +51 -0
- package/dist/caller.js.map +1 -0
- package/dist/cli/build.js +4 -2
- package/dist/cli/build.js.map +1 -1
- package/dist/cli/dev-audit.d.ts +25 -0
- package/dist/cli/dev-audit.js +84 -0
- package/dist/cli/dev-audit.js.map +1 -0
- package/dist/cli/dev-lock.d.ts +3 -1
- package/dist/cli/dev-lock.js +12 -5
- package/dist/cli/dev-lock.js.map +1 -1
- package/dist/cli/dev-server.d.ts +9 -0
- package/dist/cli/dev-server.js +24 -1
- package/dist/cli/dev-server.js.map +1 -1
- package/dist/cli/dev-tap.d.ts +20 -0
- package/dist/cli/dev-tap.js +70 -0
- package/dist/cli/dev-tap.js.map +1 -0
- package/dist/cli/dev.js +16 -4
- package/dist/cli/dev.js.map +1 -1
- package/dist/cli/help.js +2 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/inspect.d.ts +7 -0
- package/dist/cli/inspect.js +699 -0
- package/dist/cli/inspect.js.map +1 -0
- package/dist/cli/main.js +8 -0
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/output.d.ts +1 -1
- package/dist/cli/output.js +3 -2
- package/dist/cli/output.js.map +1 -1
- package/dist/cli/run.js +28 -4
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/types.d.ts +9 -0
- package/dist/cli/types.js +77 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/client/index.d.ts +10 -0
- package/dist/client/index.js +7 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/manifest.js +6 -2
- package/dist/client/manifest.js.map +1 -1
- package/dist/client/runner.js +37 -3
- package/dist/client/runner.js.map +1 -1
- package/dist/client/typed.d.ts +54 -0
- package/dist/client/typed.js +490 -0
- package/dist/client/typed.js.map +1 -0
- package/dist/client/types.d.ts +196 -0
- package/dist/client/types.js +2 -0
- package/dist/client/types.js.map +1 -0
- package/dist/command.d.ts +61 -5
- package/dist/command.js +42 -1
- package/dist/command.js.map +1 -1
- package/dist/config.d.ts +42 -10
- package/dist/config.js +32 -7
- package/dist/config.js.map +1 -1
- package/dist/errors.d.ts +21 -3
- package/dist/errors.js +13 -0
- package/dist/errors.js.map +1 -1
- package/dist/expose.d.ts +9 -0
- package/dist/expose.js +52 -0
- package/dist/expose.js.map +1 -0
- package/dist/index.d.ts +15 -6
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/dist/inspect/agent.d.ts +104 -0
- package/dist/inspect/agent.js +125 -0
- package/dist/inspect/agent.js.map +1 -0
- package/dist/inspect/audit.d.ts +46 -0
- package/dist/inspect/audit.js +133 -0
- package/dist/inspect/audit.js.map +1 -0
- package/dist/inspect/compare.d.ts +12 -0
- package/dist/inspect/compare.js +31 -0
- package/dist/inspect/compare.js.map +1 -0
- package/dist/inspect/index.d.ts +17 -0
- package/dist/inspect/index.js +12 -0
- package/dist/inspect/index.js.map +1 -0
- package/dist/inspect/inspector.d.ts +168 -0
- package/dist/inspect/inspector.js +392 -0
- package/dist/inspect/inspector.js.map +1 -0
- package/dist/inspect/profiles.d.ts +95 -0
- package/dist/inspect/profiles.js +235 -0
- package/dist/inspect/profiles.js.map +1 -0
- package/dist/inspect/scenario.d.ts +126 -0
- package/dist/inspect/scenario.js +555 -0
- package/dist/inspect/scenario.js.map +1 -0
- package/dist/inspect/ui-server.d.ts +31 -0
- package/dist/inspect/ui-server.js +378 -0
- package/dist/inspect/ui-server.js.map +1 -0
- package/dist/inspect/ui.html +917 -0
- package/dist/instrumentation.d.ts +13 -2
- package/dist/instrumentation.js +11 -1
- package/dist/instrumentation.js.map +1 -1
- package/dist/invoke.d.ts +32 -5
- package/dist/invoke.js +150 -16
- package/dist/invoke.js.map +1 -1
- package/dist/manifest.d.ts +13 -2
- package/dist/manifest.js +5 -1
- package/dist/manifest.js.map +1 -1
- package/dist/mcp/constants.d.ts +5 -0
- package/dist/mcp/constants.js +5 -0
- package/dist/mcp/constants.js.map +1 -1
- package/dist/mcp/dispatch.d.ts +1 -1
- package/dist/mcp/dispatch.js +14 -3
- package/dist/mcp/dispatch.js.map +1 -1
- package/dist/mcp/help.d.ts +2 -0
- package/dist/mcp/help.js +6 -1
- package/dist/mcp/help.js.map +1 -1
- package/dist/mcp/http.d.ts +16 -2
- package/dist/mcp/http.js +76 -7
- package/dist/mcp/http.js.map +1 -1
- package/dist/mcp/index.d.ts +1 -1
- package/dist/mcp/index.js +1 -1
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/server.d.ts +12 -1
- package/dist/mcp/server.js +63 -17
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/stdio.d.ts +4 -0
- package/dist/mcp/stdio.js +3 -0
- package/dist/mcp/stdio.js.map +1 -1
- package/dist/mcp/tasks.d.ts +3 -1
- package/dist/mcp/tasks.js +6 -3
- package/dist/mcp/tasks.js.map +1 -1
- package/dist/principal.d.ts +22 -0
- package/dist/principal.js +29 -0
- package/dist/principal.js.map +1 -1
- package/dist/registry.d.ts +5 -0
- package/dist/registry.js +21 -0
- package/dist/registry.js.map +1 -1
- package/dist/remote/client.d.ts +2 -0
- package/dist/remote/client.js +3 -2
- package/dist/remote/client.js.map +1 -1
- package/dist/remote/oauth.d.ts +1 -1
- package/dist/remote/oauth.js +1 -1
- package/dist/remote/oauth.js.map +1 -1
- package/dist/start.js +6 -2
- package/dist/start.js.map +1 -1
- package/dist/suggest.js +1 -1
- package/dist/suggest.js.map +1 -1
- package/dist/typegen.d.ts +27 -0
- package/dist/typegen.js +62 -0
- package/dist/typegen.js.map +1 -0
- package/dist/version-constant.d.ts +5 -0
- package/dist/version-constant.js +6 -0
- package/dist/version-constant.js.map +1 -0
- package/dist/version.d.ts +1 -2
- package/dist/version.js +1 -2
- package/dist/version.js.map +1 -1
- package/package.json +12 -2
package/dist/remote/oauth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/remote/oauth.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, randomBytes } from \"node:crypto\"\nimport { createServer, type Server } from \"node:http\"\nimport type { AddressInfo } from \"node:net\"\nimport { setTimeout as delay } from \"node:timers/promises\"\nimport type { BearerChallenge } from \"./client.ts\"\nimport { canonicalServerUrl, type StoredCredentials } from \"./credentials.ts\"\n\n/**\n * MCP authorization (2026-07-28) 클라이언트 쪽: OAuth 2.1 authorization code + PKCE (S256) + loopback redirect.\n * 보호 자원 메타데이터 (RFC 9728: WWW-Authenticate resource_metadata → 경로 삽입 well-known → 루트) →\n * 인가 서버 메타데이터 (RFC 8414 · OIDC Discovery, issuer 일치 검증) → 클라이언트 등록 (사전 등록 client_id ·\n * Client ID Metadata Document URL · RFC 7591 동적 등록) → 인가 요청 (resource = RFC 8707) → iss 검증 (RFC 9207) →\n * 토큰 교환. refresh_token 갱신.\n * headless: redirect URL 붙여넣기 (loopback 과 먼저 온 쪽) · device authorization grant (RFC 8628, 인가 서버 메타데이터에\n * device_authorization_endpoint 가 있을 때만. MCP 사양 밖). logout = token revocation (RFC 7009).\n */\n\nexport class OAuthFlowError extends Error {\n constructor(message: string) {\n super(message)\n this.name = \"OAuthFlowError\"\n }\n}\n\nexport interface ProtectedResourceMetadata {\n resource?: string\n authorization_servers: string[]\n scopes_supported?: string[]\n [key: string]: unknown\n}\n\nexport interface AuthorizationServerMetadata {\n issuer: string\n authorization_endpoint: string\n token_endpoint: string\n registration_endpoint?: string\n code_challenge_methods_supported?: string[]\n scopes_supported?: string[]\n authorization_response_iss_parameter_supported?: boolean\n client_id_metadata_document_supported?: boolean\n /** RFC 8628 */\n device_authorization_endpoint?: string\n /** RFC 7009 */\n revocation_endpoint?: string\n [key: string]: unknown\n}\n\ntype Fetch = typeof fetch\n\n/* 보호 자원 메타데이터 (RFC 9728) */\n\n/** 보호 자원 메타데이터 후보 URL: challenge 의 resource_metadata, 없으면 경로 삽입 well-known → 루트 well-known */\nexport function protectedResourceMetadataUrls(serverUrl: string, challenge?: BearerChallenge): string[] {\n if (challenge?.resourceMetadata) return [challenge.resourceMetadata]\n const u = new URL(serverUrl)\n const path = u.pathname.replace(/\\/$/, \"\")\n const urls: string[] = []\n if (path !== \"\") urls.push(`${u.origin}/.well-known/oauth-protected-resource${path}`)\n urls.push(`${u.origin}/.well-known/oauth-protected-resource`)\n return urls\n}\n\nexport async function discoverProtectedResource(\n serverUrl: string,\n challenge: BearerChallenge | undefined,\n doFetch: Fetch = fetch,\n): Promise<ProtectedResourceMetadata> {\n const canonical = canonicalServerUrl(serverUrl)\n for (const url of protectedResourceMetadataUrls(serverUrl, challenge)) {\n const doc = await getJson(url, doFetch)\n if (!doc) continue\n const servers = doc.authorization_servers\n if (!Array.isArray(servers) || servers.length === 0 || !servers.every((s) => typeof s === \"string\")) {\n throw new OAuthFlowError(`${url}: protected resource metadata has no authorization_servers.`)\n }\n if (typeof doc.resource === \"string\") {\n const resource = canonicalServerUrl(doc.resource)\n if (resource !== canonical && resource !== new URL(canonical).origin) {\n throw new OAuthFlowError(`${url}: resource ${doc.resource} does not match ${canonical}.`)\n }\n }\n return doc as ProtectedResourceMetadata\n }\n throw new OAuthFlowError(\n `${serverUrl} does not publish OAuth protected resource metadata (/.well-known/oauth-protected-resource). ` +\n \"Use an API key (MEXT_TOKEN) instead.\",\n )\n}\n\n/* 인가 서버 메타데이터 (RFC 8414 · OIDC Discovery) */\n\n/** issuer → 메타데이터 후보 URL (MCP authorization-server-discovery 순서) */\nexport function authorizationServerMetadataUrls(issuer: string): string[] {\n const u = new URL(issuer)\n const path = u.pathname.replace(/\\/$/, \"\")\n if (path === \"\") {\n return [`${u.origin}/.well-known/oauth-authorization-server`, `${u.origin}/.well-known/openid-configuration`]\n }\n return [\n `${u.origin}/.well-known/oauth-authorization-server${path}`,\n `${u.origin}/.well-known/openid-configuration${path}`,\n `${u.origin}${path}/.well-known/openid-configuration`,\n ]\n}\n\nexport async function discoverAuthorizationServer(issuer: string, doFetch: Fetch = fetch): Promise<AuthorizationServerMetadata> {\n for (const url of authorizationServerMetadataUrls(issuer)) {\n const doc = await getJson(url, doFetch)\n if (!doc) continue\n // issuer 는 메타데이터 URL 을 만든 값과 정확히 같아야 한다 (다르면 사용 금지)\n if (doc.issuer !== issuer) throw new OAuthFlowError(`${url}: issuer ${String(doc.issuer)} does not match ${issuer}.`)\n if (typeof doc.authorization_endpoint !== \"string\" || typeof doc.token_endpoint !== \"string\") {\n throw new OAuthFlowError(`${url}: authorization_endpoint and token_endpoint are required.`)\n }\n const methods = doc.code_challenge_methods_supported\n if (!Array.isArray(methods) || !methods.includes(\"S256\")) {\n throw new OAuthFlowError(`${issuer} does not advertise PKCE S256 (code_challenge_methods_supported).`)\n }\n return doc as AuthorizationServerMetadata\n }\n throw new OAuthFlowError(`Authorization server metadata not found for ${issuer}.`)\n}\n\n/* 클라이언트 등록 */\n\nexport interface OAuthClient {\n client_id: string\n client_secret?: string\n token_endpoint_auth_method?: string\n}\n\nexport interface RegisterOptions {\n /** 사전 등록 client_id 또는 Client ID Metadata Document URL (https) */\n clientId?: string\n clientName?: string\n /** 없으면 redirect 없는 등록 (device flow) */\n redirectUri?: string\n scope?: string\n}\n\nexport const DEVICE_CODE_GRANT = \"urn:ietf:params:oauth:grant-type:device_code\"\n\n/**\n * 등록 순서: 사전 등록 client_id (https URL 이면 Client ID Metadata Document) → 동적 등록 (registration_endpoint).\n * 둘 다 없으면 오류 (--client-id 안내).\n */\nexport async function registerClient(\n as: AuthorizationServerMetadata,\n options: RegisterOptions,\n doFetch: Fetch = fetch,\n): Promise<OAuthClient> {\n if (options.clientId !== undefined) {\n if (/^https:\\/\\//.test(options.clientId) && as.client_id_metadata_document_supported !== true) {\n throw new OAuthFlowError(`${as.issuer} does not support Client ID Metadata Documents (client_id ${options.clientId}).`)\n }\n return { client_id: options.clientId, token_endpoint_auth_method: \"none\" }\n }\n if (typeof as.registration_endpoint !== \"string\") {\n throw new OAuthFlowError(\n `${as.issuer} has no dynamic client registration. Pass a pre-registered client ID with --client-id.`,\n )\n }\n const body: Record<string, unknown> =\n options.redirectUri !== undefined\n ? {\n client_name: options.clientName ?? \"mext\",\n redirect_uris: [options.redirectUri],\n grant_types: [\"authorization_code\", \"refresh_token\"],\n response_types: [\"code\"],\n token_endpoint_auth_method: \"none\",\n application_type: \"native\",\n }\n : {\n client_name: options.clientName ?? \"mext\",\n grant_types: [DEVICE_CODE_GRANT, \"refresh_token\"],\n response_types: [],\n token_endpoint_auth_method: \"none\",\n application_type: \"native\",\n }\n if (options.scope) body.scope = options.scope\n const res = await doFetch(as.registration_endpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", Accept: \"application/json\" },\n body: JSON.stringify(body),\n })\n const doc = (await res.json().catch(() => undefined)) as Record<string, unknown> | undefined\n if (!res.ok || typeof doc?.client_id !== \"string\") {\n throw new OAuthFlowError(`Client registration failed (HTTP ${res.status})${describeOAuthError(doc)}.`)\n }\n const client: OAuthClient = { client_id: doc.client_id }\n if (typeof doc.client_secret === \"string\") client.client_secret = doc.client_secret\n if (typeof doc.token_endpoint_auth_method === \"string\") client.token_endpoint_auth_method = doc.token_endpoint_auth_method\n return client\n}\n\n/* PKCE */\n\nexport interface Pkce {\n verifier: string\n challenge: string\n}\n\nexport function createPkce(): Pkce {\n const verifier = base64url(randomBytes(32))\n return { verifier, challenge: base64url(createHash(\"sha256\").update(verifier).digest()) }\n}\n\n/* loopback redirect */\n\nexport interface Loopback {\n redirectUri: string\n port: number\n /** 첫 callback 요청의 query. signal abort · 시간 초과 = reject */\n callback: Promise<URLSearchParams>\n close(): Promise<void>\n}\n\nexport const CALLBACK_PATH = \"/callback\"\n\n/** 127.0.0.1 의 임의 포트 (port 지정 가능) 에 callback 수신 서버 */\nexport async function startLoopback(options: { port?: number; signal?: AbortSignal; timeoutMs?: number } = {}): Promise<Loopback> {\n let settle!: { resolve: (q: URLSearchParams) => void; reject: (e: unknown) => void }\n const callback = new Promise<URLSearchParams>((resolve, reject) => (settle = { resolve, reject }))\n callback.catch(() => {})\n let done = false\n const server: Server = createServer((req, res) => {\n const url = new URL(req.url ?? \"/\", \"http://127.0.0.1\")\n if (req.method !== \"GET\" || url.pathname !== CALLBACK_PATH || done) {\n res.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" }).end(\"Not found\\n\")\n return\n }\n done = true\n const ok = url.searchParams.has(\"code\") && !url.searchParams.has(\"error\")\n res\n .writeHead(ok ? 200 : 400, { \"Content-Type\": \"text/html; charset=utf-8\", Connection: \"close\" })\n .end(\n ok\n ? \"<!doctype html><title>mext login</title><p>Login complete. You can close this window.</p>\\n\"\n : \"<!doctype html><title>mext login</title><p>Login failed. Return to the terminal.</p>\\n\",\n )\n settle.resolve(url.searchParams)\n })\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject)\n server.listen(options.port ?? 0, \"127.0.0.1\", () => {\n server.off(\"error\", reject)\n resolve()\n })\n })\n const port = (server.address() as AddressInfo).port\n const timer = setTimeout(\n () => settle.reject(new OAuthFlowError(\"Timed out waiting for the authorization callback.\")),\n options.timeoutMs ?? 300_000,\n )\n const onAbort = () => settle.reject(options.signal?.reason ?? new Error(\"aborted\"))\n if (options.signal?.aborted) onAbort()\n options.signal?.addEventListener(\"abort\", onAbort, { once: true })\n const close = async () => {\n clearTimeout(timer)\n options.signal?.removeEventListener(\"abort\", onAbort)\n server.closeAllConnections()\n await new Promise<void>((resolve) => server.close(() => resolve()))\n }\n return { redirectUri: `http://127.0.0.1:${port}${CALLBACK_PATH}`, port, callback, close }\n}\n\n/* 인가 요청 · 응답 검증 · 토큰 */\n\nexport interface AuthorizationRequest {\n url: string\n state: string\n pkce: Pkce\n}\n\nexport function authorizationRequest(\n as: AuthorizationServerMetadata,\n client: OAuthClient,\n options: { redirectUri: string; resource: string; scope?: string },\n): AuthorizationRequest {\n const pkce = createPkce()\n const state = base64url(randomBytes(16))\n const url = new URL(as.authorization_endpoint)\n url.searchParams.set(\"response_type\", \"code\")\n url.searchParams.set(\"client_id\", client.client_id)\n url.searchParams.set(\"redirect_uri\", options.redirectUri)\n url.searchParams.set(\"code_challenge\", pkce.challenge)\n url.searchParams.set(\"code_challenge_method\", \"S256\")\n url.searchParams.set(\"state\", state)\n url.searchParams.set(\"resource\", options.resource)\n if (options.scope) url.searchParams.set(\"scope\", options.scope)\n return { url: url.href, state, pkce }\n}\n\n/** callback query → code. state · iss (RFC 9207) 검증 후 error 를 본다 (iss 불일치면 error 내용도 쓰지 않음) */\nexport function authorizationCode(\n query: URLSearchParams,\n as: AuthorizationServerMetadata,\n expectedState: string,\n): string {\n const iss = query.get(\"iss\")\n if (iss !== null && iss !== as.issuer) throw new OAuthFlowError(\"Authorization response issuer mismatch.\")\n if (iss === null && as.authorization_response_iss_parameter_supported === true) {\n throw new OAuthFlowError(\"Authorization response is missing iss.\")\n }\n if (query.get(\"state\") !== expectedState) throw new OAuthFlowError(\"Authorization response state mismatch.\")\n const error = query.get(\"error\")\n if (error !== null) {\n const description = query.get(\"error_description\")\n throw new OAuthFlowError(`Authorization failed: ${error}${description ? ` (${description})` : \"\"}.`)\n }\n const code = query.get(\"code\")\n if (code === null || code === \"\") throw new OAuthFlowError(\"Authorization response has no code.\")\n return code\n}\n\ninterface TokenContext {\n issuer: string\n token_endpoint: string\n client: OAuthClient\n resource?: string\n}\n\nexport async function exchangeCode(\n context: TokenContext,\n options: { code: string; redirectUri: string; verifier: string },\n doFetch: Fetch = fetch,\n): Promise<StoredCredentials> {\n return tokenRequest(\n context,\n { grant_type: \"authorization_code\", code: options.code, redirect_uri: options.redirectUri, code_verifier: options.verifier },\n undefined,\n doFetch,\n )\n}\n\n/** refresh_token 갱신. 새 refresh_token 이 없으면 기존 값 유지 */\nexport async function refreshCredentials(credentials: StoredCredentials, doFetch: Fetch = fetch): Promise<StoredCredentials> {\n if (!credentials.refresh_token) throw new OAuthFlowError(\"No refresh token.\")\n if (credentials.issuer === undefined || credentials.token_endpoint === undefined || credentials.client_id === undefined) {\n throw new OAuthFlowError(\"Stored credentials have no OAuth client.\")\n }\n return tokenRequest(\n {\n issuer: credentials.issuer,\n token_endpoint: credentials.token_endpoint,\n client: storedClient(credentials, credentials.client_id),\n ...(credentials.resource !== undefined ? { resource: credentials.resource } : {}),\n },\n { grant_type: \"refresh_token\", refresh_token: credentials.refresh_token },\n credentials,\n doFetch,\n )\n}\n\nfunction storedClient(credentials: StoredCredentials, clientId: string): OAuthClient {\n const client: OAuthClient = { client_id: clientId }\n if (credentials.client_secret !== undefined) client.client_secret = credentials.client_secret\n if (credentials.token_endpoint_auth_method !== undefined) client.token_endpoint_auth_method = credentials.token_endpoint_auth_method\n return client\n}\n\n/** 클라이언트 인증 (token · revocation · device authorization 공통): secret 없음 = client_id 본문, basic · post */\nfunction clientAuth(client: OAuthClient, body: URLSearchParams, headers: Record<string, string>): void {\n const method = client.token_endpoint_auth_method ?? (client.client_secret ? \"client_secret_basic\" : \"none\")\n if (client.client_secret && method === \"client_secret_basic\") {\n const pair = `${encodeURIComponent(client.client_id)}:${encodeURIComponent(client.client_secret)}`\n headers.Authorization = `Basic ${Buffer.from(pair).toString(\"base64\")}`\n } else {\n body.set(\"client_id\", client.client_id)\n if (client.client_secret && method === \"client_secret_post\") body.set(\"client_secret\", client.client_secret)\n }\n}\n\nfunction formHeaders(): Record<string, string> {\n return { \"Content-Type\": \"application/x-www-form-urlencoded\", Accept: \"application/json\" }\n}\n\nasync function tokenRequest(\n context: TokenContext,\n grant: Record<string, string>,\n previous: StoredCredentials | undefined,\n doFetch: Fetch,\n): Promise<StoredCredentials> {\n const res = await postTokenEndpoint(context, grant, doFetch)\n const doc = res.doc\n if (!res.ok || typeof doc?.access_token !== \"string\") {\n throw new OAuthFlowError(`Token request failed (HTTP ${res.status})${describeOAuthError(doc)}.`)\n }\n return credentialsFrom(context, doc as Record<string, unknown> & { access_token: string }, previous)\n}\n\nasync function postTokenEndpoint(\n context: TokenContext,\n grant: Record<string, string>,\n doFetch: Fetch,\n): Promise<{ ok: boolean; status: number; doc: Record<string, unknown> | undefined }> {\n const body = new URLSearchParams(grant)\n if (context.resource !== undefined) body.set(\"resource\", context.resource)\n const headers = formHeaders()\n clientAuth(context.client, body, headers)\n const res = await doFetch(context.token_endpoint, { method: \"POST\", headers, body })\n const doc = (await res.json().catch(() => undefined)) as Record<string, unknown> | undefined\n return { ok: res.ok, status: res.status, doc }\n}\n\nfunction credentialsFrom(\n context: TokenContext,\n doc: Record<string, unknown> & { access_token: string },\n previous: StoredCredentials | undefined,\n): StoredCredentials {\n const { client } = context\n const out: StoredCredentials = {\n access_token: doc.access_token,\n issuer: context.issuer,\n token_endpoint: context.token_endpoint,\n client_id: client.client_id,\n }\n if (context.resource !== undefined) out.resource = context.resource\n if (typeof doc.token_type === \"string\") out.token_type = doc.token_type\n const refresh = typeof doc.refresh_token === \"string\" ? doc.refresh_token : previous?.refresh_token\n if (refresh !== undefined) out.refresh_token = refresh\n if (typeof doc.expires_in === \"number\") out.expires_at = Date.now() + doc.expires_in * 1000\n const scope = typeof doc.scope === \"string\" ? doc.scope : previous?.scope\n if (scope !== undefined) out.scope = scope\n if (client.client_secret !== undefined) out.client_secret = client.client_secret\n if (client.token_endpoint_auth_method !== undefined) out.token_endpoint_auth_method = client.token_endpoint_auth_method\n return out\n}\n\n/** 만료 30초 전부터 만료로 본다 */\nexport function isExpired(credentials: StoredCredentials, now = Date.now()): boolean {\n return credentials.expires_at !== undefined && credentials.expires_at - 30_000 <= now\n}\n\n/* 전체 흐름 */\n\n/** login 대상: 보호 자원 메타데이터 → 인가 서버 메타데이터 · resource · scope */\nexport interface LoginTarget {\n serverUrl: string\n as: AuthorizationServerMetadata\n /** RFC 8707 resource */\n resource: string\n scope?: string\n}\n\nexport interface DiscoverLoginOptions {\n serverUrl: string\n /** 서버 401 의 WWW-Authenticate (없으면 well-known 탐색) */\n challenge?: BearerChallenge\n /** 기본: challenge 의 scope → 보호 자원 메타데이터 scopes_supported → 생략 */\n scope?: string\n fetch?: Fetch\n}\n\nexport async function discoverLoginTarget(options: DiscoverLoginOptions): Promise<LoginTarget> {\n const doFetch = options.fetch ?? fetch\n const prm = await discoverProtectedResource(options.serverUrl, options.challenge, doFetch)\n // 여러 인가 서버 중 첫 번째 (RFC 9728 7.6: 선택은 클라이언트 몫)\n const as = await discoverAuthorizationServer(prm.authorization_servers[0]!, doFetch)\n const resource = typeof prm.resource === \"string\" ? prm.resource : canonicalServerUrl(options.serverUrl)\n const scope =\n options.scope ??\n options.challenge?.scope ??\n (Array.isArray(prm.scopes_supported) && prm.scopes_supported.length > 0 ? prm.scopes_supported.join(\" \") : undefined)\n return { serverUrl: options.serverUrl, as, resource, ...(scope !== undefined ? { scope } : {}) }\n}\n\nexport interface AuthorizationCodeLoginOptions {\n clientId?: string\n /** 동적 등록 client_name. 기본 mext */\n clientName?: string\n /** loopback 포트. 기본 임의 */\n port?: number\n signal?: AbortSignal\n timeoutMs?: number\n fetch?: Fetch\n /** 인가 URL 준비됨 (브라우저 열기 · 안내 출력) */\n onAuthorizationUrl(url: string, loopback: { redirectUri: string; port: number }): void\n /**\n * 붙여넣은 redirect URL 의 query (stdin). loopback callback 과 먼저 온 쪽을 쓰고, 다른 쪽은 signal 로 중단.\n * undefined = 입력 끝 (loopback 만 대기)\n */\n readRedirect?(signal: AbortSignal): Promise<URLSearchParams | undefined>\n}\n\n/** authorization code + PKCE. redirect = loopback callback 또는 붙여넣은 URL. 둘 다 state · iss 검증 */\nexport async function authorizationCodeLogin(\n target: LoginTarget,\n options: AuthorizationCodeLoginOptions,\n): Promise<StoredCredentials> {\n const doFetch = options.fetch ?? fetch\n const { as, resource, scope } = target\n const loopback = await startLoopback({\n ...(options.port !== undefined ? { port: options.port } : {}),\n ...(options.signal ? { signal: options.signal } : {}),\n ...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),\n })\n const pasteAbort = new AbortController()\n try {\n const client = await registerClient(\n as,\n {\n redirectUri: loopback.redirectUri,\n ...(options.clientId !== undefined ? { clientId: options.clientId } : {}),\n ...(options.clientName !== undefined ? { clientName: options.clientName } : {}),\n ...(scope !== undefined ? { scope } : {}),\n },\n doFetch,\n )\n const request = authorizationRequest(as, client, {\n redirectUri: loopback.redirectUri,\n resource,\n ...(scope !== undefined ? { scope } : {}),\n })\n options.onAuthorizationUrl(request.url, { redirectUri: loopback.redirectUri, port: loopback.port })\n const never = new Promise<never>(() => {})\n const pasted = options.readRedirect\n ? options.readRedirect(pasteAbort.signal).then((q) => q ?? never)\n : never\n const query = await Promise.race([loopback.callback, pasted])\n const code = authorizationCode(query, as, request.state)\n return await exchangeCode(\n { issuer: as.issuer, token_endpoint: as.token_endpoint, client, resource },\n { code, redirectUri: loopback.redirectUri, verifier: request.pkce.verifier },\n doFetch,\n )\n } finally {\n pasteAbort.abort()\n await loopback.close()\n }\n}\n\n/** 붙여넣은 redirect URL (또는 query 문자열) → query. code · error 가 없으면 undefined */\nexport function parseRedirectUrl(text: string): URLSearchParams | undefined {\n const trimmed = text.trim()\n if (trimmed === \"\") return undefined\n let query: URLSearchParams\n try {\n query = new URL(trimmed).searchParams\n } catch {\n if (!trimmed.includes(\"=\")) return undefined\n query = new URLSearchParams(trimmed.replace(/^[^?]*\\?/, \"\"))\n }\n return query.has(\"code\") || query.has(\"error\") ? query : undefined\n}\n\n/* device authorization grant (RFC 8628) */\n\nexport interface DeviceAuthorization {\n verification_uri: string\n verification_uri_complete?: string\n user_code: string\n /** 초 */\n expires_in: number\n /** polling 간격 (초). 기본 5 */\n interval: number\n}\n\nexport interface DeviceLoginOptions {\n clientId?: string\n /** 동적 등록 client_name. 기본 mext */\n clientName?: string\n signal?: AbortSignal\n fetch?: Fetch\n /** polling 대기 (테스트 주입). 기본 setTimeout */\n sleep?(ms: number, signal?: AbortSignal): Promise<void>\n /** 사용자 코드 준비됨 (안내 출력 · 브라우저 열기) */\n onDeviceCode(device: DeviceAuthorization): void\n}\n\nexport async function deviceLogin(target: LoginTarget, options: DeviceLoginOptions): Promise<StoredCredentials> {\n const doFetch = options.fetch ?? fetch\n const sleep = options.sleep ?? ((ms: number, signal?: AbortSignal) => delay(ms, undefined, signal ? { signal } : {}))\n const { as, resource, scope } = target\n const endpoint = as.device_authorization_endpoint\n if (typeof endpoint !== \"string\") {\n throw new OAuthFlowError(\n `${as.issuer} does not support the device authorization grant (no device_authorization_endpoint in its metadata).`,\n )\n }\n const client = await registerClient(\n as,\n {\n ...(options.clientId !== undefined ? { clientId: options.clientId } : {}),\n ...(options.clientName !== undefined ? { clientName: options.clientName } : {}),\n ...(scope !== undefined ? { scope } : {}),\n },\n doFetch,\n )\n const body = new URLSearchParams({ resource })\n if (scope !== undefined) body.set(\"scope\", scope)\n const headers = formHeaders()\n clientAuth(client, body, headers)\n const res = await doFetch(endpoint, { method: \"POST\", headers, body })\n const doc = (await res.json().catch(() => undefined)) as Record<string, unknown> | undefined\n if (\n !res.ok ||\n typeof doc?.device_code !== \"string\" ||\n typeof doc.user_code !== \"string\" ||\n typeof doc.verification_uri !== \"string\" ||\n typeof doc.expires_in !== \"number\"\n ) {\n throw new OAuthFlowError(`Device authorization request failed (HTTP ${res.status})${describeOAuthError(doc)}.`)\n }\n const device: DeviceAuthorization = {\n verification_uri: doc.verification_uri,\n user_code: doc.user_code,\n expires_in: doc.expires_in,\n interval: typeof doc.interval === \"number\" && doc.interval >= 0 ? doc.interval : 5,\n }\n if (typeof doc.verification_uri_complete === \"string\") device.verification_uri_complete = doc.verification_uri_complete\n const deviceCode = doc.device_code\n options.onDeviceCode(device)\n\n const context: TokenContext = { issuer: as.issuer, token_endpoint: as.token_endpoint, client, resource }\n const deadline = Date.now() + device.expires_in * 1000\n let interval = device.interval * 1000\n const expired = () => new OAuthFlowError(\"The device code expired before authorization. Run login again.\")\n for (;;) {\n if (Date.now() >= deadline) throw expired()\n await sleep(interval, options.signal)\n const token = await postTokenEndpoint(context, { grant_type: DEVICE_CODE_GRANT, device_code: deviceCode }, doFetch)\n if (token.ok && typeof token.doc?.access_token === \"string\") {\n return credentialsFrom(context, token.doc as Record<string, unknown> & { access_token: string }, undefined)\n }\n const error = token.doc?.error\n if (error === \"authorization_pending\") continue\n if (error === \"slow_down\") {\n interval += 5000 // RFC 8628 3.5\n continue\n }\n if (error === \"expired_token\") throw expired()\n if (error === \"access_denied\") throw new OAuthFlowError(\"Authorization was denied.\")\n throw new OAuthFlowError(`Token request failed (HTTP ${token.status})${describeOAuthError(token.doc)}.`)\n }\n}\n\n/* token revocation (RFC 7009) */\n\nexport interface RevokeResult {\n /** 인가 서버에 revocation_endpoint 가 있음 */\n supported: boolean\n /** 폐기 요청이 성공한 토큰 종류 (refresh_token → access_token 순서) */\n revoked: (\"refresh_token\" | \"access_token\")[]\n /** 실패 (메타데이터 조회 · 요청). 실패해도 저장분 삭제는 호출자가 진행 */\n errors: string[]\n}\n\n/** 저장된 OAuth 토큰 폐기. refresh token 먼저 (RFC 7009 2.1: 연결된 access token 도 무효화될 수 있음), 그다음 access token */\nexport async function revokeCredentials(credentials: StoredCredentials, options: { fetch?: Fetch } = {}): Promise<RevokeResult> {\n const doFetch = options.fetch ?? fetch\n const result: RevokeResult = { supported: false, revoked: [], errors: [] }\n if (credentials.issuer === undefined || credentials.client_id === undefined) return result\n let as: AuthorizationServerMetadata\n try {\n as = await discoverAuthorizationServer(credentials.issuer, doFetch)\n } catch (error) {\n result.errors.push(error instanceof Error ? error.message : String(error))\n return result\n }\n const endpoint = as.revocation_endpoint\n if (typeof endpoint !== \"string\") return result\n result.supported = true\n const client = storedClient(credentials, credentials.client_id)\n const tokens: [RevokeResult[\"revoked\"][number], string | undefined][] = [\n [\"refresh_token\", credentials.refresh_token],\n [\"access_token\", credentials.access_token],\n ]\n for (const [hint, token] of tokens) {\n if (token === undefined || token === \"\") continue\n const body = new URLSearchParams({ token, token_type_hint: hint })\n const headers = formHeaders()\n clientAuth(client, body, headers)\n try {\n const res = await doFetch(endpoint, { method: \"POST\", headers, body })\n if (res.ok) {\n await res.body?.cancel().catch(() => {})\n result.revoked.push(hint)\n } else {\n const doc = (await res.json().catch(() => undefined)) as Record<string, unknown> | undefined\n result.errors.push(`${hint} revocation failed (HTTP ${res.status})${describeOAuthError(doc)}`)\n }\n } catch (error) {\n result.errors.push(`${hint} revocation failed: ${error instanceof Error ? error.message : String(error)}`)\n }\n }\n return result\n}\n\n/** 이전 API: 탐색 + authorization code (loopback) */\nexport interface LoginOptions extends DiscoverLoginOptions, Omit<AuthorizationCodeLoginOptions, \"fetch\"> {}\n\nexport async function login(options: LoginOptions): Promise<StoredCredentials> {\n const target = await discoverLoginTarget(options)\n return authorizationCodeLogin(target, options)\n}\n\n/* 공통 */\n\nasync function getJson(url: string, doFetch: Fetch): Promise<Record<string, unknown> | undefined> {\n let res: Response\n try {\n res = await doFetch(url, { headers: { Accept: \"application/json\" } })\n } catch (error) {\n throw new OAuthFlowError(`Cannot reach ${url}: ${error instanceof Error ? error.message : String(error)}`)\n }\n if (!res.ok) {\n await res.body?.cancel().catch(() => {})\n return undefined\n }\n const doc = (await res.json().catch(() => undefined)) as unknown\n return typeof doc === \"object\" && doc !== null && !Array.isArray(doc) ? (doc as Record<string, unknown>) : undefined\n}\n\nfunction describeOAuthError(doc: Record<string, unknown> | undefined): string {\n if (typeof doc?.error !== \"string\") return \"\"\n return `: ${doc.error}${typeof doc.error_description === \"string\" ? ` (${doc.error_description})` : \"\"}`\n}\n\nfunction base64url(buf: Buffer): string {\n return buf.toString(\"base64url\")\n}\n"]}
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/remote/oauth.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, randomBytes } from \"node:crypto\"\nimport { createServer, type Server } from \"node:http\"\nimport type { AddressInfo } from \"node:net\"\nimport { setTimeout as delay } from \"node:timers/promises\"\nimport type { BearerChallenge } from \"./client.ts\"\nimport { canonicalServerUrl, type StoredCredentials } from \"./credentials.ts\"\n\n/**\n * MCP authorization (2026-07-28) 클라이언트 쪽: OAuth 2.1 authorization code + PKCE (S256) + loopback redirect.\n * 보호 자원 메타데이터 (RFC 9728: WWW-Authenticate resource_metadata → 경로 삽입 well-known → 루트) →\n * 인가 서버 메타데이터 (RFC 8414 · OIDC Discovery, issuer 일치 검증) → 클라이언트 등록 (사전 등록 client_id ·\n * Client ID Metadata Document URL · RFC 7591 동적 등록) → 인가 요청 (resource = RFC 8707) → iss 검증 (RFC 9207) →\n * 토큰 교환. refresh_token 갱신.\n * headless: redirect URL 붙여넣기 (loopback 과 먼저 온 쪽) · device authorization grant (RFC 8628, 인가 서버 메타데이터에\n * device_authorization_endpoint 가 있을 때만. MCP 사양 밖). logout = token revocation (RFC 7009).\n */\n\nexport class OAuthFlowError extends Error {\n constructor(message: string) {\n super(message)\n this.name = \"OAuthFlowError\"\n }\n}\n\nexport interface ProtectedResourceMetadata {\n resource?: string\n authorization_servers: string[]\n scopes_supported?: string[]\n [key: string]: unknown\n}\n\nexport interface AuthorizationServerMetadata {\n issuer: string\n authorization_endpoint: string\n token_endpoint: string\n registration_endpoint?: string\n code_challenge_methods_supported?: string[]\n scopes_supported?: string[]\n authorization_response_iss_parameter_supported?: boolean\n client_id_metadata_document_supported?: boolean\n /** RFC 8628 */\n device_authorization_endpoint?: string\n /** RFC 7009 */\n revocation_endpoint?: string\n [key: string]: unknown\n}\n\ntype Fetch = typeof fetch\n\n/* 보호 자원 메타데이터 (RFC 9728) */\n\n/** 보호 자원 메타데이터 후보 URL: challenge 의 resource_metadata, 없으면 경로 삽입 well-known → 루트 well-known */\nexport function protectedResourceMetadataUrls(serverUrl: string, challenge?: BearerChallenge): string[] {\n if (challenge?.resourceMetadata) return [challenge.resourceMetadata]\n const u = new URL(serverUrl)\n const path = u.pathname.replace(/\\/$/, \"\")\n const urls: string[] = []\n if (path !== \"\") urls.push(`${u.origin}/.well-known/oauth-protected-resource${path}`)\n urls.push(`${u.origin}/.well-known/oauth-protected-resource`)\n return urls\n}\n\nexport async function discoverProtectedResource(\n serverUrl: string,\n challenge: BearerChallenge | undefined,\n doFetch: Fetch = fetch,\n): Promise<ProtectedResourceMetadata> {\n const canonical = canonicalServerUrl(serverUrl)\n for (const url of protectedResourceMetadataUrls(serverUrl, challenge)) {\n const doc = await getJson(url, doFetch)\n if (!doc) continue\n const servers = doc.authorization_servers\n if (!Array.isArray(servers) || servers.length === 0 || !servers.every((s) => typeof s === \"string\")) {\n throw new OAuthFlowError(`${url}: protected resource metadata has no authorization_servers.`)\n }\n if (typeof doc.resource === \"string\") {\n const resource = canonicalServerUrl(doc.resource)\n if (resource !== canonical && resource !== new URL(canonical).origin) {\n throw new OAuthFlowError(`${url}: resource ${doc.resource} does not match ${canonical}.`)\n }\n }\n return doc as ProtectedResourceMetadata\n }\n throw new OAuthFlowError(\n `${serverUrl} does not publish OAuth protected resource metadata (/.well-known/oauth-protected-resource). ` +\n \"Use an API key (MEXT_TOKEN) instead.\",\n )\n}\n\n/* 인가 서버 메타데이터 (RFC 8414 · OIDC Discovery) */\n\n/** issuer → 메타데이터 후보 URL (MCP authorization-server-discovery 순서) */\nexport function authorizationServerMetadataUrls(issuer: string): string[] {\n const u = new URL(issuer)\n const path = u.pathname.replace(/\\/$/, \"\")\n if (path === \"\") {\n return [`${u.origin}/.well-known/oauth-authorization-server`, `${u.origin}/.well-known/openid-configuration`]\n }\n return [\n `${u.origin}/.well-known/oauth-authorization-server${path}`,\n `${u.origin}/.well-known/openid-configuration${path}`,\n `${u.origin}${path}/.well-known/openid-configuration`,\n ]\n}\n\nexport async function discoverAuthorizationServer(issuer: string, doFetch: Fetch = fetch): Promise<AuthorizationServerMetadata> {\n for (const url of authorizationServerMetadataUrls(issuer)) {\n const doc = await getJson(url, doFetch)\n if (!doc) continue\n // issuer 는 메타데이터 URL 을 만든 값과 정확히 같아야 한다 (다르면 사용 금지)\n if (doc.issuer !== issuer) throw new OAuthFlowError(`${url}: issuer ${String(doc.issuer)} does not match ${issuer}.`)\n if (typeof doc.authorization_endpoint !== \"string\" || typeof doc.token_endpoint !== \"string\") {\n throw new OAuthFlowError(`${url}: authorization_endpoint and token_endpoint are required.`)\n }\n const methods = doc.code_challenge_methods_supported\n if (!Array.isArray(methods) || !methods.includes(\"S256\")) {\n throw new OAuthFlowError(`${issuer} does not advertise PKCE S256 (code_challenge_methods_supported).`)\n }\n return doc as AuthorizationServerMetadata\n }\n throw new OAuthFlowError(`Authorization server metadata not found for ${issuer}.`)\n}\n\n/* 클라이언트 등록 */\n\nexport interface OAuthClient {\n client_id: string\n client_secret?: string\n token_endpoint_auth_method?: string\n}\n\nexport interface RegisterOptions {\n /** 사전 등록 client_id 또는 Client ID Metadata Document URL (https) */\n clientId?: string\n clientName?: string\n /** 없으면 redirect 없는 등록 (device flow) */\n redirectUri?: string\n scope?: string\n}\n\nexport const DEVICE_CODE_GRANT = \"urn:ietf:params:oauth:grant-type:device_code\"\n\n/**\n * 등록 순서: 사전 등록 client_id (https URL 이면 Client ID Metadata Document) → 동적 등록 (registration_endpoint).\n * 둘 다 없으면 오류 (--client-id 안내).\n */\nexport async function registerClient(\n as: AuthorizationServerMetadata,\n options: RegisterOptions,\n doFetch: Fetch = fetch,\n): Promise<OAuthClient> {\n if (options.clientId !== undefined) {\n if (options.clientId.startsWith(\"https://\") && as.client_id_metadata_document_supported !== true) {\n throw new OAuthFlowError(`${as.issuer} does not support Client ID Metadata Documents (client_id ${options.clientId}).`)\n }\n return { client_id: options.clientId, token_endpoint_auth_method: \"none\" }\n }\n if (typeof as.registration_endpoint !== \"string\") {\n throw new OAuthFlowError(\n `${as.issuer} has no dynamic client registration. Pass a pre-registered client ID with --client-id.`,\n )\n }\n const body: Record<string, unknown> =\n options.redirectUri !== undefined\n ? {\n client_name: options.clientName ?? \"mext\",\n redirect_uris: [options.redirectUri],\n grant_types: [\"authorization_code\", \"refresh_token\"],\n response_types: [\"code\"],\n token_endpoint_auth_method: \"none\",\n application_type: \"native\",\n }\n : {\n client_name: options.clientName ?? \"mext\",\n grant_types: [DEVICE_CODE_GRANT, \"refresh_token\"],\n response_types: [],\n token_endpoint_auth_method: \"none\",\n application_type: \"native\",\n }\n if (options.scope) body.scope = options.scope\n const res = await doFetch(as.registration_endpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", Accept: \"application/json\" },\n body: JSON.stringify(body),\n })\n const doc = (await res.json().catch(() => undefined)) as Record<string, unknown> | undefined\n if (!res.ok || typeof doc?.client_id !== \"string\") {\n throw new OAuthFlowError(`Client registration failed (HTTP ${res.status})${describeOAuthError(doc)}.`)\n }\n const client: OAuthClient = { client_id: doc.client_id }\n if (typeof doc.client_secret === \"string\") client.client_secret = doc.client_secret\n if (typeof doc.token_endpoint_auth_method === \"string\") client.token_endpoint_auth_method = doc.token_endpoint_auth_method\n return client\n}\n\n/* PKCE */\n\nexport interface Pkce {\n verifier: string\n challenge: string\n}\n\nexport function createPkce(): Pkce {\n const verifier = base64url(randomBytes(32))\n return { verifier, challenge: base64url(createHash(\"sha256\").update(verifier).digest()) }\n}\n\n/* loopback redirect */\n\nexport interface Loopback {\n redirectUri: string\n port: number\n /** 첫 callback 요청의 query. signal abort · 시간 초과 = reject */\n callback: Promise<URLSearchParams>\n close(): Promise<void>\n}\n\nexport const CALLBACK_PATH = \"/callback\"\n\n/** 127.0.0.1 의 임의 포트 (port 지정 가능) 에 callback 수신 서버 */\nexport async function startLoopback(options: { port?: number; signal?: AbortSignal; timeoutMs?: number } = {}): Promise<Loopback> {\n let settle!: { resolve: (q: URLSearchParams) => void; reject: (e: unknown) => void }\n const callback = new Promise<URLSearchParams>((resolve, reject) => (settle = { resolve, reject }))\n callback.catch(() => {})\n let done = false\n const server: Server = createServer((req, res) => {\n const url = new URL(req.url ?? \"/\", \"http://127.0.0.1\")\n if (req.method !== \"GET\" || url.pathname !== CALLBACK_PATH || done) {\n res.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" }).end(\"Not found\\n\")\n return\n }\n done = true\n const ok = url.searchParams.has(\"code\") && !url.searchParams.has(\"error\")\n res\n .writeHead(ok ? 200 : 400, { \"Content-Type\": \"text/html; charset=utf-8\", Connection: \"close\" })\n .end(\n ok\n ? \"<!doctype html><title>mext login</title><p>Login complete. You can close this window.</p>\\n\"\n : \"<!doctype html><title>mext login</title><p>Login failed. Return to the terminal.</p>\\n\",\n )\n settle.resolve(url.searchParams)\n })\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject)\n server.listen(options.port ?? 0, \"127.0.0.1\", () => {\n server.off(\"error\", reject)\n resolve()\n })\n })\n const port = (server.address() as AddressInfo).port\n const timer = setTimeout(\n () => settle.reject(new OAuthFlowError(\"Timed out waiting for the authorization callback.\")),\n options.timeoutMs ?? 300_000,\n )\n const onAbort = () => settle.reject(options.signal?.reason ?? new Error(\"aborted\"))\n if (options.signal?.aborted) onAbort()\n options.signal?.addEventListener(\"abort\", onAbort, { once: true })\n const close = async () => {\n clearTimeout(timer)\n options.signal?.removeEventListener(\"abort\", onAbort)\n server.closeAllConnections()\n await new Promise<void>((resolve) => server.close(() => resolve()))\n }\n return { redirectUri: `http://127.0.0.1:${port}${CALLBACK_PATH}`, port, callback, close }\n}\n\n/* 인가 요청 · 응답 검증 · 토큰 */\n\nexport interface AuthorizationRequest {\n url: string\n state: string\n pkce: Pkce\n}\n\nexport function authorizationRequest(\n as: AuthorizationServerMetadata,\n client: OAuthClient,\n options: { redirectUri: string; resource: string; scope?: string },\n): AuthorizationRequest {\n const pkce = createPkce()\n const state = base64url(randomBytes(16))\n const url = new URL(as.authorization_endpoint)\n url.searchParams.set(\"response_type\", \"code\")\n url.searchParams.set(\"client_id\", client.client_id)\n url.searchParams.set(\"redirect_uri\", options.redirectUri)\n url.searchParams.set(\"code_challenge\", pkce.challenge)\n url.searchParams.set(\"code_challenge_method\", \"S256\")\n url.searchParams.set(\"state\", state)\n url.searchParams.set(\"resource\", options.resource)\n if (options.scope) url.searchParams.set(\"scope\", options.scope)\n return { url: url.href, state, pkce }\n}\n\n/** callback query → code. state · iss (RFC 9207) 검증 후 error 를 본다 (iss 불일치면 error 내용도 쓰지 않음) */\nexport function authorizationCode(\n query: URLSearchParams,\n as: AuthorizationServerMetadata,\n expectedState: string,\n): string {\n const iss = query.get(\"iss\")\n if (iss !== null && iss !== as.issuer) throw new OAuthFlowError(\"Authorization response issuer mismatch.\")\n if (iss === null && as.authorization_response_iss_parameter_supported === true) {\n throw new OAuthFlowError(\"Authorization response is missing iss.\")\n }\n if (query.get(\"state\") !== expectedState) throw new OAuthFlowError(\"Authorization response state mismatch.\")\n const error = query.get(\"error\")\n if (error !== null) {\n const description = query.get(\"error_description\")\n throw new OAuthFlowError(`Authorization failed: ${error}${description ? ` (${description})` : \"\"}.`)\n }\n const code = query.get(\"code\")\n if (code === null || code === \"\") throw new OAuthFlowError(\"Authorization response has no code.\")\n return code\n}\n\ninterface TokenContext {\n issuer: string\n token_endpoint: string\n client: OAuthClient\n resource?: string\n}\n\nexport async function exchangeCode(\n context: TokenContext,\n options: { code: string; redirectUri: string; verifier: string },\n doFetch: Fetch = fetch,\n): Promise<StoredCredentials> {\n return tokenRequest(\n context,\n { grant_type: \"authorization_code\", code: options.code, redirect_uri: options.redirectUri, code_verifier: options.verifier },\n undefined,\n doFetch,\n )\n}\n\n/** refresh_token 갱신. 새 refresh_token 이 없으면 기존 값 유지 */\nexport async function refreshCredentials(credentials: StoredCredentials, doFetch: Fetch = fetch): Promise<StoredCredentials> {\n if (!credentials.refresh_token) throw new OAuthFlowError(\"No refresh token.\")\n if (credentials.issuer === undefined || credentials.token_endpoint === undefined || credentials.client_id === undefined) {\n throw new OAuthFlowError(\"Stored credentials have no OAuth client.\")\n }\n return tokenRequest(\n {\n issuer: credentials.issuer,\n token_endpoint: credentials.token_endpoint,\n client: storedClient(credentials, credentials.client_id),\n ...(credentials.resource !== undefined ? { resource: credentials.resource } : {}),\n },\n { grant_type: \"refresh_token\", refresh_token: credentials.refresh_token },\n credentials,\n doFetch,\n )\n}\n\nfunction storedClient(credentials: StoredCredentials, clientId: string): OAuthClient {\n const client: OAuthClient = { client_id: clientId }\n if (credentials.client_secret !== undefined) client.client_secret = credentials.client_secret\n if (credentials.token_endpoint_auth_method !== undefined) client.token_endpoint_auth_method = credentials.token_endpoint_auth_method\n return client\n}\n\n/** 클라이언트 인증 (token · revocation · device authorization 공통): secret 없음 = client_id 본문, basic · post */\nfunction clientAuth(client: OAuthClient, body: URLSearchParams, headers: Record<string, string>): void {\n const method = client.token_endpoint_auth_method ?? (client.client_secret ? \"client_secret_basic\" : \"none\")\n if (client.client_secret && method === \"client_secret_basic\") {\n const pair = `${encodeURIComponent(client.client_id)}:${encodeURIComponent(client.client_secret)}`\n headers.Authorization = `Basic ${Buffer.from(pair).toString(\"base64\")}`\n } else {\n body.set(\"client_id\", client.client_id)\n if (client.client_secret && method === \"client_secret_post\") body.set(\"client_secret\", client.client_secret)\n }\n}\n\nfunction formHeaders(): Record<string, string> {\n return { \"Content-Type\": \"application/x-www-form-urlencoded\", Accept: \"application/json\" }\n}\n\nasync function tokenRequest(\n context: TokenContext,\n grant: Record<string, string>,\n previous: StoredCredentials | undefined,\n doFetch: Fetch,\n): Promise<StoredCredentials> {\n const res = await postTokenEndpoint(context, grant, doFetch)\n const doc = res.doc\n if (!res.ok || typeof doc?.access_token !== \"string\") {\n throw new OAuthFlowError(`Token request failed (HTTP ${res.status})${describeOAuthError(doc)}.`)\n }\n return credentialsFrom(context, doc as Record<string, unknown> & { access_token: string }, previous)\n}\n\nasync function postTokenEndpoint(\n context: TokenContext,\n grant: Record<string, string>,\n doFetch: Fetch,\n): Promise<{ ok: boolean; status: number; doc: Record<string, unknown> | undefined }> {\n const body = new URLSearchParams(grant)\n if (context.resource !== undefined) body.set(\"resource\", context.resource)\n const headers = formHeaders()\n clientAuth(context.client, body, headers)\n const res = await doFetch(context.token_endpoint, { method: \"POST\", headers, body })\n const doc = (await res.json().catch(() => undefined)) as Record<string, unknown> | undefined\n return { ok: res.ok, status: res.status, doc }\n}\n\nfunction credentialsFrom(\n context: TokenContext,\n doc: Record<string, unknown> & { access_token: string },\n previous: StoredCredentials | undefined,\n): StoredCredentials {\n const { client } = context\n const out: StoredCredentials = {\n access_token: doc.access_token,\n issuer: context.issuer,\n token_endpoint: context.token_endpoint,\n client_id: client.client_id,\n }\n if (context.resource !== undefined) out.resource = context.resource\n if (typeof doc.token_type === \"string\") out.token_type = doc.token_type\n const refresh = typeof doc.refresh_token === \"string\" ? doc.refresh_token : previous?.refresh_token\n if (refresh !== undefined) out.refresh_token = refresh\n if (typeof doc.expires_in === \"number\") out.expires_at = Date.now() + doc.expires_in * 1000\n const scope = typeof doc.scope === \"string\" ? doc.scope : previous?.scope\n if (scope !== undefined) out.scope = scope\n if (client.client_secret !== undefined) out.client_secret = client.client_secret\n if (client.token_endpoint_auth_method !== undefined) out.token_endpoint_auth_method = client.token_endpoint_auth_method\n return out\n}\n\n/** 만료 30초 전부터 만료로 본다 */\nexport function isExpired(credentials: StoredCredentials, now = Date.now()): boolean {\n return credentials.expires_at !== undefined && credentials.expires_at - 30_000 <= now\n}\n\n/* 전체 흐름 */\n\n/** login 대상: 보호 자원 메타데이터 → 인가 서버 메타데이터 · resource · scope */\nexport interface LoginTarget {\n serverUrl: string\n as: AuthorizationServerMetadata\n /** RFC 8707 resource */\n resource: string\n scope?: string\n}\n\nexport interface DiscoverLoginOptions {\n serverUrl: string\n /** 서버 401 의 WWW-Authenticate (없으면 well-known 탐색) */\n challenge?: BearerChallenge\n /** 기본: challenge 의 scope → 보호 자원 메타데이터 scopes_supported → 생략 */\n scope?: string\n fetch?: Fetch\n}\n\nexport async function discoverLoginTarget(options: DiscoverLoginOptions): Promise<LoginTarget> {\n const doFetch = options.fetch ?? fetch\n const prm = await discoverProtectedResource(options.serverUrl, options.challenge, doFetch)\n // 여러 인가 서버 중 첫 번째 (RFC 9728 7.6: 선택은 클라이언트 몫)\n const as = await discoverAuthorizationServer(prm.authorization_servers[0]!, doFetch)\n const resource = typeof prm.resource === \"string\" ? prm.resource : canonicalServerUrl(options.serverUrl)\n const scope =\n options.scope ??\n options.challenge?.scope ??\n (Array.isArray(prm.scopes_supported) && prm.scopes_supported.length > 0 ? prm.scopes_supported.join(\" \") : undefined)\n return { serverUrl: options.serverUrl, as, resource, ...(scope !== undefined ? { scope } : {}) }\n}\n\nexport interface AuthorizationCodeLoginOptions {\n clientId?: string\n /** 동적 등록 client_name. 기본 mext */\n clientName?: string\n /** loopback 포트. 기본 임의 */\n port?: number\n signal?: AbortSignal\n timeoutMs?: number\n fetch?: Fetch\n /** 인가 URL 준비됨 (브라우저 열기 · 안내 출력) */\n onAuthorizationUrl(url: string, loopback: { redirectUri: string; port: number }): void\n /**\n * 붙여넣은 redirect URL 의 query (stdin). loopback callback 과 먼저 온 쪽을 쓰고, 다른 쪽은 signal 로 중단.\n * undefined = 입력 끝 (loopback 만 대기)\n */\n readRedirect?(signal: AbortSignal): Promise<URLSearchParams | undefined>\n}\n\n/** authorization code + PKCE. redirect = loopback callback 또는 붙여넣은 URL. 둘 다 state · iss 검증 */\nexport async function authorizationCodeLogin(\n target: LoginTarget,\n options: AuthorizationCodeLoginOptions,\n): Promise<StoredCredentials> {\n const doFetch = options.fetch ?? fetch\n const { as, resource, scope } = target\n const loopback = await startLoopback({\n ...(options.port !== undefined ? { port: options.port } : {}),\n ...(options.signal ? { signal: options.signal } : {}),\n ...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),\n })\n const pasteAbort = new AbortController()\n try {\n const client = await registerClient(\n as,\n {\n redirectUri: loopback.redirectUri,\n ...(options.clientId !== undefined ? { clientId: options.clientId } : {}),\n ...(options.clientName !== undefined ? { clientName: options.clientName } : {}),\n ...(scope !== undefined ? { scope } : {}),\n },\n doFetch,\n )\n const request = authorizationRequest(as, client, {\n redirectUri: loopback.redirectUri,\n resource,\n ...(scope !== undefined ? { scope } : {}),\n })\n options.onAuthorizationUrl(request.url, { redirectUri: loopback.redirectUri, port: loopback.port })\n const never = new Promise<never>(() => {})\n const pasted = options.readRedirect\n ? options.readRedirect(pasteAbort.signal).then((q) => q ?? never)\n : never\n const query = await Promise.race([loopback.callback, pasted])\n const code = authorizationCode(query, as, request.state)\n return await exchangeCode(\n { issuer: as.issuer, token_endpoint: as.token_endpoint, client, resource },\n { code, redirectUri: loopback.redirectUri, verifier: request.pkce.verifier },\n doFetch,\n )\n } finally {\n pasteAbort.abort()\n await loopback.close()\n }\n}\n\n/** 붙여넣은 redirect URL (또는 query 문자열) → query. code · error 가 없으면 undefined */\nexport function parseRedirectUrl(text: string): URLSearchParams | undefined {\n const trimmed = text.trim()\n if (trimmed === \"\") return undefined\n let query: URLSearchParams\n try {\n query = new URL(trimmed).searchParams\n } catch {\n if (!trimmed.includes(\"=\")) return undefined\n query = new URLSearchParams(trimmed.replace(/^[^?]*\\?/, \"\"))\n }\n return query.has(\"code\") || query.has(\"error\") ? query : undefined\n}\n\n/* device authorization grant (RFC 8628) */\n\nexport interface DeviceAuthorization {\n verification_uri: string\n verification_uri_complete?: string\n user_code: string\n /** 초 */\n expires_in: number\n /** polling 간격 (초). 기본 5 */\n interval: number\n}\n\nexport interface DeviceLoginOptions {\n clientId?: string\n /** 동적 등록 client_name. 기본 mext */\n clientName?: string\n signal?: AbortSignal\n fetch?: Fetch\n /** polling 대기 (테스트 주입). 기본 setTimeout */\n sleep?: (ms: number, signal?: AbortSignal) => Promise<void>\n /** 사용자 코드 준비됨 (안내 출력 · 브라우저 열기) */\n onDeviceCode(device: DeviceAuthorization): void\n}\n\nexport async function deviceLogin(target: LoginTarget, options: DeviceLoginOptions): Promise<StoredCredentials> {\n const doFetch = options.fetch ?? fetch\n const sleep = options.sleep ?? ((ms: number, signal?: AbortSignal) => delay(ms, undefined, signal ? { signal } : {}))\n const { as, resource, scope } = target\n const endpoint = as.device_authorization_endpoint\n if (typeof endpoint !== \"string\") {\n throw new OAuthFlowError(\n `${as.issuer} does not support the device authorization grant (no device_authorization_endpoint in its metadata).`,\n )\n }\n const client = await registerClient(\n as,\n {\n ...(options.clientId !== undefined ? { clientId: options.clientId } : {}),\n ...(options.clientName !== undefined ? { clientName: options.clientName } : {}),\n ...(scope !== undefined ? { scope } : {}),\n },\n doFetch,\n )\n const body = new URLSearchParams({ resource })\n if (scope !== undefined) body.set(\"scope\", scope)\n const headers = formHeaders()\n clientAuth(client, body, headers)\n const res = await doFetch(endpoint, { method: \"POST\", headers, body })\n const doc = (await res.json().catch(() => undefined)) as Record<string, unknown> | undefined\n if (\n !res.ok ||\n typeof doc?.device_code !== \"string\" ||\n typeof doc.user_code !== \"string\" ||\n typeof doc.verification_uri !== \"string\" ||\n typeof doc.expires_in !== \"number\"\n ) {\n throw new OAuthFlowError(`Device authorization request failed (HTTP ${res.status})${describeOAuthError(doc)}.`)\n }\n const device: DeviceAuthorization = {\n verification_uri: doc.verification_uri,\n user_code: doc.user_code,\n expires_in: doc.expires_in,\n interval: typeof doc.interval === \"number\" && doc.interval >= 0 ? doc.interval : 5,\n }\n if (typeof doc.verification_uri_complete === \"string\") device.verification_uri_complete = doc.verification_uri_complete\n const deviceCode = doc.device_code\n options.onDeviceCode(device)\n\n const context: TokenContext = { issuer: as.issuer, token_endpoint: as.token_endpoint, client, resource }\n const deadline = Date.now() + device.expires_in * 1000\n let interval = device.interval * 1000\n const expired = () => new OAuthFlowError(\"The device code expired before authorization. Run login again.\")\n for (;;) {\n if (Date.now() >= deadline) throw expired()\n await sleep(interval, options.signal)\n const token = await postTokenEndpoint(context, { grant_type: DEVICE_CODE_GRANT, device_code: deviceCode }, doFetch)\n if (token.ok && typeof token.doc?.access_token === \"string\") {\n return credentialsFrom(context, token.doc as Record<string, unknown> & { access_token: string }, undefined)\n }\n const error = token.doc?.error\n if (error === \"authorization_pending\") continue\n if (error === \"slow_down\") {\n interval += 5000 // RFC 8628 3.5\n continue\n }\n if (error === \"expired_token\") throw expired()\n if (error === \"access_denied\") throw new OAuthFlowError(\"Authorization was denied.\")\n throw new OAuthFlowError(`Token request failed (HTTP ${token.status})${describeOAuthError(token.doc)}.`)\n }\n}\n\n/* token revocation (RFC 7009) */\n\nexport interface RevokeResult {\n /** 인가 서버에 revocation_endpoint 가 있음 */\n supported: boolean\n /** 폐기 요청이 성공한 토큰 종류 (refresh_token → access_token 순서) */\n revoked: (\"refresh_token\" | \"access_token\")[]\n /** 실패 (메타데이터 조회 · 요청). 실패해도 저장분 삭제는 호출자가 진행 */\n errors: string[]\n}\n\n/** 저장된 OAuth 토큰 폐기. refresh token 먼저 (RFC 7009 2.1: 연결된 access token 도 무효화될 수 있음), 그다음 access token */\nexport async function revokeCredentials(credentials: StoredCredentials, options: { fetch?: Fetch } = {}): Promise<RevokeResult> {\n const doFetch = options.fetch ?? fetch\n const result: RevokeResult = { supported: false, revoked: [], errors: [] }\n if (credentials.issuer === undefined || credentials.client_id === undefined) return result\n let as: AuthorizationServerMetadata\n try {\n as = await discoverAuthorizationServer(credentials.issuer, doFetch)\n } catch (error) {\n result.errors.push(error instanceof Error ? error.message : String(error))\n return result\n }\n const endpoint = as.revocation_endpoint\n if (typeof endpoint !== \"string\") return result\n result.supported = true\n const client = storedClient(credentials, credentials.client_id)\n const tokens: [RevokeResult[\"revoked\"][number], string | undefined][] = [\n [\"refresh_token\", credentials.refresh_token],\n [\"access_token\", credentials.access_token],\n ]\n for (const [hint, token] of tokens) {\n if (token === undefined || token === \"\") continue\n const body = new URLSearchParams({ token, token_type_hint: hint })\n const headers = formHeaders()\n clientAuth(client, body, headers)\n try {\n const res = await doFetch(endpoint, { method: \"POST\", headers, body })\n if (res.ok) {\n await res.body?.cancel().catch(() => {})\n result.revoked.push(hint)\n } else {\n const doc = (await res.json().catch(() => undefined)) as Record<string, unknown> | undefined\n result.errors.push(`${hint} revocation failed (HTTP ${res.status})${describeOAuthError(doc)}`)\n }\n } catch (error) {\n result.errors.push(`${hint} revocation failed: ${error instanceof Error ? error.message : String(error)}`)\n }\n }\n return result\n}\n\n/** 이전 API: 탐색 + authorization code (loopback) */\nexport interface LoginOptions extends DiscoverLoginOptions, Omit<AuthorizationCodeLoginOptions, \"fetch\"> {}\n\nexport async function login(options: LoginOptions): Promise<StoredCredentials> {\n const target = await discoverLoginTarget(options)\n return authorizationCodeLogin(target, options)\n}\n\n/* 공통 */\n\nasync function getJson(url: string, doFetch: Fetch): Promise<Record<string, unknown> | undefined> {\n let res: Response\n try {\n res = await doFetch(url, { headers: { Accept: \"application/json\" } })\n } catch (error) {\n throw new OAuthFlowError(`Cannot reach ${url}: ${error instanceof Error ? error.message : String(error)}`)\n }\n if (!res.ok) {\n await res.body?.cancel().catch(() => {})\n return undefined\n }\n const doc = (await res.json().catch(() => undefined)) as unknown\n return typeof doc === \"object\" && doc !== null && !Array.isArray(doc) ? (doc as Record<string, unknown>) : undefined\n}\n\nfunction describeOAuthError(doc: Record<string, unknown> | undefined): string {\n if (typeof doc?.error !== \"string\") return \"\"\n return `: ${doc.error}${typeof doc.error_description === \"string\" ? ` (${doc.error_description})` : \"\"}`\n}\n\nfunction base64url(buf: Buffer): string {\n return buf.toString(\"base64url\")\n}\n"]}
|
package/dist/start.js
CHANGED
|
@@ -51,7 +51,7 @@ export async function startFromBuild(dir, options = {}) {
|
|
|
51
51
|
registry: build.registry,
|
|
52
52
|
instrumentation: build.instrumentation,
|
|
53
53
|
manifestHash: build.manifest.manifestHash,
|
|
54
|
-
principal: await resolveLocalPrincipal(build.config),
|
|
54
|
+
principal: await resolveLocalPrincipal(build.config, "stdio"),
|
|
55
55
|
...(build.config.app ? { app: build.config.app } : {}),
|
|
56
56
|
...(build.config.tools ? { tools: build.config.tools } : {}),
|
|
57
57
|
...mcpStdioDeclarations(build.config, env),
|
|
@@ -147,7 +147,7 @@ export function readBuildManifest(dir) {
|
|
|
147
147
|
}
|
|
148
148
|
const manifest = JSON.parse(text);
|
|
149
149
|
if (manifest.schemaVersion !== MANIFEST_SCHEMA_VERSION) {
|
|
150
|
-
throw new Error(`${fileURLToPath(base)} was built with manifest schemaVersion ${String(manifest.schemaVersion)} (expected ${MANIFEST_SCHEMA_VERSION}). Run "mext build" again`);
|
|
150
|
+
throw new Error(`${fileURLToPath(base)} was built with manifest schemaVersion ${String(manifest.schemaVersion)} (expected ${String(MANIFEST_SCHEMA_VERSION)}). Run "mext build" again`);
|
|
151
151
|
}
|
|
152
152
|
if (manifest.mextVersion !== mextVersion()) {
|
|
153
153
|
throw new Error(`${fileURLToPath(base)} was built with @obov/mext ${manifest.mextVersion}, but ${mextVersion()} is installed. Run "mext build" again`);
|
|
@@ -256,11 +256,15 @@ function metadataCommand(c) {
|
|
|
256
256
|
readOnly: c.readOnly,
|
|
257
257
|
destructive: c.destructive,
|
|
258
258
|
requiresConfirmation: c.requiresConfirmation,
|
|
259
|
+
// 조건식 = 메타데이터 표시만 (describeCommand 가 "conditional" 로 싣는다). 판정은 로드한 모듈의 함수로
|
|
260
|
+
...(c.needsApproval === "conditional" ? { needsApproval: notLoaded } : {}),
|
|
259
261
|
scopes: Object.freeze([...c.scopes]),
|
|
260
262
|
examples: Object.freeze([...c.examples]),
|
|
261
263
|
positional: Object.freeze([...c.positional]),
|
|
262
264
|
aliases: Object.freeze(c.aliases.map((a) => (a.startsWith(parent) ? a.slice(parent.length) : a))),
|
|
263
265
|
...(c.task !== undefined ? { task: Object.freeze({ ttlMs: c.task.ttlMs }) } : {}),
|
|
266
|
+
// expose 판정 = 모듈 import 전 (목록 · UNKNOWN_COMMAND 는 manifest 만으로)
|
|
267
|
+
...(c.expose !== undefined ? { expose: Object.freeze({ ...c.expose }) } : {}),
|
|
264
268
|
execute: notLoaded,
|
|
265
269
|
});
|
|
266
270
|
}
|
package/dist/start.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.js","sourceRoot":"","sources":["../src/start.ts"],"names":[],"mappings":";;;;;;;;AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACvD,OAAO,EAAE,OAAO,EAAE,SAAS,EAAgB,MAAM,cAAc,CAAA;AAC/D,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,aAAa,EAAE,UAAU,EAAmB,MAAM,aAAa,CAAA;AACtI,OAAO,EAAE,mBAAmB,EAAwB,MAAM,sBAAsB,CAAA;AAChF,OAAO,EAAE,uBAAuB,EAAiD,MAAM,eAAe,CAAA;AACtG,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAC/D,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAA6C,MAAM,eAAe,CAAA;AACpH,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9D,OAAO,EAAE,kBAAkB,EAAiB,MAAM,eAAe,CAAA;AACjE,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAkB,MAAM,aAAa,CAAA;AAC3E,OAAO,EAAE,qBAAqB,EAAE,UAAU,EAAoB,MAAM,eAAe,CAAA;AAEnF,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE1C;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAqC1D,MAAM,KAAK,GAAG,kHAAkH,CAAA;AAEhI,oEAAoE;AACpE,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAiB,EAAE,OAAO,GAAiB,EAAE;IAChF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAA;IAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAA;IACtC,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAA;IAC/C,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,CAAC,KAAK,CAAC,UAAU,IAAI,KAAK,KAAK,IAAI,CAAC,CAAA;QAC1C,OAAO,CAAC,CAAA;IACV,CAAC;IACD,2EAA2E;IAC3E,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;IAC1D,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,EAAE,CAAA;IAC5G,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,CAAA;QAClC,MAAM,OAAO,GAAG,CAAC,KAAY,EAAQ,EAAE,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,QAAQ,KAAK,CAAC,OAAO,IAAI,CAAC,CAAA;QACpF,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,aAAa,CAAC;gBAC3B,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,eAAe,EAAE,KAAK,CAAC,eAAe;gBACtC,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,YAAY;gBACzC,SAAS,EAAE,MAAM,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC;gBACpD,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtD,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5D,GAAG,oBAAoB,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC;gBAC1C,MAAM,EAAE,QAAS,CAAC,IAAI;gBACtB,OAAO;aACR,CAAC,CAAA;YACF,MAAM,OAAO,GAAG,GAAS,EAAE,CAAC,KAAK,MAAM,CAAC,KAAK,EAAE,CAAA;YAC/C,IAAI,MAAM,CAAC,OAAO;gBAAE,OAAO,EAAE,CAAA;YAC7B,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;YACzD,MAAM,MAAM,CAAC,MAAM,CAAA;YACnB,OAAO,CAAC,CAAA;QACV,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,IAAI,YAAY,CAAA;QACxF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,IAAI,YAAY,CAAA;QACzI,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,CAAA;QAC7C,IAAI,aAAa,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;YACnD,MAAM,CAAC,KAAK,CACV,gDAAgD,UAAU,gFAAgF,CAC3I,CAAA;QACH,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAA;QAC5F,MAAM,CAAC,KAAK,CAAC,6CAA6C,MAAM,CAAC,GAAG,aAAa,KAAK,CAAC,QAAQ,CAAC,OAAO,KAAK,CAAC,CAAA;QAC7G,MAAM,IAAI,OAAO,CAAO,CAAC,IAAI,EAAE,EAAE;YAC/B,IAAI,MAAM,CAAC,OAAO;gBAAE,OAAO,IAAI,EAAE,CAAA;YACjC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QAChE,CAAC,CAAC,CAAA;QACF,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;QACpB,OAAO,CAAC,CAAA;IACV,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,sCAAsC;QACtC,QAAQ,EAAE,OAAO,EAAE,CAAA;QACnB,MAAM,CAAC,KAAK,CAAC,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAClF,OAAO,CAAC,CAAA;IACV,CAAC;YAAS,CAAC;QACT,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAiB,EAAE,OAAO,GAAqB,EAAE;IAClF,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;IACxB,MAAM,OAAO,GAAG,CAAC,KAAY,EAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;IAC9E,IAAI,OAA6C,CAAA;IACjD,MAAM,IAAI,GAAG,GAA6B,EAAE,CAC1C,CAAC,OAAO,KAAK,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC;SAClC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,qBAAqB,CAAC,EAAE,GAAG,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC,CAAC;SACtG,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QACxB,OAAO,GAAG,SAAS,CAAA;QACnB,MAAM,KAAK,CAAA;IACb,CAAC,CAAC,CAAC,CAAA;IACP,OAAO;QACL,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI;YAC1B,IAAI,OAAwB,CAAA;YAC5B,IAAI,CAAC;gBACH,OAAO,GAAG,MAAM,IAAI,EAAE,CAAA;YACxB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;gBACtE,OAAO,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAA;gBAC5D,MAAM,IAAI,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,wBAAwB,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,CAAA;gBACpI,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAA;YAC7G,CAAC;YACD,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;YACrC,OAAO,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;QACtE,CAAC;KACF,CAAA;AACH,CAAC;AAED,sEAAsE;AACtE,SAAS,aAAa,CAAC,IAAwB;IAC7C,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,KAAuC,CAAA;QACtD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;YAC5F,MAAM,EAAE,GAAG,MAAM,CAAC,SAAgD,CAAA;YAClE,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAC9C,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,iBAAiB,CAAC,GAAiB;IACjD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;IACxB,IAAI,IAAY,CAAA;IAChB,IAAI,CAAC;QACH,IAAI,GAAG,YAAY,CAAC,IAAI,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAA;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,qBAAqB,aAAa,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAA;IAC7G,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAkB,CAAA;IAClD,IAAI,QAAQ,CAAC,aAAa,KAAK,uBAAuB,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CACb,GAAG,aAAa,CAAC,IAAI,CAAC,0CAA0C,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,cAAc,uBAAuB,2BAA2B,CAC/J,CAAA;IACH,CAAC;IACD,IAAI,QAAQ,CAAC,WAAW,KAAK,WAAW,EAAE,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CACb,GAAG,aAAa,CAAC,IAAI,CAAC,8BAA8B,QAAQ,CAAC,WAAW,SAAS,WAAW,EAAE,uCAAuC,CACtI,CAAA;IACH,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,2FAA2F;AAC3F,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAiB,EAAE,OAAO,GAAqB,EAAE;IAC/E,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;IACxB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAA;IACxC,MAAM,eAAe,GAAG,MAAM,mBAAmB,CAC/C,QAAQ,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC,CAC7F,CAAA;IACD,MAAM,MAAM,GACV,QAAQ,CAAC,MAAM,KAAK,SAAS;QAC3B,CAAC,CAAC,EAAE;QACJ,CAAC,CAAE,CAAC,MAAM,MAAM,kCAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,EAAC,CAA6B,CAAC,OAAO,CAAA;IAC9F,MAAM,QAAQ,GAAG,oBAAoB,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;IAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,kBAAkB,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,CAAA;AAC7G,CAAC;AAED,wGAAwG;AACxG,MAAM,UAAU,kBAAkB,CAAC,QAAuB,EAAE,GAAiB,EAAE,OAAO,GAAqB,EAAE;IAC3G,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;IACxB,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,MAAM,kCAAC,IAAI,EAAC,CAAC,CAAA;IAC7E,OAAO,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACzC,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,YAAY,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAgB;KACpF,CAAC,CAAC,CAAA;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAuB,EAAE,GAAiB,EAAE,OAAO,GAAqB,EAAE;IAC7G,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;IACxB,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,MAAM,kCAAC,IAAI,EAAC,CAAC,CAAA;IAC7E,MAAM,SAAS,GAAG,qBAAqB,CAAC,QAAQ,EAAE,IAAI,EAAE,YAAY,CAAC,CAAA;IACrE,MAAM,OAAO,GAAG,mBAAmB,CAAC,QAAQ,EAAE,IAAI,EAAE,YAAY,CAAC,CAAA;IACjE,MAAM,QAAQ,GAAG,kBAAkB,CAAC;QAClC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtC,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC;YAC3B,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjD,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,GAAG,CAAC,CAAC,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzE,KAAK,CAAC,IAAI;gBACR,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAA;gBACzC,MAAM,GAAG,GAAG,CAAC,MAAM,YAAY,CAAC,IAAI,CAAC,CAAsC,CAAA;gBAC3E,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,2DAA2D,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;gBAC5H,OAAO,GAAG,CAAC,OAAO,CAAA;YACpB,CAAC;SACF,CAAC,CAAC;QACH,UAAU,EAAE;YACV,GAAG,CAAC,QAAQ,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9F,GAAG,QAAQ,CAAC,UAAU;SACvB;KACF,CAAC,CAAA;IACF,OAAO,EAAE,GAAG,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;AAC9F,CAAC;AAED,uEAAuE;AACvE,SAAS,mBAAmB,CAC1B,QAAuB,EACvB,IAAS,EACT,YAAgD;IAEhD,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IACxE,OAAO,mBAAmB,CACxB,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1C,GAAG,CAAC;QACJ,KAAK,CAAC,IAAI;YACR,MAAM,GAAG,GAAG,CAAC,MAAM,YAAY,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAsC,CAAA;YACjG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,yDAAyD,CAAC,CAAC,IAAI,GAAG,CAAC,CAAA;YACzH,OAAO,GAAG,CAAC,OAAO,CAAA;QACpB,CAAC;KACF,CAAC,CAAC,CACJ,CAAA;AACH,CAAC;AAED,yEAAyE;AACzE,SAAS,qBAAqB,CAC5B,QAAuB,EACvB,IAAS,EACT,YAAgD;IAEhD,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IAC5E,OAAO,qBAAqB,CAC1B,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5C,GAAG,CAAC;QACJ,KAAK,CAAC,IAAI;YACR,MAAM,GAAG,GAAG,CAAC,MAAM,YAAY,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAsC,CAAA;YACjG,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC;gBAC3D,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,yDAAyD,CAAC,CAAC,GAAG,EAAE,CAAC,CAAA;YAC5F,CAAC;YACD,OAAO,GAAG,CAAC,OAAO,CAAA;QACpB,CAAC;KACF,CAAC,CAAC,CACJ,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,CAAuB;IAC9C,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACjF,MAAM,SAAS,GAAG,GAAU,EAAE;QAC5B,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,kDAAkD,CAAC,CAAA;IAC5E,CAAC,CAAA;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,CAAC,OAAO,CAAC,EAAE,IAAa;QACxB,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,IAAI,KAAK;YACP,OAAO,SAAS,EAAE,CAAA;QACpB,CAAC;QACD,MAAM,EAAE,SAAS;QACjB,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,oBAAoB,EAAE,CAAC,CAAC,oBAAoB;QAC5C,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;QACpC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAwB;QAC/D,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;QAC5C,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjG,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjF,OAAO,EAAE,SAAS;KACnB,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,WAAW,CAClB,KAAkB,EAClB,OAA+B,EAC/B,GAAG,GAAuC,OAAO,CAAC,GAAG;IAErD,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAA;IACxB,OAAO;QACL,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,YAAY;QACzC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1C,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,GAAG,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC;QAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE;QAC7F,OAAO;KACR,CAAA;AACH,CAAC;AAQD,sBAAsB;AACtB,MAAM,UAAU,cAAc,CAAC,IAAuB;IACpD,MAAM,IAAI,GAAc,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAE,CAAA;QACpB,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;YACjB,SAAQ;QACV,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,wBAAwB,GAAG,GAAG,CAAA;QAChE,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAC3B,MAAM,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;QACrD,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM;YAAE,OAAO,kBAAkB,IAAI,EAAE,CAAA;QACvE,MAAM,KAAK,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;QACpD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;YAAE,OAAO,KAAK,IAAI,mBAAmB,CAAA;QAC5E,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;YAC1B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBAAE,OAAO,+CAA+C,CAAA;YACzE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAClB,CAAC;;YAAM,IAAI,CAAC,IAAI,GAAG,KAAK,CAAA;IAC1B,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC;QAAE,OAAO,2CAA2C,CAAA;IAC1H,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,OAAO,CAAC,KAAyB;IACxC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,SAAS,CAAA;IACzD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IAC1B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,qDAAqD,KAAK,IAAI,CAAC,CAAA;IAClG,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,MAAM,CAAC,CAAS;IACvB,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,CAAA;AACrD,CAAC;AAED,SAAS,MAAM,CAAC,GAAiB;IAC/B,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,CAAA;IAC1F,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;IACxB,OAAO,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC,CAAA;AAChE,CAAC;AAED,SAAS,aAAa;IACpB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IACxC,MAAM,KAAK,GAAG,GAAS,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAA;IAC5C,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;IAC7B,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;IAC9B,OAAO;QACL,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,OAAO;YACL,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;YAC5B,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;QAC/B,CAAC;KACF,CAAA;AACH,CAAC","sourcesContent":["import { readFileSync } from \"node:fs\"\nimport { resolve, sep } from \"node:path\"\nimport { fileURLToPath, pathToFileURL } from \"node:url\"\nimport { COMMAND, isCommand, type Command } from \"./command.ts\"\nimport { mcpDeclarations, mcpStdioDeclarations, resolveLocalPrincipal, resolveSecret, SECRET_ENV, type MextConfig } from \"./config.ts\"\nimport { loadInstrumentation, type Instrumentation } from \"./instrumentation.ts\"\nimport { MANIFEST_SCHEMA_VERSION, type BuildManifest, type BuildManifestCommand } from \"./manifest.ts\"\nimport { DEFAULT_HOST, DEFAULT_PORT } from \"./mcp/constants.ts\"\nimport { createMcpFetchHandler, startMcpHttpServer, type McpFetchHandler, type McpHttpOptions } from \"./mcp/http.ts\"\nimport { redirectStdout, serveMcpStdio } from \"./mcp/stdio.ts\"\nimport { createLazyRegistry, type Registry } from \"./registry.ts\"\nimport { createLazyPromptSet, isPrompt, type PromptSet } from \"./prompt.ts\"\nimport { createLazyResourceSet, isResource, type ResourceSet } from \"./resource.ts\"\nimport type { RouteEntry, RouteModule } from \"./route.ts\"\nimport { mextVersion } from \"./version.ts\"\n\n/**\n * @obov/mext/start: .mext/ (mext build 산출) 실행 런타임. 소스 스캔 · TypeScript 없음.\n * 생성 파일 계약 (mext build 가 쓰는 server.js · handler.js, 바꾸면 기존 빌드가 깨진다):\n * server.js process.exitCode = await startFromBuild(new URL(\".\", import.meta.url), { argv: process.argv.slice(2), env: process.env })\n * handler.js export default createFetchHandler(new URL(\".\", import.meta.url))\n *\n * 로드 순서 = manifest.json (검증) → instrumentation.js (register) → config.js → manifest 기반 lazy Registry.\n * 명령어 모듈은 그 명령어를 실행할 때 import (help · tools/list · UNKNOWN_COMMAND · 권한 거부는 import 없음)\n */\n\nexport { mainLocalBin, runLocalBin } from \"./local-bin.ts\"\nexport type { LocalBinOptions } from \"./local-bin.ts\"\n\nexport interface StartOptions {\n /** server.js · mext start 뒤 인자. --stdio · --port <n> · --host <h> */\n argv?: readonly string[]\n /** PORT · HOST. 기본 process.env */\n env?: Record<string, string | undefined>\n /** abort = 종료. 기본 SIGINT · SIGTERM */\n signal?: AbortSignal\n /** 기본 process.stderr */\n stderr?: { write(chunk: string): unknown }\n}\n\nexport interface FetchHandler {\n /**\n * 거부하지 않는다. 초기화 실패 · 내부 오류 = 500 JSON-RPC 오류.\n * rest 중 waitUntil 함수를 가진 객체 (Cloudflare ctx · Vercel 등) = 응답 후 task 실행 유지. 없으면 tasks 확장 미선언 (§10 · §12.6)\n */\n fetch(request: Request, ...rest: unknown[]): Promise<Response>\n}\n\n/** .mext/ 로드 결과 */\nexport interface LoadedBuild {\n manifest: BuildManifest\n config: MextConfig\n registry: Registry\n instrumentation: Instrumentation\n /** manifest.routes → lazy RouteEntry (모듈은 처음 요청에서 import) */\n routes: RouteEntry[]\n}\n\nexport interface LoadBuildOptions {\n /** 명령어 모듈 import (테스트 계측). 기본 = 동적 import */\n importModule?: (href: string) => Promise<unknown>\n}\n\nconst USAGE = \"Usage: mext start [--stdio] [--port <n>] [--host <h>] (node .mext/server.js, PORT · HOST environment variables)\"\n\n/** .mext/ 실행 (mext start · node .mext/server.js). 반환 = exit code */\nexport async function startFromBuild(dir: string | URL, options: StartOptions = {}): Promise<number> {\n const stderr = options.stderr ?? process.stderr\n const env = options.env ?? process.env\n const args = parseStartArgs(options.argv ?? [])\n if (typeof args === \"string\") {\n stderr.write(`error: ${args}\\n${USAGE}\\n`)\n return 2\n }\n // stdio: 사용자 코드 import 전부터 그 외 stdout 쓰기를 stderr 로 (mext dev --stdio 와 같음)\n const redirect = args.stdio ? redirectStdout() : undefined\n const { signal, dispose } = options.signal ? { signal: options.signal, dispose: () => {} } : processSignal()\n try {\n const build = await loadBuild(dir)\n const onerror = (error: Error): void => void stderr.write(`mcp: ${error.message}\\n`)\n if (args.stdio) {\n const server = serveMcpStdio({\n registry: build.registry,\n instrumentation: build.instrumentation,\n manifestHash: build.manifest.manifestHash,\n principal: await resolveLocalPrincipal(build.config),\n ...(build.config.app ? { app: build.config.app } : {}),\n ...(build.config.tools ? { tools: build.config.tools } : {}),\n ...mcpStdioDeclarations(build.config, env),\n stdout: redirect!.wire,\n onerror,\n })\n const onAbort = (): void => void server.close()\n if (signal.aborted) onAbort()\n signal.addEventListener(\"abort\", onAbort, { once: true })\n await server.closed\n return 0\n }\n const port = args.port ?? envPort(env.PORT) ?? build.config.server?.port ?? DEFAULT_PORT\n const host = args.host ?? (env.HOST === undefined || env.HOST === \"\" ? undefined : env.HOST) ?? build.config.server?.host ?? DEFAULT_HOST\n const http = httpOptions(build, onerror, env)\n if (resolveSecret(build.config, env) === undefined) {\n stderr.write(\n `warning: no secret (mext.config.ts secret or ${SECRET_ENV}). ctx.ask retries after the first answer fail across instances and restarts\\n`,\n )\n }\n const server = await startMcpHttpServer({ ...http, server: { ...http.server, host, port } })\n stderr.write(`MCP server (Streamable HTTP) listening on ${server.url} (buildId ${build.manifest.buildId})\\n`)\n await new Promise<void>((done) => {\n if (signal.aborted) return done()\n signal.addEventListener(\"abort\", () => done(), { once: true })\n })\n await server.close()\n return 0\n } catch (error) {\n // 시작 실패 = stdout 원복 (stdio 서버를 띄우기 전)\n redirect?.restore()\n stderr.write(`error: ${error instanceof Error ? error.message : String(error)}\\n`)\n return 1\n } finally {\n dispose()\n }\n}\n\n/**\n * handler.js 의 Web fetch handler ({ fetch(request) → Response }). 동기 반환.\n * D7: 초기화 (manifest 검증 · instrumentation register · config · Registry) = 첫 요청에서 1회 (memoized promise).\n * 초기화 실패 = 그 요청 500 + JSON-RPC 오류 (data.loadError), 다음 요청에서 재시도.\n * MCP 처리 (Origin · auth · 헤더 검증 · SSE progress · MRTR) = node 서버와 같은 createMcpFetchHandler\n */\nexport function createFetchHandler(dir: string | URL, options: LoadBuildOptions = {}): FetchHandler {\n const base = dirUrl(dir)\n const onerror = (error: Error): void => console.error(`mcp: ${error.message}`)\n let pending: Promise<McpFetchHandler> | undefined\n const init = (): Promise<McpFetchHandler> =>\n (pending ??= loadBuild(base, options)\n .then((build) => createMcpFetchHandler({ ...httpOptions(build, onerror), taskExecution: \"waitUntil\" }))\n .catch((error: unknown) => {\n pending = undefined\n throw error\n }))\n return {\n async fetch(request, ...rest) {\n let handler: McpFetchHandler\n try {\n handler = await init()\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n onerror(error instanceof Error ? error : new Error(message))\n const body = { jsonrpc: \"2.0\", id: null, error: { code: -32_603, message: \"Server failed to start\", data: { loadError: message } } }\n return new Response(JSON.stringify(body), { status: 500, headers: { \"Content-Type\": \"application/json\" } })\n }\n const waitUntil = findWaitUntil(rest)\n return handler.fetch(request, waitUntil ? { waitUntil } : undefined)\n },\n }\n}\n\n/** fetch(request, ...rest) 의 rest 에서 waitUntil 함수를 가진 객체 (this 유지) */\nfunction findWaitUntil(rest: readonly unknown[]): ((promise: Promise<unknown>) => void) | undefined {\n for (const value of rest) {\n const holder = value as { waitUntil?: unknown } | null\n if (typeof holder === \"object\" && holder !== null && typeof holder.waitUntil === \"function\") {\n const fn = holder.waitUntil as (promise: Promise<unknown>) => void\n return (promise) => fn.call(holder, promise)\n }\n }\n return undefined\n}\n\n/** .mext/manifest.json 읽기 + 검증 (없음 · schemaVersion · mextVersion 불일치 = 오류) */\nexport function readBuildManifest(dir: string | URL): BuildManifest {\n const base = dirUrl(dir)\n let text: string\n try {\n text = readFileSync(new URL(\"manifest.json\", base), \"utf8\")\n } catch {\n throw new Error(`no build found in ${fileURLToPath(base)} (manifest.json missing). Run \"mext build\" first`)\n }\n const manifest = JSON.parse(text) as BuildManifest\n if (manifest.schemaVersion !== MANIFEST_SCHEMA_VERSION) {\n throw new Error(\n `${fileURLToPath(base)} was built with manifest schemaVersion ${String(manifest.schemaVersion)} (expected ${MANIFEST_SCHEMA_VERSION}). Run \"mext build\" again`,\n )\n }\n if (manifest.mextVersion !== mextVersion()) {\n throw new Error(\n `${fileURLToPath(base)} was built with @obov/mext ${manifest.mextVersion}, but ${mextVersion()} is installed. Run \"mext build\" again`,\n )\n }\n return manifest\n}\n\n/** manifest 검증 → instrumentation.js (register, 사용자 코드보다 먼저) → config.js → lazy Registry */\nexport async function loadBuild(dir: string | URL, options: LoadBuildOptions = {}): Promise<LoadedBuild> {\n const base = dirUrl(dir)\n const manifest = readBuildManifest(base)\n const instrumentation = await loadInstrumentation(\n manifest.instrumentation === undefined ? undefined : new URL(manifest.instrumentation, base),\n )\n const config =\n manifest.config === undefined\n ? {}\n : ((await import(new URL(manifest.config, base).href)) as { default: MextConfig }).default\n const registry = registryFromManifest(manifest, base, options)\n return { manifest, config, registry, instrumentation, routes: routesFromManifest(manifest, base, options) }\n}\n\n/** manifest.routes → RouteEntry. 405 = manifest 의 methods 만, 모듈 (routes[].module) 은 load() 에서 import */\nexport function routesFromManifest(manifest: BuildManifest, dir: string | URL, options: LoadBuildOptions = {}): RouteEntry[] {\n const base = dirUrl(dir)\n const importModule = options.importModule ?? ((href: string) => import(href))\n return (manifest.routes ?? []).map((r) => ({\n path: r.path,\n file: r.file,\n methods: r.methods,\n load: async () => (await importModule(new URL(r.module, base).href)) as RouteModule,\n }))\n}\n\n/**\n * manifest → lazy Registry. 명령어 모듈 (manifest.commands[].module) · 자원 모듈 (resources[].module) ·\n * 프롬프트 모듈 (prompts[].module) 은 load() 에서 import\n */\nexport function registryFromManifest(manifest: BuildManifest, dir: string | URL, options: LoadBuildOptions = {}): Registry {\n const base = dirUrl(dir)\n const importModule = options.importModule ?? ((href: string) => import(href))\n const resources = resourcesFromManifest(manifest, base, importModule)\n const prompts = promptsFromManifest(manifest, base, importModule)\n const registry = createLazyRegistry({\n commands: manifest.commands.map((c) => ({\n id: c.id,\n command: metadataCommand(c),\n aliases: c.aliases,\n ...(c.file !== undefined ? { file: c.file } : {}),\n inputSchema: c.inputSchema,\n ...(c.outputSchema !== undefined ? { outputSchema: c.outputSchema } : {}),\n async load() {\n const href = new URL(c.module, base).href\n const mod = (await importModule(href)) as { default?: unknown } | undefined\n if (!isCommand(mod?.default)) throw new Error(`${c.module}: default export is not a defineCommand result (command ${c.id})`)\n return mod.default\n },\n })),\n namespaces: [\n ...(manifest.description !== undefined ? [{ id: \"\", description: manifest.description }] : []),\n ...manifest.namespaces,\n ],\n })\n return { ...registry, ...(resources ? { resources } : {}), ...(prompts ? { prompts } : {}) }\n}\n\n/** manifest.prompts → lazy PromptSet. 없거나 비면 undefined (프롬프트 기능 없음) */\nfunction promptsFromManifest(\n manifest: BuildManifest,\n base: URL,\n importModule: (href: string) => Promise<unknown>,\n): PromptSet | undefined {\n if (!manifest.prompts || manifest.prompts.length === 0) return undefined\n return createLazyPromptSet(\n manifest.prompts.map(({ module, ...p }) => ({\n ...p,\n async load() {\n const mod = (await importModule(new URL(module, base).href)) as { default?: unknown } | undefined\n if (!isPrompt(mod?.default)) throw new Error(`${module}: default export is not a definePrompt result (prompt ${p.name})`)\n return mod.default\n },\n })),\n )\n}\n\n/** manifest.resources → lazy ResourceSet. 없거나 비면 undefined (자원 기능 없음) */\nfunction resourcesFromManifest(\n manifest: BuildManifest,\n base: URL,\n importModule: (href: string) => Promise<unknown>,\n): ResourceSet | undefined {\n if (!manifest.resources || manifest.resources.length === 0) return undefined\n return createLazyResourceSet(\n manifest.resources.map(({ module, ...r }) => ({\n ...r,\n async load() {\n const mod = (await importModule(new URL(module, base).href)) as { default?: unknown } | undefined\n if (!isResource(mod?.default) || mod.default.uri !== r.uri) {\n throw new Error(`${module}: default export is not the defineResource result for ${r.uri}`)\n }\n return mod.default\n },\n })),\n )\n}\n\n/**\n * manifest 메타데이터만 있는 Command (RegisteredCommand.command). input · execute 는 모듈 로드 전이라 접근 = 오류\n * (invoke 는 loadCommand 결과를 쓴다)\n */\nfunction metadataCommand(c: BuildManifestCommand): Command {\n const parent = c.id.includes(\".\") ? c.id.slice(0, c.id.lastIndexOf(\".\") + 1) : \"\"\n const notLoaded = (): never => {\n throw new Error(`${c.id}: command module is not loaded (use loadCommand)`)\n }\n return Object.freeze({\n [COMMAND]: true as const,\n description: c.description,\n get input(): never {\n return notLoaded()\n },\n output: undefined,\n readOnly: c.readOnly,\n destructive: c.destructive,\n requiresConfirmation: c.requiresConfirmation,\n scopes: Object.freeze([...c.scopes]),\n examples: Object.freeze([...c.examples]) as Command[\"examples\"],\n positional: Object.freeze([...c.positional]),\n aliases: Object.freeze(c.aliases.map((a) => (a.startsWith(parent) ? a.slice(parent.length) : a))),\n ...(c.task !== undefined ? { task: Object.freeze({ ttlMs: c.task.ttlMs }) } : {}),\n execute: notLoaded,\n })\n}\n\nfunction httpOptions(\n build: LoadedBuild,\n onerror: (error: Error) => void,\n env: Record<string, string | undefined> = process.env,\n): McpHttpOptions {\n const { config } = build\n return {\n registry: build.registry,\n instrumentation: build.instrumentation,\n manifestHash: build.manifest.manifestHash,\n ...(config.app ? { app: config.app } : {}),\n ...(config.auth ? { auth: config.auth } : {}),\n ...(config.tools ? { tools: config.tools } : {}),\n ...(config.oauth ? { oauth: config.oauth } : {}),\n ...(build.routes.length > 0 ? { routes: build.routes } : {}),\n ...mcpDeclarations(config, env),\n server: config.server?.allowedOrigins ? { allowedOrigins: config.server.allowedOrigins } : {},\n onerror,\n }\n}\n\ninterface StartArgs {\n stdio: boolean\n port?: number\n host?: string\n}\n\n/** 반환 문자열 = 사용법 오류 */\nexport function parseStartArgs(argv: readonly string[]): StartArgs | string {\n const args: StartArgs = { stdio: false }\n for (let i = 0; i < argv.length; i++) {\n const tok = argv[i]!\n if (tok === \"--stdio\") {\n args.stdio = true\n continue\n }\n if (!tok.startsWith(\"--\")) return `unexpected argument \"${tok}\"`\n const eq = tok.indexOf(\"=\")\n const name = eq < 0 ? tok.slice(2) : tok.slice(2, eq)\n if (name !== \"port\" && name !== \"host\") return `unknown flag --${name}`\n const value = eq < 0 ? argv[++i] : tok.slice(eq + 1)\n if (value === undefined || value === \"\") return `--${name} requires a value`\n if (name === \"port\") {\n const port = Number(value)\n if (!isPort(port)) return \"--port must be an integer between 0 and 65535\"\n args.port = port\n } else args.host = value\n }\n if (args.stdio && (args.port !== undefined || args.host !== undefined)) return \"--port and --host do not apply to --stdio\"\n return args\n}\n\nfunction envPort(value: string | undefined): number | undefined {\n if (value === undefined || value === \"\") return undefined\n const port = Number(value)\n if (!isPort(port)) throw new Error(`PORT must be an integer between 0 and 65535 (got \"${value}\")`)\n return port\n}\n\nfunction isPort(n: number): boolean {\n return Number.isInteger(n) && n >= 0 && n <= 65_535\n}\n\nfunction dirUrl(dir: string | URL): URL {\n if (typeof dir !== \"string\") return dir.href.endsWith(\"/\") ? dir : new URL(`${dir.href}/`)\n const abs = resolve(dir)\n return pathToFileURL(abs.endsWith(sep) ? abs : `${abs}${sep}`)\n}\n\nfunction processSignal(): { signal: AbortSignal; dispose(): void } {\n const controller = new AbortController()\n const abort = (): void => controller.abort()\n process.once(\"SIGINT\", abort)\n process.once(\"SIGTERM\", abort)\n return {\n signal: controller.signal,\n dispose() {\n process.off(\"SIGINT\", abort)\n process.off(\"SIGTERM\", abort)\n },\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../src/start.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync } from \"node:fs\"\nimport { resolve, sep } from \"node:path\"\nimport { fileURLToPath, pathToFileURL } from \"node:url\"\nimport { COMMAND, isCommand, type Command } from \"./command.ts\"\nimport { mcpDeclarations, mcpStdioDeclarations, resolveLocalPrincipal, resolveSecret, SECRET_ENV, type MextConfig } from \"./config.ts\"\nimport { loadInstrumentation, type Instrumentation } from \"./instrumentation.ts\"\nimport { MANIFEST_SCHEMA_VERSION, type BuildManifest, type BuildManifestCommand } from \"./manifest.ts\"\nimport { DEFAULT_HOST, DEFAULT_PORT } from \"./mcp/constants.ts\"\nimport { createMcpFetchHandler, startMcpHttpServer, type McpFetchHandler, type McpHttpOptions } from \"./mcp/http.ts\"\nimport { redirectStdout, serveMcpStdio } from \"./mcp/stdio.ts\"\nimport { createLazyRegistry, type Registry } from \"./registry.ts\"\nimport { createLazyPromptSet, isPrompt, type PromptSet } from \"./prompt.ts\"\nimport { createLazyResourceSet, isResource, type ResourceSet } from \"./resource.ts\"\nimport type { RouteEntry, RouteModule } from \"./route.ts\"\nimport { mextVersion } from \"./version.ts\"\n\n/**\n * @obov/mext/start: .mext/ (mext build 산출) 실행 런타임. 소스 스캔 · TypeScript 없음.\n * 생성 파일 계약 (mext build 가 쓰는 server.js · handler.js, 바꾸면 기존 빌드가 깨진다):\n * server.js process.exitCode = await startFromBuild(new URL(\".\", import.meta.url), { argv: process.argv.slice(2), env: process.env })\n * handler.js export default createFetchHandler(new URL(\".\", import.meta.url))\n *\n * 로드 순서 = manifest.json (검증) → instrumentation.js (register) → config.js → manifest 기반 lazy Registry.\n * 명령어 모듈은 그 명령어를 실행할 때 import (help · tools/list · UNKNOWN_COMMAND · 권한 거부는 import 없음)\n */\n\nexport { mainLocalBin, runLocalBin } from \"./local-bin.ts\"\nexport type { LocalBinOptions } from \"./local-bin.ts\"\n\nexport interface StartOptions {\n /** server.js · mext start 뒤 인자. --stdio · --port <n> · --host <h> */\n argv?: readonly string[]\n /** PORT · HOST. 기본 process.env */\n env?: Record<string, string | undefined>\n /** abort = 종료. 기본 SIGINT · SIGTERM */\n signal?: AbortSignal\n /** 기본 process.stderr */\n stderr?: { write(chunk: string): unknown }\n}\n\nexport interface FetchHandler {\n /**\n * 거부하지 않는다. 초기화 실패 · 내부 오류 = 500 JSON-RPC 오류.\n * rest 중 waitUntil 함수를 가진 객체 (Cloudflare ctx · Vercel 등) = 응답 후 task 실행 유지. 없으면 tasks 확장 미선언 (§10 · §12.6)\n */\n fetch(request: Request, ...rest: unknown[]): Promise<Response>\n}\n\n/** .mext/ 로드 결과 */\nexport interface LoadedBuild {\n manifest: BuildManifest\n config: MextConfig\n registry: Registry\n instrumentation: Instrumentation\n /** manifest.routes → lazy RouteEntry (모듈은 처음 요청에서 import) */\n routes: RouteEntry[]\n}\n\nexport interface LoadBuildOptions {\n /** 명령어 모듈 import (테스트 계측). 기본 = 동적 import */\n importModule?: (href: string) => Promise<unknown>\n}\n\nconst USAGE = \"Usage: mext start [--stdio] [--port <n>] [--host <h>] (node .mext/server.js, PORT · HOST environment variables)\"\n\n/** .mext/ 실행 (mext start · node .mext/server.js). 반환 = exit code */\nexport async function startFromBuild(dir: string | URL, options: StartOptions = {}): Promise<number> {\n const stderr = options.stderr ?? process.stderr\n const env = options.env ?? process.env\n const args = parseStartArgs(options.argv ?? [])\n if (typeof args === \"string\") {\n stderr.write(`error: ${args}\\n${USAGE}\\n`)\n return 2\n }\n // stdio: 사용자 코드 import 전부터 그 외 stdout 쓰기를 stderr 로 (mext dev --stdio 와 같음)\n const redirect = args.stdio ? redirectStdout() : undefined\n const { signal, dispose } = options.signal ? { signal: options.signal, dispose: () => {} } : processSignal()\n try {\n const build = await loadBuild(dir)\n const onerror = (error: Error): void => void stderr.write(`mcp: ${error.message}\\n`)\n if (args.stdio) {\n const server = serveMcpStdio({\n registry: build.registry,\n instrumentation: build.instrumentation,\n manifestHash: build.manifest.manifestHash,\n principal: await resolveLocalPrincipal(build.config, \"stdio\"),\n ...(build.config.app ? { app: build.config.app } : {}),\n ...(build.config.tools ? { tools: build.config.tools } : {}),\n ...mcpStdioDeclarations(build.config, env),\n stdout: redirect!.wire,\n onerror,\n })\n const onAbort = (): void => void server.close()\n if (signal.aborted) onAbort()\n signal.addEventListener(\"abort\", onAbort, { once: true })\n await server.closed\n return 0\n }\n const port = args.port ?? envPort(env.PORT) ?? build.config.server?.port ?? DEFAULT_PORT\n const host = args.host ?? (env.HOST === undefined || env.HOST === \"\" ? undefined : env.HOST) ?? build.config.server?.host ?? DEFAULT_HOST\n const http = httpOptions(build, onerror, env)\n if (resolveSecret(build.config, env) === undefined) {\n stderr.write(\n `warning: no secret (mext.config.ts secret or ${SECRET_ENV}). ctx.ask retries after the first answer fail across instances and restarts\\n`,\n )\n }\n const server = await startMcpHttpServer({ ...http, server: { ...http.server, host, port } })\n stderr.write(`MCP server (Streamable HTTP) listening on ${server.url} (buildId ${build.manifest.buildId})\\n`)\n await new Promise<void>((done) => {\n if (signal.aborted) return done()\n signal.addEventListener(\"abort\", () => done(), { once: true })\n })\n await server.close()\n return 0\n } catch (error) {\n // 시작 실패 = stdout 원복 (stdio 서버를 띄우기 전)\n redirect?.restore()\n stderr.write(`error: ${error instanceof Error ? error.message : String(error)}\\n`)\n return 1\n } finally {\n dispose()\n }\n}\n\n/**\n * handler.js 의 Web fetch handler ({ fetch(request) → Response }). 동기 반환.\n * D7: 초기화 (manifest 검증 · instrumentation register · config · Registry) = 첫 요청에서 1회 (memoized promise).\n * 초기화 실패 = 그 요청 500 + JSON-RPC 오류 (data.loadError), 다음 요청에서 재시도.\n * MCP 처리 (Origin · auth · 헤더 검증 · SSE progress · MRTR) = node 서버와 같은 createMcpFetchHandler\n */\nexport function createFetchHandler(dir: string | URL, options: LoadBuildOptions = {}): FetchHandler {\n const base = dirUrl(dir)\n const onerror = (error: Error): void => console.error(`mcp: ${error.message}`)\n let pending: Promise<McpFetchHandler> | undefined\n const init = (): Promise<McpFetchHandler> =>\n (pending ??= loadBuild(base, options)\n .then((build) => createMcpFetchHandler({ ...httpOptions(build, onerror), taskExecution: \"waitUntil\" }))\n .catch((error: unknown) => {\n pending = undefined\n throw error\n }))\n return {\n async fetch(request, ...rest) {\n let handler: McpFetchHandler\n try {\n handler = await init()\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n onerror(error instanceof Error ? error : new Error(message))\n const body = { jsonrpc: \"2.0\", id: null, error: { code: -32_603, message: \"Server failed to start\", data: { loadError: message } } }\n return new Response(JSON.stringify(body), { status: 500, headers: { \"Content-Type\": \"application/json\" } })\n }\n const waitUntil = findWaitUntil(rest)\n return handler.fetch(request, waitUntil ? { waitUntil } : undefined)\n },\n }\n}\n\n/** fetch(request, ...rest) 의 rest 에서 waitUntil 함수를 가진 객체 (this 유지) */\nfunction findWaitUntil(rest: readonly unknown[]): ((promise: Promise<unknown>) => void) | undefined {\n for (const value of rest) {\n const holder = value as { waitUntil?: unknown } | null\n if (typeof holder === \"object\" && holder !== null && typeof holder.waitUntil === \"function\") {\n const fn = holder.waitUntil as (promise: Promise<unknown>) => void\n return (promise) => fn.call(holder, promise)\n }\n }\n return undefined\n}\n\n/** .mext/manifest.json 읽기 + 검증 (없음 · schemaVersion · mextVersion 불일치 = 오류) */\nexport function readBuildManifest(dir: string | URL): BuildManifest {\n const base = dirUrl(dir)\n let text: string\n try {\n text = readFileSync(new URL(\"manifest.json\", base), \"utf8\")\n } catch {\n throw new Error(`no build found in ${fileURLToPath(base)} (manifest.json missing). Run \"mext build\" first`)\n }\n const manifest = JSON.parse(text) as BuildManifest\n if (manifest.schemaVersion !== MANIFEST_SCHEMA_VERSION) {\n throw new Error(\n `${fileURLToPath(base)} was built with manifest schemaVersion ${String(manifest.schemaVersion)} (expected ${String(MANIFEST_SCHEMA_VERSION)}). Run \"mext build\" again`,\n )\n }\n if (manifest.mextVersion !== mextVersion()) {\n throw new Error(\n `${fileURLToPath(base)} was built with @obov/mext ${manifest.mextVersion}, but ${mextVersion()} is installed. Run \"mext build\" again`,\n )\n }\n return manifest\n}\n\n/** manifest 검증 → instrumentation.js (register, 사용자 코드보다 먼저) → config.js → lazy Registry */\nexport async function loadBuild(dir: string | URL, options: LoadBuildOptions = {}): Promise<LoadedBuild> {\n const base = dirUrl(dir)\n const manifest = readBuildManifest(base)\n const instrumentation = await loadInstrumentation(\n manifest.instrumentation === undefined ? undefined : new URL(manifest.instrumentation, base),\n )\n const config =\n manifest.config === undefined\n ? {}\n : ((await import(new URL(manifest.config, base).href)) as { default: MextConfig }).default\n const registry = registryFromManifest(manifest, base, options)\n return { manifest, config, registry, instrumentation, routes: routesFromManifest(manifest, base, options) }\n}\n\n/** manifest.routes → RouteEntry. 405 = manifest 의 methods 만, 모듈 (routes[].module) 은 load() 에서 import */\nexport function routesFromManifest(manifest: BuildManifest, dir: string | URL, options: LoadBuildOptions = {}): RouteEntry[] {\n const base = dirUrl(dir)\n const importModule = options.importModule ?? ((href: string) => import(href))\n return (manifest.routes ?? []).map((r) => ({\n path: r.path,\n file: r.file,\n methods: r.methods,\n load: async () => (await importModule(new URL(r.module, base).href)) as RouteModule,\n }))\n}\n\n/**\n * manifest → lazy Registry. 명령어 모듈 (manifest.commands[].module) · 자원 모듈 (resources[].module) ·\n * 프롬프트 모듈 (prompts[].module) 은 load() 에서 import\n */\nexport function registryFromManifest(manifest: BuildManifest, dir: string | URL, options: LoadBuildOptions = {}): Registry {\n const base = dirUrl(dir)\n const importModule = options.importModule ?? ((href: string) => import(href))\n const resources = resourcesFromManifest(manifest, base, importModule)\n const prompts = promptsFromManifest(manifest, base, importModule)\n const registry = createLazyRegistry({\n commands: manifest.commands.map((c) => ({\n id: c.id,\n command: metadataCommand(c),\n aliases: c.aliases,\n ...(c.file !== undefined ? { file: c.file } : {}),\n inputSchema: c.inputSchema,\n ...(c.outputSchema !== undefined ? { outputSchema: c.outputSchema } : {}),\n async load() {\n const href = new URL(c.module, base).href\n const mod = (await importModule(href)) as { default?: unknown } | undefined\n if (!isCommand(mod?.default)) throw new Error(`${c.module}: default export is not a defineCommand result (command ${c.id})`)\n return mod.default\n },\n })),\n namespaces: [\n ...(manifest.description !== undefined ? [{ id: \"\", description: manifest.description }] : []),\n ...manifest.namespaces,\n ],\n })\n return { ...registry, ...(resources ? { resources } : {}), ...(prompts ? { prompts } : {}) }\n}\n\n/** manifest.prompts → lazy PromptSet. 없거나 비면 undefined (프롬프트 기능 없음) */\nfunction promptsFromManifest(\n manifest: BuildManifest,\n base: URL,\n importModule: (href: string) => Promise<unknown>,\n): PromptSet | undefined {\n if (!manifest.prompts || manifest.prompts.length === 0) return undefined\n return createLazyPromptSet(\n manifest.prompts.map(({ module, ...p }) => ({\n ...p,\n async load() {\n const mod = (await importModule(new URL(module, base).href)) as { default?: unknown } | undefined\n if (!isPrompt(mod?.default)) throw new Error(`${module}: default export is not a definePrompt result (prompt ${p.name})`)\n return mod.default\n },\n })),\n )\n}\n\n/** manifest.resources → lazy ResourceSet. 없거나 비면 undefined (자원 기능 없음) */\nfunction resourcesFromManifest(\n manifest: BuildManifest,\n base: URL,\n importModule: (href: string) => Promise<unknown>,\n): ResourceSet | undefined {\n if (!manifest.resources || manifest.resources.length === 0) return undefined\n return createLazyResourceSet(\n manifest.resources.map(({ module, ...r }) => ({\n ...r,\n async load() {\n const mod = (await importModule(new URL(module, base).href)) as { default?: unknown } | undefined\n if (!isResource(mod?.default) || mod.default.uri !== r.uri) {\n throw new Error(`${module}: default export is not the defineResource result for ${r.uri}`)\n }\n return mod.default\n },\n })),\n )\n}\n\n/**\n * manifest 메타데이터만 있는 Command (RegisteredCommand.command). input · execute 는 모듈 로드 전이라 접근 = 오류\n * (invoke 는 loadCommand 결과를 쓴다)\n */\nfunction metadataCommand(c: BuildManifestCommand): Command {\n const parent = c.id.includes(\".\") ? c.id.slice(0, c.id.lastIndexOf(\".\") + 1) : \"\"\n const notLoaded = (): never => {\n throw new Error(`${c.id}: command module is not loaded (use loadCommand)`)\n }\n return Object.freeze({\n [COMMAND]: true as const,\n description: c.description,\n get input(): never {\n return notLoaded()\n },\n output: undefined,\n readOnly: c.readOnly,\n destructive: c.destructive,\n requiresConfirmation: c.requiresConfirmation,\n // 조건식 = 메타데이터 표시만 (describeCommand 가 \"conditional\" 로 싣는다). 판정은 로드한 모듈의 함수로\n ...(c.needsApproval === \"conditional\" ? { needsApproval: notLoaded } : {}),\n scopes: Object.freeze([...c.scopes]),\n examples: Object.freeze([...c.examples]) as Command[\"examples\"],\n positional: Object.freeze([...c.positional]),\n aliases: Object.freeze(c.aliases.map((a) => (a.startsWith(parent) ? a.slice(parent.length) : a))),\n ...(c.task !== undefined ? { task: Object.freeze({ ttlMs: c.task.ttlMs }) } : {}),\n // expose 판정 = 모듈 import 전 (목록 · UNKNOWN_COMMAND 는 manifest 만으로)\n ...(c.expose !== undefined ? { expose: Object.freeze({ ...c.expose }) } : {}),\n execute: notLoaded,\n })\n}\n\nfunction httpOptions(\n build: LoadedBuild,\n onerror: (error: Error) => void,\n env: Record<string, string | undefined> = process.env,\n): McpHttpOptions {\n const { config } = build\n return {\n registry: build.registry,\n instrumentation: build.instrumentation,\n manifestHash: build.manifest.manifestHash,\n ...(config.app ? { app: config.app } : {}),\n ...(config.auth ? { auth: config.auth } : {}),\n ...(config.tools ? { tools: config.tools } : {}),\n ...(config.oauth ? { oauth: config.oauth } : {}),\n ...(build.routes.length > 0 ? { routes: build.routes } : {}),\n ...mcpDeclarations(config, env),\n server: config.server?.allowedOrigins ? { allowedOrigins: config.server.allowedOrigins } : {},\n onerror,\n }\n}\n\ninterface StartArgs {\n stdio: boolean\n port?: number\n host?: string\n}\n\n/** 반환 문자열 = 사용법 오류 */\nexport function parseStartArgs(argv: readonly string[]): StartArgs | string {\n const args: StartArgs = { stdio: false }\n for (let i = 0; i < argv.length; i++) {\n const tok = argv[i]!\n if (tok === \"--stdio\") {\n args.stdio = true\n continue\n }\n if (!tok.startsWith(\"--\")) return `unexpected argument \"${tok}\"`\n const eq = tok.indexOf(\"=\")\n const name = eq < 0 ? tok.slice(2) : tok.slice(2, eq)\n if (name !== \"port\" && name !== \"host\") return `unknown flag --${name}`\n const value = eq < 0 ? argv[++i] : tok.slice(eq + 1)\n if (value === undefined || value === \"\") return `--${name} requires a value`\n if (name === \"port\") {\n const port = Number(value)\n if (!isPort(port)) return \"--port must be an integer between 0 and 65535\"\n args.port = port\n } else args.host = value\n }\n if (args.stdio && (args.port !== undefined || args.host !== undefined)) return \"--port and --host do not apply to --stdio\"\n return args\n}\n\nfunction envPort(value: string | undefined): number | undefined {\n if (value === undefined || value === \"\") return undefined\n const port = Number(value)\n if (!isPort(port)) throw new Error(`PORT must be an integer between 0 and 65535 (got \"${value}\")`)\n return port\n}\n\nfunction isPort(n: number): boolean {\n return Number.isInteger(n) && n >= 0 && n <= 65_535\n}\n\nfunction dirUrl(dir: string | URL): URL {\n if (typeof dir !== \"string\") return dir.href.endsWith(\"/\") ? dir : new URL(`${dir.href}/`)\n const abs = resolve(dir)\n return pathToFileURL(abs.endsWith(sep) ? abs : `${abs}${sep}`)\n}\n\nfunction processSignal(): { signal: AbortSignal; dispose(): void } {\n const controller = new AbortController()\n const abort = (): void => controller.abort()\n process.once(\"SIGINT\", abort)\n process.once(\"SIGTERM\", abort)\n return {\n signal: controller.signal,\n dispose() {\n process.off(\"SIGINT\", abort)\n process.off(\"SIGTERM\", abort)\n },\n }\n}\n"]}
|
package/dist/suggest.js
CHANGED
|
@@ -3,7 +3,7 @@ export function editDistance(a, b) {
|
|
|
3
3
|
const rows = a.length + 1;
|
|
4
4
|
const cols = b.length + 1;
|
|
5
5
|
const d = Array.from({ length: rows }, (_, i) => {
|
|
6
|
-
const row =
|
|
6
|
+
const row = Array.from({ length: cols }, () => 0);
|
|
7
7
|
row[0] = i;
|
|
8
8
|
return row;
|
|
9
9
|
});
|
package/dist/suggest.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"suggest.js","sourceRoot":"","sources":["../src/suggest.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,MAAM,UAAU,YAAY,CAAC,CAAS,EAAE,CAAS;IAC/C,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAA;IACzB,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAA;IACzB,MAAM,CAAC,GAAe,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC1D,MAAM,GAAG,GAAG,
|
|
1
|
+
{"version":3,"file":"suggest.js","sourceRoot":"","sources":["../src/suggest.ts"],"names":[],"mappings":"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","sourcesContent":["/** 최적 문자열 정렬 (제한된 Damerau-Levenshtein) 거리 */\nexport function editDistance(a: string, b: string): number {\n const rows = a.length + 1\n const cols = b.length + 1\n const d: number[][] = Array.from({ length: rows }, (_, i) => {\n const row = Array.from({ length: cols }, () => 0)\n row[0] = i\n return row\n })\n for (let j = 0; j < cols; j++) d[0]![j] = j\n for (let i = 1; i < rows; i++) {\n for (let j = 1; j < cols; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1\n let v = Math.min(d[i - 1]![j]! + 1, d[i]![j - 1]! + 1, d[i - 1]![j - 1]! + cost)\n if (i > 1 && j > 1 && a[i - 1] === b[j - 2] && a[i - 2] === b[j - 1]) v = Math.min(v, d[i - 2]![j - 2]! + 1)\n d[i]![j] = v\n }\n }\n return d[a.length]![b.length]!\n}\n\n/**\n * 후보 중 query 와 가까운 것 (가까운 순 · 같은 거리는 이름 순).\n * 후보는 [비교할 이름, 돌려줄 값]. 같은 값은 한 번만.\n */\nexport function closest(query: string, candidates: Iterable<readonly [string, string]>, limit = 3): string[] {\n const q = query.toLowerCase()\n const threshold = Math.max(2, Math.floor(q.length / 3))\n const best = new Map<string, number>()\n for (const [name, value] of candidates) {\n const n = name.toLowerCase()\n const distance = editDistance(q, n)\n if (distance > threshold) continue\n const prev = best.get(value)\n if (prev === undefined || distance < prev) best.set(value, distance)\n }\n return [...best]\n .sort((x, y) => x[1] - y[1] || (x[0] < y[0] ? -1 : x[0] > y[0] ? 1 : 0))\n .slice(0, limit)\n .map(([value]) => value)\n}\n"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 명령어 타입 생성 (specs/client.md §4). 생성 파일 = 명령어 ID → 명령어 모듈 타입 참조 표:
|
|
3
|
+
* "users.get": CommandTypes<typeof import(<명령어 파일 상대 경로>).default>
|
|
4
|
+
* 입력 · 출력 타입은 TypeScript 가 명령어 정의에서 계산한다 (타입을 코드로 다시 쓰지 않는다).
|
|
5
|
+
* 명령어 모듈을 import 하지 않는다 (파일 트리만: walkCommands). 재생성이 필요한 때 = 파일 추가 · 삭제 · 이름 변경
|
|
6
|
+
*/
|
|
7
|
+
/** 기본 생성 파일 (도입 프로젝트 루트 기준) */
|
|
8
|
+
export declare const TYPES_FILE = "mext.gen.ts";
|
|
9
|
+
/**
|
|
10
|
+
* 생성 파일 절대 경로: override (--out) > config.types (true = 기본 파일, 문자열 = 경로) > fallback.
|
|
11
|
+
* 셋 다 없으면 undefined (mext dev · mext build 는 만들지 않는다)
|
|
12
|
+
*/
|
|
13
|
+
export declare function resolveTypesPath(cwd: string, types: boolean | string | undefined, override?: string, fallback?: string): string | undefined;
|
|
14
|
+
/** 생성 파일 내용. commandsDir · out = 절대 경로. 정식 ID 만 (별칭 제외), ID 순 */
|
|
15
|
+
export declare function renderTypes(commandsDir: string, out: string): string;
|
|
16
|
+
export interface WriteTypesResult {
|
|
17
|
+
/** 생성 파일 절대 경로 */
|
|
18
|
+
path: string;
|
|
19
|
+
/** 파일 내용이 달랐다 (check = 쓰지 않았다) */
|
|
20
|
+
changed: boolean;
|
|
21
|
+
/** 명령어 수 */
|
|
22
|
+
commands: number;
|
|
23
|
+
}
|
|
24
|
+
/** 생성 파일 쓰기. 내용이 같으면 쓰지 않는다 (mtime 유지). check = 비교만 */
|
|
25
|
+
export declare function writeTypes(commandsDir: string, out: string, options?: {
|
|
26
|
+
check?: boolean;
|
|
27
|
+
}): WriteTypesResult;
|
package/dist/typegen.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { dirname, isAbsolute, relative, resolve, sep } from "node:path";
|
|
3
|
+
import { walkCommands } from "./scan.js";
|
|
4
|
+
/**
|
|
5
|
+
* 명령어 타입 생성 (specs/client.md §4). 생성 파일 = 명령어 ID → 명령어 모듈 타입 참조 표:
|
|
6
|
+
* "users.get": CommandTypes<typeof import(<명령어 파일 상대 경로>).default>
|
|
7
|
+
* 입력 · 출력 타입은 TypeScript 가 명령어 정의에서 계산한다 (타입을 코드로 다시 쓰지 않는다).
|
|
8
|
+
* 명령어 모듈을 import 하지 않는다 (파일 트리만: walkCommands). 재생성이 필요한 때 = 파일 추가 · 삭제 · 이름 변경
|
|
9
|
+
*/
|
|
10
|
+
/** 기본 생성 파일 (도입 프로젝트 루트 기준) */
|
|
11
|
+
export const TYPES_FILE = "mext.gen.ts";
|
|
12
|
+
/**
|
|
13
|
+
* 생성 파일 절대 경로: override (--out) > config.types (true = 기본 파일, 문자열 = 경로) > fallback.
|
|
14
|
+
* 셋 다 없으면 undefined (mext dev · mext build 는 만들지 않는다)
|
|
15
|
+
*/
|
|
16
|
+
export function resolveTypesPath(cwd, types, override, fallback) {
|
|
17
|
+
const path = override ?? (types === true ? TYPES_FILE : typeof types === "string" ? types : fallback);
|
|
18
|
+
return path === undefined ? undefined : resolve(cwd, path);
|
|
19
|
+
}
|
|
20
|
+
/** 생성 파일 내용. commandsDir · out = 절대 경로. 정식 ID 만 (별칭 제외), ID 순 */
|
|
21
|
+
export function renderTypes(commandsDir, out) {
|
|
22
|
+
const { files } = walkCommands(commandsDir);
|
|
23
|
+
const from = dirname(out);
|
|
24
|
+
const rows = [...files]
|
|
25
|
+
.sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0))
|
|
26
|
+
.map((f) => ` ${JSON.stringify(f.id)}: CommandTypes<typeof import(${JSON.stringify(specifier(from, resolve(commandsDir, f.file)))}).default>`);
|
|
27
|
+
return [
|
|
28
|
+
"// Generated by mext (mext types · mext dev · mext build). Do not edit.",
|
|
29
|
+
'// Command ID → input · output types for createClient<Commands>() from "@obov/mext/client".',
|
|
30
|
+
"// Regenerate after adding, removing or renaming a command file. Types follow the command definitions without regenerating.",
|
|
31
|
+
'import type { CommandTypes } from "@obov/mext/client"',
|
|
32
|
+
"",
|
|
33
|
+
rows.length === 0 ? "export interface Commands {}" : `export interface Commands {\n${rows.join("\n")}\n}`,
|
|
34
|
+
"",
|
|
35
|
+
].join("\n");
|
|
36
|
+
}
|
|
37
|
+
/** 생성 파일 쓰기. 내용이 같으면 쓰지 않는다 (mtime 유지). check = 비교만 */
|
|
38
|
+
export function writeTypes(commandsDir, out, options = {}) {
|
|
39
|
+
const content = renderTypes(commandsDir, out);
|
|
40
|
+
const commands = (content.match(/^ {2}"/gm) ?? []).length;
|
|
41
|
+
let current;
|
|
42
|
+
try {
|
|
43
|
+
current = readFileSync(out, "utf8");
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
current = undefined;
|
|
47
|
+
}
|
|
48
|
+
if (current === content)
|
|
49
|
+
return { path: out, changed: false, commands };
|
|
50
|
+
if (options.check !== true) {
|
|
51
|
+
mkdirSync(dirname(out), { recursive: true });
|
|
52
|
+
writeFileSync(out, content);
|
|
53
|
+
}
|
|
54
|
+
return { path: out, changed: true, commands };
|
|
55
|
+
}
|
|
56
|
+
/** 생성 파일 폴더 → 명령어 파일의 상대 import 경로 (posix, ./ · ../ 로 시작, .ts 확장자 유지) */
|
|
57
|
+
function specifier(from, file) {
|
|
58
|
+
const rel = relative(from, file);
|
|
59
|
+
const posix = (isAbsolute(rel) ? file : rel).split(sep).join("/");
|
|
60
|
+
return posix.startsWith(".") || posix.startsWith("/") ? posix : `./${posix}`;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=typegen.js.map
|