ainecto 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/README.md +26 -70
- package/dist/bin/ainecto.js +72 -300
- package/dist/bin/ainecto.js.map +1 -1
- package/dist/bin/mcp.js +10 -45
- package/dist/bin/mcp.js.map +1 -1
- package/package.json +2 -4
package/dist/bin/ainecto.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/auth/tokenStore.ts","../../src/core/harness/role.ts","../../src/core/auth/oauth.ts","../../src/core/config/endpoints.ts","../../src/core/auth/clientRegistration.ts","../../src/core/input/payloadSource.ts","../../src/core/version.ts","../../src/core/mcp/rpcClient.ts","../../src/core/output/render.ts","../../src/core/catalog/generated.prod.ts","../../src/core/catalog/generated.dev.ts","../../src/core/catalog/generator.ts","../../src/core/catalog/index.ts","../../src/core/mcp/stdioBridge.ts","../../src/adapters/mcp/connector.ts","../../src/core/catalog/enrichments.ts","../../src/core/output/table.ts","../../src/adapters/cli/errors.ts","../../src/adapters/cli/flagParser.ts","../../src/adapters/cli/destructiveConfirmation.ts","../../src/adapters/cli/bespokeCommands.ts","../../src/adapters/cli/generatedCommandRouter.ts","../../src/core/upload/attachmentUpload.ts","../../src/adapters/cli/attachmentsUploadCommand.ts","../../src/adapters/cli/initCommand.ts","../../src/core/harness/agentTargets.ts","../../src/core/harness/harnessDoc.ts","../../src/core/harness/initRecord.ts","../../src/core/harness/initPlan.ts","../../src/core/harness/repositoryRole.ts","../../src/core/harness/legacyLayout.ts","../../src/core/harness/documentFetch.ts","../../src/adapters/cli/prompter.ts","../../src/adapters/cli/ainectoCli.ts","../../src/bin/ainecto.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { mkdir, readFile, rename, rm, stat, writeFile, chmod } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { ROLE_SCOPE_PREFIX } from \"../harness/role\";\n\nexport interface StoredTokenSet {\n endpoint: string;\n accessToken: string;\n refreshToken?: string;\n tokenType?: string;\n expiresAt?: number;\n scope?: string;\n clientId?: string;\n clientSecret?: string;\n authorizationServer?: string;\n updatedAt: string;\n}\n\n/**\n * 토큰 저장소 — ★서버(endpoint)마다 «한 칸»이다(설계 0.4.2 §2-4).\n *\n * <p>역할은 더는 토큰 칸이 정하지 않는다. 역할은 저장소(init 이 쓴 --role)에서 와서 요청 헤더로 실린다.\n * 0.4.1 이하가 쓴 역할별 칸은 읽지도 지우지도 않는다(사용자 결정 «마이그레이션은 고려하지 마»).\n */\nexport interface TokenStore {\n load(endpoint: string): Promise<StoredTokenSet | undefined>;\n save(endpoint: string, token: StoredTokenSet): Promise<void>;\n delete(endpoint: string): Promise<void>;\n}\n\ntype TokenFile = Record<string, StoredTokenSet>;\n\nexport class FileTokenStore implements TokenStore {\n readonly filePath: string;\n\n constructor(rootDir = join(homedir(), \".ainecto\")) {\n this.filePath = join(rootDir, \"tokens.json\");\n }\n\n async load(endpoint: string): Promise<StoredTokenSet | undefined> {\n const file = await this.readFile();\n return file[tokenKey(endpoint)];\n }\n\n async save(endpoint: string, token: StoredTokenSet): Promise<void> {\n assertNoRoleScope(token);\n const file = await this.readFile();\n file[tokenKey(endpoint)] = { ...token, endpoint, updatedAt: new Date().toISOString() };\n await this.writeFile(file);\n }\n\n async delete(endpoint: string): Promise<void> {\n const file = await this.readFile();\n delete file[tokenKey(endpoint)];\n await this.writeFile(file);\n }\n\n private async readFile(): Promise<TokenFile> {\n try {\n await this.hardenExistingPermissions();\n const raw = await readFile(this.filePath, \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(\"Token file must contain an object.\");\n }\n return parsed as TokenFile;\n } catch (error) {\n if (isNodeError(error, \"ENOENT\")) {\n return {};\n }\n throw error;\n }\n }\n\n private async writeFile(file: TokenFile): Promise<void> {\n await mkdir(dirname(this.filePath), { recursive: true, mode: 0o700 });\n await chmod(dirname(this.filePath), 0o700);\n const tmpPath = `${this.filePath}.${process.pid}.${Date.now()}.tmp`;\n await writeFile(tmpPath, `${JSON.stringify(file, null, 2)}\\n`, { mode: 0o600 });\n await chmod(tmpPath, 0o600);\n await rename(tmpPath, this.filePath);\n await chmod(this.filePath, 0o600);\n }\n\n private async hardenExistingPermissions(): Promise<void> {\n const dirPath = dirname(this.filePath);\n await chmodIfPermissive(dirPath, 0o700);\n await chmodIfPermissive(this.filePath, 0o600);\n }\n}\n\n/** 서버 하나의 칸. 0.4.1 이하의 «역할 없는» 칸과 같은 키다 — 그때 역할 없이 로그인해 둔 사람은 그대로 쓴다. */\nexport function tokenKey(endpoint: string): string {\n return createHash(\"sha256\").update(endpoint).digest(\"hex\");\n}\n\n/**\n * ★역할 scope 가 든 토큰은 이 칸에 두지 않는다(설계 0.4.2 §2-4, 리뷰 P0-1).\n *\n * <p>토큰에 역할이 박혀 있으면 서버는 헤더보다 토큰을 믿는다. 그런 토큰이 이 한 칸에 들어가면 «모든»\n * 저장소에서 그 역할이 헤더를 이겨 역할이 뒤바뀐다. 지금은 그런 토큰을 받을 경로가 없지만(로그인에 역할을\n * 싣지 않는다), 저장 경계에서 막아 두면 새 경로가 생겨도 조용히 새지 않는다.\n */\nexport function assertNoRoleScope(token: Pick<StoredTokenSet, \"scope\">): void {\n if (token.scope?.split(/\\s+/).some((scope) => scope.startsWith(ROLE_SCOPE_PREFIX))) {\n throw new Error(\n \"Refusing to store a role-scoped access token: sign-in is one per machine and the role comes \"\n + \"from the repository. Run `ainecto auth login` again.\",\n );\n }\n}\n\nexport async function tokenStorePermissions(path: string): Promise<{ mode: number } | undefined> {\n try {\n const result = await stat(path);\n return { mode: result.mode & 0o777 };\n } catch (error) {\n if (isNodeError(error, \"ENOENT\")) {\n return undefined;\n }\n throw error;\n }\n}\n\nexport async function tokenStoreDirectoryPermissions(path: string): Promise<{ mode: number } | undefined> {\n return tokenStorePermissions(dirname(path));\n}\n\nexport async function removeTokenStoreForTests(path: string): Promise<void> {\n await rm(dirname(path), { recursive: true, force: true });\n}\n\nfunction isNodeError(error: unknown, code: string): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error && error.code === code;\n}\n\nasync function chmodIfPermissive(path: string, mode: number): Promise<void> {\n try {\n const result = await stat(path);\n if ((result.mode & 0o077) !== 0) {\n await chmod(path, mode);\n }\n } catch (error) {\n if (isNodeError(error, \"ENOENT\")) {\n return;\n }\n throw error;\n }\n}\n","/**\n * 세션 역할 — AiNecto Harness 의 「하나의 세션은 하나의 역할만 가진다」를 클라이언트 쪽에서\n * 실어 나르는 부분.\n *\n * ★0.4.2: 역할의 «저장 위치»는 하나다 — init 이 저장소에 쓴 {@code .mcp.json}·{@code .cursor/mcp.json}\n * 의 {@code ainecto} 항목(0.4.x 가 쓴 {@code ai-erd} 항목도)의 {@code --role}(판정은 {@code repositoryRole.ts} 한 곳). 로그인은 서버마다\n * 한 번이고 토큰은 역할을 싣지 않는다. 역할은 요청마다 {@link ROLE_HEADER} 로 실리고, 서버는 그 헤더로\n * 도구 목록·거절·인자 판정을 전부 적용한다. 역할은 작업 가드레일이지 보안 경계가 아니다(2026-09-29\n * 사용자 결정 Q1) — 같은 토큰으로 헤더를 빼면 제한이 없다.\n *\n * - 브리지({@code ainecto mcp}): ① {@code --role} 인자(init 이 MCP 설정에 쓴다) ② {@code AINECTO_ROLE}\n * (옛 이름 {@code AI_ERD_ROLE} 도 읽는다)\n * (Codex 처럼 설정이 전역뿐인 에이전트). 세션 시작 때 정해지고 세션 동안 바뀌지 않는다.\n * - 셸 명령({@code ainecto tools call …} 등): 저장소 역할. ①② 를 주면 저장소 역할과 같아야 한다(다르면 거절).\n * - 저장소 밖: 역할 없음 = 제한 없음.\n *\n * ★에이전트가 «사용자의 답으로» 다음 세션의 역할을 적용하는 것은 허용한다(Q2): 고르는 것은 사람,\n * 적용({@code ainecto init --role <role>})은 에이전트. 떠 있는 세션의 역할은 바뀌지 않는다.\n *\n * ⛔«도구로 역할을 선언»하는 길은 택하지 않았다. 에이전트가 «세션 도중에» 스스로 바꿀 수 있으면\n * 제약이 아니다 — 막히는 순간 「역할을 바꿔서 하겠습니다」가 가장 자연스러운 다음 수가 된다.\n *\n * ⚠강제하는 쪽은 서버다. 이 파일은 역할을 «전달»만 한다.\n */\n\nexport const HARNESS_ROLES = [\"design\", \"development\", \"test\", \"validation\"] as const;\n\nexport type HarnessRole = (typeof HARNESS_ROLES)[number];\n\n/**\n * 역할을 싣던 OAuth scope 접두사(0.4.1 이하). 서버의 McpSessionRole.ROLE_SCOPE_PREFIX 와 같다.\n *\n * <p>0.4.2 부터 로그인은 이 scope 를 요구하지 않는다. 남은 쓰임은 하나 — 역할 없는 토큰 칸에\n * 이 scope 가 든 토큰을 «저장하지 않는» 가드({@code tokenStore.assertNoRoleScope}).\n */\n// ⛔이름을 바꾸지 않는다(2026-10-11 사용자 결정) — 서버·발급된 토큰과 맞물린 값이고 사람에게 안 보인다.\nexport const ROLE_SCOPE_PREFIX = \"ai-erd:role:\";\n\n/**\n * 서버가 읽는 헤더 이름. 서버의 McpSessionRoleResolver.ROLE_HEADER 와 같아야 한다.\n * ⛔이름을 바꾸지 않는다(2026-10-11 사용자 결정) — 사람에게 안 보이고, 옛 CLI 도 계속 이 헤더를 보낸다.\n */\nexport const ROLE_HEADER = \"X-AI-ERD-Role\";\n\n/** 설정이 전역뿐인 에이전트(Codex 등)를 위한 환경변수. */\nexport const ROLE_ENV_VAR = \"AINECTO_ROLE\";\n\n/**\n * 0.4.x 의 이름. ★계속 읽는다 — Codex 셸 프로필 등 사용자 기계에 이미 박혀 있다.\n * 둘 다 있으면 {@link ROLE_ENV_VAR} 가 이긴다(새 이름을 적은 쪽이 나중의 뜻이다). 그 값이 저장소 역할과\n * 어긋나면 셸 명령은 기존 «역할 충돌» 규칙대로 거절한다(ainectoCli.commandRole).\n */\nexport const LEGACY_ROLE_ENV_VAR = \"AI_ERD_ROLE\";\n\nexport interface RoleResolutionInput {\n role?: string;\n envVars?: NodeJS.ProcessEnv;\n}\n\nexport interface ResolvedRole {\n role?: HarnessRole;\n source: \"flag\" | \"env\" | \"none\";\n /** {@code source===\"env\"} 일 때 값을 읽은 환경변수 이름 — 거절 문장이 사용자가 실제로 둔 이름을 말하게. */\n envVar?: string;\n}\n\nexport function resolveRole(input: RoleResolutionInput = {}): ResolvedRole {\n if (input.role !== undefined) {\n return { role: assertRole(input.role), source: \"flag\" };\n }\n const envVars = input.envVars ?? process.env;\n for (const envVar of [ROLE_ENV_VAR, LEGACY_ROLE_ENV_VAR]) {\n const fromEnv = envVars[envVar];\n if (fromEnv && fromEnv.trim()) {\n return { role: assertRole(fromEnv), source: \"env\", envVar };\n }\n }\n return { source: \"none\" };\n}\n\n/**\n * ⚠여기서는 «틀리면 멈춘다». 서버는 모르는 값을 FULL 로 받아 넘기지만, 그건 남의 설정이\n * 조용히 죽지 않게 하려는 것이고 — 이쪽은 방금 사람이 친 값이라 오타를 알려주는 편이 낫다.\n * 조용히 «역할 없음»으로 도는 것이 이 도구에서 가장 나쁜 실패다.\n */\nexport function assertRole(value: string): HarnessRole {\n const normalized = value.trim().toLowerCase();\n if ((HARNESS_ROLES as readonly string[]).includes(normalized)) {\n return normalized as HarnessRole;\n }\n throw new Error(\n `Invalid role \"${value}\". Expected one of: ${HARNESS_ROLES.join(\", \")}.`,\n );\n}\n\n/** 사람이 읽는 이름. 서버의 거부 안내문과 같은 어휘를 쓴다. */\nexport function roleDisplayName(role: HarnessRole): string {\n return `${role.charAt(0).toUpperCase()}${role.slice(1)} Session`;\n}\n","import { createHash, randomBytes } from \"node:crypto\";\nimport { createServer } from \"node:http\";\nimport { spawn, type ChildProcess, type SpawnOptions } from \"node:child_process\";\nimport { URLSearchParams } from \"node:url\";\nimport type { StoredTokenSet, TokenStore } from \"./tokenStore\";\nimport { registerPublicClient, type ClientRegistrationResult } from \"./clientRegistration\";\nimport { assertTrustedEndpointUrl, fallbackTokenEndpointsFor, isDefaultEndpoint } from \"../config/endpoints\";\n\n/**\n * ★로그인은 서버마다 한 번이다(설계 0.4.2). 토큰은 역할을 싣지 않고, 역할은 저장소에서 와서\n * 요청 헤더로 실린다({@link McpRpcClient}). 그래서 이 클라이언트에는 역할이 없다.\n */\nexport interface OAuthClientOptions {\n endpoint: string;\n tokenStore: TokenStore;\n fetchImpl?: typeof fetch;\n envVars?: NodeJS.ProcessEnv;\n /**\n * 브라우저를 연다. <b>열기에 실패하면 거절</b>하고, 성공이 확인되면(또는 아직 모르면) 가만히 있는다.\n * login 은 이 약속을 «기다리지 않고» 콜백 대기와 경주시킨다 — 여는 명령이 브라우저가 닫힐 때까지\n * 안 끝나는 환경에서 순서대로 기다리면 교착한다.\n */\n openBrowser?: (url: string) => Promise<void>;\n /**\n * 인가 URL 을 «브라우저를 열기 전에» 알린다. CLI 는 stderr 에 한 줄 쓴다 — 브라우저가 안 열려도\n * 사람이 직접 열 수 있고, 에이전트가 실행했다면 명령이 끝날 때 그 줄이 에이전트에게 닿는다.\n */\n onAuthorizeUrl?: (url: string) => void;\n /** 콜백을 기다리는 한도. 기본 5분 — 사람이 로그인하기엔 넉넉하고, 에이전트 셸 도구 최대 한도보다 짧다. */\n loginTimeoutMs?: number;\n /**\n * 토큰 저장소를 «읽기만» 한다 — 갱신하지 않는다(네트워크도, 토큰 파일 쓰기도 없다).\n * {@code init --dry-run} 이 쓴다: 「아무것도 바꾸지 않는다」에 사용자의 로그인 상태도 든다.\n * 갱신이 필요한(만료된) 토큰은 «없음»으로 본다.\n */\n readOnly?: boolean;\n}\n\n/** 로그인 대기 기본 한도(5분). */\nexport const DEFAULT_LOGIN_TIMEOUT_MS = 300_000;\n\n/**\n * 로그인이 «사람 쪽 사정으로» 끝나지 못한 이유. {@code code} 는 {@code --json} 의 {@code error.code} 로\n * 그대로 나간다(종료 코드는 다른 실패와 같은 1 — 받는 쪽은 메시지를 읽고 사람에게 옮긴다).\n */\nexport class OAuthLoginError extends Error {\n constructor(readonly code: \"LOGIN_TIMEOUT\" | \"BROWSER_UNAVAILABLE\" | \"CALLBACK_UNAVAILABLE\", message: string) {\n super(message);\n this.name = \"OAuthLoginError\";\n }\n}\n\nexport interface OAuthMetadata {\n authorizationEndpoint: string;\n tokenEndpoint: string;\n registrationEndpoint?: string;\n issuer?: string;\n codeChallengeMethodsSupported: string[];\n}\n\nexport interface TokenProvider {\n getAccessToken(): Promise<string | undefined>;\n refreshAfterUnauthorized(): Promise<string | undefined>;\n}\n\nexport class OAuthClient implements TokenProvider {\n private readonly fetchImpl: typeof fetch;\n private readonly envVars: NodeJS.ProcessEnv;\n private readonly openBrowserImpl: (url: string) => Promise<void>;\n\n constructor(private readonly options: OAuthClientOptions) {\n this.fetchImpl = options.fetchImpl ?? fetch;\n this.envVars = options.envVars ?? process.env;\n this.openBrowserImpl = options.openBrowser ?? openBrowser;\n }\n\n async getAccessToken(): Promise<string | undefined> {\n const envToken = this.envVars.AINECTO_TOKEN;\n if (envToken) {\n assertEnvTokenEndpointAllowed(this.options.endpoint, this.envVars);\n return envToken;\n }\n\n const stored = await this.loadStored();\n if (!stored) {\n return undefined;\n }\n\n if (!shouldRefresh(stored)) {\n return stored.accessToken;\n }\n if (this.options.readOnly) {\n return isExpired(stored) ? undefined : stored.accessToken;\n }\n // ★만료됐는데 갱신할 수단이 없으면 «토큰 없음»이다. 예전엔 만료된 토큰을 그대로 돌려줘서,\n // init 은 로그인 대신 401 안내로 떨어졌고 다른 경로는 받을 게 뻔한 401 을 받으러 갔다\n // (2026-09-29 독립 리뷰 P1-2). 아직 60초 창 안이면 쓸 수 있으므로 돌려준다.\n if (!stored.refreshToken) {\n return isExpired(stored) ? undefined : stored.accessToken;\n }\n\n return this.refreshStoredToken({ ...stored, refreshToken: stored.refreshToken });\n }\n\n async refreshAfterUnauthorized(): Promise<string | undefined> {\n const stored = await this.loadStored();\n if (this.options.readOnly || !stored?.refreshToken) {\n return undefined;\n }\n return this.refreshStoredToken({ ...stored, refreshToken: stored.refreshToken });\n }\n\n async login(): Promise<StoredTokenSet> {\n const pkce = generatePkcePair();\n const state = generateOAuthState();\n const loopback = await createLoopbackReceiver(state);\n\n try {\n const metadata = await discoverOAuthMetadata(this.options.endpoint, this.fetchImpl);\n const registration = metadata.registrationEndpoint\n ? await registerPublicClient(metadata.registrationEndpoint, loopback.redirectUri, this.fetchImpl)\n : { clientId: \"ainecto-cli\" };\n const authorizeUrl = new URL(metadata.authorizationEndpoint);\n authorizeUrl.searchParams.set(\"response_type\", \"code\");\n authorizeUrl.searchParams.set(\"client_id\", registration.clientId);\n authorizeUrl.searchParams.set(\"redirect_uri\", loopback.redirectUri);\n authorizeUrl.searchParams.set(\"code_challenge\", pkce.codeChallenge);\n authorizeUrl.searchParams.set(\"code_challenge_method\", \"S256\");\n authorizeUrl.searchParams.set(\"resource\", this.options.endpoint);\n authorizeUrl.searchParams.set(\"state\", state);\n // ★역할을 scope 에 싣지 않는다(설계 0.4.2) — 로그인은 서버마다 한 번이고, 역할은 저장소에서\n // 요청 헤더로 온다. 역할은 작업 가드레일이지 보안 경계가 아니다(2026-09-29 사용자 결정 Q1).\n\n assertTrustedEndpointUrl(authorizeUrl, \"OAuth authorization URL\");\n const url = authorizeUrl.toString();\n this.options.onAuthorizeUrl?.(url);\n // ★셋 중 먼저 오는 것이 결과다 — 콜백 도착 / 브라우저 열기 실패 / 시간 한도.\n // 예전엔 한도가 없고 열기 실패를 못 봐서, 브라우저가 없는 기계에서 말없이 영원히 기다렸다\n // (2026-09-29 독립 리뷰 P1-2). 비TTY(에이전트가 실행)에서는 그 대기가 곧 멈춤이다.\n const browserFailure = this.openBrowserImpl(url).then(() => new Promise<never>(() => undefined));\n const code = await withTimeout(\n Promise.race([loopback.waitForCode(), browserFailure]),\n this.options.loginTimeoutMs ?? DEFAULT_LOGIN_TIMEOUT_MS,\n );\n const token = await exchangeToken(metadata.tokenEndpoint, {\n grant_type: \"authorization_code\",\n code,\n redirect_uri: loopback.redirectUri,\n client_id: registration.clientId,\n code_verifier: pkce.codeVerifier,\n resource: this.options.endpoint,\n ...(registration.clientSecret ? { client_secret: registration.clientSecret } : {}),\n }, this.fetchImpl);\n\n const stored = toStoredToken(this.options.endpoint, token, metadata, registration);\n await this.options.tokenStore.save(this.options.endpoint, stored);\n return stored;\n } finally {\n await loopback.close();\n }\n }\n\n /**\n * ★대체로 읽는 옛 칸도 함께 지운다. 새 칸만 지우면 다음 읽기가 곧바로 옛 칸으로 대체돼\n * «로그아웃했는데 여전히 로그인됨»이 된다. 로그인은 기계당 한 번이므로 옛 CLI 의 칸도 같이 끝난다.\n */\n async logout(): Promise<void> {\n await this.options.tokenStore.delete(this.options.endpoint);\n for (const fallback of fallbackTokenEndpointsFor(this.options.endpoint)) {\n await this.options.tokenStore.delete(fallback);\n }\n }\n\n /** 이 주소의 칸, 비었으면 옛 기본 주소의 칸({@link fallbackTokenEndpointsFor}). 쓰기는 늘 이 주소의 칸이다. */\n private async loadStored(): Promise<StoredTokenSet | undefined> {\n const own = await this.options.tokenStore.load(this.options.endpoint);\n if (own) {\n return own;\n }\n for (const fallback of fallbackTokenEndpointsFor(this.options.endpoint)) {\n const stored = await this.options.tokenStore.load(fallback);\n if (stored) {\n return stored;\n }\n }\n return undefined;\n }\n\n /** 부르는 쪽이 refresh token 이 있음을 이미 확인했다 — 타입이 그것을 요구한다. */\n private async refreshStoredToken(stored: StoredTokenSet & { refreshToken: string }): Promise<string | undefined> {\n const metadata = await discoverOAuthMetadata(this.options.endpoint, this.fetchImpl);\n const token = await exchangeToken(metadata.tokenEndpoint, {\n grant_type: \"refresh_token\",\n refresh_token: stored.refreshToken,\n client_id: stored.clientId ?? \"ainecto-cli\",\n ...(stored.clientSecret ? { client_secret: stored.clientSecret } : {}),\n resource: this.options.endpoint,\n }, this.fetchImpl);\n const next = toStoredToken(this.options.endpoint, token, metadata, stored);\n await this.options.tokenStore.save(this.options.endpoint, next);\n return next.accessToken;\n }\n}\n\nexport function generatePkcePair(): { codeVerifier: string; codeChallenge: string } {\n const codeVerifier = randomBytes(32).toString(\"base64url\");\n const codeChallenge = createHash(\"sha256\").update(codeVerifier).digest(\"base64url\");\n return { codeVerifier, codeChallenge };\n}\n\nexport function generateOAuthState(): string {\n return randomBytes(32).toString(\"base64url\");\n}\n\n/** 이미 만료됐는가. 만료 시각이 없으면 만료되지 않은 것으로 본다(서버가 수명을 안 알려 준 토큰). */\nexport function isExpired(token: Pick<StoredTokenSet, \"expiresAt\">, now = Date.now()): boolean {\n return token.expiresAt !== undefined && token.expiresAt <= now;\n}\n\nasync function withTimeout<T>(work: Promise<T>, timeoutMs: number): Promise<T> {\n let timer: NodeJS.Timeout | undefined;\n const timeout = new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n const minutes = timeoutMs / 60_000;\n const span = Number.isInteger(minutes) ? `${minutes} minute${minutes === 1 ? \"\" : \"s\"}` : `${timeoutMs} ms`;\n reject(new OAuthLoginError(\n \"LOGIN_TIMEOUT\",\n `Sign-in was not completed within ${span}. Nothing was saved — run the same command again.`,\n ));\n }, timeoutMs);\n });\n try {\n return await Promise.race([work, timeout]);\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport function shouldRefresh(token: Pick<StoredTokenSet, \"expiresAt\">, now = Date.now()): boolean {\n if (!token.expiresAt) {\n return false;\n }\n return token.expiresAt - now < 60_000;\n}\n\nexport async function discoverOAuthMetadata(endpoint: string, fetchImpl: typeof fetch = fetch): Promise<OAuthMetadata> {\n assertTrustedEndpointUrl(endpoint, \"MCP endpoint\");\n const resourceMetadataUrl = await discoverResourceMetadataUrl(endpoint, fetchImpl);\n assertTrustedEndpointUrl(resourceMetadataUrl, \"OAuth protected resource metadata URL\");\n const resourceMetadata = await fetchJson<Record<string, unknown>>(resourceMetadataUrl, fetchImpl);\n const authorizationServers = resourceMetadata.authorization_servers;\n if (!Array.isArray(authorizationServers) || typeof authorizationServers[0] !== \"string\") {\n throw new Error(\"OAuth protected resource metadata did not include authorization_servers.\");\n }\n const authServer = authorizationServers[0];\n assertTrustedEndpointUrl(authServer, \"OAuth authorization server\");\n const metadataUrl = authServer.includes(\"/.well-known/\")\n ? authServer\n : `${authServer.replace(/\\/$/, \"\")}/.well-known/oauth-authorization-server`;\n assertTrustedEndpointUrl(metadataUrl, \"OAuth authorization server metadata URL\");\n const metadata = await fetchJson<Record<string, unknown>>(metadataUrl, fetchImpl);\n if (typeof metadata.authorization_endpoint !== \"string\" || typeof metadata.token_endpoint !== \"string\") {\n throw new Error(\"OAuth authorization server metadata is missing authorization_endpoint or token_endpoint.\");\n }\n assertTrustedEndpointUrl(metadata.authorization_endpoint, \"OAuth authorization endpoint\");\n assertTrustedEndpointUrl(metadata.token_endpoint, \"OAuth token endpoint\");\n if (typeof metadata.registration_endpoint === \"string\") {\n assertTrustedEndpointUrl(metadata.registration_endpoint, \"OAuth client registration endpoint\");\n }\n if (typeof metadata.issuer === \"string\") {\n assertTrustedEndpointUrl(metadata.issuer, \"OAuth issuer\");\n }\n const codeChallengeMethodsSupported = parseStringArray(metadata.code_challenge_methods_supported);\n if (!codeChallengeMethodsSupported.includes(\"S256\")) {\n throw new Error(\"OAuth authorization server metadata must support PKCE S256.\");\n }\n return {\n authorizationEndpoint: metadata.authorization_endpoint,\n tokenEndpoint: metadata.token_endpoint,\n registrationEndpoint: typeof metadata.registration_endpoint === \"string\" ? metadata.registration_endpoint : undefined,\n issuer: typeof metadata.issuer === \"string\" ? metadata.issuer : undefined,\n codeChallengeMethodsSupported,\n };\n}\n\nasync function discoverResourceMetadataUrl(endpoint: string, fetchImpl: typeof fetch): Promise<string> {\n const challengeUrl = new URL(endpoint);\n assertTrustedEndpointUrl(challengeUrl, \"MCP endpoint\");\n const response = await fetchImpl(challengeUrl, { method: \"GET\" });\n const challenge = response.headers.get(\"www-authenticate\");\n const fromChallenge = challenge ? parseBearerChallengeParam(challenge, \"resource_metadata\") : undefined;\n if (fromChallenge) {\n assertTrustedEndpointUrl(fromChallenge, \"OAuth protected resource metadata URL\");\n return fromChallenge;\n }\n const origin = new URL(endpoint).origin;\n const fallback = `${origin}/.well-known/oauth-protected-resource`;\n assertTrustedEndpointUrl(fallback, \"OAuth protected resource metadata URL\");\n return fallback;\n}\n\nexport function parseBearerChallengeParam(header: string, name: string): string | undefined {\n const pattern = new RegExp(`${name}=\"([^\"]+)\"`);\n return pattern.exec(header)?.[1];\n}\n\nasync function exchangeToken(\n tokenEndpoint: string,\n params: Record<string, string>,\n fetchImpl: typeof fetch,\n): Promise<Record<string, unknown>> {\n assertTrustedEndpointUrl(tokenEndpoint, \"OAuth token endpoint\");\n const response = await fetchImpl(tokenEndpoint, {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams(params),\n });\n if (!response.ok) {\n throw new Error(`OAuth token exchange failed with HTTP ${response.status}.`);\n }\n return response.json() as Promise<Record<string, unknown>>;\n}\n\ntype TokenContext = Partial<Pick<StoredTokenSet, \"refreshToken\" | \"tokenType\" | \"expiresAt\" | \"scope\" | \"clientId\" | \"clientSecret\">>\n & Partial<ClientRegistrationResult>;\n\nfunction toStoredToken(\n endpoint: string,\n token: Record<string, unknown>,\n metadata: OAuthMetadata,\n previous?: TokenContext,\n): StoredTokenSet {\n if (typeof token.access_token !== \"string\") {\n throw new Error(\"OAuth token response did not include access_token.\");\n }\n const expiresIn = typeof token.expires_in === \"number\" ? token.expires_in : undefined;\n return {\n endpoint,\n accessToken: token.access_token,\n refreshToken: typeof token.refresh_token === \"string\" ? token.refresh_token : previous?.refreshToken,\n tokenType: typeof token.token_type === \"string\" ? token.token_type : previous?.tokenType,\n expiresAt: expiresIn ? Date.now() + expiresIn * 1000 : previous?.expiresAt,\n scope: typeof token.scope === \"string\" ? token.scope : previous?.scope,\n clientId: previous?.clientId ?? \"ainecto-cli\",\n clientSecret: previous?.clientSecret,\n authorizationServer: metadata.issuer,\n updatedAt: new Date().toISOString(),\n };\n}\n\n/**\n * 로그인 콜백을 받는 loopback 서버. {@code host} 는 시험이 «바인딩 실패»를 만들 때만 바꾼다.\n */\nexport async function createLoopbackReceiver(expectedState: string, host = \"127.0.0.1\"): Promise<{\n redirectUri: string;\n waitForCode(): Promise<string>;\n close(): Promise<void>;\n}> {\n let resolveCode!: (code: string) => void;\n let rejectCode!: (error: Error) => void;\n const codePromise = new Promise<string>((resolve, reject) => {\n resolveCode = resolve;\n rejectCode = reject;\n });\n codePromise.catch(() => undefined);\n\n const server = createServer((req, res) => {\n const url = new URL(req.url ?? \"/\", \"http://127.0.0.1\");\n const error = url.searchParams.get(\"error\");\n const code = url.searchParams.get(\"code\");\n const state = url.searchParams.get(\"state\");\n if (error) {\n res.writeHead(400, { \"content-type\": \"text/plain\" });\n res.end(\"AiNecto CLI authorization failed. You can close this tab.\");\n rejectCode(new Error(`OAuth authorization failed: ${error}`));\n return;\n }\n if (!state || state !== expectedState) {\n res.writeHead(400, { \"content-type\": \"text/plain\" });\n res.end(\"AiNecto CLI authorization state mismatch. You can close this tab.\");\n rejectCode(new Error(\"OAuth state mismatch.\"));\n return;\n }\n if (!code) {\n res.writeHead(400, { \"content-type\": \"text/plain\" });\n res.end(\"Missing OAuth code.\");\n rejectCode(new Error(\"OAuth redirect did not include a code.\"));\n return;\n }\n res.writeHead(200, { \"content-type\": \"text/plain\" });\n res.end(\"AiNecto CLI authorization complete. You can close this tab.\");\n resolveCode(code);\n });\n\n // ★바인딩이 막히면(에이전트 sandbox 등) 예전엔 error 리스너가 없어 처리되지 않은 예외로 죽었다\n // (2026-09-29 코드 리뷰 P1). 사람이 할 일을 말하는 오류로 바꾼다.\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", (error) => reject(new OAuthLoginError(\n \"CALLBACK_UNAVAILABLE\",\n `Could not start the local sign-in callback on ${host} (${error.message}). `\n + \"If this command runs in a sandbox, allow local network binding or run it outside the sandbox.\",\n )));\n server.listen(0, host, () => resolve());\n });\n const address = server.address();\n if (!address || typeof address === \"string\") {\n throw new Error(\"Loopback OAuth server did not bind to a TCP port.\");\n }\n return {\n redirectUri: `http://127.0.0.1:${address.port}/callback`,\n waitForCode: () => codePromise,\n close: () => new Promise<void>((resolve, reject) => {\n // Node 18 은 브라우저가 붙들고 있는 keep-alive 연결이 끝날 때까지 close 가 늦어진다.\n server.closeAllConnections?.();\n server.close((error) => error ? reject(error) : resolve());\n }),\n };\n}\n\nfunction parseStringArray(value: unknown): string[] {\n return Array.isArray(value) ? value.filter((item): item is string => typeof item === \"string\") : [];\n}\n\nasync function fetchJson<T>(url: string, fetchImpl: typeof fetch): Promise<T> {\n assertTrustedEndpointUrl(url, \"OAuth metadata URL\");\n const response = await fetchImpl(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch OAuth metadata from ${url}: HTTP ${response.status}.`);\n }\n return response.json() as Promise<T>;\n}\n\nexport function getBrowserOpenCommand(\n url: string,\n platform: NodeJS.Platform = process.platform,\n): { command: string; args: string[] } {\n assertTrustedEndpointUrl(url, \"OAuth authorization URL\");\n if (platform === \"darwin\") {\n return { command: \"open\", args: [url] };\n }\n if (platform === \"win32\") {\n return { command: \"explorer.exe\", args: [url] };\n }\n return { command: \"xdg-open\", args: [url] };\n}\n\nexport interface LaunchBrowserDeps {\n platform?: NodeJS.Platform;\n spawnImpl?: (command: string, args: string[], options: SpawnOptions) => ChildProcess;\n}\n\n/**\n * 기본 브라우저 열기. <b>여는 명령이 없거나(ENOENT) 0 이 아닌 코드로 끝나면 거절</b>한다.\n *\n * <p>★예전엔 {@code error} 리스너가 없어 명령이 없으면 처리되지 않은 오류로 죽었고, 명령은 있는데\n * 브라우저가 없으면({@code xdg-open} 비0 종료) 아무 말 없이 콜백을 영원히 기다렸다\n * (2026-09-29 독립 리뷰 P1-2).\n *\n * <p>⚠<b>Windows 는 종료 코드를 보지 않는다.</b> {@code explorer.exe} 는 성공해도 1 로 끝나는 것으로\n * 알려져 있어, 그 코드로 판정하면 정상 환경을 실패로 만든다 — 명령이 «떴다»는 것만 본다\n * (설계 §8-1, Windows 실측 V14 전까지 추정).\n */\nexport function launchBrowser(url: string, deps: LaunchBrowserDeps = {}): Promise<void> {\n const platform = deps.platform ?? process.platform;\n const { command, args } = getBrowserOpenCommand(url, platform);\n const spawnImpl = deps.spawnImpl ?? spawn;\n return new Promise<void>((resolve, reject) => {\n const unavailable = (reason: string) => new OAuthLoginError(\n \"BROWSER_UNAVAILABLE\",\n `Could not open a browser on this machine (${command}: ${reason}). Sign-in needs a browser here.`,\n );\n let child: ChildProcess;\n try {\n child = spawnImpl(command, args, { stdio: \"ignore\", detached: true });\n } catch (error) {\n reject(unavailable(error instanceof Error ? error.message : String(error)));\n return;\n }\n child.once(\"error\", (error) => reject(unavailable(error.message)));\n if (platform === \"win32\") {\n child.once(\"spawn\", () => resolve());\n } else {\n child.once(\"exit\", (code, signal) => {\n if (code === 0) {\n resolve();\n } else {\n reject(unavailable(code === null ? `stopped by ${signal ?? \"a signal\"}` : `exited with code ${code}`));\n }\n });\n }\n child.unref();\n });\n}\n\nfunction openBrowser(url: string): Promise<void> {\n return launchBrowser(url);\n}\n\nfunction assertEnvTokenEndpointAllowed(endpoint: string, envVars: NodeJS.ProcessEnv): void {\n if (envVars.AINECTO_ALLOW_CUSTOM_ENDPOINT_TOKEN === \"1\") {\n return;\n }\n if (isDefaultEndpoint(endpoint)) {\n return;\n }\n throw new Error(\"AINECTO_TOKEN can only be used with the default prod/dev endpoints. Set AINECTO_ALLOW_CUSTOM_ENDPOINT_TOKEN=1 only when you intentionally trust the custom endpoint.\");\n}\n","export type AinectoEnv = \"prod\" | \"dev\";\n\nexport interface EndpointResolutionInput {\n env?: AinectoEnv;\n endpoint?: string;\n envVars?: NodeJS.ProcessEnv;\n}\n\nexport interface ResolvedEndpoint {\n env: AinectoEnv;\n endpoint: string;\n source: \"flag\" | \"env\" | \"default\";\n}\n\n/**\n * 기본 MCP 엔드포인트.\n *\n * ★2026-10-11 AiNecto 복귀(2단계)로 «사람이 보는 주소»가 다시 ainecto.com 이다. /mcp 는 두 도메인\n * 모두에서 동일하게 서빙되고(같은 인스턴스), ai-erd.com 의 기계 경로는 301 하지 않고 계속 받는다.\n * OAuth 메타데이터(issuer·resource·authorization_servers)는 줄곧 ainecto.com 이었다 — 이제 기본 주소와 맞는다.\n *\n * ⚠dev 는 바꾸지 않는다(dev.ai-erd.com) — 복귀 계획서 범위 밖.\n */\nconst DEFAULT_ENDPOINTS: Record<AinectoEnv, string> = {\n prod: \"https://ainecto.com/mcp\",\n dev: \"https://dev.ai-erd.com/mcp\",\n};\n\n/**\n * 옛 기본값 — 이미 설정·클라이언트에 적어둔 사용자가 있다. isDefaultEndpoint 가 이것도 «기본»으로 본다\n * (그래서 AINECTO_TOKEN 도 이 주소에 보낸다). ai-erd.com 은 2026-09-21~10-11 의 기본값이었다.\n */\nconst LEGACY_PROD_ENDPOINT = \"https://ai-erd.com/mcp\";\nconst LEGACY_DEFAULT_ENDPOINTS: readonly string[] = [\n LEGACY_PROD_ENDPOINT,\n \"https://dev.ainecto.com/mcp\",\n];\n\n/**\n * ★<b>토큰 칸 대체 — 판정은 여기 한 곳이다.</b> 이 주소의 칸이 비었을 때 «대신 읽을» 옛 칸.\n *\n * <p>토큰 칸은 주소마다 하나라(tokenStore {@code tokenKey}), 기본 주소가 ai-erd.com → ainecto.com 으로\n * 돌아가면 ai-erd.com 칸에 로그인해 둔 사람이 새 칸에서 안 보인다. 서버의 토큰 검증은 issuer 와 고정\n * audience(mcp-server)만 보고 요청 호스트와 무관하므로, 옛 칸의 토큰은 새 주소에서도 유효하다.\n *\n * <p>쌍은 «새 prod 기본 ← 옛 prod 기본» 하나뿐이다. 사용자 지정 주소(--endpoint)·dev 에는 대체가 없다.\n * 읽기만 대체한다 — 갱신·새 로그인은 새 칸에 쓰고, 옛 칸은 지우지 않는다(옛 CLI 가 계속 쓴다).\n */\nconst TOKEN_SLOT_FALLBACKS: Readonly<Record<string, readonly string[]>> = {\n [DEFAULT_ENDPOINTS.prod]: [LEGACY_PROD_ENDPOINT],\n};\n\nexport function fallbackTokenEndpointsFor(endpoint: string): readonly string[] {\n return TOKEN_SLOT_FALLBACKS[normalizeEndpoint(endpoint)] ?? [];\n}\n\nexport function resolveEndpoint(input: EndpointResolutionInput = {}): ResolvedEndpoint {\n const envVars = input.envVars ?? process.env;\n const env = input.env ?? \"prod\";\n\n if (input.endpoint) {\n return { env, endpoint: normalizeEndpoint(input.endpoint), source: \"flag\" };\n }\n\n if (envVars.AINECTO_MCP_ENDPOINT) {\n return { env, endpoint: normalizeEndpoint(envVars.AINECTO_MCP_ENDPOINT), source: \"env\" };\n }\n\n return { env, endpoint: DEFAULT_ENDPOINTS[env], source: \"default\" };\n}\n\nexport function normalizeEndpoint(endpoint: string): string {\n const url = new URL(endpoint);\n assertTrustedEndpointUrl(url, \"MCP endpoint\");\n url.hash = \"\";\n return url.toString().replace(/\\/$/, \"\");\n}\n\n/**\n * ★<b>이 env 의 기본 주소와 «정확히» 같은가.</b>\n *\n * <p>{@link isDefaultEndpoint} 는 prod·dev·옛 주소를 전부 «기본»으로 보는 넓은 판정이라,\n * 「env=prod 인데 endpoint 만 dev」 같은 입력을 기본으로 착각한다. 그 판정으로 설정에서\n * {@code --endpoint} 를 빼면, 조회한 주소와 세션이 붙는 주소가 갈라진다\n * (2026-09-23 독립 재리뷰 I7).\n */\nexport function isDefaultEndpointFor(env: AinectoEnv, endpoint: string): boolean {\n return normalizeEndpoint(endpoint) === DEFAULT_ENDPOINTS[env];\n}\n\nexport function isDefaultEndpoint(endpoint: string): boolean {\n const normalized = normalizeEndpoint(endpoint);\n return Object.values(DEFAULT_ENDPOINTS).includes(normalized)\n || LEGACY_DEFAULT_ENDPOINTS.includes(normalized);\n}\n\nexport function assertTrustedEndpointUrl(value: string | URL, label = \"URL\"): void {\n const url = typeof value === \"string\" ? new URL(value) : value;\n if (url.protocol === \"https:\") {\n return;\n }\n if (url.protocol === \"http:\" && isLoopbackHostname(url.hostname)) {\n return;\n }\n throw new Error(`${label} must use https, except http is allowed for localhost loopback endpoints.`);\n}\n\nexport function assertLoopbackRedirectUrl(value: string): void {\n const url = new URL(value);\n if (url.protocol === \"http:\" && isLoopbackHostname(url.hostname)) {\n return;\n }\n throw new Error(\"OAuth redirect URI must be an http localhost loopback URL.\");\n}\n\nfunction isLoopbackHostname(hostname: string): boolean {\n return hostname === \"localhost\"\n || hostname === \"127.0.0.1\"\n || hostname === \"::1\"\n || hostname === \"[::1]\";\n}\n\nexport function assertEnv(value: string | undefined): AinectoEnv | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (value === \"prod\" || value === \"dev\") {\n return value;\n }\n throw new Error(`Invalid --env value \"${value}\". Expected \"prod\" or \"dev\".`);\n}\n","import { assertLoopbackRedirectUrl, assertTrustedEndpointUrl } from \"../config/endpoints\";\n\nexport interface ClientRegistrationResult {\n clientId: string;\n clientSecret?: string;\n}\n\nexport async function registerPublicClient(\n registrationEndpoint: string,\n redirectUri: string,\n fetchImpl: typeof fetch = fetch,\n): Promise<ClientRegistrationResult> {\n assertTrustedEndpointUrl(registrationEndpoint, \"OAuth client registration endpoint\");\n assertLoopbackRedirectUrl(redirectUri);\n const response = await fetchImpl(registrationEndpoint, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", accept: \"application/json\" },\n body: JSON.stringify({\n client_name: \"AiNecto CLI\",\n redirect_uris: [redirectUri],\n token_endpoint_auth_method: \"none\",\n grant_types: [\"authorization_code\", \"refresh_token\"],\n response_types: [\"code\"],\n }),\n });\n if (!response.ok) {\n throw new Error(`OAuth client registration failed with HTTP ${response.status}.`);\n }\n const body = await response.json() as unknown;\n if (!isRecord(body) || typeof body.client_id !== \"string\") {\n throw new Error(\"OAuth client registration response did not include client_id.\");\n }\n return {\n clientId: body.client_id,\n clientSecret: typeof body.client_secret === \"string\" ? body.client_secret : undefined,\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { readFile } from \"node:fs/promises\";\n\nexport interface PayloadSourceInput {\n file?: string;\n inline?: string;\n stdin?: NodeJS.ReadStream;\n stdinText?: string;\n stdinIsTTY?: boolean;\n}\n\nexport interface ParsedPayload {\n value: unknown;\n source: \"file\" | \"stdin\" | \"inline\" | \"empty\";\n warnings: string[];\n}\n\nexport async function parsePayloadSource(input: PayloadSourceInput): Promise<ParsedPayload> {\n const warnings: string[] = [];\n const stdinIsTTY = input.stdinIsTTY ?? input.stdin?.isTTY ?? true;\n const hasInline = input.inline !== undefined && input.inline !== \"\";\n const hasStdin = input.stdinText !== undefined || !stdinIsTTY;\n\n if (input.file) {\n if (hasInline || hasStdin) {\n warnings.push(\"Multiple payload sources were provided; --file takes precedence.\");\n }\n const text = await readFileOrStdin(input.file, input);\n return { value: parseJson(text), source: input.file === \"-\" || input.file === \"@-\" ? \"stdin\" : \"file\", warnings };\n }\n\n if (hasStdin) {\n if (hasInline) {\n warnings.push(\"Multiple payload sources were provided; stdin takes precedence.\");\n }\n const text = input.stdinText ?? await readAllStdin(input.stdin);\n if (!text.trim()) {\n return { value: {}, source: \"empty\", warnings };\n }\n return { value: parseJson(text), source: \"stdin\", warnings };\n }\n\n if (hasInline) {\n const inline = input.inline === \"@-\" ? await readAllStdin(input.stdin) : input.inline;\n return { value: parseJson(inline), source: \"inline\", warnings };\n }\n\n return { value: {}, source: \"empty\", warnings };\n}\n\nfunction parseJson(text: string | undefined): unknown {\n if (text === undefined || !text.trim()) {\n return {};\n }\n try {\n return JSON.parse(text);\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error);\n throw new Error(`Invalid JSON payload: ${detail}`);\n }\n}\n\nasync function readFileOrStdin(file: string, input: PayloadSourceInput): Promise<string> {\n if (file === \"-\" || file === \"@-\") {\n return input.stdinText ?? await readAllStdin(input.stdin);\n }\n return readFile(file, \"utf8\");\n}\n\nasync function readAllStdin(stdin: NodeJS.ReadStream | undefined): Promise<string> {\n if (!stdin) {\n return \"\";\n }\n stdin.setEncoding(\"utf8\");\n let text = \"\";\n for await (const chunk of stdin) {\n text += chunk;\n }\n return text;\n}\n","/**\n * CLI 버전. ★진실원은 {@code package.json} 이고 빌드(tsup define)가 그 값을 박는다 —\n * 상수로 또 적으면 릴리스 때 한쪽만 올라가 조용히 거짓이 된다.\n * 번들을 거치지 않는 실행(vitest·tsx)에서는 값이 없으므로 \"dev\" 로 떨어진다.\n */\ndeclare const __AINECTO_CLI_VERSION__: string | undefined;\n\nexport const CLI_VERSION: string =\n typeof __AINECTO_CLI_VERSION__ === \"string\" ? __AINECTO_CLI_VERSION__ : \"dev\";\n\n/**\n * npm 주 이름. ★이 이름을 박는 곳은 여기 하나다 — init 이 쓰는 {@code npx -y <이름> --role …},\n * MCP {@code clientInfo}, User-Agent, init 기록의 {@code generatedBy} 가 모두 이것을 쓴다.\n * {@code package.json} 의 name·{@code server.json} 의 패키지 식별자와 같아야 한다(시험이 대조한다).\n *\n * <p>옛 이름 {@code @ai-erd/mcp}·{@code ai-erd}·{@code @ai-erd/cli} 에도 같은 코드가 올라가지만\n * (scripts/publish.mjs), 그 판으로 init 해도 새 이름을 쓴다 — 새 저장소 설정이 옛 이름에 묶이지 않게.\n */\nexport const PACKAGE_NAME = \"@ainecto/mcp\";\n\n/** 0.4.x 의 주 이름. 이미 깔린 저장소의 MCP 설정에 남아 있다 — «우리 브리지»로 알아볼 때만 쓴다. */\nexport const LEGACY_PACKAGE_NAME = \"@ai-erd/mcp\";\n\nexport const CLI_USER_AGENT = `${PACKAGE_NAME} ${CLI_VERSION}`;\n","import type { TokenProvider } from \"../auth/oauth\";\nimport { ROLE_HEADER, type HarnessRole } from \"../harness/role\";\nimport { CLI_VERSION, PACKAGE_NAME } from \"../version\";\n\nexport interface JsonRpcRequest {\n jsonrpc: \"2.0\";\n id?: string | number | null;\n method: string;\n params?: unknown;\n}\n\nexport interface JsonRpcSuccess {\n jsonrpc: \"2.0\";\n id?: string | number | null;\n result: unknown;\n}\n\nexport interface JsonRpcFailure {\n jsonrpc: \"2.0\";\n id?: string | number | null;\n error: {\n code: number;\n message: string;\n data?: unknown;\n };\n}\n\nexport type JsonRpcResponse = JsonRpcSuccess | JsonRpcFailure;\n\nexport interface McpRpcClientOptions {\n endpoint: string;\n tokenProvider?: TokenProvider;\n fetchImpl?: typeof fetch;\n envVars?: NodeJS.ProcessEnv;\n /**\n * 세션 역할. ★필수다 — 역할이 없으면 {@code null} 을 «명시»한다(설계 0.4.2 §2-3, 리뷰 P2).\n * 저장소 안에서 이것을 빠뜨리면 요청이 조용히 «제한 없음»으로 간다. 그 빠뜨림을 타입이 잡는다.\n * 값이 있으면 모든 요청의 {@code X-AI-ERD-Role} 헤더로 실린다 — 강제는 서버가 한다.\n */\n role: HarnessRole | null;\n}\n\nexport class McpRpcError extends Error {\n constructor(\n message: string,\n readonly code: string,\n readonly details?: unknown,\n ) {\n super(message);\n }\n}\n\nexport class McpRpcClient {\n private readonly fetchImpl: typeof fetch;\n private nextId = 1;\n\n constructor(private readonly options: McpRpcClientOptions) {\n this.fetchImpl = options.fetchImpl ?? fetch;\n }\n\n initialize(): Promise<unknown> {\n return this.request(\"initialize\", {\n protocolVersion: \"2024-11-05\",\n capabilities: {},\n clientInfo: { name: PACKAGE_NAME, version: CLI_VERSION },\n });\n }\n\n async toolsList(): Promise<unknown[]> {\n const result = await this.request(\"tools/list\", {});\n if (!isRecord(result) || !Array.isArray(result.tools)) {\n throw new McpRpcError(\"tools/list response did not include a tools array.\", \"MCP_PROTOCOL_ERROR\", result);\n }\n return result.tools;\n }\n\n async toolsCall(name: string, args: unknown): Promise<unknown> {\n return this.request(\"tools/call\", { name, arguments: args ?? {} });\n }\n\n async request(method: string, params?: unknown): Promise<unknown> {\n const response = await this.sendRaw({\n jsonrpc: \"2.0\",\n id: this.nextId++,\n method,\n params,\n });\n if (!response) {\n return undefined;\n }\n if (\"error\" in response) {\n throw new McpRpcError(response.error.message, \"MCP_ERROR\", response.error);\n }\n return response.result;\n }\n\n async sendRaw(request: JsonRpcRequest): Promise<JsonRpcResponse | undefined> {\n const token = await this.options.tokenProvider?.getAccessToken();\n let response = await this.postJson(request, token);\n if (response.status === 401 && this.options.tokenProvider) {\n const refreshed = await this.options.tokenProvider.refreshAfterUnauthorized();\n if (refreshed) {\n response = await this.postJson(request, refreshed);\n }\n }\n\n if (response.status === 204 || response.status === 202) {\n return undefined;\n }\n const text = await response.text();\n if (!response.ok) {\n throw new McpRpcError(\n `MCP HTTP request failed with HTTP ${response.status}.`,\n \"MCP_HTTP_ERROR\",\n httpErrorDetails(response.status, text, this.options.envVars ?? process.env),\n );\n }\n if (!text.trim()) {\n return undefined;\n }\n const parsed = JSON.parse(text) as unknown;\n if (!isJsonRpcResponse(parsed)) {\n throw new McpRpcError(\"MCP response was not a JSON-RPC response.\", \"MCP_PROTOCOL_ERROR\", parsed);\n }\n return parsed;\n }\n\n private postJson(request: JsonRpcRequest, token: string | undefined): Promise<Response> {\n const headers: Record<string, string> = {\n \"content-type\": \"application/json\",\n accept: \"application/json\",\n };\n if (token) {\n headers.authorization = `Bearer ${token}`;\n }\n if (this.options.role) {\n headers[ROLE_HEADER.toLowerCase()] = this.options.role;\n }\n return this.fetchImpl(this.options.endpoint, {\n method: \"POST\",\n headers,\n body: JSON.stringify(request),\n });\n }\n}\n\n/**\n * ★MCP 는 «도구가 거부/실패했다»를 JSON-RPC error 가 아니라 결과 안의 {@code isError} 로\n * 알린다(2025-06-18 규격). 그래서 최상위 error 만 보면 실패가 성공으로 보고된다 —\n * 셸 자동화는 exit 0 을 받고 다음 단계로 간다(2026-09-22 독립 리뷰 I9).\n */\nexport function isToolError(result: unknown): boolean {\n return isRecord(result) && result.isError === true;\n}\n\nfunction isJsonRpcResponse(value: unknown): value is JsonRpcResponse {\n return isRecord(value)\n && value.jsonrpc === \"2.0\"\n && (\"result\" in value || \"error\" in value);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction httpErrorDetails(status: number, body: string, envVars: NodeJS.ProcessEnv): Record<string, unknown> {\n const details: Record<string, unknown> = { status };\n if (envVars.AINECTO_CLI_DEBUG === \"1\" || envVars.AINECTO_DEBUG === \"1\") {\n details.body = safeBodyPreview(body);\n }\n return details;\n}\n\nexport function safeBodyPreview(body: string): string {\n return body.length > 500 ? `${body.slice(0, 500)}...` : body;\n}\n","export interface CliErrorShape {\n ok: false;\n error: {\n code: string;\n message: string;\n details?: unknown;\n };\n}\n\nexport interface CliSuccessShape {\n ok: true;\n data: unknown;\n warnings?: string[];\n}\n\nexport function renderSuccess(data: unknown, options: { json?: boolean; warnings?: string[] } = {}): string {\n if (options.json) {\n const shape: CliSuccessShape = { ok: true, data };\n if (options.warnings?.length) {\n shape.warnings = options.warnings;\n }\n return `${JSON.stringify(shape, null, 2)}\\n`;\n }\n const warnings = options.warnings?.length ? `${options.warnings.map((warning) => `Warning: ${warning}`).join(\"\\n\")}\\n` : \"\";\n return `${warnings}${renderHuman(data)}\\n`;\n}\n\nexport function renderError(error: unknown, options: { json?: boolean } = {}): string {\n const shape = toErrorShape(error);\n if (options.json) {\n return `${JSON.stringify(shape, null, 2)}\\n`;\n }\n return `Error: ${shape.error.message}\\n`;\n}\n\nexport function toErrorShape(error: unknown): CliErrorShape {\n if (error instanceof Error) {\n const maybe = error as Error & { code?: string; details?: unknown };\n return {\n ok: false,\n error: {\n code: maybe.code ?? \"CLI_ERROR\",\n message: error.message,\n details: redactSecrets(maybe.details),\n },\n };\n }\n return { ok: false, error: { code: \"CLI_ERROR\", message: String(error) } };\n}\n\nexport function redactSecrets(value: unknown): unknown {\n return redactSecretsInner(value, new WeakSet<object>());\n}\n\nfunction renderHuman(data: unknown): string {\n if (Array.isArray(data)) {\n return data.map((item) => renderHuman(item)).join(\"\\n\");\n }\n if (typeof data === \"string\") {\n return data;\n }\n return JSON.stringify(data, null, 2);\n}\n\nfunction redactSecretsInner(value: unknown, seen: WeakSet<object>): unknown {\n if (typeof value === \"string\") {\n return redactSecretString(value);\n }\n if (Array.isArray(value)) {\n return value.map((item) => redactSecretsInner(item, seen));\n }\n if (value && typeof value === \"object\") {\n if (seen.has(value)) {\n return \"[circular]\";\n }\n seen.add(value);\n const output: Record<string, unknown> = {};\n for (const [key, child] of Object.entries(value)) {\n output[key] = isSecretKey(key) ? \"[redacted]\" : redactSecretsInner(child, seen);\n }\n return output;\n }\n return value;\n}\n\nfunction isSecretKey(key: string): boolean {\n const normalized = key.toLowerCase().replace(/-/g, \"_\");\n return normalized === \"authorization\"\n || normalized.includes(\"access_token\")\n || normalized.includes(\"refresh_token\")\n || normalized.includes(\"client_secret\")\n || normalized.includes(\"token\");\n}\n\nfunction redactSecretString(value: string): string {\n return value\n .replace(/(\"(?:authorization|access_token|refresh_token|client_secret|token)\"\\s*:\\s*\")([^\"]*)(\")/gi, \"$1[redacted]$3\")\n .replace(/((?:authorization|access_token|refresh_token|client_secret|token)=)([^&\\s\"']+)/gi, \"$1[redacted]\")\n .replace(/(authorization:\\s*bearer\\s+)([^\\s,}]+)/gi, \"$1[redacted]\")\n .replace(/(bearer\\s+)(eyJ[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+)/gi, \"$1[redacted]\");\n}\n","import type { GeneratedToolDefinition } from \"./types\";\n\nexport const generatedTools = [\n {\"mcpName\":\"create_documents\",\"commandPath\":[\"documents\",\"create\"],\"group\":\"document\",\"description\":\"Create documents. If a document body is tens of KB or more, prefer request_upload_token (purpose=document.create) and upload the body with curl.\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Documents\",\"items\":{\"properties\":{\"body\":{\"description\":\"Deprecated compatibility alias for typePayload.body when document type is markdown. 본문이 수십 KB 이상으로 크면 LLM 토큰 절약을 위해 `request_upload_token (purpose=document.create)` 를 호출해 uploadUrl 을 받고 curl 로 직접 PUT 으로 보낼 것.\",\"type\":\"string\"},\"folderUuid\":{\"description\":\"Optional folder UUID\",\"type\":\"string\"},\"projectUuid\":{\"description\":\"Project UUID\",\"type\":\"string\"},\"title\":{\"description\":\"Document title\",\"type\":\"string\"},\"type\":{\"description\":\"Document type. Creatable values: erd, markdown, diagram, openapi, html.\",\"enum\":[\"erd\",\"markdown\",\"diagram\",\"openapi\",\"html\"],\"type\":\"string\"},\"typePayload\":{\"description\":\"Type-specific payload for enabled document types. markdown: {body}; diagram: {diagramSource,sourceLanguage,edgeStyle,isModule,metadata}; openapi: {content}; html: {content} (a full HTML page).\",\"type\":\"object\"}},\"required\":[\"projectUuid\",\"type\",\"title\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"105d051791cf595b\"},\n {\"mcpName\":\"create_folders\",\"commandPath\":[\"folders\",\"create\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Folders\",\"items\":{\"properties\":{\"name\":{\"description\":\"Folder name\",\"type\":\"string\"},\"parentFolderUuid\":{\"description\":\"Parent folder UUID\",\"type\":\"string\"},\"projectUuid\":{\"description\":\"Project UUID\",\"type\":\"string\"}},\"required\":[\"projectUuid\",\"name\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"30f45b887259609f\"},\n {\"mcpName\":\"create_projects\",\"commandPath\":[\"projects\",\"create\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Projects\",\"items\":{\"properties\":{\"description\":{\"description\":\"Description\",\"type\":\"string\"},\"name\":{\"description\":\"Project name\",\"type\":\"string\"},\"projectKey\":{\"description\":\"Unique project key\",\"type\":\"string\"},\"workspaceUuid\":{\"description\":\"Workspace UUID — null uses user's default workspace\",\"type\":\"string\"}},\"required\":[\"name\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"edf5cf688d7c039a\"},\n {\"mcpName\":\"create_workspaces\",\"commandPath\":[\"workspaces\",\"create\"],\"group\":\"workspace\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Workspaces\",\"items\":{\"properties\":{\"description\":{\"description\":\"Description\",\"type\":\"string\"},\"name\":{\"description\":\"Workspace name\",\"type\":\"string\"}},\"required\":[\"name\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"d9d1b0d561828b8e\"},\n {\"mcpName\":\"delete_attachments\",\"commandPath\":[\"attachments\",\"delete\"],\"group\":\"attachment\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuids\":{\"description\":\"Attachment UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"uuids\"],\"type\":\"object\"},\"required\":[\"uuids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"prod\",\"schemaHash\":\"b22c24bffdfe3d7d\"},\n {\"mcpName\":\"delete_documents\",\"commandPath\":[\"documents\",\"delete\"],\"group\":\"document\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuids\":{\"description\":\"Document UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"uuids\"],\"type\":\"object\"},\"required\":[\"uuids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"prod\",\"schemaHash\":\"3a725ae70956c270\"},\n {\"mcpName\":\"delete_folders\",\"commandPath\":[\"folders\",\"delete\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuids\":{\"description\":\"Folder UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"uuids\"],\"type\":\"object\"},\"required\":[\"uuids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"prod\",\"schemaHash\":\"2254cde89c9e8f06\"},\n {\"mcpName\":\"delete_projects\",\"commandPath\":[\"projects\",\"delete\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuids\":{\"description\":\"Project UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"uuids\"],\"type\":\"object\"},\"required\":[\"uuids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"prod\",\"schemaHash\":\"6521c33a28cb5465\"},\n {\"mcpName\":\"delete_workspaces\",\"commandPath\":[\"workspaces\",\"delete\"],\"group\":\"workspace\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuids\":{\"description\":\"Workspace UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"uuids\"],\"type\":\"object\"},\"required\":[\"uuids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"prod\",\"schemaHash\":\"3177868221137066\"},\n {\"mcpName\":\"diagram_apply_changes\",\"commandPath\":[\"tools\",\"run\",\"diagram-apply-changes\"],\"group\":\"generic\",\"description\":\"Required single-call mutation path for diagram node/edge/group create/update/delete changes. Put nodes, edges, and groups in one request and call this once. Do not look for type-specific diagram CUD tools; this tool is the only diagram CUD entry point.\",\"inputSchema\":{\"properties\":{\"description\":{\"description\":\"Reason for batch (audit)\",\"type\":\"string\"},\"diagramUuid\":{\"description\":\"Diagram UUID\",\"type\":\"string\"},\"edges\":{\"description\":\"Edge operations\",\"items\":{\"properties\":{\"action\":{\"description\":\"Operation kind\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"bridgeType\":{\"description\":\"Bridge type\",\"type\":\"string\"},\"fromUuid\":{\"description\":\"Source\",\"type\":\"string\"},\"label\":{\"description\":\"Edge label\",\"type\":\"string\"},\"lineStyle\":{\"description\":\"Line style\",\"type\":\"string\"},\"strokeColor\":{\"description\":\"Stroke color\",\"type\":\"string\"},\"strokeWidth\":{\"description\":\"Stroke width\",\"type\":\"integer\"},\"toUuid\":{\"description\":\"Target\",\"type\":\"string\"},\"uuid\":{\"description\":\"Required for update/delete\",\"type\":\"string\"}},\"required\":[\"action\"],\"type\":\"object\"},\"type\":\"array\"},\"groups\":{\"description\":\"Group operations\",\"items\":{\"properties\":{\"action\":{\"description\":\"Operation kind\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"collapsed\":{\"description\":\"Collapsed state\",\"type\":\"boolean\"},\"color\":{\"description\":\"Group color\",\"type\":\"string\"},\"height\":{\"description\":\"Explicit height; omit to keep it derived from member nodes\",\"type\":\"number\"},\"linkMode\":{\"description\":\"Link mode\",\"type\":\"string\"},\"linkedDiagramUuid\":{\"description\":\"Linked diagram UUID\",\"type\":\"string\"},\"name\":{\"description\":\"Group name\",\"type\":\"string\"},\"parentGroupUuid\":{\"description\":\"Parent group UUID\",\"type\":\"string\"},\"sortOrder\":{\"description\":\"Sort order\",\"type\":\"integer\"},\"uuid\":{\"description\":\"Required for update/delete\",\"type\":\"string\"},\"width\":{\"description\":\"Explicit width; omit to keep it derived from member nodes\",\"type\":\"number\"}},\"required\":[\"action\"],\"type\":\"object\"},\"type\":\"array\"},\"nodes\":{\"description\":\"Node operations\",\"items\":{\"properties\":{\"action\":{\"description\":\"Operation kind\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"fillColor\":{\"description\":\"Fill color\",\"type\":\"string\"},\"groupUuid\":{\"description\":\"Group UUID; empty string clears membership\",\"type\":\"string\"},\"height\":{\"description\":\"Height\",\"type\":\"number\"},\"shape\":{\"description\":\"Node shape (start/end/diamond/cylinder/parallelogram/stadium/hexagon/rect/roundRect/...)\",\"enum\":[\"rect\",\"roundRect\",\"stadium\",\"diamond\",\"decision\",\"circle\",\"start\",\"doubleCircle\",\"end\",\"hexagon\",\"cylinder\",\"parallelogram\"],\"type\":\"string\"},\"strokeColor\":{\"description\":\"Stroke color\",\"type\":\"string\"},\"text\":{\"description\":\"Node text/label. Supports newlines (\\\\n) for multi-line display.\",\"maxLength\":4000,\"type\":\"string\"},\"textColor\":{\"description\":\"Text color\",\"type\":\"string\"},\"type\":{\"description\":\"Node type\",\"type\":\"string\"},\"uuid\":{\"description\":\"Required for update/delete; optional for create\",\"type\":\"string\"},\"width\":{\"description\":\"Width\",\"type\":\"number\"},\"x\":{\"description\":\"X\",\"type\":\"number\"},\"y\":{\"description\":\"Y\",\"type\":\"number\"}},\"required\":[\"action\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"diagramUuid\",\"description\"],\"type\":\"object\"},\"required\":[\"description\",\"diagramUuid\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"add78d8edce88c86\"},\n {\"mcpName\":\"diagram_get_edge\",\"commandPath\":[\"tools\",\"run\",\"diagram-get-edge\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"edgeUuid\":{\"description\":\"Edge UUID\",\"type\":\"string\"}},\"required\":[\"edgeUuid\"],\"type\":\"object\"},\"required\":[\"edgeUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"2c03c4f7daa69898\"},\n {\"mcpName\":\"diagram_get_group\",\"commandPath\":[\"tools\",\"run\",\"diagram-get-group\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"groupUuid\":{\"description\":\"Group UUID\",\"type\":\"string\"}},\"required\":[\"groupUuid\"],\"type\":\"object\"},\"required\":[\"groupUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"55c5aa27b8cf489d\"},\n {\"mcpName\":\"diagram_get_node\",\"commandPath\":[\"tools\",\"run\",\"diagram-get-node\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"nodeUuid\":{\"description\":\"Node UUID\",\"type\":\"string\"}},\"required\":[\"nodeUuid\"],\"type\":\"object\"},\"required\":[\"nodeUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"646d553238328a9e\"},\n {\"mcpName\":\"diagram_get_pending_llm_requests\",\"commandPath\":[\"tools\",\"run\",\"diagram-get-pending-llm-requests\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{},\"type\":\"object\"},\"required\":[],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"2143d616cf7822bf\"},\n {\"mcpName\":\"diagram_list_edges\",\"commandPath\":[\"tools\",\"run\",\"diagram-list-edges\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"diagramUuid\":{\"description\":\"Diagram document UUID\",\"type\":\"string\"}},\"required\":[\"diagramUuid\"],\"type\":\"object\"},\"required\":[\"diagramUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"4645085bde616381\"},\n {\"mcpName\":\"diagram_list_groups\",\"commandPath\":[\"tools\",\"run\",\"diagram-list-groups\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"diagramUuid\":{\"description\":\"Diagram document UUID\",\"type\":\"string\"}},\"required\":[\"diagramUuid\"],\"type\":\"object\"},\"required\":[\"diagramUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"8a7ca45dd34d1aef\"},\n {\"mcpName\":\"diagram_list_nodes\",\"commandPath\":[\"tools\",\"run\",\"diagram-list-nodes\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"diagramUuid\":{\"description\":\"Diagram document UUID\",\"type\":\"string\"}},\"required\":[\"diagramUuid\"],\"type\":\"object\"},\"required\":[\"diagramUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"d444066b5ca6eeb4\"},\n {\"mcpName\":\"diagram_submit_llm_result\",\"commandPath\":[\"tools\",\"run\",\"diagram-submit-llm-result\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"cachedInputTokens\":{\"description\":\"Cached subset of provider total input tokens\",\"type\":\"integer\"},\"creditsCharged\":{\"description\":\"Deprecated; ignored. Credits are calculated server-side from tokens.\",\"type\":\"integer\"},\"inputTokens\":{\"description\":\"Provider total input tokens; Java persists uncached input after one normalization\",\"type\":\"integer\"},\"outputTokens\":{\"description\":\"Output token count\",\"type\":\"integer\"},\"result\":{\"description\":\"LLM result text\",\"type\":\"string\"},\"uuid\":{\"description\":\"LLM request UUID\",\"type\":\"string\"}},\"required\":[\"uuid\",\"result\"],\"type\":\"object\"},\"required\":[\"result\",\"uuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"870ace32642a770a\"},\n {\"mcpName\":\"diagram_update_llm_request_status\",\"commandPath\":[\"tools\",\"run\",\"diagram-update-llm-request-status\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"errorMessage\":{\"description\":\"Error message (when status=FAILED)\",\"type\":\"string\"},\"status\":{\"description\":\"Target status — currently only FAILED is mutable from caller side\",\"enum\":[\"FAILED\"],\"type\":\"string\"},\"uuid\":{\"description\":\"LLM request UUID\",\"type\":\"string\"}},\"required\":[\"uuid\",\"status\"],\"type\":\"object\"},\"required\":[\"status\",\"uuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"9ad96e3dc5fd2a8f\"},\n {\"mcpName\":\"disable_shares\",\"commandPath\":[\"tools\",\"run\",\"disable-shares\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"targetType\":{\"description\":\"Share target type\",\"enum\":[\"project\",\"folder\",\"document\"],\"type\":\"string\"},\"targetUuids\":{\"description\":\"Target UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"targetType\",\"targetUuids\"],\"type\":\"object\"},\"required\":[\"targetType\",\"targetUuids\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"bd1b310200b78420\"},\n {\"mcpName\":\"enable_shares\",\"commandPath\":[\"tools\",\"run\",\"enable-shares\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"targetType\":{\"description\":\"Share target type. A document gets a shareUrl anyone can open; a project gets a public API path only (there is no public project page); a folder token is stored but nothing public reads it yet.\",\"enum\":[\"project\",\"folder\",\"document\"],\"type\":\"string\"},\"targetUuids\":{\"description\":\"Target UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"targetType\",\"targetUuids\"],\"type\":\"object\"},\"required\":[\"targetType\",\"targetUuids\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"18559d7c0af09d2c\"},\n {\"mcpName\":\"erd_apply_changes\",\"commandPath\":[\"erd\",\"apply-changes\"],\"group\":\"erd\",\"description\":\"Required single-call mutation path for ERD create/update/delete changes. Put tables, columns, indexes, refs, enums, enum_values, and table groups in one operations array and call this once.\\nRules: (1) all data field names are snake_case; (2) for create, generate your own UUIDs and put them in data.uuid, then later operations in the same batch may reference those UUIDs without read-back calls; (3) enum values are separate enum_value operations, not inline on enum; (4) ref.relationship uses short dbdiagram-style symbols: >, <, or -; (5) ref_column operations map FK columns explicitly, never automatically.\\nDo not look for type-specific ERD CUD tools; this tool is the only ERD CUD entry point. If operations is very large, use request_upload_token with purpose=mcp.call and send the tools/call payload with curl to save LLM tokens.\\nOne-call worked example:\\n{\\n \\\"documentUuid\\\": \\\"erd-doc-uuid\\\",\\n \\\"description\\\": \\\"create users/posts ERD\\\",\\n \\\"operations\\\": [\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"table\\\",\\\"data\\\":{\\\"uuid\\\":\\\"tbl_users\\\",\\\"name\\\":\\\"users\\\",\\\"display_order\\\":1}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"column\\\",\\\"data\\\":{\\\"uuid\\\":\\\"col_users_id\\\",\\\"table_uuid\\\":\\\"tbl_users\\\",\\\"name\\\":\\\"id\\\",\\\"type\\\":\\\"bigint\\\",\\\"is_pk\\\":true,\\\"is_not_null\\\":true,\\\"display_order\\\":1}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"column\\\",\\\"data\\\":{\\\"uuid\\\":\\\"col_users_email\\\",\\\"table_uuid\\\":\\\"tbl_users\\\",\\\"name\\\":\\\"email\\\",\\\"type\\\":\\\"varchar(255)\\\",\\\"is_unique\\\":true,\\\"is_not_null\\\":true,\\\"display_order\\\":2}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"table\\\",\\\"data\\\":{\\\"uuid\\\":\\\"tbl_posts\\\",\\\"name\\\":\\\"posts\\\",\\\"display_order\\\":2}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"column\\\",\\\"data\\\":{\\\"uuid\\\":\\\"col_posts_id\\\",\\\"table_uuid\\\":\\\"tbl_posts\\\",\\\"name\\\":\\\"id\\\",\\\"type\\\":\\\"bigint\\\",\\\"is_pk\\\":true,\\\"is_not_null\\\":true,\\\"display_order\\\":1}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"column\\\",\\\"data\\\":{\\\"uuid\\\":\\\"col_posts_author_id\\\",\\\"table_uuid\\\":\\\"tbl_posts\\\",\\\"name\\\":\\\"author_id\\\",\\\"type\\\":\\\"bigint\\\",\\\"is_not_null\\\":true,\\\"display_order\\\":2}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"column\\\",\\\"data\\\":{\\\"uuid\\\":\\\"col_posts_status\\\",\\\"table_uuid\\\":\\\"tbl_posts\\\",\\\"name\\\":\\\"status\\\",\\\"type\\\":\\\"post_status\\\",\\\"is_not_null\\\":true,\\\"display_order\\\":3}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"enum\\\",\\\"data\\\":{\\\"uuid\\\":\\\"enum_post_status\\\",\\\"name\\\":\\\"post_status\\\"}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"enum_value\\\",\\\"data\\\":{\\\"uuid\\\":\\\"enum_post_status_draft\\\",\\\"enum_uuid\\\":\\\"enum_post_status\\\",\\\"value\\\":\\\"draft\\\",\\\"display_order\\\":1}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"enum_value\\\",\\\"data\\\":{\\\"uuid\\\":\\\"enum_post_status_published\\\",\\\"enum_uuid\\\":\\\"enum_post_status\\\",\\\"value\\\":\\\"published\\\",\\\"display_order\\\":2}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"ref\\\",\\\"data\\\":{\\\"uuid\\\":\\\"ref_posts_author\\\",\\\"name\\\":\\\"fk_posts_author\\\",\\\"from_table_uuid\\\":\\\"tbl_posts\\\",\\\"to_table_uuid\\\":\\\"tbl_users\\\",\\\"relationship\\\":\\\">\\\",\\\"on_delete\\\":\\\"cascade\\\"}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"ref_column\\\",\\\"data\\\":{\\\"uuid\\\":\\\"refcol_posts_author\\\",\\\"ref_uuid\\\":\\\"ref_posts_author\\\",\\\"from_column_uuid\\\":\\\"col_posts_author_id\\\",\\\"to_column_uuid\\\":\\\"col_users_id\\\",\\\"display_order\\\":1}}\\n ]\\n}\",\"inputSchema\":{\"properties\":{\"arrangeNewTables\":{\"description\":\"Whether to auto-place newly-created tables after the batch; defaults to true\",\"type\":\"boolean\"},\"description\":{\"description\":\"Reason for batch (audit)\",\"type\":\"string\"},\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"},\"operations\":{\"description\":\"Atomic create/update/delete operations\",\"items\":{\"description\":\"One ERD mutation. Use a single operations array with client-generated data.uuid values to create cross-referenced tables, columns, enums, refs, and ref_columns without read-back calls.\",\"discriminator\":{\"propertyName\":\"type\"},\"oneOf\":[{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='table'.\",\"properties\":{\"alias\":{\"description\":\"Display alias.\",\"type\":\"string\"},\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"header_color\":{\"description\":\"Header color.\",\"type\":\"string\"},\"name\":{\"description\":\"Table name. Required for create.\",\"type\":\"string\"},\"note\":{\"description\":\"Table note.\",\"type\":\"string\"},\"schema_name\":{\"description\":\"Schema name.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"required\":[\"name\"],\"title\":\"table data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='table'.\",\"properties\":{\"alias\":{\"description\":\"Display alias.\",\"type\":\"string\"},\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"header_color\":{\"description\":\"Header color.\",\"type\":\"string\"},\"name\":{\"description\":\"Table name. Required for create.\",\"type\":\"string\"},\"note\":{\"description\":\"Table note.\",\"type\":\"string\"},\"schema_name\":{\"description\":\"Schema name.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"table data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"table\",\"description\":\"Must be 'table' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"table operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='column'.\",\"properties\":{\"default_value\":{\"description\":\"Default value.\",\"type\":\"string\"},\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"is_increment\":{\"description\":\"Auto-increment flag.\",\"type\":\"boolean\"},\"is_not_null\":{\"description\":\"Not-null flag.\",\"type\":\"boolean\"},\"is_pk\":{\"description\":\"Primary key flag.\",\"type\":\"boolean\"},\"is_unique\":{\"description\":\"Unique flag.\",\"type\":\"boolean\"},\"name\":{\"description\":\"Column name.\",\"type\":\"string\"},\"note\":{\"description\":\"Column note.\",\"type\":\"string\"},\"table_uuid\":{\"description\":\"Parent table UUID. Required for create; may be a data.uuid from an earlier table operation in this batch.\",\"type\":\"string\"},\"type\":{\"description\":\"SQL data type. Use this exact field name; do not send data_type.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"required\":[\"table_uuid\"],\"title\":\"column data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='column'.\",\"properties\":{\"default_value\":{\"description\":\"Default value.\",\"type\":\"string\"},\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"is_increment\":{\"description\":\"Auto-increment flag.\",\"type\":\"boolean\"},\"is_not_null\":{\"description\":\"Not-null flag.\",\"type\":\"boolean\"},\"is_pk\":{\"description\":\"Primary key flag.\",\"type\":\"boolean\"},\"is_unique\":{\"description\":\"Unique flag.\",\"type\":\"boolean\"},\"name\":{\"description\":\"Column name.\",\"type\":\"string\"},\"note\":{\"description\":\"Column note.\",\"type\":\"string\"},\"table_uuid\":{\"description\":\"Parent table UUID. Required for create; may be a data.uuid from an earlier table operation in this batch.\",\"type\":\"string\"},\"type\":{\"description\":\"SQL data type. Use this exact field name; do not send data_type.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"column data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"column\",\"description\":\"Must be 'column' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"column operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='index'.\",\"properties\":{\"is_pk\":{\"description\":\"Primary key index flag.\",\"type\":\"boolean\"},\"is_unique\":{\"description\":\"Unique index flag.\",\"type\":\"boolean\"},\"name\":{\"description\":\"Index name.\",\"type\":\"string\"},\"note\":{\"description\":\"Index note.\",\"type\":\"string\"},\"table_uuid\":{\"description\":\"Parent table UUID. Required for create.\",\"type\":\"string\"},\"type\":{\"description\":\"Index type.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"required\":[\"table_uuid\"],\"title\":\"index data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='index'.\",\"properties\":{\"is_pk\":{\"description\":\"Primary key index flag.\",\"type\":\"boolean\"},\"is_unique\":{\"description\":\"Unique index flag.\",\"type\":\"boolean\"},\"name\":{\"description\":\"Index name.\",\"type\":\"string\"},\"note\":{\"description\":\"Index note.\",\"type\":\"string\"},\"table_uuid\":{\"description\":\"Parent table UUID. Required for create.\",\"type\":\"string\"},\"type\":{\"description\":\"Index type.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"index data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"index\",\"description\":\"Must be 'index' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"index operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='index_column'.\",\"properties\":{\"column_uuid\":{\"description\":\"Column UUID. Required for create.\",\"type\":\"string\"},\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"index_uuid\":{\"description\":\"Index UUID. Required for create.\",\"type\":\"string\"},\"sort_order\":{\"description\":\"Sort order, for example ASC or DESC.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"required\":[\"index_uuid\",\"column_uuid\"],\"title\":\"index_column data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='index_column'.\",\"properties\":{\"column_uuid\":{\"description\":\"Column UUID. Required for create.\",\"type\":\"string\"},\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"index_uuid\":{\"description\":\"Index UUID. Required for create.\",\"type\":\"string\"},\"sort_order\":{\"description\":\"Sort order, for example ASC or DESC.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"index_column data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"index_column\",\"description\":\"Must be 'index_column' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"index_column operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='ref'.\",\"properties\":{\"from_table_uuid\":{\"description\":\"Source table UUID. Required for create.\",\"type\":\"string\"},\"name\":{\"description\":\"Reference name.\",\"type\":\"string\"},\"on_delete\":{\"description\":\"ON DELETE action.\",\"type\":\"string\"},\"on_update\":{\"description\":\"ON UPDATE action.\",\"type\":\"string\"},\"relationship\":{\"description\":\"Required for create. Use short dbdiagram-style relationship symbols.\",\"enum\":[\">\",\"<\",\"-\"],\"type\":\"string\"},\"to_table_uuid\":{\"description\":\"Target table UUID. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"required\":[\"from_table_uuid\",\"to_table_uuid\",\"relationship\"],\"title\":\"ref data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='ref'.\",\"properties\":{\"from_table_uuid\":{\"description\":\"Source table UUID. Required for create.\",\"type\":\"string\"},\"name\":{\"description\":\"Reference name.\",\"type\":\"string\"},\"on_delete\":{\"description\":\"ON DELETE action.\",\"type\":\"string\"},\"on_update\":{\"description\":\"ON UPDATE action.\",\"type\":\"string\"},\"relationship\":{\"description\":\"Required for create. Use short dbdiagram-style relationship symbols.\",\"enum\":[\">\",\"<\",\"-\"],\"type\":\"string\"},\"to_table_uuid\":{\"description\":\"Target table UUID. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"ref data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"ref\",\"description\":\"Must be 'ref' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"ref operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='ref_column'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"from_column_uuid\":{\"description\":\"Source column UUID. Required for create.\",\"type\":\"string\"},\"ref_uuid\":{\"description\":\"Reference UUID. Required for create; may be a data.uuid from an earlier ref operation.\",\"type\":\"string\"},\"to_column_uuid\":{\"description\":\"Target column UUID. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"required\":[\"ref_uuid\",\"from_column_uuid\",\"to_column_uuid\"],\"title\":\"ref_column data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='ref_column'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"from_column_uuid\":{\"description\":\"Source column UUID. Required for create.\",\"type\":\"string\"},\"ref_uuid\":{\"description\":\"Reference UUID. Required for create; may be a data.uuid from an earlier ref operation.\",\"type\":\"string\"},\"to_column_uuid\":{\"description\":\"Target column UUID. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"ref_column data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"ref_column\",\"description\":\"Must be 'ref_column' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"ref_column operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='enum'.\",\"properties\":{\"name\":{\"description\":\"Enum name.\",\"type\":\"string\"},\"note\":{\"description\":\"Enum note.\",\"type\":\"string\"},\"schema_name\":{\"description\":\"Schema name.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"enum data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='enum'.\",\"properties\":{\"name\":{\"description\":\"Enum name.\",\"type\":\"string\"},\"note\":{\"description\":\"Enum note.\",\"type\":\"string\"},\"schema_name\":{\"description\":\"Schema name.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"enum data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"enum\",\"description\":\"Must be 'enum' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"enum operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='enum_value'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"enum_uuid\":{\"description\":\"Parent enum UUID. Required for create; may be a data.uuid from an earlier enum operation.\",\"type\":\"string\"},\"note\":{\"description\":\"Enum value note.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"},\"value\":{\"description\":\"Enum value. Inline enum values on enum are not persisted; create enum_value operations.\",\"type\":\"string\"}},\"required\":[\"enum_uuid\"],\"title\":\"enum_value data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='enum_value'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"enum_uuid\":{\"description\":\"Parent enum UUID. Required for create; may be a data.uuid from an earlier enum operation.\",\"type\":\"string\"},\"note\":{\"description\":\"Enum value note.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"},\"value\":{\"description\":\"Enum value. Inline enum values on enum are not persisted; create enum_value operations.\",\"type\":\"string\"}},\"title\":\"enum_value data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"enum_value\",\"description\":\"Must be 'enum_value' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"enum_value operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='table_group'.\",\"properties\":{\"color\":{\"description\":\"Group color.\",\"type\":\"string\"},\"name\":{\"description\":\"Table group name.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"table_group data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='table_group'.\",\"properties\":{\"color\":{\"description\":\"Group color.\",\"type\":\"string\"},\"name\":{\"description\":\"Table group name.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"table_group data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"table_group\",\"description\":\"Must be 'table_group' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"table_group operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='table_group_table'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"group_uuid\":{\"description\":\"Table group UUID. Required for create.\",\"type\":\"string\"},\"schema_name\":{\"description\":\"Table schema name.\",\"type\":\"string\"},\"table_name\":{\"description\":\"Table name. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"required\":[\"group_uuid\",\"table_name\"],\"title\":\"table_group_table data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='table_group_table'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"group_uuid\":{\"description\":\"Table group UUID. Required for create.\",\"type\":\"string\"},\"schema_name\":{\"description\":\"Table schema name.\",\"type\":\"string\"},\"table_name\":{\"description\":\"Table name. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"table_group_table data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"table_group_table\",\"description\":\"Must be 'table_group_table' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"table_group_table operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='table_group_note'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"group_uuid\":{\"description\":\"Table group UUID. Required for create.\",\"type\":\"string\"},\"note_uuid\":{\"description\":\"Note UUID. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"required\":[\"group_uuid\",\"note_uuid\"],\"title\":\"table_group_note data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='table_group_note'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"group_uuid\":{\"description\":\"Table group UUID. Required for create.\",\"type\":\"string\"},\"note_uuid\":{\"description\":\"Note UUID. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"table_group_note data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"table_group_note\",\"description\":\"Must be 'table_group_note' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"table_group_note operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='filter'.\",\"properties\":{\"included_tables\":{\"description\":\"JSON string/list of included tables.\",\"type\":\"string\"},\"is_default\":{\"description\":\"Default filter flag.\",\"type\":\"boolean\"},\"name\":{\"description\":\"Filter name.\",\"type\":\"string\"},\"table_groups\":{\"description\":\"JSON string/object of table groups.\",\"type\":\"string\"},\"table_positions\":{\"description\":\"JSON string/object of table positions.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"filter data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='filter'.\",\"properties\":{\"included_tables\":{\"description\":\"JSON string/list of included tables.\",\"type\":\"string\"},\"is_default\":{\"description\":\"Default filter flag.\",\"type\":\"boolean\"},\"name\":{\"description\":\"Filter name.\",\"type\":\"string\"},\"table_groups\":{\"description\":\"JSON string/object of table groups.\",\"type\":\"string\"},\"table_positions\":{\"description\":\"JSON string/object of table positions.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"filter data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"filter\",\"description\":\"Must be 'filter' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"filter operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='note'.\",\"properties\":{\"color\":{\"description\":\"Note color.\",\"type\":\"string\"},\"content\":{\"description\":\"Note content.\",\"type\":\"string\"},\"height\":{\"description\":\"Height.\",\"type\":\"integer\"},\"icon_name\":{\"description\":\"Icon name.\",\"type\":\"string\"},\"position_x\":{\"description\":\"X position.\",\"type\":\"integer\"},\"position_y\":{\"description\":\"Y position.\",\"type\":\"integer\"},\"title\":{\"description\":\"Note title.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"},\"width\":{\"description\":\"Width.\",\"type\":\"integer\"}},\"title\":\"note data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='note'.\",\"properties\":{\"color\":{\"description\":\"Note color.\",\"type\":\"string\"},\"content\":{\"description\":\"Note content.\",\"type\":\"string\"},\"height\":{\"description\":\"Height.\",\"type\":\"integer\"},\"icon_name\":{\"description\":\"Icon name.\",\"type\":\"string\"},\"position_x\":{\"description\":\"X position.\",\"type\":\"integer\"},\"position_y\":{\"description\":\"Y position.\",\"type\":\"integer\"},\"title\":{\"description\":\"Note title.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"},\"width\":{\"description\":\"Width.\",\"type\":\"integer\"}},\"title\":\"note data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"note\",\"description\":\"Must be 'note' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"note operation\",\"type\":\"object\"}],\"properties\":{\"data\":{\"description\":\"Type-specific payload. All field names are snake_case. For create, data.uuid may be client-supplied and referenced by later operations in the same batch.\",\"oneOf\":[{\"description\":\"Payload for operation.type='table'.\",\"properties\":{\"alias\":{\"description\":\"Display alias.\",\"type\":\"string\"},\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"header_color\":{\"description\":\"Header color.\",\"type\":\"string\"},\"name\":{\"description\":\"Table name. Required for create.\",\"type\":\"string\"},\"note\":{\"description\":\"Table note.\",\"type\":\"string\"},\"schema_name\":{\"description\":\"Schema name.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"table data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='column'.\",\"properties\":{\"default_value\":{\"description\":\"Default value.\",\"type\":\"string\"},\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"is_increment\":{\"description\":\"Auto-increment flag.\",\"type\":\"boolean\"},\"is_not_null\":{\"description\":\"Not-null flag.\",\"type\":\"boolean\"},\"is_pk\":{\"description\":\"Primary key flag.\",\"type\":\"boolean\"},\"is_unique\":{\"description\":\"Unique flag.\",\"type\":\"boolean\"},\"name\":{\"description\":\"Column name.\",\"type\":\"string\"},\"note\":{\"description\":\"Column note.\",\"type\":\"string\"},\"table_uuid\":{\"description\":\"Parent table UUID. Required for create; may be a data.uuid from an earlier table operation in this batch.\",\"type\":\"string\"},\"type\":{\"description\":\"SQL data type. Use this exact field name; do not send data_type.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"column data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='index'.\",\"properties\":{\"is_pk\":{\"description\":\"Primary key index flag.\",\"type\":\"boolean\"},\"is_unique\":{\"description\":\"Unique index flag.\",\"type\":\"boolean\"},\"name\":{\"description\":\"Index name.\",\"type\":\"string\"},\"note\":{\"description\":\"Index note.\",\"type\":\"string\"},\"table_uuid\":{\"description\":\"Parent table UUID. Required for create.\",\"type\":\"string\"},\"type\":{\"description\":\"Index type.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"index data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='index_column'.\",\"properties\":{\"column_uuid\":{\"description\":\"Column UUID. Required for create.\",\"type\":\"string\"},\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"index_uuid\":{\"description\":\"Index UUID. Required for create.\",\"type\":\"string\"},\"sort_order\":{\"description\":\"Sort order, for example ASC or DESC.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"index_column data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='ref'.\",\"properties\":{\"from_table_uuid\":{\"description\":\"Source table UUID. Required for create.\",\"type\":\"string\"},\"name\":{\"description\":\"Reference name.\",\"type\":\"string\"},\"on_delete\":{\"description\":\"ON DELETE action.\",\"type\":\"string\"},\"on_update\":{\"description\":\"ON UPDATE action.\",\"type\":\"string\"},\"relationship\":{\"description\":\"Required for create. Use short dbdiagram-style relationship symbols.\",\"enum\":[\">\",\"<\",\"-\"],\"type\":\"string\"},\"to_table_uuid\":{\"description\":\"Target table UUID. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"ref data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='ref_column'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"from_column_uuid\":{\"description\":\"Source column UUID. Required for create.\",\"type\":\"string\"},\"ref_uuid\":{\"description\":\"Reference UUID. Required for create; may be a data.uuid from an earlier ref operation.\",\"type\":\"string\"},\"to_column_uuid\":{\"description\":\"Target column UUID. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"ref_column data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='enum'.\",\"properties\":{\"name\":{\"description\":\"Enum name.\",\"type\":\"string\"},\"note\":{\"description\":\"Enum note.\",\"type\":\"string\"},\"schema_name\":{\"description\":\"Schema name.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"enum data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='enum_value'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"enum_uuid\":{\"description\":\"Parent enum UUID. Required for create; may be a data.uuid from an earlier enum operation.\",\"type\":\"string\"},\"note\":{\"description\":\"Enum value note.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"},\"value\":{\"description\":\"Enum value. Inline enum values on enum are not persisted; create enum_value operations.\",\"type\":\"string\"}},\"title\":\"enum_value data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='table_group'.\",\"properties\":{\"color\":{\"description\":\"Group color.\",\"type\":\"string\"},\"name\":{\"description\":\"Table group name.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"table_group data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='table_group_table'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"group_uuid\":{\"description\":\"Table group UUID. Required for create.\",\"type\":\"string\"},\"schema_name\":{\"description\":\"Table schema name.\",\"type\":\"string\"},\"table_name\":{\"description\":\"Table name. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"table_group_table data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='table_group_note'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"group_uuid\":{\"description\":\"Table group UUID. Required for create.\",\"type\":\"string\"},\"note_uuid\":{\"description\":\"Note UUID. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"table_group_note data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='filter'.\",\"properties\":{\"included_tables\":{\"description\":\"JSON string/list of included tables.\",\"type\":\"string\"},\"is_default\":{\"description\":\"Default filter flag.\",\"type\":\"boolean\"},\"name\":{\"description\":\"Filter name.\",\"type\":\"string\"},\"table_groups\":{\"description\":\"JSON string/object of table groups.\",\"type\":\"string\"},\"table_positions\":{\"description\":\"JSON string/object of table positions.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"filter data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='note'.\",\"properties\":{\"color\":{\"description\":\"Note color.\",\"type\":\"string\"},\"content\":{\"description\":\"Note content.\",\"type\":\"string\"},\"height\":{\"description\":\"Height.\",\"type\":\"integer\"},\"icon_name\":{\"description\":\"Icon name.\",\"type\":\"string\"},\"position_x\":{\"description\":\"X position.\",\"type\":\"integer\"},\"position_y\":{\"description\":\"Y position.\",\"type\":\"integer\"},\"title\":{\"description\":\"Note title.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"},\"width\":{\"description\":\"Width.\",\"type\":\"integer\"}},\"title\":\"note data\",\"type\":\"object\"}],\"type\":\"object\"},\"op\":{\"description\":\"Operation. For create, put any new UUID in data.uuid; for update/delete, put target UUID in operation.uuid.\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"description\":\"ERD entity type. This selects the operation.data shape.\",\"enum\":[\"table\",\"column\",\"index\",\"index_column\",\"ref\",\"ref_column\",\"enum\",\"enum_value\",\"table_group\",\"table_group_table\",\"table_group_note\",\"filter\",\"note\"],\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete. Do not use this for create; use data.uuid instead.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"documentUuid\",\"description\",\"operations\"],\"type\":\"object\"},\"required\":[\"description\",\"documentUuid\",\"operations\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"87f5bcf5a253815a\"},\n {\"mcpName\":\"erd_arrange_tables\",\"commandPath\":[\"erd\",\"arrange-tables\"],\"group\":\"erd\",\"description\":\"Arrange ERD tables after edits. Default incremental mode places newly-created tables while preserving existing positions; full=true re-layouts the entire diagram. Use after several separate table edits to tidy the canvas.\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"},\"full\":{\"description\":\"Re-layout the ENTIRE diagram (overwrites existing positions). Default false = arrange only newly-added (uncoordinated) tables to the top-right while preserving existing table positions. Call this after creating several tables to tidy them up.\",\"type\":\"boolean\"}},\"required\":[\"documentUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"651fd0d54e3635ff\"},\n {\"mcpName\":\"erd_get_enum\",\"commandPath\":[\"erd\",\"get-enum\"],\"group\":\"erd\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"},\"enumUuid\":{\"description\":\"Enum UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\",\"enumUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\",\"enumUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"f0d79d7a1996939c\"},\n {\"mcpName\":\"erd_get_ref\",\"commandPath\":[\"erd\",\"get-ref\"],\"group\":\"erd\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"},\"refUuid\":{\"description\":\"Relationship UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\",\"refUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\",\"refUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"5b47fe7d99e60d4d\"},\n {\"mcpName\":\"erd_get_table\",\"commandPath\":[\"erd\",\"get-table\"],\"group\":\"erd\",\"description\":\"Get one ERD table with nested columns and indexes. Returns persistent table/column/index UUIDs usable directly as erd_apply_changes update/delete targets and ref_column column references. Column fields use apply_changes snake_case names: uuid, table_uuid, name, type, is_pk, is_unique, is_not_null, is_increment, default_value, note, display_order. Index fields include uuid, name, columns (column UUIDs), is_unique, is_pk, type.\",\"inputSchema\":{\"description\":\"Get one ERD table with nested columns and indexes. Returns persistent table/column/index UUIDs usable directly as mcp__ainecto__erd_apply_changes update/delete targets and ref_column column references. Column fields use apply_changes snake_case names: uuid, table_uuid, name, type, is_pk, is_unique, is_not_null, is_increment, default_value, note, display_order. Index fields include uuid, name, columns (column UUIDs), is_unique, is_pk, type.\",\"properties\":{\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"},\"tableUuid\":{\"description\":\"Table UUID. Response includes columns[] and indexes[] with persistent UUIDs for apply_changes.\",\"type\":\"string\"}},\"required\":[\"documentUuid\",\"tableUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\",\"tableUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"0dc13648bf3fbf8f\"},\n {\"mcpName\":\"erd_get_table_group\",\"commandPath\":[\"erd\",\"get-table-group\"],\"group\":\"erd\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"},\"tableGroupUuid\":{\"description\":\"Table group UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\",\"tableGroupUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\",\"tableGroupUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"3db246dfe8663370\"},\n {\"mcpName\":\"erd_list_enums\",\"commandPath\":[\"erd\",\"list-enums\"],\"group\":\"erd\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"4d1f602fa487a0e4\"},\n {\"mcpName\":\"erd_list_refs\",\"commandPath\":[\"erd\",\"list-refs\"],\"group\":\"erd\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"307d766c777bbe8c\"},\n {\"mcpName\":\"erd_list_table_groups\",\"commandPath\":[\"erd\",\"list-table-groups\"],\"group\":\"erd\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"775bff53bbc21c9e\"},\n {\"mcpName\":\"erd_list_tables\",\"commandPath\":[\"erd\",\"list-tables\"],\"group\":\"erd\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"34324dfc7ef461c8\"},\n {\"mcpName\":\"get_attachment\",\"commandPath\":[\"attachment\",\"get\"],\"group\":\"attachment\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuid\":{\"description\":\"Attachment UUID\",\"type\":\"string\"}},\"required\":[\"uuid\"],\"type\":\"object\"},\"required\":[\"uuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"1e0e7f1bf33b669c\"},\n {\"mcpName\":\"get_document\",\"commandPath\":[\"document\",\"get\"],\"group\":\"document\",\"description\":\"Read a document. The body comes back for the types whose create/update take one: markdown → content; openapi → content (the spec text) + format/specVersion/pathCount/operationCount; html → content (the HTML text); diagram → diagramSource/sourceLanguage/edgeStyle/isModule/metadata; erd → metadata only (read tables/refs via erd_list_*).\",\"inputSchema\":{\"properties\":{\"uuid\":{\"description\":\"Document UUID\",\"type\":\"string\"}},\"required\":[\"uuid\"],\"type\":\"object\"},\"required\":[\"uuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"5de278aad6b11bc5\"},\n {\"mcpName\":\"get_project\",\"commandPath\":[\"project\",\"get\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuid\":{\"description\":\"Project UUID\",\"type\":\"string\"}},\"required\":[\"uuid\"],\"type\":\"object\"},\"required\":[\"uuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"192403c3484ac774\"},\n {\"mcpName\":\"get_version\",\"commandPath\":[\"version\",\"get\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"Document UUID\",\"type\":\"string\"},\"versionNumber\":{\"description\":\"Version number\",\"type\":\"integer\"}},\"required\":[\"documentUuid\",\"versionNumber\"],\"type\":\"object\"},\"required\":[\"documentUuid\",\"versionNumber\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"4e308c1a8c7203d1\"},\n {\"mcpName\":\"get_workspace\",\"commandPath\":[\"workspace\",\"get\"],\"group\":\"workspace\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuid\":{\"description\":\"Workspace UUID\",\"type\":\"string\"}},\"required\":[\"uuid\"],\"type\":\"object\"},\"required\":[\"uuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"db6d1b4879d57c56\"},\n {\"mcpName\":\"identity_get_self\",\"commandPath\":[\"tools\",\"run\",\"identity-get-self\"],\"group\":\"generic\",\"description\":\"Return the authenticated MCP caller identity summary; never returns email or token claims.\",\"inputSchema\":{\"additionalProperties\":false,\"properties\":{},\"type\":\"object\"},\"required\":[],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"f29c86804eb91700\"},\n {\"mcpName\":\"list_attachments\",\"commandPath\":[\"attachments\",\"list\"],\"group\":\"attachment\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"projectUuid\":{\"description\":\"Project UUID\",\"type\":\"string\"}},\"required\":[\"projectUuid\"],\"type\":\"object\"},\"required\":[\"projectUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"fae7152d1e4a930b\"},\n {\"mcpName\":\"list_documents\",\"commandPath\":[\"documents\",\"list\"],\"group\":\"document\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"folderUuid\":{\"description\":\"Optional folder UUID\",\"type\":\"string\"},\"limit\":{\"description\":\"Result cap when q is set (default 50)\",\"type\":\"integer\"},\"projectUuid\":{\"description\":\"Project UUID\",\"type\":\"string\"},\"q\":{\"description\":\"Optional full-text query. When provided, results come from the search index instead of folder listing.\",\"type\":\"string\"},\"type\":{\"description\":\"Optional document type filter. Readable values: erd, markdown, diagram, openapi, html.\",\"enum\":[\"erd\",\"markdown\",\"diagram\",\"openapi\",\"html\"],\"type\":\"string\"}},\"type\":\"object\"},\"required\":[],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"4086c52be4dd0c15\"},\n {\"mcpName\":\"list_folders\",\"commandPath\":[\"folders\",\"list\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"projectUuid\":{\"description\":\"Project UUID\",\"type\":\"string\"}},\"required\":[\"projectUuid\"],\"type\":\"object\"},\"required\":[\"projectUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"461dc6735ac92c3b\"},\n {\"mcpName\":\"list_projects\",\"commandPath\":[\"projects\",\"list\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"limit\":{\"description\":\"Result cap when q is set (default 50)\",\"type\":\"integer\"},\"q\":{\"description\":\"Optional full-text query\",\"type\":\"string\"},\"workspaceUuid\":{\"description\":\"Optional Workspace UUID\",\"type\":\"string\"}},\"type\":\"object\"},\"required\":[],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"939bfcc088425771\"},\n {\"mcpName\":\"list_trash\",\"commandPath\":[\"trash\",\"list\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{},\"type\":\"object\"},\"required\":[],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"329250aecc06a298\"},\n {\"mcpName\":\"list_versions\",\"commandPath\":[\"versions\",\"list\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"Document UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"f08f9faee3ba9107\"},\n {\"mcpName\":\"list_workspaces\",\"commandPath\":[\"workspaces\",\"list\"],\"group\":\"workspace\",\"description\":\"\",\"inputSchema\":{\"properties\":{},\"type\":\"object\"},\"required\":[],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"39dba0089fdbdf6a\"},\n {\"mcpName\":\"markdown_append_document\",\"commandPath\":[\"markdown\",\"append-document\"],\"group\":\"markdown\",\"description\":\"Append to Markdown documents. If the appended body is tens of KB or more, prefer request_upload_token (purpose=document.append) and upload the body with curl.\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Appends\",\"items\":{\"properties\":{\"addition\":{\"description\":\"Body addition. 추가할 내용이 크면 (수십 KB 이상) LLM 토큰 절약을 위해 `request_upload_token (purpose=document.append, scopeJson={documentUuid, separator})` 로 uploadUrl 을 받고 curl 로 PUT 으로 보낼 것.\",\"type\":\"string\"},\"separator\":{\"description\":\"Separator between existing body and addition\",\"type\":\"string\"},\"uuid\":{\"description\":\"Document UUID\",\"type\":\"string\"}},\"required\":[\"uuid\",\"addition\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"bf82401f055f29b0\"},\n {\"mcpName\":\"markdown_generate_document\",\"commandPath\":[\"markdown\",\"generate-document\"],\"group\":\"markdown\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Generation requests\",\"items\":{\"properties\":{\"context\":{\"description\":\"Optional JSON context\",\"type\":\"string\"},\"documentUuid\":{\"description\":\"Target document UUID\",\"type\":\"string\"},\"prompt\":{\"description\":\"Generation prompt\",\"type\":\"string\"}},\"required\":[\"documentUuid\",\"prompt\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"1e4724ea42f25743\"},\n {\"mcpName\":\"move_documents\",\"commandPath\":[\"documents\",\"move\"],\"group\":\"document\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"clientMutationId\":{\"description\":\"Optional mutation identifier for client retry tracing\",\"maxLength\":128,\"minLength\":1,\"pattern\":\"^[\\\\x21-\\\\x7E]{1,128}$\",\"type\":\"string\"},\"items\":{\"description\":\"Moves\",\"items\":{\"properties\":{\"newFolderUuid\":{\"description\":\"New folder UUID — null/empty for root\",\"type\":\"string\"},\"targetProjectUuid\":{\"description\":\"Target project UUID — omit to stay in current project\",\"type\":\"string\"},\"targetWorkspaceUuid\":{\"description\":\"Guard only: must match targetProjectUuid workspace\",\"type\":\"string\"},\"uuid\":{\"description\":\"Document UUID\",\"type\":\"string\"}},\"required\":[\"uuid\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"prod\",\"schemaHash\":\"45899053743a0c1e\"},\n {\"mcpName\":\"move_folders\",\"commandPath\":[\"folders\",\"move\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Moves\",\"items\":{\"properties\":{\"newParentFolderUuid\":{\"description\":\"New parent UUID — null/empty for root\",\"type\":\"string\"},\"uuid\":{\"description\":\"Folder UUID\",\"type\":\"string\"}},\"required\":[\"uuid\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"prod\",\"schemaHash\":\"eff4458d2f35587a\"},\n {\"mcpName\":\"move_projects\",\"commandPath\":[\"projects\",\"move\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Moves\",\"items\":{\"properties\":{\"targetWorkspaceUuid\":{\"description\":\"Destination workspace UUID (you need write access there)\",\"type\":\"string\"},\"uuid\":{\"description\":\"Project UUID\",\"type\":\"string\"}},\"required\":[\"uuid\",\"targetWorkspaceUuid\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"prod\",\"schemaHash\":\"abe0196da3c48ad5\"},\n {\"mcpName\":\"request_upload_token\",\"commandPath\":[\"tools\",\"run\",\"request-upload-token\"],\"group\":\"attachment\",\"description\":\"Use this for large payloads of tens of KB or more to save LLM tokens. purpose=mcp.call returns a short-lived bearer token that can call any MCP tool, including erd_apply_changes, via curl. purpose=document.create/update/append uploads document bodies directly to the upload endpoint with PUT/curl. Tokens are reusable for 5 minutes by default.\",\"inputSchema\":{\"properties\":{\"maxBytes\":{\"description\":\"최대 업로드 byte (서버 측 한도)\",\"type\":\"integer\"},\"purpose\":{\"description\":\"Token 용도. `mcp.call` 은 curl 로 /mcp 호출, `document.create/update/append` 는 PUT body 로 본문 업로드, `attachment.upload` 는 파일 bytes 업로드. 콘텐츠가 크면 (수십 KB 이상) LLM 토큰 절약을 위해 이 도구로 5분 재사용 토큰을 받고 curl 로 보내는 것을 강력 권장.\",\"enum\":[\"mcp.call\",\"document.create\",\"document.update\",\"document.append\",\"attachment.upload\"],\"type\":\"string\"},\"scopeJson\":{\"description\":\"선택 — JSON scope. document.create 는 projectUuid, type, title 을 포함하고 creatable type values 는 erd, markdown, diagram, openapi, html. document.update/document.append 는 documentUuid 를 포함. attachment.upload typed: {parentType:TEST_CASE|TEST_EXECUTION,parentUuid,filename,contentType,sizeBytes}.\",\"type\":\"string\"},\"ttlSeconds\":{\"description\":\"TTL (초). 기본 300 (5분)\",\"type\":\"integer\"}},\"required\":[\"purpose\"],\"type\":\"object\"},\"required\":[\"purpose\"],\"payloadMode\":\"binary-upload\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"85867a646f6c652f\"},\n {\"mcpName\":\"restore_versions\",\"commandPath\":[\"versions\",\"restore\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Restores\",\"items\":{\"properties\":{\"documentUuid\":{\"description\":\"Document UUID\",\"type\":\"string\"},\"versionNumber\":{\"description\":\"Version number to restore\",\"type\":\"integer\"}},\"required\":[\"documentUuid\",\"versionNumber\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"prod\",\"schemaHash\":\"005b5b08a19fc605\"},\n {\"mcpName\":\"search_documents\",\"commandPath\":[\"documents\",\"search\"],\"group\":\"document\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"limit\":{\"description\":\"결과 개수 (기본 20, 최대 50)\",\"type\":\"integer\"},\"offset\":{\"description\":\"페이지네이션 offset (기본 0)\",\"type\":\"integer\"},\"projectUuid\":{\"description\":\"특정 프로젝트로 한정 (선택)\",\"type\":\"string\"},\"q\":{\"description\":\"검색 키워드\",\"type\":\"string\"},\"type\":{\"description\":\"Optional document type filter. Readable values: erd, markdown, diagram, openapi, html.\",\"enum\":[\"erd\",\"markdown\",\"diagram\",\"openapi\",\"html\"],\"type\":\"string\"}},\"required\":[\"q\"],\"type\":\"object\"},\"required\":[\"q\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"d24e109383700433\"},\n {\"mcpName\":\"unarchive_documents\",\"commandPath\":[\"documents\",\"unarchive\"],\"group\":\"document\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuids\":{\"description\":\"Document UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"uuids\"],\"type\":\"object\"},\"required\":[\"uuids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"prod\",\"schemaHash\":\"f2810e71583a320f\"},\n {\"mcpName\":\"unarchive_folders\",\"commandPath\":[\"folders\",\"unarchive\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuids\":{\"description\":\"Folder UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"uuids\"],\"type\":\"object\"},\"required\":[\"uuids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"prod\",\"schemaHash\":\"2a24cc44696b7906\"},\n {\"mcpName\":\"unarchive_projects\",\"commandPath\":[\"projects\",\"unarchive\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuids\":{\"description\":\"Project UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"uuids\"],\"type\":\"object\"},\"required\":[\"uuids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"prod\",\"schemaHash\":\"6925e444671afe19\"},\n {\"mcpName\":\"unarchive_workspaces\",\"commandPath\":[\"workspaces\",\"unarchive\"],\"group\":\"workspace\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuids\":{\"description\":\"Workspace UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"uuids\"],\"type\":\"object\"},\"required\":[\"uuids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"prod\",\"schemaHash\":\"8dafe9bc6378c3f2\"},\n {\"mcpName\":\"update_documents\",\"commandPath\":[\"documents\",\"update\"],\"group\":\"document\",\"description\":\"Update documents. If a replacement body is tens of KB or more, prefer request_upload_token (purpose=document.update) and upload the body with curl.\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Updates\",\"items\":{\"properties\":{\"body\":{\"description\":\"Deprecated compatibility alias for typePayload.body when document type is markdown. 본문이 수십 KB 이상으로 크면 LLM 토큰 절약을 위해 `request_upload_token (purpose=document.update)` 를 호출해 uploadUrl 을 받고 curl 로 직접 PUT 으로 보낼 것.\",\"type\":\"string\"},\"title\":{\"description\":\"New title\",\"type\":\"string\"},\"typePayload\":{\"description\":\"Type-specific payload for enabled document types. markdown: {body}; diagram: {diagramSource,sourceLanguage,edgeStyle,isModule,metadata}; openapi: {content}; html: {content} (a full HTML page).\",\"type\":\"object\"},\"uuid\":{\"description\":\"Document UUID\",\"type\":\"string\"}},\"required\":[\"uuid\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"4c3cfe4d25def672\"},\n {\"mcpName\":\"update_folders\",\"commandPath\":[\"folders\",\"update\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Updates\",\"items\":{\"properties\":{\"name\":{\"description\":\"New name\",\"type\":\"string\"},\"uuid\":{\"description\":\"Folder UUID\",\"type\":\"string\"}},\"required\":[\"uuid\",\"name\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"43c58a96ee632b5f\"},\n {\"mcpName\":\"update_projects\",\"commandPath\":[\"projects\",\"update\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Updates\",\"items\":{\"properties\":{\"description\":{\"description\":\"New description\",\"type\":\"string\"},\"name\":{\"description\":\"New name\",\"type\":\"string\"},\"uuid\":{\"description\":\"Project UUID\",\"type\":\"string\"}},\"required\":[\"uuid\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"7d849ef0a830aa8c\"},\n {\"mcpName\":\"update_workspaces\",\"commandPath\":[\"workspaces\",\"update\"],\"group\":\"workspace\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Updates\",\"items\":{\"properties\":{\"description\":{\"description\":\"New description\",\"type\":\"string\"},\"name\":{\"description\":\"New name\",\"type\":\"string\"},\"uuid\":{\"description\":\"Workspace UUID\",\"type\":\"string\"}},\"required\":[\"uuid\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"553275e6da799c5a\"},\n {\"mcpName\":\"upload_attachments\",\"commandPath\":[\"tools\",\"run\",\"upload-attachments\"],\"group\":\"attachment\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Attachments to register\",\"items\":{\"properties\":{\"contentType\":{\"description\":\"MIME type\",\"type\":\"string\"},\"documentUuid\":{\"description\":\"Parent document UUID\",\"type\":\"string\"},\"filename\":{\"description\":\"Original file name\",\"type\":\"string\"},\"sizeBytes\":{\"description\":\"Size in bytes\",\"type\":\"integer\"},\"storageKey\":{\"description\":\"Storage key returned by request_upload_token purpose=attachment.upload\",\"type\":\"string\"}},\"required\":[\"documentUuid\",\"filename\",\"storageKey\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"binary-upload\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"deda4a56fbbe064f\"},\n] satisfies GeneratedToolDefinition[];\n","import type { GeneratedToolDefinition } from \"./types\";\n\nexport const generatedTools = [\n {\"mcpName\":\"mcp__ainecto__create_documents\",\"commandPath\":[\"documents\",\"create\"],\"group\":\"document\",\"description\":\"Create documents. If a document body is tens of KB or more, prefer request_upload_token (purpose=document.create) and upload the body with curl.\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Documents\",\"items\":{\"properties\":{\"body\":{\"description\":\"Deprecated compatibility alias for typePayload.body when document type is markdown. 본문이 수십 KB 이상으로 크면 LLM 토큰 절약을 위해 `request_upload_token (purpose=document.create)` 를 호출해 uploadUrl 을 받고 curl 로 직접 PUT 으로 보낼 것.\",\"type\":\"string\"},\"folderUuid\":{\"description\":\"Optional folder UUID\",\"type\":\"string\"},\"projectUuid\":{\"description\":\"Project UUID\",\"type\":\"string\"},\"title\":{\"description\":\"Document title\",\"type\":\"string\"},\"type\":{\"description\":\"Document type. Enabled values: erd, diagram, markdown, testcase, task.\",\"enum\":[\"erd\",\"diagram\",\"markdown\",\"testcase\",\"task\"],\"type\":\"string\"},\"typePayload\":{\"description\":\"Type-specific payload for enabled document types. markdown: {body}; diagram: {diagramSource,sourceLanguage,edgeStyle,isModule,metadata}; testcase: {defaultEnvironment (max 50 chars), defaultTestAccount (max 100 chars)}; task: no typePayload; board and default statuses are seeded automatically.\",\"type\":\"object\"}},\"required\":[\"projectUuid\",\"type\",\"title\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"6abbab093274fceb\"},\n {\"mcpName\":\"mcp__ainecto__create_folders\",\"commandPath\":[\"folders\",\"create\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Folders\",\"items\":{\"properties\":{\"name\":{\"description\":\"Folder name\",\"type\":\"string\"},\"parentFolderUuid\":{\"description\":\"Parent folder UUID\",\"type\":\"string\"},\"projectUuid\":{\"description\":\"Project UUID\",\"type\":\"string\"}},\"required\":[\"projectUuid\",\"name\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"d423d3c265631664\"},\n {\"mcpName\":\"mcp__ainecto__create_projects\",\"commandPath\":[\"projects\",\"create\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Projects\",\"items\":{\"properties\":{\"description\":{\"description\":\"Description\",\"type\":\"string\"},\"name\":{\"description\":\"Project name\",\"type\":\"string\"},\"projectKey\":{\"description\":\"Unique project key\",\"type\":\"string\"},\"workspaceUuid\":{\"description\":\"Workspace UUID — null uses user's default workspace\",\"type\":\"string\"}},\"required\":[\"name\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"396c80c6cc2ba41a\"},\n {\"mcpName\":\"mcp__ainecto__create_workspaces\",\"commandPath\":[\"workspaces\",\"create\"],\"group\":\"workspace\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Workspaces\",\"items\":{\"properties\":{\"description\":{\"description\":\"Description\",\"type\":\"string\"},\"name\":{\"description\":\"Workspace name\",\"type\":\"string\"}},\"required\":[\"name\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"d663d461f9c9da65\"},\n {\"mcpName\":\"mcp__ainecto__delete_attachments\",\"commandPath\":[\"attachments\",\"delete\"],\"group\":\"attachment\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuids\":{\"description\":\"Attachment UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"uuids\"],\"type\":\"object\"},\"required\":[\"uuids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"dev\",\"schemaHash\":\"6e55e6511d732199\"},\n {\"mcpName\":\"mcp__ainecto__delete_documents\",\"commandPath\":[\"documents\",\"delete\"],\"group\":\"document\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuids\":{\"description\":\"Document UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"uuids\"],\"type\":\"object\"},\"required\":[\"uuids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"dev\",\"schemaHash\":\"5fbc7c142bb4a49d\"},\n {\"mcpName\":\"mcp__ainecto__delete_folders\",\"commandPath\":[\"folders\",\"delete\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuids\":{\"description\":\"Folder UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"uuids\"],\"type\":\"object\"},\"required\":[\"uuids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"dev\",\"schemaHash\":\"49fa7c0f823871b2\"},\n {\"mcpName\":\"mcp__ainecto__delete_projects\",\"commandPath\":[\"projects\",\"delete\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuids\":{\"description\":\"Project UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"uuids\"],\"type\":\"object\"},\"required\":[\"uuids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"dev\",\"schemaHash\":\"e1a86ddaa9638298\"},\n {\"mcpName\":\"mcp__ainecto__delete_workspaces\",\"commandPath\":[\"workspaces\",\"delete\"],\"group\":\"workspace\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuids\":{\"description\":\"Workspace UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"uuids\"],\"type\":\"object\"},\"required\":[\"uuids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"dev\",\"schemaHash\":\"2aca644f7a105b06\"},\n {\"mcpName\":\"mcp__ainecto__diagram_apply_changes\",\"commandPath\":[\"tools\",\"run\",\"diagram-apply-changes\"],\"group\":\"generic\",\"description\":\"Required single-call mutation path for diagram node/edge/group create/update/delete changes. Put nodes, edges, and groups in one request and call this once. Do not look for type-specific diagram CUD tools; this tool is the only diagram CUD entry point.\",\"inputSchema\":{\"properties\":{\"description\":{\"description\":\"Reason for batch (audit)\",\"type\":\"string\"},\"diagramUuid\":{\"description\":\"Diagram UUID\",\"type\":\"string\"},\"edges\":{\"description\":\"Edge operations\",\"items\":{\"properties\":{\"action\":{\"description\":\"Operation kind\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"bridgeType\":{\"description\":\"Bridge type\",\"type\":\"string\"},\"fromUuid\":{\"description\":\"Source\",\"type\":\"string\"},\"label\":{\"description\":\"Edge label\",\"type\":\"string\"},\"lineStyle\":{\"description\":\"Line style\",\"type\":\"string\"},\"strokeColor\":{\"description\":\"Stroke color\",\"type\":\"string\"},\"strokeWidth\":{\"description\":\"Stroke width\",\"type\":\"integer\"},\"toUuid\":{\"description\":\"Target\",\"type\":\"string\"},\"uuid\":{\"description\":\"Required for update/delete\",\"type\":\"string\"}},\"required\":[\"action\"],\"type\":\"object\"},\"type\":\"array\"},\"groups\":{\"description\":\"Group operations\",\"items\":{\"properties\":{\"action\":{\"description\":\"Operation kind\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"collapsed\":{\"description\":\"Collapsed state\",\"type\":\"boolean\"},\"color\":{\"description\":\"Group color\",\"type\":\"string\"},\"linkMode\":{\"description\":\"Link mode\",\"type\":\"string\"},\"linkedDiagramUuid\":{\"description\":\"Linked diagram UUID\",\"type\":\"string\"},\"name\":{\"description\":\"Group name\",\"type\":\"string\"},\"parentGroupUuid\":{\"description\":\"Parent group UUID\",\"type\":\"string\"},\"sortOrder\":{\"description\":\"Sort order\",\"type\":\"integer\"},\"uuid\":{\"description\":\"Required for update/delete\",\"type\":\"string\"}},\"required\":[\"action\"],\"type\":\"object\"},\"type\":\"array\"},\"nodes\":{\"description\":\"Node operations\",\"items\":{\"properties\":{\"action\":{\"description\":\"Operation kind\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"fillColor\":{\"description\":\"Fill color\",\"type\":\"string\"},\"groupUuid\":{\"description\":\"Group UUID; empty string clears membership\",\"type\":\"string\"},\"height\":{\"description\":\"Height\",\"type\":\"number\"},\"shape\":{\"description\":\"Node shape (start/end/diamond/cylinder/parallelogram/stadium/hexagon/rect/roundRect/...)\",\"enum\":[\"rect\",\"roundRect\",\"stadium\",\"diamond\",\"decision\",\"circle\",\"start\",\"doubleCircle\",\"end\",\"hexagon\",\"cylinder\",\"parallelogram\"],\"type\":\"string\"},\"strokeColor\":{\"description\":\"Stroke color\",\"type\":\"string\"},\"text\":{\"description\":\"Node text/label. Supports newlines (\\\\n) for multi-line display.\",\"maxLength\":4000,\"type\":\"string\"},\"textColor\":{\"description\":\"Text color\",\"type\":\"string\"},\"type\":{\"description\":\"Node type\",\"type\":\"string\"},\"uuid\":{\"description\":\"Required for update/delete; optional for create\",\"type\":\"string\"},\"width\":{\"description\":\"Width\",\"type\":\"number\"},\"x\":{\"description\":\"X\",\"type\":\"number\"},\"y\":{\"description\":\"Y\",\"type\":\"number\"}},\"required\":[\"action\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"diagramUuid\",\"description\"],\"type\":\"object\"},\"required\":[\"description\",\"diagramUuid\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"1c87428fea4bb77a\"},\n {\"mcpName\":\"mcp__ainecto__diagram_get_edge\",\"commandPath\":[\"tools\",\"run\",\"diagram-get-edge\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"edgeUuid\":{\"description\":\"Edge UUID\",\"type\":\"string\"}},\"required\":[\"edgeUuid\"],\"type\":\"object\"},\"required\":[\"edgeUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"b147277e74d3b0f7\"},\n {\"mcpName\":\"mcp__ainecto__diagram_get_group\",\"commandPath\":[\"tools\",\"run\",\"diagram-get-group\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"groupUuid\":{\"description\":\"Group UUID\",\"type\":\"string\"}},\"required\":[\"groupUuid\"],\"type\":\"object\"},\"required\":[\"groupUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"4516fc00303ab8db\"},\n {\"mcpName\":\"mcp__ainecto__diagram_get_node\",\"commandPath\":[\"tools\",\"run\",\"diagram-get-node\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"nodeUuid\":{\"description\":\"Node UUID\",\"type\":\"string\"}},\"required\":[\"nodeUuid\"],\"type\":\"object\"},\"required\":[\"nodeUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"20f370ff4438c4b0\"},\n {\"mcpName\":\"mcp__ainecto__diagram_get_pending_llm_requests\",\"commandPath\":[\"tools\",\"run\",\"diagram-get-pending-llm-requests\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{},\"type\":\"object\"},\"required\":[],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"0ec4dd6d61584a98\"},\n {\"mcpName\":\"mcp__ainecto__diagram_list_edges\",\"commandPath\":[\"tools\",\"run\",\"diagram-list-edges\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"diagramUuid\":{\"description\":\"Diagram document UUID\",\"type\":\"string\"}},\"required\":[\"diagramUuid\"],\"type\":\"object\"},\"required\":[\"diagramUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"fee200dd1433daf9\"},\n {\"mcpName\":\"mcp__ainecto__diagram_list_groups\",\"commandPath\":[\"tools\",\"run\",\"diagram-list-groups\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"diagramUuid\":{\"description\":\"Diagram document UUID\",\"type\":\"string\"}},\"required\":[\"diagramUuid\"],\"type\":\"object\"},\"required\":[\"diagramUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"852a19cda307f863\"},\n {\"mcpName\":\"mcp__ainecto__diagram_list_nodes\",\"commandPath\":[\"tools\",\"run\",\"diagram-list-nodes\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"diagramUuid\":{\"description\":\"Diagram document UUID\",\"type\":\"string\"}},\"required\":[\"diagramUuid\"],\"type\":\"object\"},\"required\":[\"diagramUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"a8c41752151ade3e\"},\n {\"mcpName\":\"mcp__ainecto__diagram_submit_llm_result\",\"commandPath\":[\"tools\",\"run\",\"diagram-submit-llm-result\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"creditsCharged\":{\"description\":\"Deprecated; ignored. Credits are calculated server-side from tokens.\",\"type\":\"integer\"},\"inputTokens\":{\"description\":\"Input token count\",\"type\":\"integer\"},\"outputTokens\":{\"description\":\"Output token count\",\"type\":\"integer\"},\"result\":{\"description\":\"LLM result text\",\"type\":\"string\"},\"uuid\":{\"description\":\"LLM request UUID\",\"type\":\"string\"}},\"required\":[\"uuid\",\"result\"],\"type\":\"object\"},\"required\":[\"result\",\"uuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"374654baa87c1bb8\"},\n {\"mcpName\":\"mcp__ainecto__diagram_update_llm_request_status\",\"commandPath\":[\"tools\",\"run\",\"diagram-update-llm-request-status\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"errorMessage\":{\"description\":\"Error message (when status=FAILED)\",\"type\":\"string\"},\"status\":{\"description\":\"Target status — currently only FAILED is mutable from caller side\",\"enum\":[\"FAILED\"],\"type\":\"string\"},\"uuid\":{\"description\":\"LLM request UUID\",\"type\":\"string\"}},\"required\":[\"uuid\",\"status\"],\"type\":\"object\"},\"required\":[\"status\",\"uuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"25537b63698bc33d\"},\n {\"mcpName\":\"mcp__ainecto__disable_shares\",\"commandPath\":[\"tools\",\"run\",\"disable-shares\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"targetType\":{\"description\":\"Share target type\",\"enum\":[\"project\",\"folder\",\"document\"],\"type\":\"string\"},\"targetUuids\":{\"description\":\"Target UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"targetType\",\"targetUuids\"],\"type\":\"object\"},\"required\":[\"targetType\",\"targetUuids\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"a4b4358eff0faa97\"},\n {\"mcpName\":\"mcp__ainecto__enable_shares\",\"commandPath\":[\"tools\",\"run\",\"enable-shares\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"targetType\":{\"description\":\"Share target type\",\"enum\":[\"project\",\"folder\",\"document\"],\"type\":\"string\"},\"targetUuids\":{\"description\":\"Target UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"targetType\",\"targetUuids\"],\"type\":\"object\"},\"required\":[\"targetType\",\"targetUuids\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"ebace643de07e826\"},\n {\"mcpName\":\"mcp__ainecto__erd_apply_changes\",\"commandPath\":[\"erd\",\"apply-changes\"],\"group\":\"erd\",\"description\":\"Required single-call mutation path for ERD create/update/delete changes. Put tables, columns, indexes, refs, enums, enum_values, and table groups in one operations array and call this once.\\nRules: (1) all data field names are snake_case; (2) for create, generate your own UUIDs and put them in data.uuid, then later operations in the same batch may reference those UUIDs without read-back calls; (3) enum values are separate enum_value operations, not inline on enum; (4) ref.relationship uses short dbdiagram-style symbols: >, <, or -; (5) ref_column operations map FK columns explicitly, never automatically.\\nDo not look for type-specific ERD CUD tools; this tool is the only ERD CUD entry point. If operations is very large, use mcp__ainecto__request_upload_token with purpose=mcp.call and send the tools/call payload with curl to save LLM tokens.\\nOne-call worked example:\\n{\\n \\\"documentUuid\\\": \\\"erd-doc-uuid\\\",\\n \\\"description\\\": \\\"create users/posts ERD\\\",\\n \\\"operations\\\": [\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"table\\\",\\\"data\\\":{\\\"uuid\\\":\\\"tbl_users\\\",\\\"name\\\":\\\"users\\\",\\\"display_order\\\":1}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"column\\\",\\\"data\\\":{\\\"uuid\\\":\\\"col_users_id\\\",\\\"table_uuid\\\":\\\"tbl_users\\\",\\\"name\\\":\\\"id\\\",\\\"type\\\":\\\"bigint\\\",\\\"is_pk\\\":true,\\\"is_not_null\\\":true,\\\"display_order\\\":1}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"column\\\",\\\"data\\\":{\\\"uuid\\\":\\\"col_users_email\\\",\\\"table_uuid\\\":\\\"tbl_users\\\",\\\"name\\\":\\\"email\\\",\\\"type\\\":\\\"varchar(255)\\\",\\\"is_unique\\\":true,\\\"is_not_null\\\":true,\\\"display_order\\\":2}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"table\\\",\\\"data\\\":{\\\"uuid\\\":\\\"tbl_posts\\\",\\\"name\\\":\\\"posts\\\",\\\"display_order\\\":2}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"column\\\",\\\"data\\\":{\\\"uuid\\\":\\\"col_posts_id\\\",\\\"table_uuid\\\":\\\"tbl_posts\\\",\\\"name\\\":\\\"id\\\",\\\"type\\\":\\\"bigint\\\",\\\"is_pk\\\":true,\\\"is_not_null\\\":true,\\\"display_order\\\":1}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"column\\\",\\\"data\\\":{\\\"uuid\\\":\\\"col_posts_author_id\\\",\\\"table_uuid\\\":\\\"tbl_posts\\\",\\\"name\\\":\\\"author_id\\\",\\\"type\\\":\\\"bigint\\\",\\\"is_not_null\\\":true,\\\"display_order\\\":2}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"column\\\",\\\"data\\\":{\\\"uuid\\\":\\\"col_posts_status\\\",\\\"table_uuid\\\":\\\"tbl_posts\\\",\\\"name\\\":\\\"status\\\",\\\"type\\\":\\\"post_status\\\",\\\"is_not_null\\\":true,\\\"display_order\\\":3}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"enum\\\",\\\"data\\\":{\\\"uuid\\\":\\\"enum_post_status\\\",\\\"name\\\":\\\"post_status\\\"}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"enum_value\\\",\\\"data\\\":{\\\"uuid\\\":\\\"enum_post_status_draft\\\",\\\"enum_uuid\\\":\\\"enum_post_status\\\",\\\"value\\\":\\\"draft\\\",\\\"display_order\\\":1}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"enum_value\\\",\\\"data\\\":{\\\"uuid\\\":\\\"enum_post_status_published\\\",\\\"enum_uuid\\\":\\\"enum_post_status\\\",\\\"value\\\":\\\"published\\\",\\\"display_order\\\":2}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"ref\\\",\\\"data\\\":{\\\"uuid\\\":\\\"ref_posts_author\\\",\\\"name\\\":\\\"fk_posts_author\\\",\\\"from_table_uuid\\\":\\\"tbl_posts\\\",\\\"to_table_uuid\\\":\\\"tbl_users\\\",\\\"relationship\\\":\\\">\\\",\\\"on_delete\\\":\\\"cascade\\\"}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"ref_column\\\",\\\"data\\\":{\\\"uuid\\\":\\\"refcol_posts_author\\\",\\\"ref_uuid\\\":\\\"ref_posts_author\\\",\\\"from_column_uuid\\\":\\\"col_posts_author_id\\\",\\\"to_column_uuid\\\":\\\"col_users_id\\\",\\\"display_order\\\":1}}\\n ]\\n}\",\"inputSchema\":{\"properties\":{\"arrangeNewTables\":{\"description\":\"Whether to auto-place newly-created tables after the batch; defaults to true\",\"type\":\"boolean\"},\"description\":{\"description\":\"Reason for batch (audit)\",\"type\":\"string\"},\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"},\"operations\":{\"description\":\"Atomic create/update/delete operations\",\"items\":{\"description\":\"One ERD mutation. Use a single operations array with client-generated data.uuid values to create cross-referenced tables, columns, enums, refs, and ref_columns without read-back calls.\",\"discriminator\":{\"propertyName\":\"type\"},\"oneOf\":[{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='table'.\",\"properties\":{\"alias\":{\"description\":\"Display alias.\",\"type\":\"string\"},\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"header_color\":{\"description\":\"Header color.\",\"type\":\"string\"},\"name\":{\"description\":\"Table name. Required for create.\",\"type\":\"string\"},\"note\":{\"description\":\"Table note.\",\"type\":\"string\"},\"schema_name\":{\"description\":\"Schema name.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"required\":[\"name\"],\"title\":\"table data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='table'.\",\"properties\":{\"alias\":{\"description\":\"Display alias.\",\"type\":\"string\"},\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"header_color\":{\"description\":\"Header color.\",\"type\":\"string\"},\"name\":{\"description\":\"Table name. Required for create.\",\"type\":\"string\"},\"note\":{\"description\":\"Table note.\",\"type\":\"string\"},\"schema_name\":{\"description\":\"Schema name.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"table data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"table\",\"description\":\"Must be 'table' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"table operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='column'.\",\"properties\":{\"default_value\":{\"description\":\"Default value.\",\"type\":\"string\"},\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"is_increment\":{\"description\":\"Auto-increment flag.\",\"type\":\"boolean\"},\"is_not_null\":{\"description\":\"Not-null flag.\",\"type\":\"boolean\"},\"is_pk\":{\"description\":\"Primary key flag.\",\"type\":\"boolean\"},\"is_unique\":{\"description\":\"Unique flag.\",\"type\":\"boolean\"},\"name\":{\"description\":\"Column name.\",\"type\":\"string\"},\"note\":{\"description\":\"Column note.\",\"type\":\"string\"},\"table_uuid\":{\"description\":\"Parent table UUID. Required for create; may be a data.uuid from an earlier table operation in this batch.\",\"type\":\"string\"},\"type\":{\"description\":\"SQL data type. Use this exact field name; do not send data_type.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"required\":[\"table_uuid\"],\"title\":\"column data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='column'.\",\"properties\":{\"default_value\":{\"description\":\"Default value.\",\"type\":\"string\"},\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"is_increment\":{\"description\":\"Auto-increment flag.\",\"type\":\"boolean\"},\"is_not_null\":{\"description\":\"Not-null flag.\",\"type\":\"boolean\"},\"is_pk\":{\"description\":\"Primary key flag.\",\"type\":\"boolean\"},\"is_unique\":{\"description\":\"Unique flag.\",\"type\":\"boolean\"},\"name\":{\"description\":\"Column name.\",\"type\":\"string\"},\"note\":{\"description\":\"Column note.\",\"type\":\"string\"},\"table_uuid\":{\"description\":\"Parent table UUID. Required for create; may be a data.uuid from an earlier table operation in this batch.\",\"type\":\"string\"},\"type\":{\"description\":\"SQL data type. Use this exact field name; do not send data_type.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"column data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"column\",\"description\":\"Must be 'column' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"column operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='index'.\",\"properties\":{\"is_pk\":{\"description\":\"Primary key index flag.\",\"type\":\"boolean\"},\"is_unique\":{\"description\":\"Unique index flag.\",\"type\":\"boolean\"},\"name\":{\"description\":\"Index name.\",\"type\":\"string\"},\"note\":{\"description\":\"Index note.\",\"type\":\"string\"},\"table_uuid\":{\"description\":\"Parent table UUID. Required for create.\",\"type\":\"string\"},\"type\":{\"description\":\"Index type.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"required\":[\"table_uuid\"],\"title\":\"index data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='index'.\",\"properties\":{\"is_pk\":{\"description\":\"Primary key index flag.\",\"type\":\"boolean\"},\"is_unique\":{\"description\":\"Unique index flag.\",\"type\":\"boolean\"},\"name\":{\"description\":\"Index name.\",\"type\":\"string\"},\"note\":{\"description\":\"Index note.\",\"type\":\"string\"},\"table_uuid\":{\"description\":\"Parent table UUID. Required for create.\",\"type\":\"string\"},\"type\":{\"description\":\"Index type.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"index data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"index\",\"description\":\"Must be 'index' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"index operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='index_column'.\",\"properties\":{\"column_uuid\":{\"description\":\"Column UUID. Required for create.\",\"type\":\"string\"},\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"index_uuid\":{\"description\":\"Index UUID. Required for create.\",\"type\":\"string\"},\"sort_order\":{\"description\":\"Sort order, for example ASC or DESC.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"required\":[\"index_uuid\",\"column_uuid\"],\"title\":\"index_column data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='index_column'.\",\"properties\":{\"column_uuid\":{\"description\":\"Column UUID. Required for create.\",\"type\":\"string\"},\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"index_uuid\":{\"description\":\"Index UUID. Required for create.\",\"type\":\"string\"},\"sort_order\":{\"description\":\"Sort order, for example ASC or DESC.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"index_column data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"index_column\",\"description\":\"Must be 'index_column' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"index_column operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='ref'.\",\"properties\":{\"from_table_uuid\":{\"description\":\"Source table UUID. Required for create.\",\"type\":\"string\"},\"name\":{\"description\":\"Reference name.\",\"type\":\"string\"},\"on_delete\":{\"description\":\"ON DELETE action.\",\"type\":\"string\"},\"on_update\":{\"description\":\"ON UPDATE action.\",\"type\":\"string\"},\"relationship\":{\"description\":\"Required for create. Use short dbdiagram-style relationship symbols.\",\"enum\":[\">\",\"<\",\"-\"],\"type\":\"string\"},\"to_table_uuid\":{\"description\":\"Target table UUID. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"required\":[\"from_table_uuid\",\"to_table_uuid\",\"relationship\"],\"title\":\"ref data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='ref'.\",\"properties\":{\"from_table_uuid\":{\"description\":\"Source table UUID. Required for create.\",\"type\":\"string\"},\"name\":{\"description\":\"Reference name.\",\"type\":\"string\"},\"on_delete\":{\"description\":\"ON DELETE action.\",\"type\":\"string\"},\"on_update\":{\"description\":\"ON UPDATE action.\",\"type\":\"string\"},\"relationship\":{\"description\":\"Required for create. Use short dbdiagram-style relationship symbols.\",\"enum\":[\">\",\"<\",\"-\"],\"type\":\"string\"},\"to_table_uuid\":{\"description\":\"Target table UUID. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"ref data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"ref\",\"description\":\"Must be 'ref' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"ref operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='ref_column'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"from_column_uuid\":{\"description\":\"Source column UUID. Required for create.\",\"type\":\"string\"},\"ref_uuid\":{\"description\":\"Reference UUID. Required for create; may be a data.uuid from an earlier ref operation.\",\"type\":\"string\"},\"to_column_uuid\":{\"description\":\"Target column UUID. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"required\":[\"ref_uuid\",\"from_column_uuid\",\"to_column_uuid\"],\"title\":\"ref_column data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='ref_column'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"from_column_uuid\":{\"description\":\"Source column UUID. Required for create.\",\"type\":\"string\"},\"ref_uuid\":{\"description\":\"Reference UUID. Required for create; may be a data.uuid from an earlier ref operation.\",\"type\":\"string\"},\"to_column_uuid\":{\"description\":\"Target column UUID. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"ref_column data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"ref_column\",\"description\":\"Must be 'ref_column' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"ref_column operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='enum'.\",\"properties\":{\"name\":{\"description\":\"Enum name.\",\"type\":\"string\"},\"note\":{\"description\":\"Enum note.\",\"type\":\"string\"},\"schema_name\":{\"description\":\"Schema name.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"enum data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='enum'.\",\"properties\":{\"name\":{\"description\":\"Enum name.\",\"type\":\"string\"},\"note\":{\"description\":\"Enum note.\",\"type\":\"string\"},\"schema_name\":{\"description\":\"Schema name.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"enum data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"enum\",\"description\":\"Must be 'enum' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"enum operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='enum_value'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"enum_uuid\":{\"description\":\"Parent enum UUID. Required for create; may be a data.uuid from an earlier enum operation.\",\"type\":\"string\"},\"note\":{\"description\":\"Enum value note.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"},\"value\":{\"description\":\"Enum value. Inline enum values on enum are not persisted; create enum_value operations.\",\"type\":\"string\"}},\"required\":[\"enum_uuid\"],\"title\":\"enum_value data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='enum_value'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"enum_uuid\":{\"description\":\"Parent enum UUID. Required for create; may be a data.uuid from an earlier enum operation.\",\"type\":\"string\"},\"note\":{\"description\":\"Enum value note.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"},\"value\":{\"description\":\"Enum value. Inline enum values on enum are not persisted; create enum_value operations.\",\"type\":\"string\"}},\"title\":\"enum_value data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"enum_value\",\"description\":\"Must be 'enum_value' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"enum_value operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='table_group'.\",\"properties\":{\"color\":{\"description\":\"Group color.\",\"type\":\"string\"},\"name\":{\"description\":\"Table group name.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"table_group data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='table_group'.\",\"properties\":{\"color\":{\"description\":\"Group color.\",\"type\":\"string\"},\"name\":{\"description\":\"Table group name.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"table_group data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"table_group\",\"description\":\"Must be 'table_group' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"table_group operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='table_group_table'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"group_uuid\":{\"description\":\"Table group UUID. Required for create.\",\"type\":\"string\"},\"schema_name\":{\"description\":\"Table schema name.\",\"type\":\"string\"},\"table_name\":{\"description\":\"Table name. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"required\":[\"group_uuid\",\"table_name\"],\"title\":\"table_group_table data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='table_group_table'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"group_uuid\":{\"description\":\"Table group UUID. Required for create.\",\"type\":\"string\"},\"schema_name\":{\"description\":\"Table schema name.\",\"type\":\"string\"},\"table_name\":{\"description\":\"Table name. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"table_group_table data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"table_group_table\",\"description\":\"Must be 'table_group_table' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"table_group_table operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='table_group_note'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"group_uuid\":{\"description\":\"Table group UUID. Required for create.\",\"type\":\"string\"},\"note_uuid\":{\"description\":\"Note UUID. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"required\":[\"group_uuid\",\"note_uuid\"],\"title\":\"table_group_note data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='table_group_note'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"group_uuid\":{\"description\":\"Table group UUID. Required for create.\",\"type\":\"string\"},\"note_uuid\":{\"description\":\"Note UUID. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"table_group_note data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"table_group_note\",\"description\":\"Must be 'table_group_note' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"table_group_note operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='filter'.\",\"properties\":{\"included_tables\":{\"description\":\"JSON string/list of included tables.\",\"type\":\"string\"},\"is_default\":{\"description\":\"Default filter flag.\",\"type\":\"boolean\"},\"name\":{\"description\":\"Filter name.\",\"type\":\"string\"},\"table_groups\":{\"description\":\"JSON string/object of table groups.\",\"type\":\"string\"},\"table_positions\":{\"description\":\"JSON string/object of table positions.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"filter data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='filter'.\",\"properties\":{\"included_tables\":{\"description\":\"JSON string/list of included tables.\",\"type\":\"string\"},\"is_default\":{\"description\":\"Default filter flag.\",\"type\":\"boolean\"},\"name\":{\"description\":\"Filter name.\",\"type\":\"string\"},\"table_groups\":{\"description\":\"JSON string/object of table groups.\",\"type\":\"string\"},\"table_positions\":{\"description\":\"JSON string/object of table positions.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"filter data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"filter\",\"description\":\"Must be 'filter' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"filter operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='note'.\",\"properties\":{\"color\":{\"description\":\"Note color.\",\"type\":\"string\"},\"content\":{\"description\":\"Note content.\",\"type\":\"string\"},\"height\":{\"description\":\"Height.\",\"type\":\"integer\"},\"icon_name\":{\"description\":\"Icon name.\",\"type\":\"string\"},\"position_x\":{\"description\":\"X position.\",\"type\":\"integer\"},\"position_y\":{\"description\":\"Y position.\",\"type\":\"integer\"},\"title\":{\"description\":\"Note title.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"},\"width\":{\"description\":\"Width.\",\"type\":\"integer\"}},\"title\":\"note data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='note'.\",\"properties\":{\"color\":{\"description\":\"Note color.\",\"type\":\"string\"},\"content\":{\"description\":\"Note content.\",\"type\":\"string\"},\"height\":{\"description\":\"Height.\",\"type\":\"integer\"},\"icon_name\":{\"description\":\"Icon name.\",\"type\":\"string\"},\"position_x\":{\"description\":\"X position.\",\"type\":\"integer\"},\"position_y\":{\"description\":\"Y position.\",\"type\":\"integer\"},\"title\":{\"description\":\"Note title.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"},\"width\":{\"description\":\"Width.\",\"type\":\"integer\"}},\"title\":\"note data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"note\",\"description\":\"Must be 'note' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"note operation\",\"type\":\"object\"}],\"properties\":{\"data\":{\"description\":\"Type-specific payload. All field names are snake_case. For create, data.uuid may be client-supplied and referenced by later operations in the same batch.\",\"oneOf\":[{\"description\":\"Payload for operation.type='table'.\",\"properties\":{\"alias\":{\"description\":\"Display alias.\",\"type\":\"string\"},\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"header_color\":{\"description\":\"Header color.\",\"type\":\"string\"},\"name\":{\"description\":\"Table name. Required for create.\",\"type\":\"string\"},\"note\":{\"description\":\"Table note.\",\"type\":\"string\"},\"schema_name\":{\"description\":\"Schema name.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"table data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='column'.\",\"properties\":{\"default_value\":{\"description\":\"Default value.\",\"type\":\"string\"},\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"is_increment\":{\"description\":\"Auto-increment flag.\",\"type\":\"boolean\"},\"is_not_null\":{\"description\":\"Not-null flag.\",\"type\":\"boolean\"},\"is_pk\":{\"description\":\"Primary key flag.\",\"type\":\"boolean\"},\"is_unique\":{\"description\":\"Unique flag.\",\"type\":\"boolean\"},\"name\":{\"description\":\"Column name.\",\"type\":\"string\"},\"note\":{\"description\":\"Column note.\",\"type\":\"string\"},\"table_uuid\":{\"description\":\"Parent table UUID. Required for create; may be a data.uuid from an earlier table operation in this batch.\",\"type\":\"string\"},\"type\":{\"description\":\"SQL data type. Use this exact field name; do not send data_type.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"column data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='index'.\",\"properties\":{\"is_pk\":{\"description\":\"Primary key index flag.\",\"type\":\"boolean\"},\"is_unique\":{\"description\":\"Unique index flag.\",\"type\":\"boolean\"},\"name\":{\"description\":\"Index name.\",\"type\":\"string\"},\"note\":{\"description\":\"Index note.\",\"type\":\"string\"},\"table_uuid\":{\"description\":\"Parent table UUID. Required for create.\",\"type\":\"string\"},\"type\":{\"description\":\"Index type.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"index data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='index_column'.\",\"properties\":{\"column_uuid\":{\"description\":\"Column UUID. Required for create.\",\"type\":\"string\"},\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"index_uuid\":{\"description\":\"Index UUID. Required for create.\",\"type\":\"string\"},\"sort_order\":{\"description\":\"Sort order, for example ASC or DESC.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"index_column data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='ref'.\",\"properties\":{\"from_table_uuid\":{\"description\":\"Source table UUID. Required for create.\",\"type\":\"string\"},\"name\":{\"description\":\"Reference name.\",\"type\":\"string\"},\"on_delete\":{\"description\":\"ON DELETE action.\",\"type\":\"string\"},\"on_update\":{\"description\":\"ON UPDATE action.\",\"type\":\"string\"},\"relationship\":{\"description\":\"Required for create. Use short dbdiagram-style relationship symbols.\",\"enum\":[\">\",\"<\",\"-\"],\"type\":\"string\"},\"to_table_uuid\":{\"description\":\"Target table UUID. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"ref data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='ref_column'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"from_column_uuid\":{\"description\":\"Source column UUID. Required for create.\",\"type\":\"string\"},\"ref_uuid\":{\"description\":\"Reference UUID. Required for create; may be a data.uuid from an earlier ref operation.\",\"type\":\"string\"},\"to_column_uuid\":{\"description\":\"Target column UUID. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"ref_column data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='enum'.\",\"properties\":{\"name\":{\"description\":\"Enum name.\",\"type\":\"string\"},\"note\":{\"description\":\"Enum note.\",\"type\":\"string\"},\"schema_name\":{\"description\":\"Schema name.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"enum data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='enum_value'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"enum_uuid\":{\"description\":\"Parent enum UUID. Required for create; may be a data.uuid from an earlier enum operation.\",\"type\":\"string\"},\"note\":{\"description\":\"Enum value note.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"},\"value\":{\"description\":\"Enum value. Inline enum values on enum are not persisted; create enum_value operations.\",\"type\":\"string\"}},\"title\":\"enum_value data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='table_group'.\",\"properties\":{\"color\":{\"description\":\"Group color.\",\"type\":\"string\"},\"name\":{\"description\":\"Table group name.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"table_group data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='table_group_table'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"group_uuid\":{\"description\":\"Table group UUID. Required for create.\",\"type\":\"string\"},\"schema_name\":{\"description\":\"Table schema name.\",\"type\":\"string\"},\"table_name\":{\"description\":\"Table name. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"table_group_table data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='table_group_note'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"group_uuid\":{\"description\":\"Table group UUID. Required for create.\",\"type\":\"string\"},\"note_uuid\":{\"description\":\"Note UUID. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"table_group_note data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='filter'.\",\"properties\":{\"included_tables\":{\"description\":\"JSON string/list of included tables.\",\"type\":\"string\"},\"is_default\":{\"description\":\"Default filter flag.\",\"type\":\"boolean\"},\"name\":{\"description\":\"Filter name.\",\"type\":\"string\"},\"table_groups\":{\"description\":\"JSON string/object of table groups.\",\"type\":\"string\"},\"table_positions\":{\"description\":\"JSON string/object of table positions.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"filter data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='note'.\",\"properties\":{\"color\":{\"description\":\"Note color.\",\"type\":\"string\"},\"content\":{\"description\":\"Note content.\",\"type\":\"string\"},\"height\":{\"description\":\"Height.\",\"type\":\"integer\"},\"icon_name\":{\"description\":\"Icon name.\",\"type\":\"string\"},\"position_x\":{\"description\":\"X position.\",\"type\":\"integer\"},\"position_y\":{\"description\":\"Y position.\",\"type\":\"integer\"},\"title\":{\"description\":\"Note title.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"},\"width\":{\"description\":\"Width.\",\"type\":\"integer\"}},\"title\":\"note data\",\"type\":\"object\"}],\"type\":\"object\"},\"op\":{\"description\":\"Operation. For create, put any new UUID in data.uuid; for update/delete, put target UUID in operation.uuid.\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"description\":\"ERD entity type. This selects the operation.data shape.\",\"enum\":[\"table\",\"column\",\"index\",\"index_column\",\"ref\",\"ref_column\",\"enum\",\"enum_value\",\"table_group\",\"table_group_table\",\"table_group_note\",\"filter\",\"note\"],\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete. Do not use this for create; use data.uuid instead.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"documentUuid\",\"description\",\"operations\"],\"type\":\"object\"},\"required\":[\"description\",\"documentUuid\",\"operations\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"dd64d1f996060ab1\"},\n {\"mcpName\":\"mcp__ainecto__erd_arrange_tables\",\"commandPath\":[\"erd\",\"arrange-tables\"],\"group\":\"erd\",\"description\":\"Arrange ERD tables after edits. Default incremental mode places newly-created tables while preserving existing positions; full=true re-layouts the entire diagram. Use after several separate table edits to tidy the canvas.\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"},\"full\":{\"description\":\"Re-layout the ENTIRE diagram (overwrites existing positions). Default false = arrange only newly-added (uncoordinated) tables to the top-right while preserving existing table positions. Call this after creating several tables to tidy them up.\",\"type\":\"boolean\"}},\"required\":[\"documentUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"d2e66548e3d60d30\"},\n {\"mcpName\":\"mcp__ainecto__erd_get_enum\",\"commandPath\":[\"erd\",\"get-enum\"],\"group\":\"erd\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"},\"enumUuid\":{\"description\":\"Enum UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\",\"enumUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\",\"enumUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"1e477b3fadb50c6b\"},\n {\"mcpName\":\"mcp__ainecto__erd_get_ref\",\"commandPath\":[\"erd\",\"get-ref\"],\"group\":\"erd\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"},\"refUuid\":{\"description\":\"Relationship UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\",\"refUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\",\"refUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"40bf1eb02e7a9730\"},\n {\"mcpName\":\"mcp__ainecto__erd_get_table\",\"commandPath\":[\"erd\",\"get-table\"],\"group\":\"erd\",\"description\":\"Get one ERD table with nested columns and indexes. Returns persistent table/column/index UUIDs usable directly as mcp__ainecto__erd_apply_changes update/delete targets and ref_column column references. Column fields use apply_changes snake_case names: uuid, table_uuid, name, type, is_pk, is_unique, is_not_null, is_increment, default_value, note, display_order. Index fields include uuid, name, columns (column UUIDs), is_unique, is_pk, type.\",\"inputSchema\":{\"description\":\"Get one ERD table with nested columns and indexes. Returns persistent table/column/index UUIDs usable directly as mcp__ainecto__erd_apply_changes update/delete targets and ref_column column references. Column fields use apply_changes snake_case names: uuid, table_uuid, name, type, is_pk, is_unique, is_not_null, is_increment, default_value, note, display_order. Index fields include uuid, name, columns (column UUIDs), is_unique, is_pk, type.\",\"properties\":{\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"},\"tableUuid\":{\"description\":\"Table UUID. Response includes columns[] and indexes[] with persistent UUIDs for apply_changes.\",\"type\":\"string\"}},\"required\":[\"documentUuid\",\"tableUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\",\"tableUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"8edd40794f39f47a\"},\n {\"mcpName\":\"mcp__ainecto__erd_get_table_group\",\"commandPath\":[\"erd\",\"get-table-group\"],\"group\":\"erd\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"},\"tableGroupUuid\":{\"description\":\"Table group UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\",\"tableGroupUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\",\"tableGroupUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"bcd417344639c0c9\"},\n {\"mcpName\":\"mcp__ainecto__erd_list_enums\",\"commandPath\":[\"erd\",\"list-enums\"],\"group\":\"erd\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"e0c2207905dbb068\"},\n {\"mcpName\":\"mcp__ainecto__erd_list_refs\",\"commandPath\":[\"erd\",\"list-refs\"],\"group\":\"erd\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"9ae2e04c310b57f2\"},\n {\"mcpName\":\"mcp__ainecto__erd_list_table_groups\",\"commandPath\":[\"erd\",\"list-table-groups\"],\"group\":\"erd\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"dc8811071df04ac2\"},\n {\"mcpName\":\"mcp__ainecto__erd_list_tables\",\"commandPath\":[\"erd\",\"list-tables\"],\"group\":\"erd\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"ca05b35b174fc209\"},\n {\"mcpName\":\"mcp__ainecto__get_attachment\",\"commandPath\":[\"attachment\",\"get\"],\"group\":\"attachment\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuid\":{\"description\":\"Attachment UUID\",\"type\":\"string\"}},\"required\":[\"uuid\"],\"type\":\"object\"},\"required\":[\"uuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"12bee70f6d254a5d\"},\n {\"mcpName\":\"mcp__ainecto__get_document\",\"commandPath\":[\"document\",\"get\"],\"group\":\"document\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuid\":{\"description\":\"Document UUID\",\"type\":\"string\"}},\"required\":[\"uuid\"],\"type\":\"object\"},\"required\":[\"uuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"4949c8a5bb425491\"},\n {\"mcpName\":\"mcp__ainecto__get_project\",\"commandPath\":[\"project\",\"get\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuid\":{\"description\":\"Project UUID\",\"type\":\"string\"}},\"required\":[\"uuid\"],\"type\":\"object\"},\"required\":[\"uuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"b4ee9097f4b80df4\"},\n {\"mcpName\":\"mcp__ainecto__get_version\",\"commandPath\":[\"version\",\"get\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"Document UUID\",\"type\":\"string\"},\"versionNumber\":{\"description\":\"Version number\",\"type\":\"integer\"}},\"required\":[\"documentUuid\",\"versionNumber\"],\"type\":\"object\"},\"required\":[\"documentUuid\",\"versionNumber\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"ad81d04200d3d7f5\"},\n {\"mcpName\":\"mcp__ainecto__get_workspace\",\"commandPath\":[\"workspace\",\"get\"],\"group\":\"workspace\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuid\":{\"description\":\"Workspace UUID\",\"type\":\"string\"}},\"required\":[\"uuid\"],\"type\":\"object\"},\"required\":[\"uuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"ef7bae555463116e\"},\n {\"mcpName\":\"mcp__ainecto__list_attachments\",\"commandPath\":[\"attachments\",\"list\"],\"group\":\"attachment\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"projectUuid\":{\"description\":\"Project UUID\",\"type\":\"string\"}},\"required\":[\"projectUuid\"],\"type\":\"object\"},\"required\":[\"projectUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"a75657bb2e5eb383\"},\n {\"mcpName\":\"mcp__ainecto__list_documents\",\"commandPath\":[\"documents\",\"list\"],\"group\":\"document\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"folderUuid\":{\"description\":\"Optional folder UUID\",\"type\":\"string\"},\"limit\":{\"description\":\"Result cap when q is set (default 50)\",\"type\":\"integer\"},\"projectUuid\":{\"description\":\"Project UUID\",\"type\":\"string\"},\"q\":{\"description\":\"Optional full-text query. When provided, results come from the search index instead of folder listing.\",\"type\":\"string\"},\"type\":{\"description\":\"Optional document type filter. Enabled values: erd, diagram, markdown, testcase, task.\",\"enum\":[\"erd\",\"diagram\",\"markdown\",\"testcase\",\"task\"],\"type\":\"string\"}},\"type\":\"object\"},\"required\":[],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"e5d92431322ac0e3\"},\n {\"mcpName\":\"mcp__ainecto__list_folders\",\"commandPath\":[\"folders\",\"list\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"projectUuid\":{\"description\":\"Project UUID\",\"type\":\"string\"}},\"required\":[\"projectUuid\"],\"type\":\"object\"},\"required\":[\"projectUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"f3cde57fe87d375c\"},\n {\"mcpName\":\"mcp__ainecto__list_projects\",\"commandPath\":[\"projects\",\"list\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"limit\":{\"description\":\"Result cap when q is set (default 50)\",\"type\":\"integer\"},\"q\":{\"description\":\"Optional full-text query\",\"type\":\"string\"},\"workspaceUuid\":{\"description\":\"Optional Workspace UUID\",\"type\":\"string\"}},\"type\":\"object\"},\"required\":[],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"9174d6965d7e53f5\"},\n {\"mcpName\":\"mcp__ainecto__list_trash\",\"commandPath\":[\"trash\",\"list\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{},\"type\":\"object\"},\"required\":[],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"82f8586d68bfcd7d\"},\n {\"mcpName\":\"mcp__ainecto__list_versions\",\"commandPath\":[\"versions\",\"list\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"Document UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"370e4b8b8ec18e18\"},\n {\"mcpName\":\"mcp__ainecto__list_workspaces\",\"commandPath\":[\"workspaces\",\"list\"],\"group\":\"workspace\",\"description\":\"\",\"inputSchema\":{\"properties\":{},\"type\":\"object\"},\"required\":[],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"7c32c74000696b2f\"},\n {\"mcpName\":\"mcp__ainecto__markdown_append_document\",\"commandPath\":[\"markdown\",\"append-document\"],\"group\":\"markdown\",\"description\":\"Append to Markdown documents. If the appended body is tens of KB or more, prefer request_upload_token (purpose=document.append) and upload the body with curl.\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Appends\",\"items\":{\"properties\":{\"addition\":{\"description\":\"Body addition. 추가할 내용이 크면 (수십 KB 이상) LLM 토큰 절약을 위해 `request_upload_token (purpose=document.append, scopeJson={documentUuid, separator})` 로 uploadUrl 을 받고 curl 로 PUT 으로 보낼 것.\",\"type\":\"string\"},\"separator\":{\"description\":\"Separator between existing body and addition\",\"type\":\"string\"},\"uuid\":{\"description\":\"Document UUID\",\"type\":\"string\"}},\"required\":[\"uuid\",\"addition\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"f189514b3cccd1cc\"},\n {\"mcpName\":\"mcp__ainecto__markdown_generate_document\",\"commandPath\":[\"markdown\",\"generate-document\"],\"group\":\"markdown\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Generation requests\",\"items\":{\"properties\":{\"context\":{\"description\":\"Optional JSON context\",\"type\":\"string\"},\"documentUuid\":{\"description\":\"Target document UUID\",\"type\":\"string\"},\"prompt\":{\"description\":\"Generation prompt\",\"type\":\"string\"}},\"required\":[\"documentUuid\",\"prompt\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"72114a2d2642ed92\"},\n {\"mcpName\":\"mcp__ainecto__move_documents\",\"commandPath\":[\"documents\",\"move\"],\"group\":\"document\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"clientMutationId\":{\"description\":\"Optional mutation identifier for client retry tracing\",\"maxLength\":128,\"minLength\":1,\"pattern\":\"^[\\\\x21-\\\\x7E]{1,128}$\",\"type\":\"string\"},\"items\":{\"description\":\"Moves\",\"items\":{\"properties\":{\"newFolderUuid\":{\"description\":\"New folder UUID — null/empty for root\",\"type\":\"string\"},\"targetProjectUuid\":{\"description\":\"Target project UUID — omit to stay in current project\",\"type\":\"string\"},\"targetWorkspaceUuid\":{\"description\":\"Guard only: must match targetProjectUuid workspace\",\"type\":\"string\"},\"uuid\":{\"description\":\"Document UUID\",\"type\":\"string\"}},\"required\":[\"uuid\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"dev\",\"schemaHash\":\"9758d6a262913a3f\"},\n {\"mcpName\":\"mcp__ainecto__move_folders\",\"commandPath\":[\"folders\",\"move\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Moves\",\"items\":{\"properties\":{\"newParentFolderUuid\":{\"description\":\"New parent UUID — null/empty for root\",\"type\":\"string\"},\"uuid\":{\"description\":\"Folder UUID\",\"type\":\"string\"}},\"required\":[\"uuid\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"dev\",\"schemaHash\":\"612a779b1fd176bb\"},\n {\"mcpName\":\"mcp__ainecto__request_upload_token\",\"commandPath\":[\"tools\",\"run\",\"request-upload-token\"],\"group\":\"attachment\",\"description\":\"Use this for large payloads of tens of KB or more to save LLM tokens. purpose=mcp.call returns a short-lived bearer token that can call any MCP tool, including mcp__ainecto__erd_apply_changes, via curl. purpose=document.create/update/append uploads document bodies directly to the upload endpoint with PUT/curl. Tokens are reusable for 5 minutes by default.\",\"inputSchema\":{\"properties\":{\"maxBytes\":{\"description\":\"최대 업로드 byte (서버 측 한도)\",\"type\":\"integer\"},\"purpose\":{\"description\":\"Token 용도. `mcp.call` 은 curl 로 /mcp 호출, `document.create/update/append` 는 PUT body 로 본문 업로드, `attachment.upload` 는 파일 bytes 업로드. 콘텐츠가 크면 (수십 KB 이상) LLM 토큰 절약을 위해 이 도구로 5분 재사용 토큰을 받고 curl 로 보내는 것을 강력 권장.\",\"enum\":[\"mcp.call\",\"document.create\",\"document.update\",\"document.append\",\"attachment.upload\"],\"type\":\"string\"},\"scopeJson\":{\"description\":\"선택 — JSON scope. document.create 는 projectUuid, type, title 을 포함하고 enabled type values 는 erd, diagram, markdown, testcase, task. document.update/document.append 는 documentUuid 를 포함. attachment.upload: {documentUuid, filename, contentType?, sizeBytes?}; storageKey 는 서버가 발급 scope 에 추가.\",\"type\":\"string\"},\"ttlSeconds\":{\"description\":\"TTL (초). 기본 300 (5분)\",\"type\":\"integer\"}},\"required\":[\"purpose\"],\"type\":\"object\"},\"required\":[\"purpose\"],\"payloadMode\":\"binary-upload\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"cc5db0cc4a9d9603\"},\n {\"mcpName\":\"mcp__ainecto__restore_versions\",\"commandPath\":[\"versions\",\"restore\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Restores\",\"items\":{\"properties\":{\"documentUuid\":{\"description\":\"Document UUID\",\"type\":\"string\"},\"versionNumber\":{\"description\":\"Version number to restore\",\"type\":\"integer\"}},\"required\":[\"documentUuid\",\"versionNumber\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"dev\",\"schemaHash\":\"c4f448cc3b96c7a6\"},\n {\"mcpName\":\"mcp__ainecto__search_documents\",\"commandPath\":[\"documents\",\"search\"],\"group\":\"document\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"limit\":{\"description\":\"결과 개수 (기본 20, 최대 50)\",\"type\":\"integer\"},\"offset\":{\"description\":\"페이지네이션 offset (기본 0)\",\"type\":\"integer\"},\"projectUuid\":{\"description\":\"특정 프로젝트로 한정 (선택)\",\"type\":\"string\"},\"q\":{\"description\":\"검색 키워드\",\"type\":\"string\"},\"type\":{\"description\":\"Optional document type filter. Enabled values: erd, diagram, markdown, testcase, task.\",\"enum\":[\"erd\",\"diagram\",\"markdown\",\"testcase\",\"task\"],\"type\":\"string\"}},\"required\":[\"q\"],\"type\":\"object\"},\"required\":[\"q\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"89efa02eab3c01a1\"},\n {\"mcpName\":\"mcp__ainecto__task_apply_changes\",\"commandPath\":[\"task\",\"apply-changes\"],\"group\":\"task\",\"description\":\"Task CUD entry point. Applies one atomic batch using operation objects shaped exactly as {op, uuid, data}. There is no partial success mode; any validation failure aborts the whole batch.\",\"inputSchema\":{\"examples\":[{\"baseRevision\":1,\"clientMutationId\":\"task-mutation-1\",\"documentUuid\":\"task-document-uuid\",\"operations\":[{\"data\":{\"parentTaskUuid\":null,\"title\":\"Task title\"},\"op\":\"create_task\",\"uuid\":\"client-task-uuid\"}]}],\"properties\":{\"baseRevision\":{\"description\":\"Current board revision from task_get_snapshot\",\"type\":\"integer\"},\"clientMutationId\":{\"description\":\"Optional idempotency key. Visible ASCII, 1-128 chars; will become required in a later phase.\",\"maxLength\":128,\"minLength\":1,\"pattern\":\"^[\\\\x21-\\\\x7E]{1,128}$\",\"type\":\"string\"},\"documentUuid\":{\"description\":\"Task document UUID\",\"type\":\"string\"},\"operations\":{\"description\":\"Atomic batch. No partial success mode; validation failure aborts all operations.\",\"items\":{\"additionalProperties\":false,\"properties\":{\"data\":{\"description\":\"Operation payload. Keep all operation-specific fields inside data.\",\"type\":\"object\"},\"op\":{\"description\":\"Operation type\",\"enum\":[\"create_task\",\"update_task\",\"archive_task\",\"restore_task\",\"move_task\",\"transition_task\",\"assign_task\",\"schedule_task\",\"set_progress\"],\"type\":\"string\"},\"uuid\":{\"description\":\"Task UUID. For create_task this is the client-generated UUID.\",\"type\":\"string\"}},\"required\":[\"op\",\"uuid\",\"data\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"documentUuid\",\"baseRevision\",\"operations\"],\"type\":\"object\"},\"required\":[\"baseRevision\",\"documentUuid\",\"operations\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"085eb6e8a3eae2c8\"},\n {\"mcpName\":\"mcp__ainecto__task_get_snapshot\",\"commandPath\":[\"task\",\"get-snapshot\"],\"group\":\"task\",\"description\":\"Get one Task document snapshot. Returns board revision, statuses, tasks, member summaries, and permissions. Use before mutations to obtain baseRevision.\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"Task document UUID\",\"type\":\"string\"},\"includeArchived\":{\"description\":\"Whether to include archived tasks\",\"type\":\"boolean\"},\"limit\":{\"description\":\"Maximum tasks to return; defaults to server snapshot cap\",\"type\":\"integer\"}},\"required\":[\"documentUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"a11876f9b475338a\"},\n {\"mcpName\":\"mcp__ainecto__task_get_task\",\"commandPath\":[\"task\",\"get-task\"],\"group\":\"task\",\"description\":\"Get one task by UUID from a Task document.\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"Task document UUID\",\"type\":\"string\"},\"taskUuid\":{\"description\":\"Task UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\",\"taskUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\",\"taskUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"96b1ea530c583337\"},\n {\"mcpName\":\"mcp__ainecto__task_list_statuses\",\"commandPath\":[\"task\",\"list-statuses\"],\"group\":\"task\",\"description\":\"List statuses for a Task document. Status slug is intentionally not returned.\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"Task document UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"864ea509c54fe2e7\"},\n {\"mcpName\":\"mcp__ainecto__task_list_tasks\",\"commandPath\":[\"task\",\"list-tasks\"],\"group\":\"task\",\"description\":\"List tasks in a Task document with optional parent/status/assignee filters.\",\"inputSchema\":{\"properties\":{\"assigneeUserId\":{\"description\":\"Optional assignee user id filter\",\"type\":\"string\"},\"documentUuid\":{\"description\":\"Task document UUID\",\"type\":\"string\"},\"includeArchived\":{\"description\":\"Whether to include archived tasks\",\"type\":\"boolean\"},\"limit\":{\"description\":\"Maximum tasks to return\",\"type\":\"integer\"},\"parentTaskUuid\":{\"description\":\"Optional parent filter\",\"type\":\"string\"},\"statusUuid\":{\"description\":\"Optional status filter\",\"type\":\"string\"}},\"required\":[\"documentUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"be8dc0a4ecd117a8\"},\n {\"mcpName\":\"mcp__ainecto__testcase_archive_scenarios\",\"commandPath\":[\"testcase\",\"archive-scenarios\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"ids\":{\"description\":\"Scenario ids\",\"items\":{\"type\":\"integer\"},\"type\":\"array\"}},\"required\":[\"ids\"],\"type\":\"object\"},\"required\":[\"ids\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"a5a8768d14ebaed7\"},\n {\"mcpName\":\"mcp__ainecto__testcase_complete_runs\",\"commandPath\":[\"testcase\",\"complete-runs\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"ids\":{\"description\":\"Run ids\",\"items\":{\"type\":\"integer\"},\"type\":\"array\"}},\"required\":[\"ids\"],\"type\":\"object\"},\"required\":[\"ids\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"84bc3dad482ac61a\"},\n {\"mcpName\":\"mcp__ainecto__testcase_create_runs\",\"commandPath\":[\"testcase\",\"create-runs\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Runs\",\"items\":{\"properties\":{\"buildVersion\":{\"description\":\"Build version\",\"type\":\"string\"},\"description\":{\"description\":\"Description\",\"type\":\"string\"},\"environment\":{\"description\":\"Environment\",\"type\":\"string\"},\"name\":{\"description\":\"Run name\",\"type\":\"string\"},\"projectId\":{\"description\":\"Project id\",\"type\":\"integer\"},\"testAccount\":{\"description\":\"SUT test account\",\"type\":\"string\"},\"testCaseIds\":{\"description\":\"Test case ids to attach\",\"items\":{\"type\":\"integer\"},\"type\":\"array\"}},\"required\":[\"projectId\",\"name\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"6a08117c79f589a1\"},\n {\"mcpName\":\"mcp__ainecto__testcase_create_scenarios\",\"commandPath\":[\"testcase\",\"create-scenarios\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Scenarios\",\"items\":{\"properties\":{\"description\":{\"description\":\"Description\",\"type\":\"string\"},\"documentUuid\":{\"description\":\"Parent testcase document UUID\",\"type\":\"string\"},\"name\":{\"description\":\"Scenario name\",\"type\":\"string\"},\"parentId\":{\"description\":\"Parent scenario id\",\"type\":\"integer\"}},\"required\":[\"documentUuid\",\"name\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"4686fd0f078a65e8\"},\n {\"mcpName\":\"mcp__ainecto__testcase_create_testcases\",\"commandPath\":[\"testcase\",\"create-testcases\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Testcases\",\"items\":{\"properties\":{\"assigneeId\":{\"description\":\"Assignee user id\",\"type\":\"string\"},\"expectedResult\":{\"description\":\"Expected result\",\"type\":\"string\"},\"precondition\":{\"description\":\"Precondition\",\"type\":\"string\"},\"priority\":{\"description\":\"Priority\",\"enum\":[\"LOW\",\"MEDIUM\",\"HIGH\",\"CRITICAL\"],\"type\":\"string\"},\"scenarioId\":{\"description\":\"Scenario id (required)\",\"type\":\"integer\"},\"source\":{\"description\":\"Source\",\"enum\":[\"MANUAL\",\"AI\",\"IMPORT\",\"MCP\"],\"type\":\"string\"},\"status\":{\"description\":\"Status\",\"enum\":[\"DRAFT\",\"READY\",\"DEPRECATED\"],\"type\":\"string\"},\"tags\":{\"description\":\"Tags\",\"type\":\"string\"},\"testAccount\":{\"description\":\"SUT test account\",\"type\":\"string\"},\"title\":{\"description\":\"Title\",\"type\":\"string\"},\"type\":{\"description\":\"Type\",\"enum\":[\"FUNCTIONAL\",\"REGRESSION\",\"SMOKE\",\"PERFORMANCE\",\"SECURITY\",\"E2E\",\"UNIT\",\"INTEGRATION\"],\"type\":\"string\"}},\"required\":[\"scenarioId\",\"title\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"ae90d4749debacf0\"},\n {\"mcpName\":\"mcp__ainecto__testcase_delete_runs\",\"commandPath\":[\"testcase\",\"delete-runs\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"ids\":{\"description\":\"Run ids\",\"items\":{\"type\":\"integer\"},\"type\":\"array\"}},\"required\":[\"ids\"],\"type\":\"object\"},\"required\":[\"ids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"dev\",\"schemaHash\":\"1ba26baf794bde57\"},\n {\"mcpName\":\"mcp__ainecto__testcase_delete_testcases\",\"commandPath\":[\"testcase\",\"delete-testcases\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"ids\":{\"description\":\"Testcase ids\",\"items\":{\"type\":\"integer\"},\"type\":\"array\"}},\"required\":[\"ids\"],\"type\":\"object\"},\"required\":[\"ids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"dev\",\"schemaHash\":\"ab095f553bf46937\"},\n {\"mcpName\":\"mcp__ainecto__testcase_get_run\",\"commandPath\":[\"testcase\",\"get-run\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"id\":{\"description\":\"Run id\",\"type\":\"integer\"}},\"required\":[\"id\"],\"type\":\"object\"},\"required\":[\"id\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"713c83514cf07d68\"},\n {\"mcpName\":\"mcp__ainecto__testcase_get_testcase\",\"commandPath\":[\"testcase\",\"get-testcase\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"id\":{\"description\":\"Testcase id\",\"type\":\"integer\"}},\"required\":[\"id\"],\"type\":\"object\"},\"required\":[\"id\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"54e497a2e3c9978d\"},\n {\"mcpName\":\"mcp__ainecto__testcase_list_executions\",\"commandPath\":[\"testcase\",\"list-executions\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"runId\":{\"description\":\"Run id\",\"type\":\"integer\"}},\"required\":[\"runId\"],\"type\":\"object\"},\"required\":[\"runId\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"a5a2abcf9e43225e\"},\n {\"mcpName\":\"mcp__ainecto__testcase_list_runs\",\"commandPath\":[\"testcase\",\"list-runs\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"projectId\":{\"description\":\"Project id\",\"type\":\"integer\"}},\"required\":[\"projectId\"],\"type\":\"object\"},\"required\":[\"projectId\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"b7d5275b67bb11d9\"},\n {\"mcpName\":\"mcp__ainecto__testcase_list_scenarios\",\"commandPath\":[\"testcase\",\"list-scenarios\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"Parent testcase document UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"2486ade3c9cb0984\"},\n {\"mcpName\":\"mcp__ainecto__testcase_list_step_checks\",\"commandPath\":[\"testcase\",\"list-step-checks\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"caseId\":{\"description\":\"Testcase id\",\"type\":\"integer\"},\"runId\":{\"description\":\"Run id\",\"type\":\"integer\"}},\"required\":[\"runId\",\"caseId\"],\"type\":\"object\"},\"required\":[\"caseId\",\"runId\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"f2d5b45c0d64cd5c\"},\n {\"mcpName\":\"mcp__ainecto__testcase_list_testcases\",\"commandPath\":[\"testcase\",\"list-testcases\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"Parent testcase document UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"ef40927392d5a684\"},\n {\"mcpName\":\"mcp__ainecto__testcase_record_executions\",\"commandPath\":[\"testcase\",\"record-executions\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Executions\",\"items\":{\"properties\":{\"comment\":{\"description\":\"Comment\",\"type\":\"string\"},\"defectLinks\":{\"description\":\"Defect URLs\",\"type\":\"string\"},\"durationSeconds\":{\"description\":\"Duration in seconds\",\"type\":\"integer\"},\"result\":{\"description\":\"Result\",\"enum\":[\"PASSED\",\"FAILED\",\"BLOCKED\",\"SKIPPED\",\"UNTESTED\",\"IN_PROGRESS\"],\"type\":\"string\"},\"runId\":{\"description\":\"Run id\",\"type\":\"integer\"},\"testAccount\":{\"description\":\"SUT account\",\"type\":\"string\"},\"testCaseId\":{\"description\":\"Testcase id\",\"type\":\"integer\"}},\"required\":[\"runId\",\"testCaseId\",\"result\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"071a2075d00bff9b\"},\n {\"mcpName\":\"mcp__ainecto__testcase_remove_run_cases\",\"commandPath\":[\"testcase\",\"remove-run-cases\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"runId\":{\"description\":\"Run id\",\"type\":\"integer\"},\"testCaseIds\":{\"description\":\"Testcase ids to remove\",\"items\":{\"type\":\"integer\"},\"type\":\"array\"}},\"required\":[\"runId\",\"testCaseIds\"],\"type\":\"object\"},\"required\":[\"runId\",\"testCaseIds\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"7aef8a39afe88c5c\"},\n {\"mcpName\":\"mcp__ainecto__testcase_reorder_scenarios\",\"commandPath\":[\"testcase\",\"reorder-scenarios\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"ids\":{\"description\":\"Scenario ids in new order\",\"items\":{\"type\":\"integer\"},\"type\":\"array\"}},\"required\":[\"ids\"],\"type\":\"object\"},\"required\":[\"ids\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"7faf43a0b53c2988\"},\n {\"mcpName\":\"mcp__ainecto__testcase_reorder_testcases\",\"commandPath\":[\"testcase\",\"reorder-testcases\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"ids\":{\"description\":\"Testcase ids in new order\",\"items\":{\"type\":\"integer\"},\"type\":\"array\"}},\"required\":[\"ids\"],\"type\":\"object\"},\"required\":[\"ids\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"5f27d8b94aca5334\"},\n {\"mcpName\":\"mcp__ainecto__testcase_update_runs\",\"commandPath\":[\"testcase\",\"update-runs\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Updates\",\"items\":{\"properties\":{\"buildVersion\":{\"description\":\"New build version\",\"type\":\"string\"},\"description\":{\"description\":\"New description\",\"type\":\"string\"},\"environment\":{\"description\":\"New environment\",\"type\":\"string\"},\"id\":{\"description\":\"Run id\",\"type\":\"integer\"},\"name\":{\"description\":\"New name\",\"type\":\"string\"},\"status\":{\"description\":\"New status\",\"enum\":[\"DRAFT\",\"IN_PROGRESS\",\"COMPLETED\",\"CANCELLED\"],\"type\":\"string\"},\"testAccount\":{\"description\":\"New SUT account\",\"type\":\"string\"}},\"required\":[\"id\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"370074b6681d495f\"},\n {\"mcpName\":\"mcp__ainecto__testcase_update_scenarios\",\"commandPath\":[\"testcase\",\"update-scenarios\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Updates\",\"items\":{\"properties\":{\"id\":{\"description\":\"Scenario id\",\"type\":\"integer\"},\"name\":{\"description\":\"New name\",\"type\":\"string\"},\"parentId\":{\"description\":\"New parent id\",\"type\":\"integer\"}},\"required\":[\"id\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"929c8647c06c5fdd\"},\n {\"mcpName\":\"mcp__ainecto__testcase_update_testcases\",\"commandPath\":[\"testcase\",\"update-testcases\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Updates\",\"items\":{\"properties\":{\"assigneeId\":{\"description\":\"Assignee\",\"type\":\"string\"},\"expectedResult\":{\"description\":\"New expected result\",\"type\":\"string\"},\"id\":{\"description\":\"Testcase id\",\"type\":\"integer\"},\"precondition\":{\"description\":\"New precondition\",\"type\":\"string\"},\"priority\":{\"description\":\"Priority\",\"enum\":[\"LOW\",\"MEDIUM\",\"HIGH\",\"CRITICAL\"],\"type\":\"string\"},\"scenarioId\":{\"description\":\"New scenario id\",\"type\":\"integer\"},\"status\":{\"description\":\"Status\",\"enum\":[\"DRAFT\",\"READY\",\"DEPRECATED\"],\"type\":\"string\"},\"tags\":{\"description\":\"Tags\",\"type\":\"string\"},\"testAccount\":{\"description\":\"SUT account\",\"type\":\"string\"},\"title\":{\"description\":\"New title\",\"type\":\"string\"},\"type\":{\"description\":\"Type\",\"enum\":[\"FUNCTIONAL\",\"REGRESSION\",\"SMOKE\",\"PERFORMANCE\",\"SECURITY\",\"E2E\",\"UNIT\",\"INTEGRATION\"],\"type\":\"string\"}},\"required\":[\"id\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"b562a7b860f6036c\"},\n {\"mcpName\":\"mcp__ainecto__testcase_upsert_step_checks\",\"commandPath\":[\"testcase\",\"upsert-step-checks\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"caseId\":{\"description\":\"Testcase id\",\"type\":\"integer\"},\"items\":{\"description\":\"Step checks\",\"items\":{\"properties\":{\"checked\":{\"description\":\"Checked state\",\"type\":\"boolean\"},\"comment\":{\"description\":\"Per-step note\",\"type\":\"string\"},\"stepId\":{\"description\":\"TestStep id\",\"type\":\"integer\"}},\"required\":[\"stepId\",\"checked\"],\"type\":\"object\"},\"type\":\"array\"},\"runId\":{\"description\":\"Run id\",\"type\":\"integer\"}},\"required\":[\"runId\",\"caseId\",\"items\"],\"type\":\"object\"},\"required\":[\"caseId\",\"items\",\"runId\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"ac5768125a9fd15c\"},\n {\"mcpName\":\"mcp__ainecto__unarchive_documents\",\"commandPath\":[\"documents\",\"unarchive\"],\"group\":\"document\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuids\":{\"description\":\"Document UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"uuids\"],\"type\":\"object\"},\"required\":[\"uuids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"dev\",\"schemaHash\":\"4aae7df04fba8779\"},\n {\"mcpName\":\"mcp__ainecto__unarchive_folders\",\"commandPath\":[\"folders\",\"unarchive\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuids\":{\"description\":\"Folder UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"uuids\"],\"type\":\"object\"},\"required\":[\"uuids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"dev\",\"schemaHash\":\"e307cab0ebafd179\"},\n {\"mcpName\":\"mcp__ainecto__unarchive_projects\",\"commandPath\":[\"projects\",\"unarchive\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuids\":{\"description\":\"Project UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"uuids\"],\"type\":\"object\"},\"required\":[\"uuids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"dev\",\"schemaHash\":\"15ea4a409d1549de\"},\n {\"mcpName\":\"mcp__ainecto__unarchive_workspaces\",\"commandPath\":[\"workspaces\",\"unarchive\"],\"group\":\"workspace\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuids\":{\"description\":\"Workspace UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"uuids\"],\"type\":\"object\"},\"required\":[\"uuids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"dev\",\"schemaHash\":\"641de5b64ec75ab2\"},\n {\"mcpName\":\"mcp__ainecto__update_documents\",\"commandPath\":[\"documents\",\"update\"],\"group\":\"document\",\"description\":\"Update documents. If a replacement body is tens of KB or more, prefer request_upload_token (purpose=document.update) and upload the body with curl.\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Updates\",\"items\":{\"properties\":{\"body\":{\"description\":\"Deprecated compatibility alias for typePayload.body when document type is markdown. 본문이 수십 KB 이상으로 크면 LLM 토큰 절약을 위해 `request_upload_token (purpose=document.update)` 를 호출해 uploadUrl 을 받고 curl 로 직접 PUT 으로 보낼 것.\",\"type\":\"string\"},\"title\":{\"description\":\"New title\",\"type\":\"string\"},\"typePayload\":{\"description\":\"Type-specific payload for enabled document types. markdown: {body}; diagram: {diagramSource,sourceLanguage,edgeStyle,isModule,metadata}; testcase: {defaultEnvironment (max 50 chars), defaultTestAccount (max 100 chars)}; task: no typePayload; board and default statuses are seeded automatically.\",\"type\":\"object\"},\"uuid\":{\"description\":\"Document UUID\",\"type\":\"string\"}},\"required\":[\"uuid\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"778908eec43aba81\"},\n {\"mcpName\":\"mcp__ainecto__update_folders\",\"commandPath\":[\"folders\",\"update\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Updates\",\"items\":{\"properties\":{\"name\":{\"description\":\"New name\",\"type\":\"string\"},\"uuid\":{\"description\":\"Folder UUID\",\"type\":\"string\"}},\"required\":[\"uuid\",\"name\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"7bef3b4702df1f00\"},\n {\"mcpName\":\"mcp__ainecto__update_projects\",\"commandPath\":[\"projects\",\"update\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Updates\",\"items\":{\"properties\":{\"description\":{\"description\":\"New description\",\"type\":\"string\"},\"name\":{\"description\":\"New name\",\"type\":\"string\"},\"uuid\":{\"description\":\"Project UUID\",\"type\":\"string\"}},\"required\":[\"uuid\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"10cc0d84aeb2192b\"},\n {\"mcpName\":\"mcp__ainecto__update_workspaces\",\"commandPath\":[\"workspaces\",\"update\"],\"group\":\"workspace\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Updates\",\"items\":{\"properties\":{\"description\":{\"description\":\"New description\",\"type\":\"string\"},\"name\":{\"description\":\"New name\",\"type\":\"string\"},\"uuid\":{\"description\":\"Workspace UUID\",\"type\":\"string\"}},\"required\":[\"uuid\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"723e4f6d36ee9d02\"},\n {\"mcpName\":\"mcp__ainecto__upload_attachments\",\"commandPath\":[\"tools\",\"run\",\"upload-attachments\"],\"group\":\"attachment\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Attachments to register\",\"items\":{\"properties\":{\"contentType\":{\"description\":\"MIME type\",\"type\":\"string\"},\"documentUuid\":{\"description\":\"Parent document UUID\",\"type\":\"string\"},\"filename\":{\"description\":\"Original file name\",\"type\":\"string\"},\"sizeBytes\":{\"description\":\"Size in bytes\",\"type\":\"integer\"},\"storageKey\":{\"description\":\"Storage key returned by request_upload_token purpose=attachment.upload\",\"type\":\"string\"}},\"required\":[\"documentUuid\",\"filename\",\"storageKey\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"binary-upload\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"0622e590de3404dd\"},\n] satisfies GeneratedToolDefinition[];\n","import { createHash } from \"node:crypto\";\nimport type { GeneratedToolDefinition, JsonSchema, McpToolListItem, PayloadMode, ToolGroup } from \"./types\";\n\n/**\n * 서버가 도구 이름 앞에 달던 prefix.\n *\n * ★2026-09-22 부터 서버는 이 prefix 를 «떼고» 내보낸다 — MCP 클라이언트가 자기 서버 별칭을\n * 한 번 더 얹기 때문에, 서버까지 붙이면 `mcp__ainecto__mcp__ainecto__list_projects` 가 된다.\n * 그래서 여기서는 prefix 를 «있으면 뗀다»로만 다룬다. 옛 카탈로그(이미 받아 둔 generated.*.ts)\n * 에는 긴 이름이 남아 있고 서버가 그것도 계속 받아주므로, 두 형태가 함께 산다.\n */\nconst LEGACY_PREFIX = \"mcp__ainecto__\";\n\n/**\n * 서버 prefix 를 뗀 «맨 이름». 카탈로그가 어느 판에서 왔든(긴 이름·짧은 이름) 같은 도구를 같은\n * 이름으로 가리키려면 이 한 곳을 거친다 — 표시 정보(enrichments)를 이름으로 붙일 때 특히.\n */\nexport function bareToolName(name: string): string {\n return name.startsWith(LEGACY_PREFIX) ? name.slice(LEGACY_PREFIX.length) : name;\n}\nconst DESTRUCTIVE_PREFIXES = [\n \"delete_\",\n \"remove_\",\n \"archive_\",\n \"unarchive_\",\n \"restore_\",\n \"move_\",\n \"erd_delete_\",\n \"erd_remove_\",\n \"task_delete_\",\n \"testcase_delete_\",\n];\n\nexport function generateCatalog(tools: McpToolListItem[], sourceCatalog: \"prod\" | \"dev\"): GeneratedToolDefinition[] {\n return tools\n .map((tool) => normalizeTool(tool, sourceCatalog))\n .sort((a, b) => a.mcpName.localeCompare(b.mcpName));\n}\n\nexport function normalizeTool(tool: McpToolListItem, sourceCatalog: \"prod\" | \"dev\"): GeneratedToolDefinition {\n if (!tool.name) {\n throw new Error(\"Unsupported tool name: empty.\");\n }\n const stripped = bareToolName(tool.name);\n const group = inferGroup(stripped);\n const inputSchema = normalizeSchema(tool.inputSchema ?? { type: \"object\", properties: {} });\n const required = Array.isArray(inputSchema.required)\n ? inputSchema.required.filter((value): value is string => typeof value === \"string\").sort()\n : [];\n const definition = {\n mcpName: tool.name,\n commandPath: generateCommandPath(stripped, group),\n group,\n description: tool.description ?? \"\",\n inputSchema,\n required,\n payloadMode: inferPayloadMode(stripped, inputSchema),\n destructive: inferDestructive(stripped, tool),\n sourceCatalog,\n schemaHash: \"\",\n } satisfies GeneratedToolDefinition;\n return { ...definition, schemaHash: computeSchemaHash(definition) };\n}\n\nexport function inferGroup(strippedName: string): ToolGroup {\n if (strippedName.startsWith(\"erd_\")) return \"erd\";\n if (strippedName.startsWith(\"flow_\")) return \"flow\";\n if (strippedName.startsWith(\"testcase_\")) return \"testcase\";\n if (strippedName.startsWith(\"markdown_\")) return \"markdown\";\n if (strippedName.includes(\"attachment\") || strippedName.includes(\"upload\")) return \"attachment\";\n if (strippedName.startsWith(\"task_\")) return \"task\";\n if (strippedName.includes(\"workspace\")) return \"workspace\";\n if (strippedName.includes(\"document\")) return \"document\";\n return \"generic\";\n}\n\nexport function generateCommandPath(strippedName: string, group: ToolGroup): string[] {\n if (group !== \"generic\" && strippedName.startsWith(`${group}_`)) {\n return [group, snakeToKebab(strippedName.slice(group.length + 1))];\n }\n\n const [verb, ...rest] = strippedName.split(\"_\");\n if (verb && rest.length > 0 && isVerb(verb)) {\n return [rest.join(\"-\"), verb];\n }\n\n return [\"tools\", \"run\", snakeToKebab(strippedName)];\n}\n\nexport function inferPayloadMode(strippedName: string, inputSchema: JsonSchema): PayloadMode {\n if (strippedName.includes(\"upload\") || strippedName.includes(\"attachment_upload\")) {\n return \"binary-upload\";\n }\n const properties = inputSchema.properties;\n if (!isRecord(properties)) {\n return \"flags\";\n }\n const values = Object.values(properties);\n if (values.length === 0) {\n return \"flags\";\n }\n if (values.every(isScalarSchema)) {\n return \"flags\";\n }\n return \"file-json\";\n}\n\nexport function inferDestructive(strippedName: string, tool: McpToolListItem): boolean {\n if (tool.annotations?.destructiveHint === true) {\n return true;\n }\n return DESTRUCTIVE_PREFIXES.some((prefix) => strippedName.startsWith(prefix));\n}\n\nexport function computeSchemaHash(tool: Omit<GeneratedToolDefinition, \"schemaHash\">): string {\n return createHash(\"sha256\")\n .update(stableStringify({\n name: tool.mcpName,\n description: tool.description,\n inputSchema: tool.inputSchema,\n }))\n .digest(\"hex\")\n .slice(0, 16);\n}\n\nexport function stableStringify(value: unknown): string {\n if (Array.isArray(value)) {\n return `[${value.map(stableStringify).join(\",\")}]`;\n }\n if (isRecord(value)) {\n return `{${Object.keys(value).sort().map((key) => `${JSON.stringify(key)}:${stableStringify(value[key])}`).join(\",\")}}`;\n }\n return JSON.stringify(value);\n}\n\nexport function serializeGeneratedCatalog(tools: GeneratedToolDefinition[]): string {\n return [\n \"import type { GeneratedToolDefinition } from \\\"./types\\\";\",\n \"\",\n \"export const generatedTools = [\",\n ...tools.map((tool) => ` ${JSON.stringify(tool)},`),\n \"] satisfies GeneratedToolDefinition[];\",\n \"\",\n ].join(\"\\n\");\n}\n\nfunction normalizeSchema(schema: JsonSchema): JsonSchema {\n return JSON.parse(stableStringify(schema)) as JsonSchema;\n}\n\nfunction isScalarSchema(value: unknown): boolean {\n if (!isRecord(value)) {\n return false;\n }\n const type = value.type;\n return type === \"string\" || type === \"number\" || type === \"integer\" || type === \"boolean\";\n}\n\nfunction isVerb(value: string): boolean {\n return [\n \"list\",\n \"get\",\n \"create\",\n \"update\",\n \"delete\",\n \"move\",\n \"restore\",\n \"archive\",\n \"unarchive\",\n \"search\",\n ].includes(value);\n}\n\nfunction snakeToKebab(value: string): string {\n return value.replaceAll(\"_\", \"-\");\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { generatedTools as prodTools } from \"./generated.prod\";\nimport { generatedTools as devTools } from \"./generated.dev\";\nimport { generateCatalog } from \"./generator\";\nimport type { GeneratedToolDefinition, McpToolListItem } from \"./types\";\nimport type { AinectoEnv } from \"../config/endpoints\";\nimport type { McpRpcClient } from \"../mcp/rpcClient\";\n\n/** 이 CLI 판을 빌드할 때 받아 둔 스냅샷 — 서버를 못 부를 때의 대체본이다. */\nexport function getGeneratedTools(env: AinectoEnv) {\n return env === \"dev\" ? devTools : prodTools;\n}\n\n/**\n * ★서버의 지금 도구 목록 — 진실원은 서버다. 스냅샷만 보여 주면 서버에 새 문서 유형(html)이 열려도\n * 에이전트는 «CLI 에 없다»고 판단했다(2026-10-10). 유형·도구가 늘 때마다 CLI 를 다시 배포하지 않으려고\n * 실행할 때 받는다. 실패는 호출처가 스냅샷으로 대체하며 이유를 알린다.\n */\nexport async function loadLiveTools(env: AinectoEnv, client: McpRpcClient): Promise<GeneratedToolDefinition[]> {\n return generateCatalog(await client.toolsList() as McpToolListItem[], env);\n}\n","import { createInterface } from \"node:readline\";\nimport type { Readable, Writable } from \"node:stream\";\nimport { McpRpcClient, type JsonRpcRequest } from \"./rpcClient\";\n\nexport interface StdioBridgeOptions {\n input: Readable;\n output: Writable;\n errorOutput: Writable;\n client: McpRpcClient;\n}\n\nexport async function runStdioBridge(options: StdioBridgeOptions): Promise<void> {\n const lines = createInterface({ input: options.input, crlfDelay: Infinity });\n\n for await (const line of lines) {\n if (!line.trim()) {\n continue;\n }\n try {\n const request = parseJsonRpcRequest(line);\n const response = await options.client.sendRaw(request);\n if (response && request.id !== undefined) {\n options.output.write(`${JSON.stringify(response)}\\n`);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n options.output.write(`${JSON.stringify({\n jsonrpc: \"2.0\",\n id: null,\n error: { code: -32603, message },\n })}\\n`);\n }\n }\n}\n\nfunction parseJsonRpcRequest(line: string): JsonRpcRequest {\n const parsed = JSON.parse(line) as unknown;\n if (!isRecord(parsed) || parsed.jsonrpc !== \"2.0\" || typeof parsed.method !== \"string\") {\n throw new Error(\"Invalid JSON-RPC request.\");\n }\n return {\n jsonrpc: \"2.0\",\n id: typeof parsed.id === \"string\" || typeof parsed.id === \"number\" || parsed.id === null ? parsed.id : undefined,\n method: parsed.method,\n params: parsed.params,\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { FileTokenStore } from \"../../core/auth/tokenStore\";\nimport { OAuthClient } from \"../../core/auth/oauth\";\nimport { McpRpcClient } from \"../../core/mcp/rpcClient\";\nimport { runStdioBridge } from \"../../core/mcp/stdioBridge\";\nimport type { HarnessRole } from \"../../core/harness/role\";\nimport type { Readable, Writable } from \"node:stream\";\n\nexport interface ConnectorOptions {\n endpoint: string;\n /** 브리지의 역할 — MCP 설정의 `--role` 인자나 `AINECTO_ROLE`(옛 `AI_ERD_ROLE`) 에서만 온다. 없으면 null. */\n role: HarnessRole | null;\n input: Readable;\n output: Writable;\n errorOutput: Writable;\n}\n\nexport async function runConnector(options: ConnectorOptions): Promise<void> {\n // ★토큰은 서버마다 한 칸이다(설계 0.4.2 §2-4). 역할은 토큰이 아니라 요청 헤더로 실린다 —\n // 브리지의 역할은 시작할 때 인자로 정해지고 세션 동안 바뀌지 않는다.\n const auth = new OAuthClient({ endpoint: options.endpoint, tokenStore: new FileTokenStore() });\n const client = new McpRpcClient({\n endpoint: options.endpoint,\n tokenProvider: auth,\n role: options.role,\n });\n await runStdioBridge({\n input: options.input,\n output: options.output,\n errorOutput: options.errorOutput,\n client,\n });\n}\n","import type { ToolPresentationEnrichment } from \"./types\";\n\nexport const enrichments = [\n {\n mcpName: \"list_projects\",\n outputHint: \"table\",\n tableColumns: [\"uuid\", \"name\", \"projectKey\", \"workspaceUuid\", \"updatedAt\"],\n displayName: \"List projects\",\n examples: [\"ainecto projects list --env dev\"],\n },\n {\n mcpName: \"list_workspaces\",\n outputHint: \"table\",\n tableColumns: [\"uuid\", \"name\", \"updatedAt\"],\n displayName: \"List workspaces\",\n },\n {\n mcpName: \"list_folders\",\n outputHint: \"table\",\n tableColumns: [\"uuid\", \"name\", \"projectUuid\", \"parentFolderUuid\", \"updatedAt\"],\n displayName: \"List folders\",\n },\n {\n mcpName: \"list_documents\",\n outputHint: \"table\",\n tableColumns: [\"uuid\", \"title\", \"type\", \"projectUuid\", \"folderUuid\", \"updatedAt\"],\n displayName: \"List documents\",\n },\n {\n mcpName: \"search_documents\",\n outputHint: \"table\",\n tableColumns: [\"uuid\", \"title\", \"type\", \"projectUuid\", \"updatedAt\"],\n displayName: \"Search documents\",\n },\n {\n mcpName: \"list_attachments\",\n outputHint: \"table\",\n tableColumns: [\"uuid\", \"filename\", \"contentType\", \"sizeBytes\", \"documentUuid\"],\n displayName: \"List attachments\",\n },\n {\n mcpName: \"erd_list_tables\",\n outputHint: \"table\",\n tableColumns: [\"uuid\", \"name\", \"schema_name\", \"display_order\"],\n displayName: \"List ERD tables\",\n },\n {\n mcpName: \"erd_list_refs\",\n outputHint: \"table\",\n tableColumns: [\"uuid\", \"name\", \"from_table_uuid\", \"to_table_uuid\", \"relationship\"],\n displayName: \"List ERD refs\",\n },\n {\n mcpName: \"erd_list_enums\",\n outputHint: \"table\",\n tableColumns: [\"uuid\", \"name\", \"display_order\"],\n displayName: \"List ERD enums\",\n },\n {\n mcpName: \"erd_list_table_groups\",\n outputHint: \"table\",\n tableColumns: [\"uuid\", \"name\", \"display_order\"],\n displayName: \"List ERD table groups\",\n },\n {\n mcpName: \"task_list_tasks\",\n outputHint: \"table\",\n tableColumns: [\"uuid\", \"title\", \"statusUuid\", \"assigneeId\", \"updatedAt\"],\n displayName: \"List tasks\",\n },\n {\n mcpName: \"task_list_statuses\",\n outputHint: \"table\",\n tableColumns: [\"uuid\", \"name\", \"displayOrder\"],\n displayName: \"List task statuses\",\n },\n {\n mcpName: \"enable_shares\",\n aliases: [\"shares enable\"],\n displayName: \"Enable shares\",\n },\n {\n mcpName: \"disable_shares\",\n aliases: [\"shares disable\"],\n displayName: \"Disable shares\",\n },\n] satisfies ToolPresentationEnrichment[];\n","export interface TableOptions {\n columns?: string[];\n}\n\nexport function renderTable(data: unknown, options: TableOptions = {}): string | undefined {\n const rows = extractRows(data);\n if (!rows.length || !rows.every(isRecord)) {\n return undefined;\n }\n\n const columns = options.columns?.length ? options.columns : inferColumns(rows);\n if (!columns.length) {\n return undefined;\n }\n\n const widths = columns.map((column) => Math.max(column.length, ...rows.map((row) => formatCell(row[column]).length)));\n const header = columns.map((column, index) => column.padEnd(widths[index] ?? column.length)).join(\" \");\n const divider = widths.map((width) => \"-\".repeat(width)).join(\" \");\n const body = rows.map((row) => columns.map((column, index) => formatCell(row[column]).padEnd(widths[index] ?? column.length)).join(\" \"));\n\n return [header, divider, ...body].join(\"\\n\");\n}\n\nfunction extractRows(data: unknown): unknown[] {\n if (Array.isArray(data)) {\n return data;\n }\n if (isRecord(data)) {\n for (const key of [\"items\", \"projects\", \"workspaces\", \"folders\", \"documents\", \"tasks\", \"attachments\", \"results\", \"data\"]) {\n const value = data[key];\n if (Array.isArray(value)) {\n return value;\n }\n }\n }\n return [];\n}\n\nfunction inferColumns(rows: Record<string, unknown>[]): string[] {\n const preferred = [\"uuid\", \"id\", \"name\", \"title\", \"status\", \"type\", \"projectUuid\", \"documentUuid\", \"createdAt\", \"updatedAt\"];\n const keys = new Set(rows.flatMap((row) => Object.keys(row)));\n const columns = preferred.filter((key) => keys.has(key));\n if (columns.length > 0) {\n return columns.slice(0, 6);\n }\n return [...keys].slice(0, 6);\n}\n\nfunction formatCell(value: unknown): string {\n if (value === null || value === undefined) {\n return \"\";\n }\n if (typeof value === \"object\") {\n return JSON.stringify(value);\n }\n return String(value);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","export class CliCommandError extends Error {\n constructor(\n readonly code: string,\n message: string,\n readonly details?: unknown,\n ) {\n super(message);\n }\n}\n","import type { GeneratedToolDefinition, JsonSchema } from \"../../core/catalog/types\";\nimport { parsePayloadSource, type ParsedPayload } from \"../../core/input/payloadSource\";\nimport { CliCommandError } from \"./errors\";\n\nexport interface ParsedCommandArgs {\n args: Record<string, unknown>;\n yes: boolean;\n warnings: string[];\n}\n\nexport async function parseGeneratedCommandArgs(\n tool: GeneratedToolDefinition,\n argv: string[],\n stdin: NodeJS.ReadStream,\n): Promise<ParsedCommandArgs> {\n const parsed = parseArgv(argv);\n const payload = await parsePayload(tool, parsed, stdin);\n const args = payloadToArgs(payload.value);\n const properties = getSchemaProperties(tool.inputSchema);\n\n for (const [key, value] of Object.entries(parsed.flags)) {\n if (key === \"yes\") {\n continue;\n }\n const schemaKey = resolveSchemaKey(key, properties);\n if (!schemaKey) {\n throw new CliCommandError(\"UNKNOWN_FLAG\", `Unknown flag --${key} for ${tool.commandPath.join(\" \")}.`, {\n flag: key,\n mcpName: tool.mcpName,\n });\n }\n args[schemaKey] = coerceFlagValue(value, properties[schemaKey], schemaKey);\n }\n\n for (const required of tool.required) {\n if (args[required] === undefined || args[required] === \"\") {\n throw new CliCommandError(\"MISSING_REQUIRED_FLAG\", `Missing required argument \"${required}\" for ${tool.commandPath.join(\" \")}.`, {\n required,\n flag: `--${camelToKebab(required)}`,\n mcpName: tool.mcpName,\n });\n }\n }\n\n return {\n args,\n yes: parsed.yes,\n warnings: payload.warnings,\n };\n}\n\nfunction payloadToArgs(value: unknown): Record<string, unknown> {\n if (value === undefined || value === null) {\n return {};\n }\n if (!isRecord(value)) {\n throw new CliCommandError(\"INVALID_PAYLOAD\", \"Generated command payload must be a JSON object.\", { value });\n }\n return { ...value };\n}\n\ninterface ParsedArgv {\n flags: Record<string, string | boolean>;\n yes: boolean;\n file?: string;\n inline?: string;\n}\n\nfunction parseArgv(argv: string[]): ParsedArgv {\n const flags: Record<string, string | boolean> = {};\n const inline: string[] = [];\n let file: string | undefined;\n let yes = false;\n\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (!arg) {\n continue;\n }\n if (arg === \"--file\" || arg === \"-f\") {\n file = requireValue(arg, argv[++index]);\n continue;\n }\n if (arg === \"--yes\" || arg === \"-y\") {\n yes = true;\n flags.yes = true;\n continue;\n }\n if (arg.startsWith(\"--\")) {\n const withoutPrefix = arg.slice(2);\n const eqIndex = withoutPrefix.indexOf(\"=\");\n if (eqIndex >= 0) {\n const key = withoutPrefix.slice(0, eqIndex);\n flags[key] = withoutPrefix.slice(eqIndex + 1);\n continue;\n }\n const next = argv[index + 1];\n if (!next || next.startsWith(\"--\")) {\n flags[withoutPrefix] = true;\n continue;\n }\n flags[withoutPrefix] = next;\n index += 1;\n continue;\n }\n inline.push(arg);\n }\n\n return {\n flags,\n yes,\n file,\n inline: inline.length > 0 ? inline.join(\" \") : undefined,\n };\n}\n\nasync function parsePayload(\n tool: GeneratedToolDefinition,\n parsed: ParsedArgv,\n stdin: NodeJS.ReadStream,\n): Promise<ParsedPayload> {\n if (tool.payloadMode === \"file-json\" || parsed.file || parsed.inline) {\n return parsePayloadSource({\n file: parsed.file,\n inline: parsed.inline,\n stdin,\n });\n }\n\n return { value: {}, source: \"empty\", warnings: [] };\n}\n\nfunction resolveSchemaKey(flag: string, properties: Record<string, JsonSchema>): string | undefined {\n if (properties[flag]) {\n return flag;\n }\n const normalized = flag.toLowerCase();\n return Object.keys(properties).find((key) => camelToKebab(key) === normalized);\n}\n\nfunction coerceFlagValue(value: string | boolean, schema: JsonSchema | undefined, key: string): unknown {\n const type = schema?.type;\n if (type === \"boolean\") {\n if (typeof value === \"boolean\") {\n return value;\n }\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n throw new CliCommandError(\"INVALID_FLAG_VALUE\", `Flag \"${key}\" must be a boolean.`, { key, value });\n }\n if (type === \"string\") {\n if (typeof value === \"boolean\") {\n throw new CliCommandError(\"FLAG_REQUIRES_VALUE\", `--${camelToKebab(key)} requires a value.`, { key });\n }\n return value;\n }\n if (type === \"integer\") {\n if (typeof value === \"boolean\" || !/^-?\\d+$/.test(value)) {\n const code = typeof value === \"boolean\" ? \"FLAG_REQUIRES_VALUE\" : \"INVALID_FLAG_VALUE\";\n throw new CliCommandError(code, `Flag \"${key}\" must be an integer.`, { key, value });\n }\n return Number.parseInt(value, 10);\n }\n if (type === \"number\") {\n if (typeof value === \"boolean\" || Number.isNaN(Number(value))) {\n const code = typeof value === \"boolean\" ? \"FLAG_REQUIRES_VALUE\" : \"INVALID_FLAG_VALUE\";\n throw new CliCommandError(code, `Flag \"${key}\" must be a number.`, { key, value });\n }\n return Number(value);\n }\n throw new CliCommandError(\"UNSUPPORTED_FLAG_PAYLOAD\", `Flag \"${key}\" is not a scalar field; provide it through --file, stdin, or inline JSON.`, {\n key,\n type,\n });\n}\n\nfunction getSchemaProperties(schema: JsonSchema): Record<string, JsonSchema> {\n const properties = schema.properties;\n if (!isRecord(properties)) {\n return {};\n }\n const result: Record<string, JsonSchema> = {};\n for (const [key, value] of Object.entries(properties)) {\n if (isRecord(value)) {\n result[key] = value;\n }\n }\n return result;\n}\n\nexport function camelToKebab(value: string): string {\n return value.replace(/[A-Z]/g, (char) => `-${char.toLowerCase()}`).toLowerCase();\n}\n\nfunction requireValue(flag: string, value: string | undefined): string {\n if (!value || value.startsWith(\"--\")) {\n throw new CliCommandError(\"FLAG_REQUIRES_VALUE\", `${flag} requires a value.`, { flag });\n }\n return value;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { createInterface } from \"node:readline\";\nimport type { GeneratedToolDefinition } from \"../../core/catalog/types\";\nimport { CliCommandError } from \"./errors\";\n\nexport interface ConfirmationIO {\n stdin: NodeJS.ReadStream;\n stderr: NodeJS.WriteStream;\n}\n\nexport async function confirmDestructiveCommand(options: {\n tool: GeneratedToolDefinition;\n yes: boolean;\n json: boolean;\n io: ConfirmationIO;\n}): Promise<void> {\n if (!options.tool.destructive) {\n return;\n }\n if (options.yes) {\n return;\n }\n if (options.json) {\n throw new CliCommandError(\"CONFIRMATION_REQUIRED\", `Destructive command ${options.tool.commandPath.join(\" \")} requires --yes in --json mode.`, {\n mcpName: options.tool.mcpName,\n });\n }\n\n const answer = await promptConfirmation(options.io, `Run destructive command ${options.tool.commandPath.join(\" \")}? Type \"yes\" to continue: `);\n if (answer.trim().toLowerCase() !== \"yes\") {\n throw new CliCommandError(\"CONFIRMATION_DECLINED\", \"Destructive command was not confirmed.\", {\n mcpName: options.tool.mcpName,\n });\n }\n}\n\nasync function promptConfirmation(io: ConfirmationIO, message: string): Promise<string> {\n io.stderr.write(message);\n const rl = createInterface({ input: io.stdin, terminal: false });\n try {\n for await (const line of rl) {\n return line;\n }\n return \"\";\n } finally {\n rl.close();\n }\n}\n","export const ATTACHMENTS_UPLOAD_COMMAND_PATH = [\"attachments\", \"upload\"] as const;\n\nexport const BESPOKE_COMMAND_PATHS = [\n ATTACHMENTS_UPLOAD_COMMAND_PATH,\n] as const;\n","import type { McpRpcClient } from \"../../core/mcp/rpcClient\";\nimport type { GeneratedToolDefinition, ToolPresentationEnrichment } from \"../../core/catalog/types\";\nimport { enrichments } from \"../../core/catalog/enrichments\";\nimport { getGeneratedTools } from \"../../core/catalog\";\nimport type { AinectoEnv } from \"../../core/config/endpoints\";\nimport { renderSuccess } from \"../../core/output/render\";\nimport { isToolError } from \"../../core/mcp/rpcClient\";\nimport { renderTable } from \"../../core/output/table\";\nimport { parseGeneratedCommandArgs } from \"./flagParser\";\nimport { confirmDestructiveCommand, type ConfirmationIO } from \"./destructiveConfirmation\";\nimport { BESPOKE_COMMAND_PATHS } from \"./bespokeCommands\";\n\nexport interface GeneratedCommandRoute {\n tool: GeneratedToolDefinition;\n matchedPath: string[];\n rest: string[];\n presentation?: ToolPresentationEnrichment;\n rawContractWarning?: string;\n}\n\nexport interface GeneratedCommandExecutionOptions {\n /** 라우팅할 도구 목록 — 스냅샷이거나, 스냅샷에 없는 명령이면 서버의 지금 목록. */\n tools: readonly GeneratedToolDefinition[];\n argv: string[];\n client: McpRpcClient;\n json: boolean;\n io: ConfirmationIO & { stdout: NodeJS.WriteStream };\n}\n\nexport function matchGeneratedCommand(\n tools: readonly GeneratedToolDefinition[],\n argv: string[],\n): GeneratedCommandRoute | undefined {\n const commandTokens = argv.filter((arg) => !arg.startsWith(\"-\"));\n const entries = buildRouteEntries(tools, enrichments);\n const match = entries\n .filter((entry) => isPrefix(entry.path, commandTokens))\n .sort((a, b) => b.path.length - a.path.length)[0];\n\n if (!match) {\n return undefined;\n }\n\n const restStart = findRestStart(argv, match.path);\n return {\n tool: match.tool,\n matchedPath: match.path,\n rest: argv.slice(restStart),\n presentation: match.presentation,\n rawContractWarning: match.tool.payloadMode === \"binary-upload\"\n ? \"This generated command uses the raw MCP argument contract only; local file upload semantics are not implemented here.\"\n : undefined,\n };\n}\n\nexport async function executeGeneratedCommand(options: GeneratedCommandExecutionOptions): Promise<number> {\n const route = matchGeneratedCommand(options.tools, options.argv);\n if (!route) {\n return 2;\n }\n\n const parsed = await parseGeneratedCommandArgs(route.tool, route.rest, options.io.stdin);\n await confirmDestructiveCommand({\n tool: route.tool,\n yes: parsed.yes,\n json: options.json,\n io: options.io,\n });\n\n const result = await options.client.toolsCall(route.tool.mcpName, parsed.args);\n const warnings = [...parsed.warnings, ...(route.rawContractWarning ? [route.rawContractWarning] : [])];\n options.io.stdout.write(renderGeneratedResult(result, {\n json: options.json,\n warnings,\n presentation: route.presentation,\n }));\n // ★도구가 «거부»한 것을 성공으로 보고하지 않는다 — 셸 자동화는 exit 코드를 본다.\n return isToolError(result) ? 1 : 0;\n}\n\nexport function assertNoCommandCollisions(env: AinectoEnv): void {\n const entries = buildRouteEntries(getGeneratedTools(env), enrichments);\n const seen = new Map<string, string>();\n for (const entry of entries) {\n const key = entry.path.join(\" \");\n const existing = seen.get(key);\n if (existing) {\n throw new Error(`Command collision for \"${key}\": ${existing} and ${entry.tool.mcpName}`);\n }\n seen.set(key, entry.tool.mcpName);\n }\n for (const commandPath of BESPOKE_COMMAND_PATHS) {\n const command = commandPath.join(\" \");\n const existing = seen.get(command);\n if (existing) {\n throw new Error(`Bespoke command \"${command}\" collides with ${existing}.`);\n }\n }\n}\n\nfunction renderGeneratedResult(\n result: unknown,\n options: {\n json: boolean;\n warnings: string[];\n presentation?: ToolPresentationEnrichment;\n },\n): string {\n if (!options.json && options.presentation?.outputHint === \"table\") {\n const table = renderTable(result, { columns: options.presentation.tableColumns });\n if (table) {\n const warnings = options.warnings.length ? `${options.warnings.map((warning) => `Warning: ${warning}`).join(\"\\n\")}\\n` : \"\";\n return `${warnings}${table}\\n`;\n }\n }\n return renderSuccess(result, { json: options.json, warnings: options.warnings });\n}\n\nfunction buildRouteEntries(\n tools: readonly GeneratedToolDefinition[],\n presentations: readonly ToolPresentationEnrichment[],\n): Array<{ path: string[]; tool: GeneratedToolDefinition; presentation?: ToolPresentationEnrichment }> {\n const byName = new Map(presentations.map((presentation) => [presentation.mcpName, presentation]));\n const entries: Array<{ path: string[]; tool: GeneratedToolDefinition; presentation?: ToolPresentationEnrichment }> = [];\n for (const tool of tools) {\n const presentation = byName.get(tool.mcpName);\n entries.push({ path: tool.commandPath, tool, presentation });\n for (const alias of presentation?.aliases ?? []) {\n entries.push({ path: alias.split(/\\s+/).filter(Boolean), tool, presentation });\n }\n }\n return entries;\n}\n\nfunction isPrefix(prefix: string[], values: string[]): boolean {\n return prefix.every((value, index) => values[index] === value);\n}\n\nfunction findRestStart(argv: string[], commandPath: string[]): number {\n let matched = 0;\n for (let index = 0; index < argv.length; index += 1) {\n if (!argv[index]?.startsWith(\"-\")) {\n if (argv[index] !== commandPath[matched]) {\n return index;\n }\n matched += 1;\n if (matched === commandPath.length) {\n return index + 1;\n }\n }\n }\n return argv.length;\n}\n","import { readFile, stat } from \"node:fs/promises\";\nimport { basename, extname } from \"node:path\";\nimport { McpRpcClient } from \"../mcp/rpcClient\";\n\nexport interface AttachmentUploadFileInput {\n path: string;\n filename?: string;\n contentType?: string;\n}\n\nexport interface UploadAttachmentsInput {\n documentUuid: string;\n files: AttachmentUploadFileInput[];\n maxBytes?: number;\n ttlSeconds?: number;\n requestToolName?: string;\n commitToolName?: string;\n fetchImpl?: typeof fetch;\n onProgress?: (progress: AttachmentUploadProgress) => void;\n}\n\nexport type AttachmentUploadStage = \"token\" | \"put\" | \"register\" | \"done\";\n\nexport interface AttachmentUploadProgress {\n stage: AttachmentUploadStage;\n path: string;\n filename: string;\n index: number;\n total: number;\n}\n\nexport interface RegisteredAttachmentFile {\n path: string;\n documentUuid: string;\n filename: string;\n storageKey: string;\n contentType: string;\n sizeBytes: number;\n registerResult: unknown;\n}\n\nexport interface UploadAttachmentsResult {\n count: number;\n uploaded: RegisteredAttachmentFile[];\n}\n\nexport class AttachmentUploadError extends Error {\n constructor(\n readonly code: string,\n message: string,\n readonly details?: unknown,\n ) {\n super(message);\n }\n}\n\nexport async function uploadAttachments(\n client: McpRpcClient,\n input: UploadAttachmentsInput,\n): Promise<UploadAttachmentsResult> {\n if (!input.documentUuid.trim()) {\n throw new AttachmentUploadError(\"MISSING_REQUIRED_FLAG\", \"Missing required argument \\\"documentUuid\\\".\", {\n flag: \"--document-uuid\",\n });\n }\n if (input.files.length === 0) {\n throw new AttachmentUploadError(\"MISSING_FILE\", \"Expected at least one file to upload.\");\n }\n\n const fetchImpl = input.fetchImpl ?? fetch;\n const uploaded: RegisteredAttachmentFile[] = [];\n\n for (let index = 0; index < input.files.length; index += 1) {\n const file = input.files[index];\n if (!file) {\n continue;\n }\n uploaded.push(await uploadSingleAttachment(client, file, {\n documentUuid: input.documentUuid,\n maxBytes: input.maxBytes,\n ttlSeconds: input.ttlSeconds,\n requestToolName: input.requestToolName ?? \"mcp__ainecto__request_upload_token\",\n commitToolName: input.commitToolName ?? \"mcp__ainecto__upload_attachments\",\n fetchImpl,\n onProgress: input.onProgress,\n index,\n total: input.files.length,\n }));\n }\n\n return { count: uploaded.length, uploaded };\n}\n\ninterface SingleUploadContext {\n documentUuid: string;\n maxBytes?: number;\n ttlSeconds?: number;\n requestToolName: string;\n commitToolName: string;\n fetchImpl: typeof fetch;\n onProgress?: (progress: AttachmentUploadProgress) => void;\n index: number;\n total: number;\n}\n\ninterface UploadTokenResponse {\n token: string;\n uploadUrl: string;\n storageKey: string;\n}\n\ninterface UploadPutResponse {\n storageKey: string;\n sizeBytes: number;\n contentType: string;\n}\n\nasync function uploadSingleAttachment(\n client: McpRpcClient,\n file: AttachmentUploadFileInput,\n context: SingleUploadContext,\n): Promise<RegisteredAttachmentFile> {\n const metadata = await readFileMetadata(file);\n emitProgress(context, \"token\", file.path, metadata.filename);\n const uploadToken = await requestUploadToken(client, metadata, context);\n\n emitProgress(context, \"put\", file.path, metadata.filename);\n const putResult = await putAttachmentBytes(uploadToken, metadata, context.fetchImpl);\n validatePutResult(uploadToken, metadata, putResult);\n\n const item = {\n documentUuid: context.documentUuid,\n filename: metadata.filename,\n storageKey: uploadToken.storageKey,\n contentType: putResult.contentType,\n sizeBytes: putResult.sizeBytes,\n };\n\n emitProgress(context, \"register\", file.path, metadata.filename);\n const registerResult = await client.toolsCall(context.commitToolName, { items: [item] });\n\n emitProgress(context, \"done\", file.path, metadata.filename);\n return {\n path: file.path,\n documentUuid: context.documentUuid,\n filename: metadata.filename,\n storageKey: uploadToken.storageKey,\n contentType: putResult.contentType,\n sizeBytes: putResult.sizeBytes,\n registerResult,\n };\n}\n\nasync function readFileMetadata(file: AttachmentUploadFileInput): Promise<{\n bytes: Buffer;\n filename: string;\n contentType: string;\n sizeBytes: number;\n}> {\n const stats = await stat(file.path);\n if (!stats.isFile()) {\n throw new AttachmentUploadError(\"INVALID_FILE\", `Attachment path is not a file: ${file.path}`, { path: file.path });\n }\n const bytes = await readFile(file.path);\n return {\n bytes,\n filename: file.filename ?? basename(file.path),\n contentType: file.contentType ?? detectContentType(file.path),\n sizeBytes: bytes.byteLength,\n };\n}\n\nasync function requestUploadToken(\n client: McpRpcClient,\n metadata: { filename: string; contentType: string; sizeBytes: number },\n context: SingleUploadContext,\n): Promise<UploadTokenResponse> {\n const scopeJson = JSON.stringify({\n documentUuid: context.documentUuid,\n filename: metadata.filename,\n contentType: metadata.contentType,\n sizeBytes: metadata.sizeBytes,\n });\n const requestArgs: Record<string, unknown> = {\n purpose: \"attachment.upload\",\n scopeJson,\n };\n if (context.maxBytes !== undefined) {\n requestArgs.maxBytes = context.maxBytes;\n }\n if (context.ttlSeconds !== undefined) {\n requestArgs.ttlSeconds = context.ttlSeconds;\n }\n\n const response = unwrapMcpToolPayload(await client.toolsCall(context.requestToolName, requestArgs));\n if (!isRecord(response)) {\n throw new AttachmentUploadError(\"UPLOAD_TOKEN_PROTOCOL_ERROR\", \"request_upload_token response was not an object.\");\n }\n const token = response.token;\n const uploadUrl = response.uploadUrl;\n const storageKey = response.storageKey;\n if (typeof token !== \"string\" || token.length === 0) {\n throw new AttachmentUploadError(\"UPLOAD_TOKEN_PROTOCOL_ERROR\", \"request_upload_token response did not include token.\");\n }\n if (typeof uploadUrl !== \"string\" || uploadUrl.length === 0) {\n throw new AttachmentUploadError(\"UPLOAD_TOKEN_PROTOCOL_ERROR\", \"request_upload_token response did not include uploadUrl.\");\n }\n if (typeof storageKey !== \"string\" || storageKey.length === 0) {\n throw new AttachmentUploadError(\"UPLOAD_TOKEN_PROTOCOL_ERROR\", \"request_upload_token response did not include storageKey.\");\n }\n return { token, uploadUrl, storageKey };\n}\n\nasync function putAttachmentBytes(\n token: UploadTokenResponse,\n metadata: { bytes: Buffer; contentType: string },\n fetchImpl: typeof fetch,\n): Promise<UploadPutResponse> {\n const maxAttempts = 3;\n let lastRetryableError: unknown;\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\n try {\n const response = await fetchImpl(token.uploadUrl, {\n method: \"PUT\",\n headers: {\n authorization: `Bearer ${token.token}`,\n \"content-type\": metadata.contentType,\n },\n body: new Uint8Array(metadata.bytes),\n });\n if (shouldRetryResponse(response.status) && attempt < maxAttempts) {\n continue;\n }\n if (!response.ok) {\n throw uploadHttpError(response.status);\n }\n return parsePutResponse(await response.text());\n } catch (error) {\n if (error instanceof AttachmentUploadError) {\n throw error;\n }\n lastRetryableError = error;\n if (attempt === maxAttempts) {\n break;\n }\n }\n }\n throw new AttachmentUploadError(\"ATTACHMENT_UPLOAD_FAILED\", \"Attachment upload failed.\", {\n cause: lastRetryableError instanceof Error ? lastRetryableError.message : String(lastRetryableError),\n });\n}\n\nfunction uploadHttpError(status: number): AttachmentUploadError {\n if (status === 409) {\n return new AttachmentUploadError(\"ATTACHMENT_UPLOAD_CONFLICT\", \"Attachment upload failed with HTTP 409 Conflict.\", { status });\n }\n if (status === 401 || status === 403) {\n return new AttachmentUploadError(\"ATTACHMENT_UPLOAD_TOKEN_EXPIRED\", `Attachment upload token was rejected with HTTP ${status}.`, { status });\n }\n return new AttachmentUploadError(\"ATTACHMENT_UPLOAD_HTTP_ERROR\", `Attachment upload failed with HTTP ${status}.`, { status });\n}\n\nfunction shouldRetryResponse(status: number): boolean {\n return status === 429 || status >= 500;\n}\n\nfunction parsePutResponse(text: string): UploadPutResponse {\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n throw new AttachmentUploadError(\"ATTACHMENT_UPLOAD_PROTOCOL_ERROR\", \"Attachment PUT response was not valid JSON.\");\n }\n if (!isRecord(parsed)) {\n throw new AttachmentUploadError(\"ATTACHMENT_UPLOAD_PROTOCOL_ERROR\", \"Attachment PUT response was not an object.\");\n }\n if (typeof parsed.storageKey !== \"string\") {\n throw new AttachmentUploadError(\"ATTACHMENT_UPLOAD_PROTOCOL_ERROR\", \"Attachment PUT response did not include storageKey.\");\n }\n if (typeof parsed.sizeBytes !== \"number\" || !Number.isFinite(parsed.sizeBytes)) {\n throw new AttachmentUploadError(\"ATTACHMENT_UPLOAD_PROTOCOL_ERROR\", \"Attachment PUT response did not include numeric sizeBytes.\");\n }\n if (typeof parsed.contentType !== \"string\") {\n throw new AttachmentUploadError(\"ATTACHMENT_UPLOAD_PROTOCOL_ERROR\", \"Attachment PUT response did not include contentType.\");\n }\n return {\n storageKey: parsed.storageKey,\n sizeBytes: parsed.sizeBytes,\n contentType: parsed.contentType,\n };\n}\n\nfunction validatePutResult(\n token: UploadTokenResponse,\n metadata: { sizeBytes: number },\n putResult: UploadPutResponse,\n): void {\n if (putResult.storageKey !== token.storageKey) {\n throw new AttachmentUploadError(\"ATTACHMENT_UPLOAD_STORAGE_KEY_MISMATCH\", \"Attachment PUT response storageKey did not match the upload token.\", {\n expected: token.storageKey,\n actual: putResult.storageKey,\n });\n }\n if (putResult.sizeBytes !== metadata.sizeBytes) {\n throw new AttachmentUploadError(\"ATTACHMENT_UPLOAD_SIZE_MISMATCH\", \"Attachment PUT response sizeBytes did not match the local file size.\", {\n expected: metadata.sizeBytes,\n actual: putResult.sizeBytes,\n });\n }\n}\n\nfunction unwrapMcpToolPayload(value: unknown): unknown {\n if (!isRecord(value) || !Array.isArray(value.content)) {\n return value;\n }\n const text = value.content\n .map((item) => isRecord(item) && typeof item.text === \"string\" ? item.text : \"\")\n .find((itemText) => itemText.trim().startsWith(\"{\"));\n if (!text) {\n return value;\n }\n try {\n return JSON.parse(text) as unknown;\n } catch {\n return value;\n }\n}\n\nfunction emitProgress(\n context: SingleUploadContext,\n stage: AttachmentUploadStage,\n path: string,\n filename: string,\n): void {\n context.onProgress?.({\n stage,\n path,\n filename,\n index: context.index,\n total: context.total,\n });\n}\n\nfunction detectContentType(path: string): string {\n const extension = extname(path).toLowerCase();\n return MIME_BY_EXTENSION[extension] ?? \"application/octet-stream\";\n}\n\nconst MIME_BY_EXTENSION: Record<string, string> = {\n \".avif\": \"image/avif\",\n \".csv\": \"text/csv\",\n \".gif\": \"image/gif\",\n \".htm\": \"text/html\",\n \".html\": \"text/html\",\n \".jpeg\": \"image/jpeg\",\n \".jpg\": \"image/jpeg\",\n \".json\": \"application/json\",\n \".md\": \"text/markdown\",\n \".pdf\": \"application/pdf\",\n \".png\": \"image/png\",\n \".svg\": \"image/svg+xml\",\n \".txt\": \"text/plain\",\n \".webp\": \"image/webp\",\n \".xls\": \"application/vnd.ms-excel\",\n \".xlsx\": \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n \".zip\": \"application/zip\",\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import type { McpRpcClient } from \"../../core/mcp/rpcClient\";\nimport {\n uploadAttachments,\n type AttachmentUploadProgress,\n type UploadAttachmentsResult,\n} from \"../../core/upload/attachmentUpload\";\nimport { renderSuccess } from \"../../core/output/render\";\nimport { CliCommandError } from \"./errors\";\nimport { ATTACHMENTS_UPLOAD_COMMAND_PATH } from \"./bespokeCommands\";\n\nexport interface AttachmentsUploadCommandOptions {\n argv: string[];\n client: McpRpcClient;\n json: boolean;\n io: {\n stdout: NodeJS.WriteStream;\n stderr: NodeJS.WriteStream;\n };\n}\n\nexport function isAttachmentsUploadCommand(domain: string | undefined, action: string | undefined): boolean {\n return domain === ATTACHMENTS_UPLOAD_COMMAND_PATH[0] && action === ATTACHMENTS_UPLOAD_COMMAND_PATH[1];\n}\n\nexport async function executeAttachmentsUploadCommand(options: AttachmentsUploadCommandOptions): Promise<number> {\n const parsed = parseAttachmentsUploadArgs(options.argv);\n const result = await uploadAttachments(options.client, {\n documentUuid: parsed.documentUuid,\n files: parsed.files.map((path) => ({\n path,\n filename: parsed.filename,\n contentType: parsed.contentType,\n })),\n maxBytes: parsed.maxBytes,\n ttlSeconds: parsed.ttlSeconds,\n onProgress: options.json ? undefined : (progress) => {\n renderProgress(progress, options.io.stderr);\n },\n });\n\n options.io.stdout.write(renderAttachmentUploadResult(result, options.json));\n return 0;\n}\n\ninterface ParsedAttachmentsUploadArgs {\n documentUuid: string;\n files: string[];\n filename?: string;\n contentType?: string;\n maxBytes?: number;\n ttlSeconds?: number;\n}\n\nfunction parseAttachmentsUploadArgs(argv: string[]): ParsedAttachmentsUploadArgs {\n const files: string[] = [];\n let documentUuid: string | undefined;\n let filename: string | undefined;\n let contentType: string | undefined;\n let maxBytes: number | undefined;\n let ttlSeconds: number | undefined;\n let readFilesOnly = false;\n\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (!arg) {\n continue;\n }\n if (readFilesOnly) {\n files.push(arg);\n continue;\n }\n if (arg === \"--\") {\n readFilesOnly = true;\n continue;\n }\n if (arg === \"--document-uuid\" || arg === \"--documentUuid\") {\n documentUuid = requireValue(arg, argv[++index]);\n continue;\n }\n if (arg === \"--filename\" || arg === \"--name\") {\n filename = requireValue(arg, argv[++index]);\n continue;\n }\n if (arg === \"--content-type\" || arg === \"--contentType\") {\n contentType = requireValue(arg, argv[++index]);\n continue;\n }\n if (arg === \"--max-bytes\" || arg === \"--maxBytes\") {\n maxBytes = parsePositiveInteger(arg, requireValue(arg, argv[++index]));\n continue;\n }\n if (arg === \"--ttl-seconds\" || arg === \"--ttlSeconds\") {\n ttlSeconds = parsePositiveInteger(arg, requireValue(arg, argv[++index]));\n continue;\n }\n if (arg.startsWith(\"--\")) {\n throw new CliCommandError(\"UNKNOWN_FLAG\", `Unknown flag ${arg} for attachments upload.`, { flag: arg });\n }\n files.push(arg);\n }\n\n if (!documentUuid) {\n throw new CliCommandError(\"MISSING_REQUIRED_FLAG\", \"Missing required argument \\\"documentUuid\\\" for attachments upload.\", {\n flag: \"--document-uuid\",\n });\n }\n if (files.length === 0) {\n throw new CliCommandError(\"MISSING_FILE\", \"Expected at least one file to upload.\");\n }\n if (filename && files.length !== 1) {\n throw new CliCommandError(\"INVALID_FLAG_VALUE\", \"--filename/--name can only be used with exactly one file.\", {\n flag: \"--filename\",\n files: files.length,\n });\n }\n\n return {\n documentUuid,\n files,\n filename,\n contentType,\n maxBytes,\n ttlSeconds,\n };\n}\n\nfunction parsePositiveInteger(flag: string, value: string): number {\n if (!/^[1-9]\\d*$/.test(value)) {\n throw new CliCommandError(\"INVALID_FLAG_VALUE\", `${flag} must be a positive integer.`, { flag, value });\n }\n return Number.parseInt(value, 10);\n}\n\nfunction requireValue(flag: string, value: string | undefined): string {\n if (!value || value.startsWith(\"--\")) {\n throw new CliCommandError(\"FLAG_REQUIRES_VALUE\", `${flag} requires a value.`, { flag });\n }\n return value;\n}\n\nfunction renderProgress(progress: AttachmentUploadProgress, stderr: NodeJS.WriteStream): void {\n if (progress.stage === \"token\") {\n stderr.write(`Uploading ${progress.filename} (${progress.index + 1}/${progress.total})...\\n`);\n }\n}\n\nfunction renderAttachmentUploadResult(result: UploadAttachmentsResult, json: boolean): string {\n if (json) {\n return renderSuccess(result, { json });\n }\n const lines = [\n `Uploaded ${result.count} attachment${result.count === 1 ? \"\" : \"s\"}.`,\n ...result.uploaded.map((file) => `- ${file.filename} (${file.sizeBytes} bytes)`),\n ];\n return renderSuccess(lines.join(\"\\n\"), { json: false });\n}\n","import { chmod, mkdir, rename, rm, rmdir, stat, writeFile } from \"node:fs/promises\";\nimport { dirname, join, relative, resolve, sep } from \"node:path\";\nimport { McpRpcError, type McpRpcClient } from \"../../core/mcp/rpcClient\";\nimport { isDefaultEndpointFor } from \"../../core/config/endpoints\";\nimport { renderSuccess } from \"../../core/output/render\";\nimport { HARNESS_ROLES, ROLE_ENV_VAR, type HarnessRole } from \"../../core/harness/role\";\nimport {\n initRefusal,\n MANAGED_PATHS,\n planInit,\n planUndo,\n type FileWrite,\n type InitPlan,\n withCreatedDirectories,\n} from \"../../core/harness/initPlan\";\nimport { HARNESS_CONFIG_PATH, HARNESS_DOC_PATH, HARNESS_RECORD_PATH } from \"../../core/harness/harnessDoc\";\nimport {\n adoptLegacyLayout,\n LEGACY_RECORD_PATH,\n LEGACY_SNAPSHOT_PATHS,\n withLegacyMoves,\n} from \"../../core/harness/legacyLayout\";\nimport { LEGACY_SERVER_NAME, SERVER_NAME } from \"../../core/harness/agentTargets\";\nimport { fetchHarnessDocuments, type HarnessDocuments } from \"../../core/harness/documentFetch\";\nimport { PromptCancelled, type Choice, type Prompter } from \"./prompter\";\nimport {\n assertInsideRepository,\n findGitRoot,\n readIfExists,\n readManagedFile,\n rolesInFiles,\n} from \"../../core/harness/repositoryRole\";\n\n/** 역할이 딱 하나일 때만 그 역할(대화형 기본값). 없거나 어긋나 있으면 기본값이 없다. */\nfunction singleRole(roles: HarnessRole[]): HarnessRole | undefined {\n return roles.length === 1 ? roles[0] : undefined;\n}\n\n/** 역할이 정해진 «뒤»에 만드는 연결. 역할이 토큰 칸과 헤더를 정하므로 역할보다 먼저 만들 수 없다. */\nexport interface InitConnection {\n client: McpRpcClient;\n accessToken?: () => Promise<string | undefined>;\n login?: () => Promise<void>;\n}\n\nexport interface InitCommandOptions {\n argv: string[];\n /** 전역 `--role` / AINECTO_ROLE(옛 AI_ERD_ROLE) 에서 온 역할. init 은 이것을 따로 파싱하지 않는다. */\n role?: HarnessRole;\n /**\n * 이미 만든 연결(시험·역할이 미리 정해진 호출). {@link connect} 가 있으면 그쪽이 이긴다.\n */\n client?: McpRpcClient;\n /**\n * ★역할이 정해진 뒤 연결을 만든다(설계 §21-4). 대화형에서는 역할을 «물어서» 정하므로, 바깥 CLI 가\n * 미리 클라이언트를 만들 수 없다. 저장소 역할 추론도 init 안에서 하므로 «역할이 클라이언트보다 먼저\n * 정해진다»(I10)가 이 한 곳에서 지켜진다.\n */\n connect?: (role: HarnessRole) => InitConnection;\n /** 대화형일 때만 있다(판정은 prompter.isInteractive 한 곳). 없으면 묻지 않고 빠진 값을 말하고 멈춘다. */\n prompter?: Prompter;\n endpoint: string;\n /**\n * 문서를 받을 때 쓸 토큰을 «필요할 때» 가져온다. 없으면 패키지 기본값으로 간다.\n *\n * <p>★지연 조회인 이유: {@code --undo} 는 순수한 로컬 작업인데, 예전엔 그마저도 토큰\n * 조회·갱신·저장을 먼저 돌렸다(2026-09-23 독립 재리뷰 S1). 로컬 되돌리기가 네트워크에\n * 의존하면, 서버가 죽은 날 되돌릴 수가 없다.\n */\n accessToken?: () => Promise<string | undefined>;\n /**\n * 이 역할로 브라우저 로그인을 한다(= {@code ainecto auth login} 과 같은 함수). 없으면 init 은 예전처럼\n * 로그인하지 않고 401 을 안내로 바꾼다.\n *\n * <p>★init 은 사람이나 에이전트가 «명시적으로» 친 명령이라 여기서 로그인한다. 브리지({@code ainecto mcp})는\n * 여전히 자동 로그인하지 않는다 — 세션 한가운데서 창이 뜨면 안 된다(설계 §8-4).\n */\n login?: () => Promise<void>;\n /** 시험용 주입. 기본은 전역 fetch. */\n fetchImpl?: typeof fetch;\n env: \"prod\" | \"dev\";\n cliVersion: string;\n cwd: string;\n json: boolean;\n io: { stdout: NodeJS.WriteStream; stderr: NodeJS.WriteStream };\n}\n\n/** 연결까지 갖춘 옵션 — 원격을 부르는 함수들은 이것만 받는다. */\ntype ConnectedOptions = InitCommandOptions & { client: McpRpcClient };\n\ninterface InitArgs {\n projectUuid?: string;\n projectName?: string;\n dryRun: boolean;\n undo: boolean;\n yes: boolean;\n}\n\n/**\n * {@code ainecto init} — 이 저장소를 AiNecto 하네스에 붙인다.\n *\n * ★<b>지금은 비대화형 경로만 있다</b>(설계 §21-1, 1단계). 합격 시나리오는 에이전트가 셸로 이 명령을\n * 치는 것이고 거기엔 사람이 답할 TTY 가 없다. 그래서:\n * <ul>\n * <li><b>빠진 값은 채우지 않고 말하고 멈춘다.</b> 역할을 기본값으로 고르지 않는다 — 사람이 고른 값이\n * {@code --role} 로 와야 한다. 프로젝트가 여럿이면 목록을 보여 주고 «다시 실행하라»고 한다.</li>\n * <li><b>역할이 있으면 로그인까지 한다.</b> 그 역할의 토큰이 없으면 브라우저를 띄우고(사람이 승인)\n * 이어서 진행한다.</li>\n * </ul>\n * ★<b>사람이 터미널에서 치면(대화형) 빠진 역할·프로젝트를 번호로 묻는다</b>(설계 §21-4, 0.4.1).\n * 기본값으로 역할을 고르지 않는다. 질문 중 입력이 끝나면(EOF) 아무것도 쓰지 않고 130 으로 끝난다.\n * 확인 단계·루트 질문은 2단계다(설계 §21-2).\n */\nexport async function executeInitCommand(options: InitCommandOptions): Promise<number> {\n try {\n return await runInit(options);\n } catch (error) {\n if (error instanceof PromptCancelled) {\n options.io.stderr.write(`${error.message}\\n`);\n return 130;\n }\n throw error;\n } finally {\n options.prompter?.close();\n }\n}\n\nasync function runInit(initialOptions: InitCommandOptions): Promise<number> {\n let options = initialOptions;\n const args = parseInitArgs(options.argv);\n const root = resolve(options.cwd);\n // ★하위 폴더에서 치면 멈춘다. 그 자리에 .mcp.json 을 쓰면 에이전트는 루트에서 그것을 못 본다 —\n // 역할이 걸린 줄 알고 걸리지 않는다. undo 도 같은 이유로 루트에서만 한다(기록이 루트에 있다).\n const rootNotes = await repositoryRootNotes(root);\n // ★디스크(옛 폴더 포함)와 계획이 보는 스냅샷(새 경로만)을 가른다. 0.4.x 의 .ai-erd/ 는 계획에 «새 경로에 놓인\n // 것처럼» 보이고, 적용이 그것을 옮긴다(legacyLayout). 적용의 «그새 바뀌었나» 검사는 디스크 스냅샷으로 한다.\n const disk = await readSnapshot(root);\n const layout = adoptLegacyLayout(disk);\n const files = layout.files;\n\n if (args.undo) {\n if (layout.refusal !== undefined) {\n // 읽어 내지 못한 기록으로는 아무것도 지우지 않는다 — 손상 기록을 만난 undo 와 같은 출력이다.\n options.io.stdout.write(renderSuccess(\n { action: args.dryRun ? \"undo (dry-run)\" : \"undo\", updated: [], removed: [], notes: [...rootNotes, layout.refusal] },\n { json: options.json },\n ));\n return 0;\n }\n const plan = withLegacyMoves(planUndo({ files }), layout);\n await applyPlan(root, plan, args.dryRun, disk, false);\n options.io.stdout.write(renderSuccess(\n {\n action: args.dryRun ? \"undo (dry-run)\" : \"undo\",\n updated: plan.writes.map((write) => write.path),\n removed: plan.deletes,\n notes: [...rootNotes, ...plan.notes],\n },\n { json: options.json },\n ));\n return 0;\n }\n\n // ★<b>원격을 건드리기 «전»에 기록을 본다.</b> 예전엔 이 판정이 계획 안에만 있어서, 프로젝트가\n // 0개인 저장소에서 «원격에 프로젝트를 만든 뒤» 「아무것도 바꾸지 않았다」는 예외를 냈다\n // (9차 1차 리뷰 B7). 로컬 쓰기가 0이라는 것과 부수효과가 0이라는 것은 다른 사실이다.\n // ★묻기 «전»에도 본다 — 다 물어 놓고 거절하지 않는다.\n const refusal = layout.refusal ?? initRefusal(files);\n if (refusal !== undefined) {\n throw new Error(refusal);\n }\n\n // ⚠명시한 --role 이 있으면 저장소 역할을 읽지 않는다 — 설정끼리 어긋난 저장소를 그 --role 이 맞춘다.\n // ★설정끼리 역할이 어긋난 저장소: 대화형이면 «기본값 없이» 묻고, 비대화형이면 사용자에게 물으라며 멈춘다.\n const prompter = options.prompter;\n const role = options.role ?? (prompter\n ? await askRole(prompter, singleRole(rolesInFiles(files).roles))\n : currentRole(files));\n // 설정끼리 어긋나 있으면 «이전 역할»은 하나로 말할 수 없다 — 그때는 변경 알림을 생략한다\n // (명시한 --role 이 둘을 맞추고, 파일별 변화는 계획의 notes 가 말한다).\n const previousRole = (() => {\n try {\n return currentRole(files);\n } catch {\n return undefined;\n }\n })();\n if (!role) {\n // ⚠「하나 고르라」고 말하지 않는다 — 이 문장을 읽는 것은 대개 에이전트이고, 역할은 사용자가 고른다\n // (0.4.1 최종 리뷰 P1, noProjectForRole 과 같은 어조).\n throw new Error(\n \"No role given. Ask the user which role this repository's AI sessions should have \"\n + `(${HARNESS_ROLES.join(\", \")}), then re-run with --role <role>.`,\n );\n }\n\n // 역할이 정해졌으니 이제 그 역할의 연결을 만든다.\n const connected: ConnectedOptions = connectAs(options, role);\n options = connected;\n\n await ensureSignedIn(connected, role, args.dryRun);\n\n const project = await resolveProject(connected, args, files, root, role);\n if (\"choices\" in project) {\n options.io.stdout.write(renderSuccess(\n {\n message: \"More than one project found. Re-run with --project <uuid>.\",\n projects: project.choices,\n },\n { json: options.json },\n ));\n return 1;\n }\n\n const documents: HarnessDocuments = args.dryRun\n ? { versions: {}, fallbacks: {}, unavailableReason: \"skipped in --dry-run\" }\n : await fetchHarnessDocuments({\n endpoint: options.endpoint,\n accessToken: await options.accessToken?.(),\n // ⛔이 이름은 바꾸지 않는다 — 서버가 문서의 클라이언트별 변형 키(HARNESS.DOC.AI_ERD_CLI 등)를 이것으로\n // 찾는다. 사람에게 안 보이는 서버 쪽 식별자다(역할 헤더·scope 와 같은 이유, 2026-10-11).\n client: \"ai-erd-cli\",\n fetchImpl: options.fetchImpl,\n });\n\n const plan = withLegacyMoves(planInit({\n role,\n env: options.env,\n projectName: project.name,\n projectUuid: project.uuid,\n endpoint: options.endpoint,\n cliVersion: options.cliVersion,\n files,\n documents,\n }), layout);\n if (plan.refusal !== undefined) {\n // ★계획이 「멈춰라」고 하면 멈춘다. 이 판정을 부르는 쪽이 안 보면 그 판정은 «없는» 것이고,\n // 그 경우 읽어 내지 못한 기록을 백업 없이 덮는다(2026-09-27 8차 독립 리뷰 I1).\n // ⚠위에서 이미 물었지만 여기서도 본다 — 계획이 거절을 «돌려주는» 이상 그것을 보지 않는\n // 경로가 생겨선 안 된다. 같은 함수를 쓰므로 두 답이 갈리지 않는다.\n throw new Error(plan.refusal);\n }\n await applyPlan(root, plan, args.dryRun, disk);\n if (!args.dryRun && previousRole !== undefined && previousRole !== role) {\n // ★역할이 바뀐 사실을 사람이 보는 자리(에이전트 대화)에 한 줄 남긴다(설계 §13 S2).\n // 셸의 `ainecto` 는 지금부터, 떠 있는 세션의 MCP 도구는 새 세션부터다 — 그 조건까지 같이 말한다.\n options.io.stderr.write(`Role changes from ${previousRole} to ${role}: \\`ainecto\\` commands now, MCP tools from a new session.\\n`);\n }\n\n options.io.stdout.write(renderSuccess(\n {\n action: args.dryRun ? \"init (dry-run)\" : \"init\",\n role,\n project: { uuid: project.uuid, name: project.name },\n endpoint: options.endpoint,\n written: plan.writes.map((write) => `${write.existed ? \"updated\" : \"created\"} ${write.path}`),\n // 옛 폴더(.ai-erd/)를 옮길 때만 생긴다 — 지운 것을 말하지 않으면 사용자는 옛 파일이 어디 갔는지 모른다.\n ...(plan.deletes.length > 0 ? { removed: plan.deletes } : {}),\n codex: `Codex keeps a single global config, so init does not touch it. Run: ${plan.codexCommand}`,\n codexPerSession: plan.codexProfile,\n codexEnvFallback: `Without a profile, start the session with ${ROLE_ENV_VAR}=${role}.`,\n // ⚠조용히 기본값으로 떨어지지 않는다 — 서버에서 규칙을 고쳐도 안 바뀌는 이유를\n // 사용자가 영영 못 찾게 된다. ★요청 자체의 실패와 «문서별» 되돌림을 둘 다 적는다\n // (2026-09-23 독립 재리뷰 I5: HTTP 200 으로 온 빈 문서가 조용히 패키지 판이 됐다).\n notes: [...rootNotes, ...plan.notes, ...fallbackNotes(documents)],\n // ★「Enforce this on the server too: ainecto auth login …」 줄은 뺐다. init 이 이미 그 역할로\n // 로그인했으므로 참이 아니고, 남아 있으면 에이전트가 따라 쳐서 사람이 한 번 더 승인하게 된다\n // (2026-09-29 독립 리뷰 P1-1).\n // ★재시작 없이 이어간다(2026-09-30 사용자 결정). 셸의 `ainecto` 는 부를 때마다 저장소 역할을 읽어\n // 역할 헤더로 싣는다 — 서버가 요청마다 강제하므로 MCP 연결과 무관하게 이 세션에서 바로 맞다.\n // 재시작은 «그 역할의 MCP 도구»를 더할 뿐인 선택이다.\n next: [\n `Keep working in this session — no restart is needed. \\`ainecto\\` commands run from this repository use the ${role} role at once.`,\n `Read ${HARNESS_DOC_PATH} first, then \\`ainecto tools list\\` shows the role's tools and \\`ainecto tools call <tool> '<json>'\\` calls one.`,\n \"Do not use MCP tools this session started with for this work — they keep the role (or no role) the session started with.\",\n \"Optional, to add the role's MCP tools: start a new session.\",\n `Claude Code: exit and run \\`claude -c\\` in this folder, then approve the \"${SERVER_NAME}\" server from .mcp.json when asked.`,\n `Codex: save the profile above as $CODEX_HOME/${role}.config.toml and start with \\`codex -p ${role}\\`.`,\n role === \"design\"\n // ⚠Design 은 그 변경이 «허용»된다 — 모든 역할에 같은 문장을 내보내면 거짓이 된다.\n ? \"To check the role, change a table through `ainecto` — Design may, and the change lands in AiNecto.\"\n : `To check the role, try changing a table through \\`ainecto\\` — ${role} is told to stop.`,\n `If the new Claude Code session still has no role, run \\`claude mcp get ${SERVER_NAME}\\`: a local-scope \"${SERVER_NAME}\" entry hides .mcp.json (remove it with \\`claude mcp remove ${SERVER_NAME} -s local\\`).`,\n // ★서버 이름이 바뀌었다(0.5.0). 예전에 같은 이름(\"ai-erd\")이라 .mcp.json 이 덮던 사용자·Codex 전역 항목이\n // 이제는 «따로» 붙어, 그 세션이 역할 없는 서버를 하나 더 본다. 그 항목을 지우는 법을 같이 말한다.\n `If you added AiNecto earlier as \"${LEGACY_SERVER_NAME}\" (Claude Code user scope, or Codex), remove it — `\n + `it no longer hides behind this \"${SERVER_NAME}\" entry: \\`claude mcp remove ${LEGACY_SERVER_NAME} -s user\\`, \\`codex mcp remove ${LEGACY_SERVER_NAME}\\`.`,\n \"Undo everything with: ainecto init --undo\",\n ],\n },\n { json: options.json },\n ));\n return 0;\n}\n\n/** 이 저장소에 이미 걸린 역할. 두 설정이 어긋나 있으면 «고르지 않고» 멈춘다. */\nfunction currentRole(files: ReadonlyMap<string, string | undefined>): HarnessRole | undefined {\n const unique = rolesInFiles(files).roles;\n if (unique.length > 1) {\n throw new Error(\n `Agent configs in this repository disagree about the session role (${unique.join(\", \")}). `\n + \"Ask the user which role this repository's AI sessions should have \"\n + `(${HARNESS_ROLES.join(\", \")}), then re-run with --role <role> to line them up.`,\n );\n }\n return unique[0];\n}\n\n/** 패키지 기본값을 쓴 사실과 그 이유. 없으면 빈 배열. */\nfunction fallbackNotes(documents: HarnessDocuments): string[] {\n const notes: string[] = [];\n if (documents.unavailableReason) {\n notes.push(`Harness rules came from this package, not the server (${documents.unavailableReason}).`);\n }\n for (const [key, reason] of Object.entries(documents.fallbacks)) {\n notes.push(`${key} came from this package, not the server (${reason}).`);\n }\n return notes;\n}\n\n/**\n * ★<b>원격을 부르기 전에 로그인을 확인한다.</b> 그 역할의 토큰이 없으면(만료 + refresh 없음 포함)\n * 브라우저 로그인을 하고 이어서 진행한다(합격 시나리오 4 — 예전엔 401 로 멈추고\n * {@code ainecto auth login} 을 치라고 했다).\n *\n * <p>⚠{@code --dry-run} 은 브라우저를 띄우지 않는다 — 「아무것도 바꾸지 않는다」는 약속에 사용자의\n * 로그인 상태도 든다. 로그인 명령을 알려 주고 멈춘다.\n * <p>토큰은 있는데 서버가 401 을 주는 경우(폐기된 토큰)는 드물어 여기서 다루지 않는다 —\n * {@link callOrExplainSignIn} 이 안내한다. 트리거를 둘로 늘리지 않는다(설계 §8-1).\n */\nasync function ensureSignedIn(\n options: InitCommandOptions,\n role: HarnessRole,\n dryRun: boolean,\n): Promise<void> {\n if (options.login === undefined) {\n return;\n }\n if (await options.accessToken?.()) {\n return;\n }\n if (dryRun) {\n // (dry-run 의 accessToken 은 읽기 전용이다 — 갱신하지 않으므로 만료된 토큰도 여기로 온다.)\n throw new Error(\n `No usable AiNecto sign-in on this machine, and --dry-run neither refreshes it nor opens a browser.\\n\\n`\n + ` ${loginCommand(options)}\\n\\n`\n + \"Then run init again.\",\n );\n }\n await options.login();\n options.io.stderr.write(\"Signed in.\\n\");\n}\n\n/**\n * 저장소 루트 판정. 하위 폴더면 멈추고(던진다), git 저장소가 아니면 그 사실을 note 로 돌려준다.\n *\n * <p>★{@code .git} 은 디렉터리 «또는 파일»이다 — worktree·submodule 은 파일이다. {@code git} 실행\n * 파일에는 기대지 않는다. git 이 아니면 멈추지 않는다: git 을 안 쓰는 사용자가 있고, 그 경우엔\n * 가리킬 «진짜 루트»가 없다(설계 §6-1).\n */\nasync function repositoryRootNotes(cwd: string): Promise<string[]> {\n const gitRoot = await findGitRoot(cwd);\n if (gitRoot === undefined) {\n // (init·undo 둘 다 이 note 를 쓴다 — «설정했다»가 아니라 «어디를 기준으로 삼았나»를 말한다.)\n return [`${cwd} is not inside a git repository, so this folder was used as the repository root.`];\n }\n if (gitRoot !== cwd) {\n throw new Error(\n `This folder is inside the git repository at ${gitRoot}, not at its root. `\n + \"Agents read their MCP config from the repository root, so run init there:\\n\\n\"\n + ` cd ${gitRoot}\\n\\n`\n + \"Nothing was changed.\",\n );\n }\n return [];\n}\n\n/**\n * 역할이 정해진 뒤의 연결. {@code connect} 가 있으면 그것으로 만들고, 없으면 이미 받은 {@code client}.\n * 둘 다 없으면 부르는 쪽의 실수다.\n */\nfunction connectAs(options: InitCommandOptions, role: HarnessRole): ConnectedOptions {\n if (options.connect) {\n const connection = options.connect(role);\n return { ...options, ...connection };\n }\n if (!options.client) {\n throw new Error(\"init needs either a client or a way to connect once the role is known.\");\n }\n return { ...options, client: options.client };\n}\n\nconst ROLE_CHOICES: ReadonlyArray<Choice<HarnessRole>> = [\n { label: \"Design requirements, ERD, boundaries, tasks\", value: \"design\" },\n { label: \"Development product code, following the approved design\", value: \"development\" },\n { label: \"Test test scenarios and test code\", value: \"test\" },\n { label: \"Validation judges the result; changes nothing\", value: \"validation\" },\n];\n\n/**\n * 역할을 묻는다(설계 §6-2). ★기본값이 없다 — 빈 입력은 다시 묻는다. 저장소에 이미 걸린 역할이 있을\n * 때만 그것이 기본값이다(Enter = 유지). 그 값은 사람이 전에 고른 것이지 우리가 고른 것이 아니다.\n */\nasync function askRole(prompter: Prompter, current: HarnessRole | undefined): Promise<HarnessRole> {\n const index = current === undefined ? undefined : ROLE_CHOICES.findIndex((choice) => choice.value === current);\n return prompter.choose(\n current === undefined\n ? \"Which role should AI sessions in this repository have?\"\n : `Which role should AI sessions in this repository have? (now: ${current})`,\n ROLE_CHOICES,\n index,\n );\n}\n\n/**\n * 프로젝트를 묻는다(설계 §6-4). 「새로 만들기」는 Design 이고 dry-run 이 아닐 때만 보인다 — 다른 역할은\n * 서버가 만들기를 거부한다. 0개면: Design 은 이름을 물어 만들고(사람의 선택이 --yes 를 대신한다),\n * 다른 역할은 비대화형과 같은 안내로 멈춘다.\n */\nasync function askProject(\n options: ConnectedOptions,\n args: InitArgs,\n projects: Array<{ uuid: string; name: string }>,\n bound: string | undefined,\n root: string,\n role: HarnessRole,\n prompter: Prompter,\n): Promise<{ uuid: string; name: string }> {\n const canCreate = role === \"design\" && !args.dryRun;\n const askNameAndCreate = async () => {\n const name = await prompter.text(\"New project name\", args.projectName ?? basenameOf(root));\n return createProject(options, name);\n };\n if (projects.length === 0) {\n if (role !== \"design\") {\n throw new Error(noProjectForRole(options, role));\n }\n if (args.dryRun) {\n throw new Error(dryRunCannotCreate(args.projectName ?? basenameOf(root)));\n }\n return askNameAndCreate();\n }\n type ProjectPick = { project: { uuid: string; name: string } } | { create: true };\n const choices: Array<Choice<ProjectPick>> = projects.map((project) => ({\n label: `${project.name} (${project.uuid})`,\n value: { project },\n }));\n if (canCreate) {\n choices.push({ label: \"Create a new project\", value: { create: true } });\n }\n const boundIndex = bound === undefined ? -1 : projects.findIndex((project) => project.uuid === bound);\n const defaultIndex = boundIndex >= 0 ? boundIndex : projects.length === 1 ? 0 : undefined;\n const picked = await prompter.choose(\"Which AiNecto project should this repository use?\", choices, defaultIndex);\n return \"create\" in picked ? askNameAndCreate() : picked.project;\n}\n\n/** 0개 + Design 아님의 안내. 비대화형·대화형이 같은 문장을 쓴다. */\nfunction noProjectForRole(options: Pick<InitCommandOptions, \"endpoint\">, role: HarnessRole): string {\n // ⚠「--role design 으로 다시 치라」고 말하지 않는다. 그 문장은 에이전트를 «역할 전환»으로 이끈다 —\n // 역할은 사용자가 고른 것이다(2026-09-29 코드 리뷰 P1). 사람에게 묻게 하고, 원래 역할로 돌아오게 한다.\n return `No project found in your AiNecto account, and only a Design session can create one. `\n + `Ask the user: create the project at ${new URL(options.endpoint).origin} or in a Design session, `\n + `then run init again with --role ${role}.`;\n}\n\nfunction dryRunCannotCreate(name: string): string {\n // ★dry-run 이 «원격에» 프로젝트를 만들면 그것은 dry-run 이 아니다(2026-09-22 독립 리뷰 I6).\n return `--dry-run cannot continue: there is no project to bind, and creating \"${name}\" `\n + \"would be a real change. Re-run without --dry-run, or pass --project <uuid>.\";\n}\n\ntype ResolvedProject = { uuid: string; name: string } | { choices: Array<{ uuid: string; name: string }> };\n\nasync function resolveProject(\n options: ConnectedOptions,\n args: InitArgs,\n files: ReadonlyMap<string, string | undefined>,\n root: string,\n role: HarnessRole,\n): Promise<ResolvedProject> {\n const projects = await listProjects(options);\n\n if (args.projectUuid) {\n const found = projects.find((project) => project.uuid === args.projectUuid);\n return found ?? { uuid: args.projectUuid, name: args.projectName ?? args.projectUuid };\n }\n\n const bound = boundProjectUuid(files.get(HARNESS_CONFIG_PATH));\n if (options.prompter) {\n return askProject(options, args, projects, bound, root, role, options.prompter);\n }\n if (bound) {\n const found = projects.find((project) => project.uuid === bound);\n if (found) {\n return found;\n }\n }\n\n if (projects.length === 1) {\n return projects[0]!;\n }\n if (projects.length > 1) {\n return { choices: projects };\n }\n\n // 프로젝트가 하나도 없다 — 만들어야 한다.\n // ★만들 수 있는 것은 Design 세션뿐이다(서버 McpRolePolicy: create_projects 는 Design·FULL 만).\n // 예전엔 다른 역할로 --yes 를 주면 서버가 거부하고, 우리는 「Project creation did not return a\n // project uuid.」라는 엉뚱한 말로 끝났다. 원격 쓰기를 부르기 «전에» 사람이 할 일을 말한다.\n if (role !== \"design\") {\n throw new Error(noProjectForRole(options, role));\n }\n // ★쓰기이므로 --yes 없이는 하지 않는다.\n const name = args.projectName ?? basenameOf(root);\n if (!args.yes) {\n throw new Error(\n `No project found in your AiNecto account. Re-run with --yes to create \"${name}\", `\n + \"or --project-name <name> --yes to pick the name.\",\n );\n }\n if (args.dryRun) {\n throw new Error(dryRunCannotCreate(name));\n }\n return createProject(options, name);\n}\n\nasync function listProjects(options: ConnectedOptions): Promise<Array<{ uuid: string; name: string }>> {\n const result = await callOrExplainSignIn(options, () => options.client.toolsCall(\"list_projects\", {}));\n return extractProjects(unwrapToolJson(result));\n}\n\n/**\n * ★<b>401 을 «무엇을 하라»로 바꾼다.</b>\n *\n * <p>토큰이 «없을» 때는 여기까지 오지 않는다 — {@link ensureSignedIn} 이 먼저 로그인한다.\n * 여기 오는 것은 토큰은 있는데 서버가 거절한 경우(폐기 등)와, 로그인 함수를 받지 못한 호출이다.\n * 그때 {@code MCP HTTP request failed with HTTP 401.} 한 줄만 남기면 무엇을 해야 하는지 모른다\n * (2026-09-23 살아 있는 서버로 처음 돌려 보고 발견).\n *\n * <p>⚠401 을 받았다고 «다시» 브라우저를 띄우지는 않는다. 로그인 트리거는 하나로 둔다(설계 §8-1).\n * 브리지({@code ainecto mcp})는 애초에 자동 로그인하지 않는다 — 세션 한가운데서 창이 뜨면 안 된다.\n */\nasync function callOrExplainSignIn<T>(\n options: InitCommandOptions,\n run: () => Promise<T>,\n): Promise<T> {\n try {\n return await run();\n } catch (error) {\n if (!isUnauthorized(error)) {\n throw error;\n }\n throw new Error(\n `Not signed in, so ${options.endpoint} refused the request (HTTP 401).\\n\\n`\n + ` ${loginCommand(options)}\\n\\n`\n + \"Then run init again. Sign-in is one per machine; the role comes from this repository.\",\n );\n }\n}\n\n/**\n * 이 저장소·이 서버에 맞는 로그인 명령 한 줄. ★<b>만드는 곳은 여기 하나다.</b>\n *\n * <p>⚠예전엔 「이 env 의 기본 주소면 인자를 생략」이라고만 하고 그 env 자체도 안 실었다.\n * CLI 의 기본 env 는 prod 라, dev 기본 주소에서 막힌 사람이 그 명령을 그대로 치면 «운영»\n * 슬롯에 로그인하고 같은 자리에서 또 막힌다(2026-09-23 4차 독립 리뷰 S2).\n * 주소든 env 든 <b>하나는 반드시</b> 실린다.\n */\nfunction loginCommand(options: Pick<InitCommandOptions, \"env\" | \"endpoint\">): string {\n const target = isDefaultEndpointFor(options.env, options.endpoint)\n ? (options.env === \"prod\" ? \"\" : ` --env ${options.env}`)\n : ` --endpoint ${options.endpoint}`;\n // 로그인은 서버마다 한 번이다(0.4.2) — 역할을 싣지 않는다.\n return `ainecto auth login${target}`;\n}\n\nfunction isUnauthorized(error: unknown): boolean {\n return error instanceof McpRpcError\n && error.code === \"MCP_HTTP_ERROR\"\n && (error.details as { status?: number } | undefined)?.status === 401;\n}\n\nasync function createProject(options: ConnectedOptions, name: string): Promise<{ uuid: string; name: string }> {\n const result = await callOrExplainSignIn(options, () =>\n options.client.toolsCall(\"create_projects\", { items: [{ name }] }));\n const created = extractProjects(unwrapToolJson(result));\n const first = created[0];\n if (!first) {\n throw new Error(\"Project creation did not return a project uuid.\");\n }\n // ★원격에 생긴 것을 «바로» 알린다. 뒤에서 실패하면 결과 출력이 없어 사용자는 이 프로젝트가\n // 생긴 줄 모른다(설계 §13 S9).\n options.io.stderr.write(`Created project ${first.name} (${first.uuid}).\\n`);\n return first;\n}\n\n/** MCP 도구 응답은 {@code content[0].text} 에 JSON 문자열로 온다. */\nexport function unwrapToolJson(result: unknown): unknown {\n if (!isRecord(result) || !Array.isArray(result.content)) {\n return result;\n }\n const first = result.content.find((item) => isRecord(item) && item.type === \"text\");\n if (!isRecord(first) || typeof first.text !== \"string\") {\n return result;\n }\n try {\n return JSON.parse(first.text);\n } catch {\n return first.text;\n }\n}\n\n/**\n * 응답 모양을 단정하지 않고 «uuid 와 name 을 가진 객체의 배열»을 찾는다.\n * ⚠도구 응답 포맷을 여기 박아 두면 서버가 한 겹 감싸는 순간 조용히 빈 목록이 된다.\n */\nexport function extractProjects(value: unknown): Array<{ uuid: string; name: string }> {\n const candidates: unknown[] = Array.isArray(value)\n ? value\n : isRecord(value)\n ? [\"projects\", \"items\", \"created\", \"data\", \"hits\"].flatMap((key) => {\n const nested = value[key];\n return Array.isArray(nested) ? nested : [];\n })\n : [];\n const projects: Array<{ uuid: string; name: string }> = [];\n for (const candidate of candidates) {\n if (isRecord(candidate) && typeof candidate.uuid === \"string\") {\n projects.push({\n uuid: candidate.uuid,\n name: typeof candidate.name === \"string\" ? candidate.name : candidate.uuid,\n });\n }\n }\n return projects;\n}\n\nfunction boundProjectUuid(config: string | undefined): string | undefined {\n if (!config) {\n return undefined;\n }\n try {\n const parsed = JSON.parse(config) as { project?: { uuid?: unknown } };\n return typeof parsed.project?.uuid === \"string\" ? parsed.project.uuid : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * ★<b>읽기도 경계 검사를 먼저 통과한다.</b> 예전엔 스냅샷을 다 읽은 «뒤에» 경계를 봤다 —\n * 저장소 밖을 가리키는 링크의 내용을 한 번 읽고 나서 거절했다(2026-09-23 독립 재리뷰 I4).\n * 쓰기·삭제만 막으면 되는 게 아니다. 읽는 것도 남의 파일이다.\n */\nasync function readSnapshot(root: string): Promise<Map<string, string | undefined>> {\n const snapshot = new Map<string, string | undefined>();\n for (const path of [...MANAGED_PATHS, ...LEGACY_SNAPSHOT_PATHS]) {\n snapshot.set(path, await readManagedFile(root, path));\n }\n return snapshot;\n}\n\n/**\n * 계획을 적용한다.\n *\n * <p>★<b>먼저 전부 검사하고, 그 다음에 쓴다.</b> 예전엔 한 파일씩 쓰다가 중간에 막히면\n * (권한 등) 앞 파일만 바뀐 채로 실패했다(2026-09-22 독립 리뷰 I5). 지금은 경계·링크·\n * 「스냅샷 이후 바뀌었는가」를 먼저 다 보고, 하나라도 걸리면 아무것도 안 쓴다.\n *\n * <p>⚠그래도 «쓰는 도중» 실패는 완전히 못 막는다(디스크 가득 등). 그때 무엇이 쓰였는지는\n * 오류에 적는다 — 조용히 반쪽 상태로 두지 않는다.\n */\nasync function applyPlan(\n root: string,\n plan: InitPlan,\n dryRun: boolean,\n snapshot: FileSnapshotMap,\n recordFirst = true,\n): Promise<void> {\n // ①먼저 «전부» 본다 — 하나라도 못 쓸 상황이면 아무것도 건드리지 않고 멈추는 게 낫다.\n for (const write of plan.writes) {\n await assertInsideRepository(root, write.path);\n await assertUnchangedSinceSnapshot(root, write.path, snapshot);\n }\n for (const path of plan.deletes) {\n await assertInsideRepository(root, path);\n await assertUnchangedSinceSnapshot(root, path, snapshot);\n }\n if (dryRun) {\n return;\n }\n const applied: string[] = [];\n try {\n // ★<b>복구 기록을 먼저 쓴다.</b> 예전엔 관리 기록(.ai-erd/config.json)이 «마지막» 쓰기였다.\n // 그래서 중간에 실패하면 이미 바뀐 파일이 있는데 기록이 없어 undo 가 아무것도 못 되돌렸다\n // (2026-09-23 독립 재리뷰 I11). 되돌릴 수 있게 만드는 것이 첫 일이다.\n // ★되돌리기에서는 기록을 건드리는 일이 «작업 전체»의 마지막이다. 4차에서 config 를 쓰기\n // 목록의 뒤로 옮겼지만, 쓰기가 다 끝난 «뒤에» 삭제가 온다. 그래서 삭제가 실패하면 기록은\n // 이미 옛 파일로 돌아가 있고 되돌릴 근거가 없었다(2026-09-23 5차 독립 리뷰 I1).\n // ★옛 폴더의 기록(옮기는 중)도 기록이다 — undo 에서 그것을 먼저 지우면 뒤에서 실패할 때 근거가 없다.\n const isRecord = (path: string) => !recordFirst && (path === HARNESS_RECORD_PATH || path === LEGACY_RECORD_PATH);\n const recordWrites = plan.writes.filter((write) => isRecord(write.path));\n const recordDeletes = plan.deletes.filter((path) => isRecord(path));\n /**\n * ★<b>우리가 «실제로 만든» 디렉터리.</b> {@code mkdir(recursive)} 는 자기가 만든 가장 위\n * 디렉터리를 돌려주고, 이미 있었으면 undefined 를 준다 — 그게 우리가 알고 싶던 사실\n * 그 자체다. 이 칸의 진실원은 이 변수 하나이고, 계획은 여기에 관여하지 않는다.\n * (직전 실행에서 이어받은 것은 이미 기록에 있으므로 함께 들고 간다.)\n */\n const createdDirectories: string[] = [...(plan.record?.createdDirectories ?? [])];\n const rememberDirectories = (directories: readonly string[]) => {\n for (const directory of directories) {\n if (!createdDirectories.includes(directory)) {\n createdDirectories.push(directory);\n }\n }\n };\n /**\n * 기록의 디렉터리 칸을 «실제로 만든 것»으로 바로잡는다.\n *\n * <p>★성공했을 때만 하면 안 된다 — 중간에 실패해도 그 순간까지의 사실이 기록에 남아야\n * 한다. 예전엔 보정이 성공 경로에만 있어서, 만들기 «전»에 실패한 계획이 그대로 남고\n * 그 뒤 사용자가 만든 디렉터리를 다음 undo 가 지웠다(2026-09-27 6차 독립 리뷰 S1).\n *\n * <p>⚠기록 보정이 실패해도 원래 오류를 덮지 않는다. 같은 내용을 두 번 써도 무해하다.\n */\n const recordActualDirectories = async () => {\n const write = plan.writes.find((w) => w.path === HARNESS_RECORD_PATH);\n if (!recordFirst || !plan.record || !write || !applied.includes(HARNESS_RECORD_PATH)) {\n return;\n }\n await writeManagedFile(root, {\n ...write,\n content: withCreatedDirectories(write.content, createdDirectories),\n });\n };\n /**\n * 보정을 «삼키지 않는다». 다른 오류가 진행 중이면 그 오류를 살리고, 아니면 드러낸다.\n *\n * <p>★예전엔 무조건 삼켰다. 그러면 init 이 종료 0 을 돌려주는데 기록의 디렉터리 칸이\n * 비어 있고, 그 상태의 undo 는 우리가 만든 디렉터리를 남긴다 — 「성공」이 기록 완료를\n * 보증하지 않았다(2026-09-27 7차 독립 리뷰 S1).\n */\n const recordDirectoriesOrExplain = async (failing: boolean) => {\n try {\n await recordActualDirectories();\n } catch (error) {\n if (!failing) {\n throw error;\n }\n }\n };\n const apply = async (writes: readonly FileWrite[], deletes: readonly string[]) => {\n for (const write of writes) {\n // ②그리고 «쓰기 직전에» 다시 본다. ①과 실제 쓰기 사이에 누가 고칠 수 있다 — 그 틈으로\n // 남의 편집이 덮여 나갔다(같은 항목). 검사와 쓰기를 붙여 놓으면 창이 작아진다.\n await assertUnchangedSinceSnapshot(root, write.path, snapshot);\n await writeManagedFile(root, write, rememberDirectories);\n applied.push(write.path);\n }\n for (const path of deletes) {\n await assertUnchangedSinceSnapshot(root, path, snapshot);\n await rm(join(root, path), { force: true });\n applied.push(path);\n }\n };\n\n try {\n await apply(\n orderedWrites(plan.writes.filter((write) => !isRecord(write.path)), recordFirst),\n plan.deletes.filter((path) => !isRecord(path)),\n );\n await recordDirectoriesOrExplain(false);\n // 여기까지 전부 된 다음에만 기록을 줄이거나 지운다.\n await apply(recordWrites, recordDeletes);\n } catch (error) {\n await recordDirectoriesOrExplain(true);\n throw error;\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(\n `${message}\\nAlready applied before this failure: ${applied.join(\", \") || \"(nothing)\"}`,\n );\n }\n // 우리가 «만든» 디렉터리가 비었으면 그것도 치운다.\n // ⛔recursive 로 지우지 않는다 — 사용자가 그 안에 둔 다른 파일까지 날아간다.\n // rmdir 는 «비어 있을 때만» 성공하므로, 비었는지는 파일시스템이 판정한다.\n // ★「비었으면 치운다」였을 때는 init 전부터 있던 빈 .cursor 까지 사라졌다\n // (2026-09-23 4차 독립 리뷰 S3). 비었다는 것과 우리 것이라는 것은 다른 사실이다.\n for (const directory of plan.removableDirectories ?? []) {\n await rmdir(join(root, directory)).catch(() => undefined);\n }\n}\n\n/**\n * 관리 기록을 맨 앞으로 옮긴 쓰기 순서.\n *\n * <p>★기록이 먼저 디스크에 있어야 그 뒤의 실패를 되돌릴 수 있다. 기록에 적힌 지문은\n * «쓰려던 내용»의 것이라, 못 쓴 파일은 지문이 안 맞아 undo 가 「손댔다」로 보고 남긴다 —\n * 안 만든 파일을 지우려 드는 것보다 안전한 쪽이다.\n */\nfunction orderedWrites(writes: readonly FileWrite[], recordFirst: boolean): FileWrite[] {\n const record = writes.filter((write) => write.path === HARNESS_RECORD_PATH);\n const rest = writes.filter((write) => write.path !== HARNESS_RECORD_PATH);\n // ★undo 에서는 «마지막»이다. undo 가 config 에 쓰는 것은 기록을 남기는 일이 아니라\n // 옛 파일로 «되돌리는» 일이라, 먼저 하면 나머지를 되돌릴 근거를 스스로 지운다\n // (2026-09-23 4차 독립 리뷰 I2). 같은 순서 규칙을 두 방향에 그대로 쓰면 안 된다.\n return recordFirst ? [...record, ...rest] : [...rest, ...record];\n}\n\n\n/** 파일을 읽은 뒤 우리가 네트워크를 기다리는 사이에 누가 고쳤으면, 그 변경을 덮지 않는다. */\nasync function assertUnchangedSinceSnapshot(\n root: string,\n relativePath: string,\n snapshot: FileSnapshotMap,\n): Promise<void> {\n if (!snapshot.has(relativePath)) {\n return;\n }\n const now = await readIfExists(join(root, relativePath));\n if (now !== snapshot.get(relativePath)) {\n throw new Error(\n `${relativePath} changed while init was running; nothing was written. Run init again.`,\n );\n }\n}\n\n/**\n * 임시 파일에 쓰고 바꿔 끼운다 — 도중에 죽어도 반쪽짜리 파일이 남지 않는다.\n *\n * <p>★<b>기존 파일의 권한을 그대로 가져간다.</b> rename 은 inode 를 «갈아치우므로», 그냥\n * 만들면 umask 기본값(보통 0644)이 된다. 남의 서버 설정에 환경변수가 들어 있는 0600 파일이\n * init 한 번에 0644 로 넓어졌다(2026-09-23 독립 재리뷰 N1). 내용을 합치는 일이 남의 파일\n * 접근 권한까지 바꾸면 안 된다.\n */\nasync function writeManagedFile(\n root: string,\n write: FileWrite,\n onDirectoriesCreated?: (directories: readonly string[]) => void,\n): Promise<string[]> {\n const absolutePath = join(root, write.path);\n const targetDirectory = dirname(absolutePath);\n const firstCreated = await mkdir(targetDirectory, { recursive: true });\n // ★<b>만든 사실을 «지금» 넘긴다.</b> 예전엔 반환값으로만 줬는데, 그 반환은 rename 뒤에\n // 일어난다 — 그 사이에 쓰기가 실패하면 «우리가 만든 디렉터리»라는 사실이 통째로 사라졌고,\n // 다음 init 의 mkdir 는 이미 있는 디렉터리에 undefined 를 주므로 회복도 못 했다\n // (2026-09-27 7차 독립 리뷰 S1). 만드는 것과 쓰는 것은 다른 일이다.\n const created = createdChain(root, firstCreated, targetDirectory);\n onDirectoriesCreated?.(created);\n const previousMode = await fileMode(absolutePath);\n const tmpPath = `${absolutePath}.${process.pid}.${Date.now()}.tmp`;\n // 임시 파일도 «처음부터» 좁게 만든다 — 넓게 만들었다가 좁히면 그 사이가 창이다.\n await writeFile(tmpPath, write.content, { encoding: \"utf8\", mode: previousMode ?? 0o600 });\n if (previousMode !== undefined) {\n await chmod(tmpPath, previousMode);\n }\n await rename(tmpPath, absolutePath);\n return created;\n}\n\n/**\n * 이번 {@code mkdir} 이 «정말 만든» 디렉터리들 — 저장소 기준 상대 경로, 깊은 것부터.\n *\n * <p>★{@code recursive: true} 는 자기가 만든 «가장 위» 디렉터리 하나만 돌려준다. 그 아래부터\n * 목표 디렉터리까지도 같이 만들어진 것이므로 구간 전체가 우리 것이다. 이미 있었으면\n * undefined 를 주므로 그때는 빈 목록이다 — <b>「있다」와 「우리가 만들었다」가 갈리는 지점</b>.\n */\nexport function createdChain(root: string, firstCreated: string | undefined, targetDirectory: string): string[] {\n if (firstCreated === undefined) {\n return [];\n }\n const stop = resolve(firstCreated);\n const made: string[] = [];\n for (let at = resolve(targetDirectory); ; at = dirname(at)) {\n const asRelative = relative(root, at);\n if (asRelative && !asRelative.startsWith(\"..\")) {\n made.push(asRelative.split(sep).join(\"/\"));\n }\n if (at === stop || dirname(at) === at) {\n break;\n }\n }\n return made;\n}\n\nasync function fileMode(absolutePath: string): Promise<number | undefined> {\n try {\n return (await stat(absolutePath)).mode & 0o7777;\n } catch (error) {\n if (isRecord(error) && error.code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n}\n\ntype FileSnapshotMap = Map<string, string | undefined>;\n\nfunction parseInitArgs(argv: string[]): InitArgs {\n const args: InitArgs = { dryRun: false, undo: false, yes: false };\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (!arg) {\n continue;\n }\n if (arg === \"--project\") {\n args.projectUuid = requireValue(arg, argv[++index]);\n } else if (arg === \"--project-name\") {\n args.projectName = requireValue(arg, argv[++index]);\n } else if (arg === \"--dry-run\") {\n args.dryRun = true;\n } else if (arg === \"--undo\") {\n args.undo = true;\n } else if (arg === \"--yes\" || arg === \"-y\") {\n args.yes = true;\n } else if (arg === \"--json\") {\n // 전역 플래그 — 여기선 무시한다.\n } else {\n throw new Error(`Unknown argument: ${arg}`);\n }\n }\n return args;\n}\n\nfunction requireValue(flag: string, value: string | undefined): string {\n if (!value || value.startsWith(\"--\")) {\n throw new Error(`${flag} requires a value.`);\n }\n return value;\n}\n\nfunction basenameOf(path: string): string {\n const parts = path.split(/[\\\\/]/).filter(Boolean);\n return parts[parts.length - 1] ?? \"ainecto-project\";\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { basename } from \"node:path\";\nimport { isDefaultEndpointFor } from \"../config/endpoints\";\nimport { LEGACY_PACKAGE_NAME, PACKAGE_NAME } from \"../version\";\nimport { HARNESS_ROLES, type HarnessRole } from \"./role\";\n\n/**\n * 「어느 에이전트의 어느 파일에 무엇을 적는가」.\n *\n * ★<b>MCP 항목은 «하나»만 쓴다.</b> 이것이 「하나의 세션은 하나의 역할」을 강제하는 방식이다 —\n * 네 역할을 동시에 등록해 두면 개발 세션이 설계 서버도 보게 되고, 그 순간 제약은 다시\n * 「규칙을 읽고 지켜라」로 내려앉는다. 역할을 바꾸려면 이 한 항목을 고치고 세션을 다시 연다.\n *\n * ⚠<b>Codex 는 여기 없다.</b> Codex 의 MCP 설정은 {@code $CODEX_HOME/config.toml} 전역이라\n * 프로젝트별 파일이 없다. 프로젝트에서 친 명령이 말없이 전역 설정을 고치면 다른 저장소의\n * 세션까지 역할이 걸린다. ⇒ 우리가 고치지 않고 <b>실행할 명령을 내준다</b>.\n *\n * <p>★<b>Codex 의 세션별 역할은 «프로필»로 한다</b>(2026-09-22 실측, codex 0.153.4).\n * {@code codex -p <name>} 은 {@code $CODEX_HOME/<name>.config.toml} 을 base 위에 얹고,\n * <b>같은 서버 이름이면 프로필 쪽이 base 를 덮어쓴다</b> — 합쳐지지 않는다. 그래서 서버 항목은\n * 여전히 «하나»이고 「한 세션에 한 역할」이 그대로 성립한다.\n * ⚠구식 {@code [profiles.<name>]} 테이블은 이제 «에러로» 거부된다 — 별도 파일이어야 한다.\n * ⛔CODEX_HOME 을 프로젝트별로 바꾸는 길은 auth.json 까지 갈려 로그인을 잃으므로 택하지 않았다.\n */\n\n/** 설정에 쓰는 서버 이름. ⛔env 에 따라 바꾸지 않는다 — 도구 접두사가 흔들리고 --undo 가 못 찾는다. */\nexport const SERVER_NAME = \"ainecto\";\n\n/**\n * 0.4.x 가 쓰던 서버 이름(2026-10-11 AiNecto 복귀로 바뀌었다). ★이미 init 된 저장소에 남아 있다.\n *\n * <p>읽을 때는 «우리 브리지»일 때만 우리 항목으로 본다({@link isOurBridge}) — 같은 이름의 url·mcp-remote\n * 항목은 사용자가 직접 넣은 것이다. 쓸 때는 언제나 {@link SERVER_NAME} 로 쓰고, 옛 이름의 우리 브리지는\n * 지운다 — 한 파일에 우리 항목이 둘이면 한 세션이 두 역할을 보게 된다(«한 세션 한 역할»이 깨진다).\n *\n * <p>★<b>왜 «옛 키를 새 키로 교체»인가.</b> init 기록의 항목 계약은 «항목 값»만 들고 키 이름을 들지 않는다.\n * 그래서 옛 키 아래의 값을 «우리 항목»으로 읽어 주기만 하면 0.4.x 의 기록이 그대로 맞는다 — 기록 형식도,\n * 마이그레이션 단계도 늘지 않는다. ⚠한 가지 어긋남: 0.4.x init «전»부터 사용자가 {@code \"ai-erd\"} 에 두었던\n * 항목을 백업해 둔 저장소를 새 CLI 로 재init 한 뒤 --undo 하면, 그 원본은 {@code \"ainecto\"} 키로 돌아온다\n * (키 이름을 기록하지 않으므로). 재init 없이 바로 --undo 하면 옛 키 그대로 돌아온다.\n */\nexport const LEGACY_SERVER_NAME = \"ai-erd\";\n\nexport interface AgentTarget {\n id: \"claude-code\" | \"cursor\";\n label: string;\n /** 저장소 루트 기준 상대 경로. */\n path: string;\n}\n\nexport const AGENT_TARGETS: readonly AgentTarget[] = [\n { id: \"claude-code\", label: \"Claude Code\", path: \".mcp.json\" },\n { id: \"cursor\", label: \"Cursor\", path: \".cursor/mcp.json\" },\n];\n\nexport interface ServerEntryInput {\n role: HarnessRole;\n /** \"prod\" 면 인자를 안 붙인다 — 기본값을 설정에 박으면 기본이 바뀔 때 거짓이 된다. */\n env?: \"prod\" | \"dev\";\n /**\n * 기본이 아닌 엔드포인트. ⚠<b>이걸 빠뜨리면</b> init 은 이 주소에서 프로젝트를 찾아 적어\n * 놓고, 정작 에이전트는 «기본 주소»에 붙는다 — 문서가 가리키는 곳과 세션이 보는 곳이\n * 달라진다(2026-09-22 독립 리뷰 I7).\n */\n endpoint?: string;\n}\n\nexport interface McpServerEntry {\n command: string;\n args: string[];\n}\n\nexport function buildServerEntry(input: ServerEntryInput): McpServerEntry {\n const args = [\"-y\", PACKAGE_NAME, \"--role\", input.role];\n if (input.env && input.env !== \"prod\") {\n args.push(\"--env\", input.env);\n }\n // ★«이 env 의» 기본 주소일 때만 생략한다. 넓은 기본 판정을 쓰면 dev 주소가 prod 로 해석된다.\n if (input.endpoint && !isDefaultEndpointFor(input.env ?? \"prod\", input.endpoint)) {\n args.push(\"--endpoint\", input.endpoint);\n }\n return { command: \"npx\", args };\n}\n\n/** 설정에 적힌 항목에서 역할을 되읽는다. 설정이 곧 진실원이므로 여기서만 읽는다. */\nexport function readRoleFromEntry(entry: unknown): HarnessRole | undefined {\n if (!isRecord(entry) || !Array.isArray(entry.args)) {\n return undefined;\n }\n const index = entry.args.indexOf(\"--role\");\n const value = index >= 0 ? entry.args[index + 1] : undefined;\n return typeof value === \"string\" && (HARNESS_ROLES as readonly string[]).includes(value)\n ? (value as HarnessRole)\n : undefined;\n}\n\nexport interface MergeResult {\n /** 적어 넣은 결과 JSON 문자열 (끝에 줄바꿈 포함). */\n content: string;\n /** 이 파일에 우리 항목이 이미 있었나 — 보고용. */\n replaced: boolean;\n /**\n * 우리가 «밀어낸» 원래 항목. ★undo 가 이것을 도로 넣는다.\n * 없으면 undefined — 그때는 undo 가 그냥 지운다.\n */\n replacedEntry?: unknown;\n}\n\n/**\n * 기존 설정을 살린 채 우리 항목 하나만 얹는다.\n *\n * ⚠<b>남의 서버 항목을 지우지 않는다.</b> 이 파일은 사용자의 것이고 우리는 한 칸을 빌릴 뿐이다.\n * 파싱이 안 되면 덮어쓰지 말고 던진다 — 읽을 수 없는 파일을 덮으면 사용자의 설정이 사라진다.\n */\n/**\n * 이 파일에 들어 있는 «우리» 서버 항목. 없거나 파일이 JSON 이 아니면 undefined.\n *\n * <p>undo 가 「우리가 쓴 그대로인가」를 보려고 쓴다 — 파일 «전체»가 아니라 우리가 소유한\n * 조각만 견주어야, 남이 다른 항목을 더한 것과 우리 항목을 손댄 것을 구별한다\n * (2026-09-23 독립 재리뷰 I8).\n */\nexport function readServerEntry(existing: string | undefined): unknown {\n if (existing === undefined) {\n return undefined;\n }\n try {\n const parsed = JSON.parse(existing) as { mcpServers?: unknown };\n const servers = parsed?.mcpServers;\n return isRecord(servers) ? servers[ourKeyIn(servers) ?? SERVER_NAME] : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * 이 {@code mcpServers} 에서 «우리 항목»이 사는 키. 새 키가 먼저이고, 없으면 옛 키의 우리 브리지.\n * 둘 다 아니면 undefined.\n */\nexport function ourKeyIn(servers: Record<string, unknown>): string | undefined {\n if (Object.prototype.hasOwnProperty.call(servers, SERVER_NAME)) {\n return SERVER_NAME;\n }\n return isOurBridge(servers[LEGACY_SERVER_NAME]) ? LEGACY_SERVER_NAME : undefined;\n}\n\n/** 이 옛 키의 항목이 우리 브리지인가 — 맞으면 우리가 지워도 되는 우리 항목이다. */\nfunction legacyBridgeIn(servers: Record<string, unknown>): boolean {\n return isOurBridge(servers[LEGACY_SERVER_NAME]);\n}\n\n/**\n * 이 항목이 우리 브리지({@code npx -y @ainecto/mcp …} · 0.4.x 의 {@code npx -y @ai-erd/mcp …} · 전역 설치한\n * {@code ainecto}·{@code ai-erd}·{@code ai-erd-mcp})인가. {@code --role} 을 싣는 것도 우리 브리지뿐이다.\n */\nexport function isOurBridge(entry: unknown): boolean {\n if (!isRecord(entry)) {\n return false;\n }\n const { command, args } = entry as { command?: unknown; args?: unknown };\n const argList = Array.isArray(args) ? args.filter((arg): arg is string => typeof arg === \"string\") : [];\n const isOurPackage = (arg: string) => [PACKAGE_NAME, LEGACY_PACKAGE_NAME]\n .some((name) => arg === name || arg.startsWith(`${name}@`));\n if (argList.some((arg) => isOurPackage(arg) || arg === \"--role\")) {\n return true;\n }\n const bin = typeof command === \"string\" ? basename(command) : \"\";\n return OUR_BINS.includes(bin);\n}\n\n/**\n * 전역 설치한 우리 명령 이름(package.json bin 중 브리지를 띄울 수 있는 것). ⚠{@code mcp} 는 넣지 않는다 —\n * 흔한 이름이라 남의 명령일 수 있고, 우리 브리지로 오인하면 «역할 없는 브리지»로 읽혀 모든 명령이 멈춘다.\n */\nconst OUR_BINS: readonly string[] = [\"ainecto\", \"ai-erd\", \"ai-erd-mcp\"];\n\nexport function mergeServerEntry(existing: string | undefined, entry: McpServerEntry): MergeResult {\n const root = parseConfigObject(existing);\n const servers = readServers(root);\n const ourKey = ourKeyIn(servers);\n const replaced = ourKey !== undefined;\n const replacedEntry = ourKey === undefined ? undefined : servers[ourKey];\n // ★옛 키의 우리 브리지는 지운다 — 새 키 옆에 남으면 한 세션이 두 역할의 서버를 본다.\n if (legacyBridgeIn(servers)) {\n delete servers[LEGACY_SERVER_NAME];\n }\n servers[SERVER_NAME] = entry;\n return { content: stringify({ ...root, mcpServers: servers }), replaced, replacedEntry };\n}\n\nexport interface RemoveResult {\n /** 우리 항목을 뺀 결과. 파일을 통째로 지워야 하면 undefined. */\n content?: string;\n removed: boolean;\n /** 우리 항목을 빼고 나니 아무것도 안 남았나. */\n emptied: boolean;\n}\n\n/**\n * 되돌릴 목표를 «감싸서» 받는다.\n *\n * <p>★{@code restoreEntry?: unknown} 과 {@code !== undefined} 조합은 <b>저장된 {@code null} 을\n * 「백업 없음」으로 바꾼다.</b> 사용자가 {@code \"ai-erd\": null} 을 적어 두었고 우리가 그것을\n * 백업했다면, 되돌리기는 null 을 도로 넣어야 한다(2026-09-27 7차 독립 리뷰 I5).\n * 「값이 없다」와 「값이 null 이다」는 다른 사실이므로 그 둘을 한 자리에 담지 않는다.\n */\nexport interface RestoreEntry {\n value: unknown;\n}\n\nexport function removeServerEntry(existing: string | undefined, restore?: RestoreEntry): RemoveResult {\n if (existing === undefined) {\n return { removed: false, emptied: false };\n }\n const root = parseConfigObject(existing);\n const servers = readServers(root);\n // 우리 항목이 사는 키 — 0.4.x 가 쓰고 재init 하지 않은 저장소에서는 옛 키다.\n const ourKey = ourKeyIn(servers);\n const removed = ourKey !== undefined;\n if (restore !== undefined) {\n // ★우리가 밀어낸 사용자 항목을 도로 넣는다. 지우는 것이 아니라 «되돌리는» 것이다.\n // 우리 항목이 있던 키에 넣는다 — 옛 키에서 밀어낸 것은 옛 키로 돌아간다.\n servers[ourKey ?? SERVER_NAME] = restore.value;\n return { content: stringify({ ...root, mcpServers: servers }), removed, emptied: false };\n }\n if (ourKey !== undefined) {\n delete servers[ourKey];\n }\n const otherKeys = Object.keys(root).filter((key) => key !== \"mcpServers\");\n const emptied = Object.keys(servers).length === 0 && otherKeys.length === 0;\n return { content: stringify({ ...root, mcpServers: servers }), removed, emptied };\n}\n\n/** Codex 는 전역 설정뿐이라 «우리가 고치지 않는다». 사용자가 칠 명령을 내준다. */\nexport function codexAddCommand(input: ServerEntryInput): string {\n const entry = buildServerEntry(input);\n return `codex mcp add ${SERVER_NAME} -- ${entry.command} ${entry.args.join(\" \")}`;\n}\n\n/**\n * Codex 에서 역할을 세션마다 바꾸는 법. ★프로필 파일이 같은 이름의 서버를 덮어쓰므로\n * 항목은 하나로 유지된다.\n */\nexport function codexProfileSetup(input: ServerEntryInput): string[] {\n const entry = buildServerEntry(input);\n return [\n `Per-session roles in Codex use profiles. Put this in $CODEX_HOME/${input.role}.config.toml:`,\n \"\",\n ` [mcp_servers.${SERVER_NAME}]`,\n ` command = \"${entry.command}\"`,\n ` args = ${JSON.stringify(entry.args)}`,\n \"\",\n `Then start that session with: codex -p ${input.role}`,\n \"A profile entry with the same server name replaces the global one, so the session still sees exactly one.\",\n ];\n}\n\nexport function codexRemoveCommand(): string {\n return `codex mcp remove ${SERVER_NAME}`;\n}\n\n/**\n * {@code mcpServers} 를 읽는다. ⚠<b>모양이 틀리면 «조용히 버리지» 않는다</b> —\n * 배열이나 문자열이 들어 있는 설정을 {@code {}} 로 갈아 끼우면 사용자의 내용이 사라진다\n * (2026-09-22 독립 리뷰 I8). 이미 깨진 설정이어도 원문을 없애는 건 우리 일이 아니다.\n */\nfunction readServers(root: Record<string, unknown>): Record<string, unknown> {\n const servers = root.mcpServers;\n if (servers === undefined) {\n return {};\n }\n if (!isRecord(servers)) {\n throw new Error(\n \"Existing MCP config has an \\\"mcpServers\\\" value that is not an object, so it was left untouched. \"\n + \"Fix it by hand and run init again.\",\n );\n }\n return { ...servers };\n}\n\nfunction parseConfigObject(existing: string | undefined): Record<string, unknown> {\n if (existing === undefined || !existing.trim()) {\n return {};\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(existing);\n } catch (error) {\n throw new Error(\n `Existing MCP config is not valid JSON, so it was left untouched. Fix it by hand and run init again. (${\n error instanceof Error ? error.message : String(error)\n })`,\n );\n }\n if (!isRecord(parsed)) {\n throw new Error(\"Existing MCP config must be a JSON object; it was left untouched.\");\n }\n return parsed;\n}\n\nfunction stringify(value: unknown): string {\n return `${JSON.stringify(value, null, 2)}\\n`;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { AGENT_TARGETS, SERVER_NAME } from \"./agentTargets\";\nimport { ROLE_ENV_VAR } from \"./role\";\n\n/**\n * 저장소에 쓰는 글. ⚠<b>사용자 노출 문자열은 영어</b>로 쓴다 — 이 저장소의 기존 관례이고\n * (help·에러 메시지가 전부 영어) 공개 npm 패키지가 남의 저장소에 써 넣는 파일이다.\n * 주석·설계 메모만 한국어다.\n *\n * ★<b>역할을 여기 적지 않는다.</b> 역할의 진실원은 MCP 서버 설정 한 곳이고, 지금 무엇인지는\n * 서버가 {@code initialize} 안내문으로 말해 준다. 이 글에도 적으면 역할을 바꿀 때마다 두\n * 곳을 맞춰야 하고, 어긋나는 순간 에이전트는 틀린 쪽을 믿는다.\n */\n\nexport const MARKER_BEGIN = \"<!-- ainecto:begin -->\";\nexport const MARKER_END = \"<!-- ainecto:end -->\";\n\n/**\n * 0.4.x 가 쓴 마커. ★<b>읽을 때는 우리 마커로 알아보고, 쓸 때는 언제나 새 마커를 쓴다.</b>\n *\n * <p>왜 «두 벌을 알아보기»인가(옛 파일을 새 마커로 고쳐 읽는 번역이 아니라): init 기록의 블록 계약은\n * 우리가 쓴 «블록 원문»과 init 전에 있던 마커 예제의 «모양»(foreignBlocks)을 든다. 마커를 알아보는 쪽을\n * 넓히면 0.4.x 기록이 한 글자도 안 바뀐 채 맞는다 — 기록·파일을 번역하면 그 둘을 함께 고쳐야 하고,\n * 예제 안의 옛 마커(남의 글)를 건드리지 않고서는 「옮겨진 우리 블록」을 잡던 가드를 잃는다.\n * 재init 은 옛 마커 블록을 그 자리에서 새 마커 블록으로 갈아 끼운다(같은 범위).\n *\n * <p>⚠서버의 AGENT_NOTE 본문은 아직 옛 마커를 싣는다(서버 검증기가 그 마커를 요구하고, 옛 CLI 도 같은\n * 본문을 받는다). 그래서 {@link renderAgentNote} 가 본문의 옛 마커를 새 마커로 바꿔 쓴다.\n */\nexport const LEGACY_MARKER_BEGIN = \"<!-- ai-erd:begin -->\";\nexport const LEGACY_MARKER_END = \"<!-- ai-erd:end -->\";\n\ntype MarkerKind = \"begin\" | \"end\";\nconst MARKERS: Record<MarkerKind, readonly string[]> = {\n begin: [MARKER_BEGIN, LEGACY_MARKER_BEGIN],\n end: [MARKER_END, LEGACY_MARKER_END],\n};\n\n/** 하네스 폴더. 0.4.x 는 {@code .ai-erd/} 였다 — 옛 폴더를 옮기는 일은 {@code legacyLayout.ts} 가 한다. */\nexport const HARNESS_DIR = \".ainecto\";\nexport const LEGACY_HARNESS_DIR = \".ai-erd\";\nexport const HARNESS_DOC_PATH = `${HARNESS_DIR}/HARNESS.md`;\nexport const HARNESS_CONFIG_PATH = `${HARNESS_DIR}/config.json`;\n\n/**\n * ★<b>되돌리기 기록의 자리. 이 파일은 «전부 우리 것»이다.</b>\n *\n * <p>예전엔 기록이 {@code config.json} 안에 살았다. 그 파일은 사용자도 칸을 더하고 고치는\n * 파일이라, 한 파일에 주인이 둘이었다 — 그래서 되돌리기가 매번 「이 칸이 누구 것인가」를\n * 판정해야 했고, <b>그 판정이 네 차수 연속 샜다</b>(2026-09-23 4차 I7 → 5차 I2·S3 →\n * 6차 I1·I3 → 2026-09-27 7차 I1·I2·I3).\n *\n * <p>기록을 우리 파일로 내보내면 그 질문 자체가 사라진다:\n * <ul>\n * <li>우리 파일 — 통째로 쓰고 통째로 지운다. 병합도 소유 판정도 없다.</li>\n * <li>남의 파일({@code config.json}·{@code .mcp.json}·{@code AGENTS.md}) — «병합»해서 쓰고,\n * 우리 조각만 되돌린다.</li>\n * </ul>\n * ★<b>그리고 자기 지문의 순환도 같이 사라진다.</b> 「자기 해시를 담은 문서의 해시」를 피하려고\n * 정규형에서 그 칸을 빼던 장치가 필요 없다 — 우리 파일은 지문을 «재지 않는다». 사용자가\n * 고칠 파일이 아니고, 고쳐져 있으면 읽기가 실패해 「기록 없음」으로 안전하게 떨어진다.\n */\nexport const HARNESS_RECORD_PATH = `${HARNESS_DIR}/init-record.json`;\n\nexport interface HarnessDocInput {\n projectName: string;\n projectUuid: string;\n endpoint: string;\n}\n\n/**\n * 저장소에 쓸 문서. ★<b>서버 본문과 패키지 기본값이 «같은 채움 경로»를 쓴다.</b>\n * 두 경로로 갈리면 서버 판만 고쳤을 때 오프라인 사용자에게는 다른 글이 나간다.\n *\n * @param template 서버에서 받은 본문. 없으면 이 패키지의 기본값(= 오프라인 기본값)을 쓴다.\n */\nexport function renderHarnessDoc(input: HarnessDocInput, template?: string): string {\n return fillTemplate(template ?? DEFAULT_HARNESS_DOC, {\n projectName: input.projectName,\n projectUuid: input.projectUuid,\n endpoint: input.endpoint,\n });\n}\n\n/**\n * {{name}} 자리표시자를 채운다.\n *\n * <p>★<b>문법은 서버 레지스트리의 것이다.</b> 예전엔 이 패키지만 {@code {name}} 을 썼는데,\n * 같은 본문을 관리자 검증기가 거절했다 — 저장소를 공유하면서 계약이 둘이었다\n * (2026-09-23 독립 재리뷰 I2).\n */\nexport function fillTemplate(template: string, values: Record<string, string>): string {\n // ★원본을 «한 번만» 훑는다. 값을 하나씩 갈아 끼우면, 먼저 넣은 값 안의 자리표시자 모양\n // 글자가 다음 차례에 또 치환된다 — 프로젝트 이름에 {{endpoint}} 라고 적어 둔 사람의\n // 이름 일부가 실제 주소로 바뀌었다(2026-09-23 4차 독립 리뷰 S4).\n // ⚠모르는 이름은 그대로 둔다 — 지우면 「못 채웠다」를 아무도 못 본다.\n return template.replace(/\\{\\{([a-zA-Z0-9_]+)}}/g, (whole, name: string) =>\n Object.prototype.hasOwnProperty.call(values, name) ? values[name]! : whole);\n}\n\nexport const DOC_KEY = \"HARNESS.DOC\";\nexport const AGENT_NOTE_KEY = \"HARNESS.AGENT_NOTE\";\n\n/** 각 문서가 반드시 담아야 할 변수 이름 — 서버의 REQUIRED_VARIABLES 와 같은 목록이다. */\nconst REQUIRED_VARIABLES: Record<string, string[]> = {\n [DOC_KEY]: [\"projectName\", \"projectUuid\", \"endpoint\"],\n [AGENT_NOTE_KEY]: [\"harnessDocPath\", \"serverName\"],\n};\n\n/**\n * 받은 본문을 저장소에 «써도 되는가». 쓰면 안 되면 그 이유, 괜찮으면 undefined.\n *\n * <p>둘을 본다: ①필수 변수가 원문에 «있는가» — 없으면 채워도 그 값이 안 들어간다.\n * ②AGENT_NOTE 라면 관리 마커가 정확히 한 쌍 있는가 — 없으면 우리 블록을 다시 찾을 수 없어\n * 재실행마다 덧붙고 undo 도 못 걷어낸다.\n */\nexport function documentContractProblem(key: string, body: string): string | undefined {\n for (const name of REQUIRED_VARIABLES[key] ?? []) {\n if (!body.includes(`{{${name}}}`)) {\n return `${key} is missing the required {{${name}}} placeholder`;\n }\n }\n if (key === AGENT_NOTE_KEY) {\n // 서버 본문은 옛 마커를 실을 수 있다 — 우리가 실제로 쓸 모양(새 마커)으로 본다.\n return managedBlockProblem(key, withCurrentMarkers(body));\n }\n return undefined;\n}\n\nconst DEFAULT_HARNESS_DOC = `# AiNecto Harness\n\nThis repository is wired to an AiNecto project. The design source of truth lives in AiNecto,\nnot in this repository's files.\n\n- Project: **{{projectName}}** (\\`{{projectUuid}}\\`)\n- MCP endpoint: {{endpoint}}\n\n## One session, one role\n\nA session picks exactly one role and keeps it for the whole session. The role comes from the\nMCP server configuration — not from this file — and it does not change during a session. The\nuser picks the role; an agent applies a new one only when the user asks, and it takes effect in\nthe next session. This is a working guardrail, not a security boundary. The server exposes only\nthe tools that role is allowed to use, so a tool that is out of role is not merely discouraged:\nit is absent.\n\n| Role | Owns | Must not |\n| --- | --- | --- |\n| Design | Requirements, ERD, domain and module boundaries, dependency direction, tasks | Write product or test code |\n| Development | Product code, following the approved design | Change requirements, ERD, architecture, or data ownership |\n| Test | Test scenarios and test code, running them and reading results | Change product code to make a test pass; change the design |\n| Validation | Judging the result against the design and the rules | Change anything; it reports PASS or FAIL with evidence |\n\nEvery role can **read** the whole source of truth. Reading the design is how the other roles\ndo their job. A session that cannot do something reports it in the session, to you.\n\n## When you are blocked\n\nIf the work needs something your role cannot do, **stop and say so**. Do not look for a way\naround it: not by editing files the tools would have written, not by asking for the role to be\nchanged mid-session, not by deferring the decision into the implementation.\n\n The work needs a design change.\n This is a Development Session, so I cannot make it.\n Settle it in a Design Session, then continue here.\n\nValidation reports \\`PASS\\`, or \\`FAIL\\` with the rule violated, where it happened, the evidence,\nand which session should pick it up next.\n\n## Not every change needs four sessions\n\nA small change that fits the design already recorded in AiNecto starts at Development. The rule\nis not \"always run four steps\" — it is that when a step is needed, it does not happen inside\nanother role's session.\n\n## Switching roles\n\nChange the role in the MCP server configuration and start a new session:\n\n${AGENT_TARGETS.map((target) => ` ${target.label.padEnd(12)} ${target.path}`).join(\"\\n\")}\n Codex global config — use a profile: codex -p <role>, or set ${ROLE_ENV_VAR}\n\nOr run \\`ainecto init --role <design|development|test|validation>\\` to rewrite them.\n\n---\nGenerated by \\`ainecto init\\`. Remove everything it wrote with \\`ainecto init --undo\\`.\n`;\n\n/**\n * AGENTS.md / CLAUDE.md 에 넣는 블록. ★<b>짧게 쓴다.</b> 이 파일들은 사용자의 것이고\n * 이미 다른 규칙이 들어 있다. 우리는 한 문단만 빌리고 전문은 우리 파일로 보낸다.\n */\nexport function renderAgentNote(template?: string): string {\n return fillTemplate(withCurrentMarkers(template ?? DEFAULT_AGENT_NOTE), {\n harnessDocPath: HARNESS_DOC_PATH,\n serverName: SERVER_NAME,\n });\n}\n\n/**\n * 본문의 옛 마커를 새 마커로. ★<b>우리 본문(서버·패키지 템플릿)에만</b> 쓴다 — 사용자 파일에 쓰면\n * 남의 글(예제 속 마커)을 고치게 된다.\n */\nfunction withCurrentMarkers(template: string): string {\n return template.split(LEGACY_MARKER_BEGIN).join(MARKER_BEGIN).split(LEGACY_MARKER_END).join(MARKER_END);\n}\n\nconst DEFAULT_AGENT_NOTE = `${MARKER_BEGIN}\n## AiNecto Harness\n\nThis repository uses AiNecto as its design source of truth, and each session has one role\n(Design / Development / Test / Validation). Read \\`{{harnessDocPath}}\\` before doing work that\ntouches requirements, the ERD, or architecture.\n\nThe role of this session comes from the \\`{{serverName}}\\` MCP server configuration that\n\\`ainecto init\\` wrote; the server states it in its \\`initialize\\` instructions and exposes only\nthat role's tools. If the work needs something outside the role,\nstop and report which session is required.\n${MARKER_END}`;\n\n/**\n * 이 본문이 <b>통째로 «관리 블록 하나»</b>인가. 아니면 그 이유.\n *\n * <p>★예전엔 「마커가 한 쌍 있나」만 봤다. 그래서 마커 «밖»에 머리말·꼬리말이 달린 본문이\n * 통과했고, 그 바깥 글은 init 때마다 한 번씩 더 붙고 undo 로도 안 걷혔다 — 우리가 걷어내는\n * 범위는 마커 «사이»뿐이기 때문이다(2026-09-23 4차 독립 리뷰 I4).\n *\n * <p>「넣는 범위」와 「빼는 범위」가 다르면 차이만큼 남의 파일에 쌓인다. 그래서 «넣을 것»도\n * 뺄 수 있는 모양이어야 한다: 앞뒤 공백을 빼면 정확히 한 블록.\n */\nexport function managedBlockProblem(key: string, body: string): string | undefined {\n const trimmed = body.trim();\n if (!trimmed.startsWith(MARKER_BEGIN)) {\n return `${key} must begin with ${MARKER_BEGIN} — text outside the block is never removed by --undo`;\n }\n if (!trimmed.endsWith(MARKER_END)) {\n return `${key} must end with ${MARKER_END} — text outside the block is never removed by --undo`;\n }\n const inner = trimmed.slice(MARKER_BEGIN.length, trimmed.length - MARKER_END.length);\n if (inner.includes(MARKER_BEGIN) || inner.includes(MARKER_END)) {\n return `${key} must contain exactly one ${MARKER_BEGIN} and one ${MARKER_END}`;\n }\n // ★<b>수락하는 모양과 «다시 찾을 수 있는» 모양이 같아야 한다.</b> 예전엔 양끝 문자열만 봐서\n // 한 줄짜리 블록이나 앞에 공백이 붙은 마커를 수락했다. 그런데 소유 판정은 「들여쓰기 없이\n // 줄 맨 앞, 그 줄에 마커만」이라 방금 쓴 블록을 못 찾고, 재실행마다 블록이 하나씩 늘었다\n // (2026-09-23 5차 독립 리뷰 I4).\n if (!inner.startsWith(\"\\n\")) {\n return `${key} must put ${MARKER_BEGIN} alone on its own line`;\n }\n if (!inner.endsWith(\"\\n\")) {\n return `${key} must put ${MARKER_END} alone on its own line`;\n }\n // 안에 닫히지 않은 코드펜스가 있으면, 파일에 합친 뒤 종료 마커가 그 펜스 «안»으로 들어간다.\n if (hasUnclosedFence(inner)) {\n return `${key} contains an unclosed code fence — the closing marker would fall inside it`;\n }\n return undefined;\n}\n\n/** 이 글이 코드펜스를 열어 둔 채 끝나는가. */\nfunction hasUnclosedFence(content: string): boolean {\n let open: { char: string; length: number } | undefined;\n for (const line of content.split(\"\\n\")) {\n const fence = fenceOf(line);\n if (!fence) continue;\n if (!open) open = { char: fence.char, length: fence.length };\n else if (fence.char === open.char && fence.length >= open.length && fence.info === \"\") open = undefined;\n }\n return open !== undefined;\n}\n\n/**\n * 저장되는 모양 하나. ★<b>쓰기·교체가 모두 이것을 쓴다.</b>\n *\n * <p>끝 개행은 «블록의 것이 아니라 파일 합성의 것»이다. 예전엔 블록에 딸려온 개행을 남긴 채\n * 합성이 하나를 더 붙여, 같은 입력으로 다시 돌릴 때마다 파일이 1바이트씩 자랐다\n * (605 → 606 → 607, 2026-09-23 5차 독립 리뷰 S2). 변경 없는 재실행은 파일을 안 바꿔야 한다.\n */\nexport function canonicalManagedBlock(block: string): string {\n return block.trim();\n}\n\n/**\n * 블록이 이미 있으면 갈아 끼우고, 없으면 끝에 붙인다. 사용자의 다른 내용은 건드리지 않는다.\n *\n * @throws Error 여는 표식만 있고 닫는 표식이 없을 때. ★<b>붙이면 안 된다</b> —\n * begin 이 둘, end 가 하나가 되어 다음 실행에서 «앞의 begin ~ 새 end» 가 한 덩이로\n * 잡히고 그 사이의 사용자 글이 사라진다(2026-09-22 독립 리뷰 I3).\n */\nexport function upsertMarkerBlock(existing: string | undefined, block: string): string {\n const current = existing ?? \"\";\n assertNoDanglingMarker(current);\n // ★개행의 소유를 한 곳으로 모은다 — 블록은 마커로 끝나고, 뒤의 한 줄은 «파일»의 것이다.\n const normalized = canonicalManagedBlock(block);\n const range = markerRange(current);\n const composed = range\n ? `${current.slice(0, range.start)}${normalized}${current.slice(range.end)}`\n : `${current.trim() ? `${current.replace(/\\s*$/, \"\")}\\n\\n` : \"\"}${normalized}\\n`;\n assertComposedBlockIsOurs(composed, current);\n return composed;\n}\n\n/**\n * ★<b>다시 찾을 수 있을 때만 쓴다.</b> 합성 «결과»를 소유 판정으로 되읽어, 관리 블록이\n * 정확히 하나로 보이는지 확인한다.\n *\n * <p>예전엔 «새 블록 안»만 검사했다. 그런데 소유 판정({@link ownedMarkerIndex})은 <b>파일\n * 문맥</b>을 본다 — 기존 파일이 코드펜스를 열어 둔 채 끝나면 멀쩡한 블록도 그 펜스 «안»으로\n * 들어가 우리 것으로 안 보인다. 그래서 init 마다 블록이 하나씩 늘고 undo 는 아무것도 못\n * 걷어냈다(2026-09-27 6차 독립 리뷰 I4).\n *\n * <p>「넣는 범위 = 빼는 범위」라는 규칙을 <b>블록이 아니라 합성 결과에</b> 적용한 것이다.\n * 검사할 대상은 우리가 만든 글이 아니라 «파일에 들어간 모습»이다.\n */\nfunction assertComposedBlockIsOurs(composed: string, existing: string): void {\n if (ownedMarkerCount(composed, \"begin\") === 1 && ownedMarkerCount(composed, \"end\") === 1) {\n return;\n }\n const reason = hasUnclosedFence(existing)\n ? \"this file ends inside an unclosed code fence, so the block would sit inside it\"\n : \"the block could not be found again once merged into this file\";\n throw new Error(\n `ainecto could not place its block where --undo would find it again — ${reason}. `\n + \"The file was left untouched; fix that and run again.\",\n );\n}\n\n/**\n * 표식이 짝이 안 맞으면 그 파일은 «손대지 않는다».\n *\n * <p>사람이 손으로 잘랐거나 붙여 넣다 만 경우다. 우리가 범위를 추측해서 지우면 남의 글이\n * 날아간다. 고치는 건 사람 몫이고, 우리는 무엇이 문제인지만 말한다.\n *\n * <p>★<b>세는 대상은 «우리 것으로 알아볼 수 있는» 표식뿐이다</b>({@link ownedMarkerIndex}).\n * 인용문·코드펜스·들여쓴 예제 안의 표식은 애초에 우리 것이 아니므로 짝을 세지 않는다 —\n * 예전엔 그런 예제까지 세어서 멀쩡한 파일을 「짝이 안 맞는다」고 거절했다.\n */\nexport function assertNoDanglingMarker(content: string): void {\n const begins = ownedMarkerCount(content, \"begin\");\n const ends = ownedMarkerCount(content, \"end\");\n if (begins !== ends || begins > 1) {\n throw new Error(\n `AiNecto markers are unbalanced (${begins} begin, ${ends} end). The file was left untouched — `\n + `remove the stray ${MARKER_BEGIN} / ${MARKER_END} by hand and run again.`,\n );\n }\n if (begins === 0) {\n return;\n }\n // ★개수만 세면 «end 가 begin 보다 앞선» 한 쌍을 정상으로 본다 — 그러면 새 블록을 덧붙이고\n // 다음 실행부터 중복으로 거절된다(2026-09-23 독립 재리뷰 I3).\n if (ownedMarker(content, \"end\", 0)!.at < ownedMarker(content, \"begin\", 0)!.at) {\n throw new Error(\n `AiNecto markers are out of order (${MARKER_END} appears before ${MARKER_BEGIN}). `\n + \"The file was left untouched — fix the markers by hand and run again.\",\n );\n }\n}\n\nfunction ownedMarkerCount(content: string, kind: MarkerKind): number {\n let count = 0;\n for (let hit = ownedMarker(content, kind, 0); hit !== undefined;\n hit = ownedMarker(content, kind, hit.at + 1)) {\n count += 1;\n }\n return count;\n}\n\ninterface MarkerHit {\n at: number;\n length: number;\n}\n\n/** 이 종류(여는·닫는)의 «우리» 마커 중 {@code from} 뒤에서 가장 앞의 것 — 새 마커·옛 마커 둘 다. */\nfunction ownedMarker(content: string, kind: MarkerKind, from: number): MarkerHit | undefined {\n let best: MarkerHit | undefined;\n for (const marker of MARKERS[kind]) {\n const at = ownedMarkerIndex(content, marker, from);\n if (at >= 0 && (best === undefined || at < best.at)) {\n best = { at, length: marker.length };\n }\n }\n return best;\n}\n\n/** 이 종류의 마커 글자(우리 것인지 묻지 않는다) 중 {@code from} 뒤에서 가장 앞의 것. 증거 수집용. */\nfunction anyMarker(content: string, kind: MarkerKind, from: number): MarkerHit | undefined {\n let best: MarkerHit | undefined;\n for (const marker of MARKERS[kind]) {\n const at = content.indexOf(marker, from);\n if (at >= 0 && (best === undefined || at < best.at)) {\n best = { at, length: marker.length };\n }\n }\n return best;\n}\n\n/**\n * 이 위치가 코드펜스 «안»인가.\n *\n * <p>★예전엔 줄 맨 앞의 백틱 세 개를 «세어서» 홀짝으로 판정했다. 그래서 tilde 펜스,\n * 들여쓴 펜스, 그리고 «더 긴 펜스 안에 든 짧은 백틱 줄»을 전부 놓쳤고 — 예제로 적어 둔\n * 마커를 우리 블록으로 오인해 남의 본문을 갈아 끼웠다(2026-09-23 독립 재리뷰 I9).\n *\n * <p>지금은 Markdown 의 실제 규칙을 따른다: 펜스는 백틱 또는 tilde 세 개 이상으로 열리고,\n * 들여쓰기는 세 칸까지, 닫는 펜스는 <b>같은 문자</b>로 <b>연 것보다 짧지 않게</b>, 뒤에 아무것도\n * 없어야 한다. 완전한 파서는 아니지만 판정이 틀리는 쪽은 «안전한 쪽»(손대지 않음)이다.\n */\nfunction isInsideFencedBlock(content: string, index: number): boolean {\n let open: { char: string; length: number } | undefined;\n let offset = 0;\n for (const line of content.split(\"\\n\")) {\n const nextOffset = offset + line.length + 1;\n if (index < nextOffset) {\n // 표식이 이 줄에 있다 — 이 줄 «전»까지의 상태가 답이다.\n return open !== undefined;\n }\n const fence = fenceOf(line);\n if (fence) {\n if (!open) {\n open = { char: fence.char, length: fence.length };\n } else if (fence.char === open.char && fence.length >= open.length && fence.info === \"\") {\n open = undefined;\n }\n }\n offset = nextOffset;\n }\n return open !== undefined;\n}\n\n/** 이 줄이 펜스면 그 모양. 아니면 undefined. */\nfunction fenceOf(line: string): { char: string; length: number; info: string } | undefined {\n const match = /^ {0,3}(`{3,}|~{3,})(.*)$/.exec(line);\n if (!match) {\n return undefined;\n }\n const run = match[1]!;\n const info = match[2]!.trim();\n // 백틱 펜스의 정보 문자열에는 백틱이 못 들어간다(Markdown 규칙).\n if (run.startsWith(\"`\") && info.includes(\"`\")) {\n return undefined;\n }\n return { char: run[0]!, length: run.length, info };\n}\n\nexport interface MarkerRemoval {\n content: string;\n removed: boolean;\n /** 블록을 빼고 나니 빈 파일이 됐나 — 우리가 만든 파일이면 지울 수 있다. */\n emptied: boolean;\n}\n\nexport function removeMarkerBlock(existing: string | undefined): MarkerRemoval {\n const current = existing ?? \"\";\n assertNoDanglingMarker(current);\n const range = markerRange(current);\n if (!range) {\n return { content: current, removed: false, emptied: !current.trim() };\n }\n // ★<b>이어붙는 자리만</b> 손본다. 예전엔 파일 «전체»에 /\\n{3,}/ 를 돌려, 우리가 쓰지도 않은\n // 문단 사이 빈 줄까지 줄여 놓았다(2026-09-22 독립 리뷰 I2). 안 건드린 곳은 안 건드린다.\n //\n // ⚠원래 파일이 «끝 줄바꿈 없이» 끝났다면 그것까지는 되살리지 못한다 — upsert 가 붙일 때\n // 이미 지운 정보다. 그래서 「바이트 원복」이라고 말하지 않는다. 한 줄을 더한다.\n const before = current.slice(0, range.start).replace(/\\n*$/, \"\");\n const after = current.slice(range.end).replace(/^\\n*/, \"\");\n const stripped = before && after\n ? `${before}\\n\\n${after}`\n : before\n ? `${before}\\n`\n : after;\n return { content: stripped.trim() ? stripped : \"\", removed: true, emptied: !stripped.trim() };\n}\n\n/** 관리 블록을 «원래 있던 블록»으로 갈아 끼운다. undo 가 쓴다. */\nexport function replaceMarkerBlockWith(content: string, block: string): string {\n const range = markerRange(content);\n return range ? `${content.slice(0, range.start)}${block}${content.slice(range.end)}` : content;\n}\n\n/**\n * 짝이 맞지 않는 마커 하나. 중첩·잘림도 «설명해야 할 것»이므로 증거에 자리를 차지한다.\n *\n * <p>⛔글자를 바꾸지 않는다(2026-10-11). 0.4.x 가 쓴 기록의 foreignBlocks 에 이 글자 그대로 들어 있다 —\n * 바꾸면 그 기록의 증거가 새 CLI 의 증거와 안 맞아 되돌리기가 «설명되지 않는 마커»로 멈춘다.\n *\n * <p>★<b>여는 것과 닫는 것을 구별한다</b>(3차 리뷰 B2). 하나의 문자열로 뭉쳤더니\n * 「원래 있던 «닫는» 예제」와 「우리 블록에서 남은 «여는» 마커」가 서로 상쇄돼, 증거가 맞는 것처럼\n * 보이고 사용자 원본 백업이 버려졌다. 종류가 다르면 다른 증거다.\n */\nexport const UNPAIRED_BEGIN = \"(unpaired ai-erd begin)\";\nexport const UNPAIRED_END = \"(unpaired ai-erd end)\";\n\n/**\n * ★<b>init «전»에 이 파일에 있던 관리 블록들의 신원.</b> 되돌리기가 「이 파일에 남은 마커를\n * 내 기록으로 «설명할 수 있나»」를 묻는 데 쓰는 증거다.\n *\n * <p>★<b>왜 개수도, 모양 비교도 아닌가</b>(2026-09-27 9차 2차 리뷰 B2·N1). 두 번 틀렸다:\n * <ul>\n * <li>개수는 「예제를 지우고 그 자리에 우리 블록을 옮기기」를 못 본다 — 총수가 그대로다.</li>\n * <li>우리 블록을 «모양»으로 알아보려 하면, 제목 한 줄만 고쳐도·인용문({@code > })으로\n * 옮겨도·마커를 겹쳐도 못 알아보고 그것을 「블록이 없다」로 읽어 백업을 버렸다.\n * 거꾸로 init 전부터 있던 «똑같은» 예제는 우리 블록으로 오인해 정상 되돌리기를 막았다.</li>\n * </ul>\n * ⇒ 판정을 뒤집는다. 우리 블록을 알아보려 하지 않고, <b>기록에 있는 예제를 지워 나간 뒤 남는\n * 것을 «설명되지 않은 것»으로 본다.</b> 모양 비교는 「기록해 둔 예제가 그대로 있나」를 볼 때만\n * 쓰고, 의무 완료는 <b>증거 대조</b>가 정한다.\n *\n * <p>⚠사용자가 «자기 예제»를 고쳐 놓으면 그것도 설명되지 않은 것이 되어 되돌리기가 사람에게\n * 넘어간다. 백업을 지우는 것보다는 그쪽이 맞다 — 우리는 그 둘을 가를 근거를 갖고 있지 않다.\n */\nexport function markerEvidence(content: string | undefined): string[] {\n if (!content) {\n return [];\n }\n // ★<b>우리 블록을 «빼고» 본 파일이 증거다.</b> 소유 범위를 남겨 두면 그 경계를 가로질러 짝이\n // 지어진다 — 원래 «여는 마커만» 적어 둔 예제가 우리 블록의 «닫는 마커»와 한 쌍으로 묶여,\n // init 이 자기가 쓴 블록 때문에 «새로운 남의 증거»를 만들어 냈다(3차 리뷰 N2).\n // 빼고 보면 불변식이 선다: 우리 블록을 더하거나 걷어내도 남의 증거는 그대로다.\n const owned = markerRange(content);\n const rest = owned === undefined\n ? content\n : content.slice(0, owned.start) + content.slice(owned.end);\n const evidence: string[] = [];\n let cursor = 0;\n let begins = 0;\n let ends = 0;\n while (true) {\n const begin = anyMarker(rest, \"begin\", cursor);\n const close = anyMarker(rest, \"end\", cursor);\n if (begin === undefined && close === undefined) {\n break;\n }\n if (begin === undefined || (close !== undefined && close.at < begin.at)) {\n ends += 1; // 여는 것 없이 닫는 것이 먼저 나왔다.\n cursor = close!.at + close!.length;\n continue;\n }\n const pairEnd = anyMarker(rest, \"end\", begin.at + begin.length);\n if (pairEnd === undefined) {\n begins += 1;\n cursor = begin.at + begin.length;\n continue;\n }\n evidence.push(blockShape(rest.slice(begin.at, pairEnd.at + pairEnd.length)));\n cursor = pairEnd.at + pairEnd.length;\n }\n for (let i = 0; i < begins; i += 1) evidence.push(UNPAIRED_BEGIN);\n for (let i = 0; i < ends; i += 1) evidence.push(UNPAIRED_END);\n return evidence;\n}\n\n/** 들여쓰기와 빈 줄을 지운 «모양». 펜스·목록 안으로 옮겨져도 같은 예제로 알아본다. */\nfunction blockShape(block: string): string {\n return block.split(\"\\n\").map((line) => line.trim()).filter((line) => line.length > 0).join(\"\\n\");\n}\n\n/** 파일에 이미 들어 있던 관리 블록 원문. 없으면 undefined. undo 가 이것을 도로 넣는다. */\nexport function existingMarkerBlock(content: string | undefined): string | undefined {\n if (!content) {\n return undefined;\n }\n const range = markerRange(content);\n return range ? content.slice(range.start, range.end) : undefined;\n}\n\n/** 짝이 맞는 것은 {@link assertNoDanglingMarker} 가 이미 보장한다 — 여긴 범위만 잡는다. */\nfunction markerRange(content: string): { start: number; end: number } | undefined {\n const start = ownedMarker(content, \"begin\", 0);\n if (start === undefined) {\n return undefined;\n }\n const endMarker = ownedMarker(content, \"end\", start.at);\n if (endMarker === undefined) {\n return undefined;\n }\n return { start: start.at, end: endMarker.at + endMarker.length };\n}\n\n/**\n * ★<b>판정을 뒤집었다.</b> 「예제인지 알아내서 피한다」가 아니라\n * <b>「우리 것임을 확인할 수 있는 형태만 수락한다」</b>이다.\n *\n * <p>예제를 알아내려던 쪽은 계속 샜다 — tilde 펜스, 들여쓴 펜스, 더 긴 펜스 안의 짧은 줄,\n * 인용문 안의 코드, 네 칸 들여쓴 코드 블록…(2026-09-22 I3 → 2026-09-23 3차 I9 → 4차 I6).\n * Markdown 의 «안에 담는 문맥»은 끝이 없어서, 못 알아낸 하나가 곧 남의 본문을 지운다.\n *\n * <p>그래서 우리가 쓰는 <b>정확한 한 가지 형태</b>만 우리 것으로 본다:\n * 들여쓰기 없이 줄 맨 앞에서 시작하고, 그 줄에 표식 말고는 아무것도 없으며, 코드펜스 밖일 것.\n * ⚠이보다 느슨하게 적힌 우리 블록이 있다면 그것도 «못 알아본다» — 그 경우 덧붙이지도\n * 지우지도 않고 표식이 없는 파일처럼 다룬다. 남의 글을 지우는 쪽보다 낫다.\n */\nfunction ownedMarkerIndex(content: string, marker: string, from: number): number {\n for (let at = content.indexOf(marker, from); at >= 0; at = content.indexOf(marker, at + 1)) {\n const lineStart = content.lastIndexOf(\"\\n\", at - 1) + 1;\n if (lineStart !== at) {\n continue; // 들여썼거나 인용문(\">\") 뒤다 — 우리가 쓰는 형태가 아니다.\n }\n const lineEnd = content.indexOf(\"\\n\", at);\n const rest = (lineEnd < 0 ? content.slice(at) : content.slice(at, lineEnd)).slice(marker.length);\n if (rest.trim() !== \"\") {\n continue; // 같은 줄에 다른 글이 있다.\n }\n if (isInsideFencedBlock(content, at)) {\n continue;\n }\n return at;\n }\n return -1;\n}\n","import { HARNESS_CONFIG_PATH, HARNESS_RECORD_PATH, LEGACY_HARNESS_DIR } from \"./harnessDoc\";\n\n/**\n * 되돌리기 «기록»의 형식과 그 <b>상태 판정</b>. ★이 파일의 책임은 하나다 —\n * 「디스크에 있는 이것이 우리 기록인가, 그렇다면 온전한가」에 <b>명시적으로</b> 답하는 것.\n *\n * <p>★<b>왜 파일을 따로 두는가.</b> 다섯 차수에 걸쳐 같은 축이 샜고, 마지막 독립 리뷰가 그 이름을\n * 붙였다(2026-09-27 8차): <b>「파일 경로가 그 안의 내용이 유효하다는 증거는 아니다」</b>.\n * 기록을 우리 파일로 내보낸 것(7차)은 「이 칸이 누구 것인가」를 없앴지만, 그다음 질문을 남겼다 —\n * 「이 파일이 우리 것이라는 사실이 그 내용을 신뢰할 근거인가」. 아니다.\n *\n * <p>그때 무슨 일이 일어났나:\n * <ul>\n * <li>{@code kind} 가 다르거나 JSON 이 깨진 파일을 «부재»로 읽고, init 이 백업 없이 덮었다.\n * 읽기를 거절했는데 쓰기는 거절하지 않은 것이다(8차 I1).</li>\n * <li>{@code kind} 만 맞으면 {@code managed} 가 배열이어도, {@code version} 이 999 여도,\n * 지문 칸이 통째로 없어도 «정상 기록»으로 읽혔다. 그리고 그 기록으로 돌린 undo 가\n * <b>사용자가 편집한 문서를 지웠다</b>(8차 I2). 빈 기본값으로 채우는 관용이\n * 불확실성을 «확실»로 바꾼 것이다.</li>\n * </ul>\n * ⛔그래서 여기서는 {@code as unknown as} 로 모양을 «주장»하지 않고, 빈 값으로 «메우지» 않는다.\n * 읽어 낼 수 없으면 읽어 낼 수 없다고 말한다 — 그것이 부르는 쪽이 필요한 정보다.\n */\n\n/** 기록 파일의 신원. 사용자가 같은 이름으로 둔 파일을 실행 근거로 삼지 않는다. */\nexport const RECORD_KIND = \"ainecto/init-record\";\n\n/**\n * 0.4.x 가 쓴 신원. ★형식(판 2)은 같으므로 그대로 읽는다 — 다시 쓸 때는 {@link RECORD_KIND} 로 쓴다.\n * (그 기록 안의 경로 키를 새 폴더로 옮기는 일은 {@code legacyLayout.ts} 가 한다.)\n */\nexport const LEGACY_RECORD_KIND = \"ai-erd/init-record\";\n\n/** 이 판이 읽고 쓰는 형식. 모르는 판은 «손상»이 아니라 «지원하지 않음»이다. */\nexport const RECORD_VERSION = 2;\n\n/**\n * 우리가 «소유한 것»의 값. ★명시적 타입이라 세 가지가 갈린다:\n * 「그 자리에 아무것도 없었다」 · 「JSON 값이었다(null 일 수도 있다)」 · 「글이었다」.\n *\n * <p>예전엔 {@code undefined} 하나로 앞의 둘을 덮었고, 그래서 사용자가 저장해 둔 {@code null} 이\n * «백업 없음»으로 바뀌었다(7차 I5).\n */\nexport type Owned =\n | { at: \"absent\" }\n | { at: \"json\"; value: unknown }\n | { at: \"text\"; text: string };\n\nexport const ABSENT: Owned = { at: \"absent\" };\n\n/** 우리가 그 파일의 «무엇을» 소유하나. 넣는 법과 빼는 법이 여기서 갈린다. */\nexport type OwnedScope =\n /** 파일 본문 전체를 우리가 쓴다(.ainecto/HARNESS.md). */\n | \"whole\"\n /** JSON 안의 MCP 서버 항목 하나(.mcp.json · .cursor/mcp.json). */\n | \"entry\"\n /** Markdown 안의 마커 블록 하나(AGENTS.md · CLAUDE.md). */\n | \"block\"\n /** JSON 안의 «칸 몇 개»(.ainecto/config.json). 나머지 칸은 사용자 것이다. */\n | \"fields\";\n\n/**\n * 한 파일에 대한 복구 계약. ★<b>한 파일의 사실이 한 곳에 모인다.</b>\n *\n * <p>예전 기록은 경로를 키로 한 «평행한 map 아홉 개»였다({@code created}·{@code replacedEntries}·\n * {@code blockAdded}·{@code replacedBlocks}·{@code originals}·{@code lastWritten}·\n * {@code lastWrittenFragment}·{@code lastWrittenBody}·{@code foreignMarkers}). 그래서 지금까지\n * 나온 결함이 거의 전부 <b>「한 map 은 X 라 하고 다른 map 은 Y 라 한다」</b>였고, 고칠 때마다\n * 그중 «한 map»만 고쳤다. 한 항목으로 묶으면 그 어긋남이 생길 자리가 없다.\n */\nexport interface FileContract {\n scope: OwnedScope;\n /** 우리가 이 파일을 «만들었나». 지워도 되는 것은 이것뿐이다. */\n createdByUs: boolean;\n /** 되돌릴 «목표» — 우리가 밀어낸 것. {@code absent} 면 「우리가 더했다」는 뜻이다. */\n original: Owned;\n /** 우리가 «실제로 쓴» 것. 「지금 값이 아직 우리 것인가」의 유일한 근거다. */\n written: Owned;\n /**\n * 우리가 쓴 «파일 전체»의 지문. 파일을 지워도 되는지 판정할 때만 쓴다.\n *\n * <p>⚠없으면 «모른다»는 뜻이고, 모를 때는 지우지 않는다. 예전엔 지문이 없으면\n * {@code changedSinceOurWrite} 가 false 를 돌려줘서 「안 바뀌었다」로 읽혔고, 그 판정이\n * 사용자 문서 삭제의 근거가 됐다(8차 I2).\n */\n fileFingerprint?: string;\n /** {@code scope===\"fields\"} 전용 — 우리가 쓴 칸의 값. 칸 단위 대조의 근거다. */\n writtenFields?: Record<string, unknown>;\n /**\n * {@code scope===\"fields\"} 전용 — 우리가 덮기 «전»에 그 칸에 있던 것. 칸마다 따로 든다.\n *\n * <p>★파일 전체를 원본으로 들면 두 가지를 못 한다(8차 I4·I6):\n * <ul>\n * <li>재init 에서 사용자가 고친 칸을 «새 기준»으로 삼기 — 파일 단위로는 어느 칸이 바뀐\n * 것인지 말할 수 없다.</li>\n * <li>원래 «빈 객체»였던 config 를 빈 객체로 되돌리기 — 파일 부재와 빈 객체가 같은\n * 결과로 뭉쳤고, 그래서 프로젝트 연결이 남았다.</li>\n * </ul>\n * ⚠「파일이 아예 없었다」는 {@link #createdByUs} 가 말한다. 이 칸은 «있던 파일 안의 칸»만 다룬다.\n */\n originalFields?: Record<string, Owned>;\n /**\n * {@code scope===\"block\"} 전용 — init «전»에 이 파일에 있던 관리 블록들의 «신원».\n * {@code markerEvidence} 가 만든 목록이고, 짝이 안 맞는 마커는 그 자리에 표시가 하나 들어간다.\n *\n * <p>★<b>개수에서 목록으로 두 번 옮겨 왔다</b>(8차 I5 → 9차 B2·N1):\n * <ul>\n * <li>Boolean 하나로는 「원래 예제가 있다」와 「우리 블록이 옮겨져 남았다」를 못 갈랐다.</li>\n * <li>개수로는 「예제를 지우고 그 자리에 우리 블록을 옮기기」를 못 봤다 — 총수가 그대로다.</li>\n * <li>우리 블록을 «모양»으로 알아보려 하면 제목 한 줄 편집·인용문 이동·중첩에 뚫렸고,\n * 반대로 init 전부터 있던 똑같은 예제를 우리 것으로 오인해 정상 되돌리기를 막았다.</li>\n * </ul>\n * ⇒ 우리 블록을 알아보려 하지 않는다. <b>이 목록으로 설명되지 않는 마커가 파일에 있으면</b>\n * 되돌리기를 완료로 만들지 않고 백업을 지킨다.\n */\n foreignBlocks?: string[];\n}\n\nexport interface InitRecord {\n version: number;\n /** 경로 → 그 파일에 대한 계약. */\n files: Record<string, FileContract>;\n /** 우리가 «실제로 만든» 디렉터리. 적용이 mkdir 결과로 채운다. */\n createdDirectories: string[];\n}\n\nexport function emptyRecord(): InitRecord {\n return { version: RECORD_VERSION, files: {}, createdDirectories: [] };\n}\n\n/**\n * 디스크에 있는 것의 «상태». ★부르는 쪽이 넷을 구별해서 다뤄야 한다 —\n * 특히 {@code corrupt}·{@code legacy} 는 「없음」이 아니다. 덮으면 안 된다.\n */\nexport type RecordState =\n | { state: \"absent\" }\n | { state: \"valid\"; record: InitRecord }\n | { state: \"corrupt\"; reason: string }\n | { state: \"legacy\"; reason: string };\n\n/**\n * ★<b>단일 로더.</b> 기록을 읽는 곳은 여기 하나다.\n *\n * <p>⛔관용을 베풀지 않는다. 한 칸이라도 계약을 벗어나면 «손상»이다 — 그 기록으로 파일을 지우는\n * 것이 되돌리기가 하는 일이고, 판단 재료가 반쯤 맞는 상태로 그 일을 해선 안 된다.\n */\nexport function readRecord(content: string | undefined, recordPath: string = HARNESS_RECORD_PATH): RecordState {\n // ⚠이 함수 안의 문장은 {@code recordPath} 를 쓴다 — 옛 폴더의 기록을 읽을 때 사용자가 고칠 파일을 바로 가리키게.\n const HARNESS_RECORD_PATH = recordPath;\n if (content === undefined) {\n return { state: \"absent\" };\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(content);\n } catch {\n return { state: \"corrupt\", reason: `${HARNESS_RECORD_PATH} is not valid JSON` };\n }\n if (!isObject(parsed)) {\n return { state: \"corrupt\", reason: `${HARNESS_RECORD_PATH} is not a JSON object` };\n }\n if (parsed.kind !== RECORD_KIND && parsed.kind !== LEGACY_RECORD_KIND) {\n return {\n state: \"corrupt\",\n reason: `${HARNESS_RECORD_PATH} exists but is not an AiNecto init record (kind=`\n + `${JSON.stringify(parsed.kind)})`,\n };\n }\n if (parsed.version !== RECORD_VERSION) {\n // ★모르는 판은 손상이 아니다 — 다른 판의 CLI 가 쓴 «온전한» 기록일 수 있다.\n // 그 기록의 뜻을 우리가 추측해선 안 되고, 덮어서도 안 된다.\n return {\n state: \"legacy\",\n reason: `${HARNESS_RECORD_PATH} was written by another version of this CLI `\n + `(record version ${JSON.stringify(parsed.version)}, this CLI reads ${RECORD_VERSION})`,\n };\n }\n const files = parsed.files;\n if (!isObject(files)) {\n return { state: \"corrupt\", reason: `${HARNESS_RECORD_PATH} has no \"files\" object` };\n }\n const out: Record<string, FileContract> = {};\n for (const [path, raw] of Object.entries(files)) {\n const read = readContract(raw);\n if (\"problem\" in read) {\n return {\n state: \"corrupt\",\n reason: `${HARNESS_RECORD_PATH} has an unusable entry for ${path} — it ${read.problem}`,\n };\n }\n out[path] = read.contract;\n }\n const directories = parsed.createdDirectories;\n if (directories !== undefined && !isStringArray(directories)) {\n return { state: \"corrupt\", reason: `${HARNESS_RECORD_PATH} has a malformed createdDirectories` };\n }\n return {\n state: \"valid\",\n record: {\n version: RECORD_VERSION,\n files: out,\n createdDirectories: directories === undefined ? [] : [...directories],\n },\n };\n}\n\n/**\n * 구판(7차 이전)이 기록을 두던 자리 — {@code .ai-erd/config.json}(지금 {@code .ainecto/config.json}) 의 {@code managed} 칸.\n * 그 칸에 들어 있던 «평행한 map» 이름들이다. 하나라도 있으면 우리 구판이 쓴 기록이다.\n *\n * <p>★<b>사용자가 적은 {@code managed} 와 구별해야 한다</b>(7차 독립 리뷰 I2: config 의\n * {@code managed} 칸은 기본적으로 사용자 것이다). 그래서 이름만 보지 않고 «그 안의 모양»을 본다.\n */\nconst LEGACY_MANAGED_KEYS = [\n \"created\", \"originals\", \"lastWritten\", \"lastWrittenFragment\", \"lastWrittenBody\",\n \"replacedEntries\", \"replacedBlocks\", \"blockAdded\", \"foreignMarkers\",\n] as const;\n\n/**\n * 이 config 안에 «구판이 쓴 기록»이 들어 있나.\n *\n * <p>★<b>없는 것과 못 읽는 것은 다르다</b>(9차 1차 리뷰 B6). 기록을 우리 파일로 내보낸 뒤,\n * 구판이 config 에 남긴 기록이 있는 저장소에서 되돌리기가 <b>「이전 init 기록이 없다」</b>고\n * 안내했다 — 그 config 안에 사용자 원본 백업이 그대로 들어 있는데도. 그러면 사용자는\n * 「되돌릴 것이 없구나」로 읽고 그 백업을 영영 쓰지 않는다.\n */\nexport function legacyManagedRecord(configContent: string | undefined): boolean {\n if (configContent === undefined) {\n return false;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(configContent);\n } catch {\n return false;\n }\n if (!isObject(parsed) || !isObject(parsed.managed)) {\n return false;\n }\n const managed = parsed.managed;\n const hasLegacyShape = LEGACY_MANAGED_KEYS.some(\n (key) => Object.prototype.hasOwnProperty.call(managed, key),\n );\n if (!hasLegacyShape) {\n return false;\n }\n // ★<b>모양만으로는 «사용자가 적은 칸»과 구별되지 않는다</b> — 두 판정이 맞부딪힌 자리다\n // (7차 I2 「config 의 managed 는 사용자 것이다」 ↔ 9차 B6 「구판 기록을 없는 것으로 안내한다」).\n // 그래서 구판이 «함께 쓴 것»을 본다: 구판은 managed 를 혼자 쓰지 않았다.\n // · generatedBy — 우리 CLI 만 적는 칸(cliVersion)\n // · managed.lastWritten 안의 «config 자기 경로» — 구판이 자기 지문을 거기 넣었다\n // 둘 중 하나라도 있으면 우리 구판이 쓴 파일이고, 없으면 사용자 것으로 둔다.\n if (typeof parsed.generatedBy === \"string\") {\n return true;\n }\n const lastWritten = managed.lastWritten;\n // 구판은 0.4.x 폴더(.ai-erd/)에서만 돌았다 — 자기 경로도 그 이름으로 적혀 있다.\n return isObject(lastWritten)\n && [HARNESS_CONFIG_PATH, `${LEGACY_HARNESS_DIR}/config.json`]\n .some((path) => Object.prototype.hasOwnProperty.call(lastWritten, path));\n}\n\n/** 구판 기록을 만난 사람에게 할 말. ★자동 마이그레이션을 «하지 않는다»는 사실도 말한다. */\nexport function legacyManagedNotice(configPath: string): string {\n return `${configPath} holds an init record written by an older version of this CLI `\n + `(a \"managed\" field). This version keeps its record in ${HARNESS_RECORD_PATH} and cannot `\n + \"read that one, so your saved originals are still in there and nothing was changed. \"\n // ★`-p` 가 있어야 한다. `npx @ai-erd/mcp@0.2 ai-erd …` 는 패키지의 기본 bin(`mcp` — 브리지)을\n // 실행하고 뒤의 말을 그 인자로 넘긴다(0.4.1 리뷰 P2). 버전은 «그 기록을 쓴 판»(0.2)을 가리킨다.\n + \"Undo with the version that wrote it (for example: npx -y -p @ai-erd/mcp@0.2 ai-erd init --undo), \"\n + \"then run this version again.\";\n}\n\n/** 기록 파일의 저장 모양. ★지문을 담지 않는다 — 자기 해시를 담은 문서의 해시라는 순환이 생긴다. */\nexport function serializeRecord(record: InitRecord): string {\n return `${JSON.stringify({\n kind: RECORD_KIND,\n version: RECORD_VERSION,\n files: record.files,\n createdDirectories: record.createdDirectories,\n }, null, 2)}\\n`;\n}\n\n/**\n * 한 항목을 읽는다. ★읽어 내지 못하면 «무엇이 어긋났나»를 함께 돌려준다 —\n * 사용자가 손대야 할 파일이라 「읽을 수 없다」만으로는 고칠 수 없다.\n */\ntype ContractRead = { contract: FileContract } | { problem: string };\n\nfunction readContract(raw: unknown): ContractRead {\n if (!isObject(raw)) {\n return { problem: \"is not a JSON object\" };\n }\n const scope = raw.scope;\n if (scope !== \"whole\" && scope !== \"entry\" && scope !== \"block\" && scope !== \"fields\") {\n return { problem: `has an unknown scope (${JSON.stringify(raw.scope)})` };\n }\n if (typeof raw.createdByUs !== \"boolean\") {\n return { problem: \"does not say whether ainecto created the file\" };\n }\n const original = readOwned(raw.original);\n const written = readOwned(raw.written);\n if (original === undefined) {\n return { problem: \"has no readable record of what was there before\" };\n }\n if (written === undefined) {\n return { problem: \"has no readable record of what ainecto wrote\" };\n }\n if (raw.fileFingerprint !== undefined && typeof raw.fileFingerprint !== \"string\") {\n return { problem: \"has a malformed fileFingerprint\" };\n }\n if (raw.writtenFields !== undefined && !isObject(raw.writtenFields)) {\n return { problem: \"has a malformed writtenFields\" };\n }\n let originalFields: Record<string, Owned> | undefined;\n if (raw.originalFields !== undefined) {\n if (!isObject(raw.originalFields)) {\n return { problem: \"has a malformed originalFields\" };\n }\n originalFields = {};\n for (const [field, value] of Object.entries(raw.originalFields)) {\n const owned = readOwned(value);\n if (owned === undefined) {\n return { problem: `has no readable original for the field ${field}` };\n }\n originalFields[field] = owned;\n }\n }\n if (raw.foreignBlocks !== undefined && !isStringArray(raw.foreignBlocks)) {\n return { problem: \"has a malformed foreignBlocks\" };\n }\n if (scope === \"block\" && raw.foreignBlocks === undefined) {\n // ★블록 계약은 「이 파일에 원래 무엇이 있었나」 없이는 완료를 판정할 수 없다. 없으면 없다고 한다.\n return { problem: 'owns a marker block but does not say what marker blocks were already in the file' };\n }\n if (scope === \"fields\") {\n const problem = fieldsContractProblem({\n written,\n writtenFields: isObject(raw.writtenFields) ? raw.writtenFields : undefined,\n originalFields,\n });\n if (problem !== undefined) {\n return { problem };\n }\n }\n const contract: FileContract = {\n scope, createdByUs: raw.createdByUs, original, written,\n };\n if (typeof raw.fileFingerprint === \"string\") contract.fileFingerprint = raw.fileFingerprint;\n if (isObject(raw.writtenFields)) contract.writtenFields = { ...raw.writtenFields };\n if (originalFields !== undefined) contract.originalFields = originalFields;\n if (isStringArray(raw.foreignBlocks)) contract.foreignBlocks = [...raw.foreignBlocks];\n return { contract };\n}\n\n/**\n * {@code scope===\"fields\"} 계약이 «스스로 어긋나지» 않았나. ★로더와 계획이 <b>같은 이 함수</b>를\n * 쓴다 — 두 곳에 두면 「한쪽은 괜찮다 하고 다른 쪽은 아니라 한다」가 또 생긴다.\n *\n * <p>★<b>칸이 «있는지»에서 멈추면 반쯤 맞는 기록으로 파일을 고친다</b>(9차 B1). 세 번 뚫렸다:\n * <ul>\n * <li>{@code writtenFields.endpoint} 하나만 지운 기록을 유효로 읽었고, 되돌리기는 그 칸을\n * 「사용자가 고쳤다」로 읽어 우리 값을 남긴 뒤 <b>사용자 원본이 든 기록까지</b> 지웠다.</li>\n * <li>두 map 에서 «동시에» 지우면 그것도 유효였다 — 칸 집합끼리만 맞춰 봤기 때문이다.\n * 그래서 우리가 쓴 본문에 있는 «우리 칸»이 기록에 적혀 있는지도 본다(2차 리뷰 B1).</li>\n * <li>★원본을 {@code {at:\"text\"}} 로 바꿔 두면 유효로 읽혔고, 되돌리기는 «되돌릴 수 없는\n * 모양»을 부재로 취급해 그 칸을 지웠다 — config 가 {@code {}} 가 되고 기록이 사라졌다.\n * fields 의 원본은 {@code absent} 또는 {@code json} 뿐이다(2차 리뷰 B1).</li>\n * </ul>\n *\n * @param ownedFields 부르는 쪽이 아는 «우리 칸» 이름. 계획은 넘기고(그래서 양쪽 방향을 다 본다),\n * 로더는 넘기지 않는다 — 어느 칸이 우리 것인지는 형식 층의 지식이 아니다.\n */\nexport function fieldsContractProblem(\n contract: {\n written: Owned;\n writtenFields?: Record<string, unknown>;\n originalFields?: Record<string, Owned>;\n },\n ownedFields?: readonly string[],\n): string | undefined {\n const { written, writtenFields, originalFields } = contract;\n if (writtenFields === undefined) {\n return \"owns only some fields of the file but does not say which ones it wrote (writtenFields)\";\n }\n if (originalFields === undefined) {\n return \"owns only some fields of the file but does not say what was in them before (originalFields)\";\n }\n const writtenKeys = Object.keys(writtenFields).sort();\n const originalKeys = Object.keys(originalFields).sort();\n if (writtenKeys.length !== originalKeys.length\n || writtenKeys.some((key, at) => key !== originalKeys[at])) {\n return `lists different fields as written (${writtenKeys.join(\", \") || \"none\"}) and as `\n + `backed up (${originalKeys.join(\", \") || \"none\"})`;\n }\n for (const key of writtenKeys) {\n // ★되돌리기가 할 수 있는 일은 「그 값을 도로 넣기」와 「그 칸을 빼기」뿐이다. 그 둘이 아닌\n // 모양을 들고 있으면 그것은 판정 자료가 아니라 손상이다.\n const original = originalFields[key]!;\n if (original.at !== \"absent\" && original.at !== \"json\") {\n return `records the original of ${key} as ${original.at}, which is not something --undo `\n + \"can put back into a JSON field\";\n }\n }\n if (written.at !== \"text\") {\n return \"owns only some fields of the file but does not hold the file text it wrote\";\n }\n let body: unknown;\n try {\n body = JSON.parse(written.text);\n } catch {\n return \"holds a written file body that is not valid JSON\";\n }\n if (!isObject(body)) {\n return \"holds a written file body that is not a JSON object\";\n }\n for (const key of writtenKeys) {\n if (!Object.prototype.hasOwnProperty.call(body, key)) {\n return `says it wrote ${key}, but that field is not in the file body it recorded`;\n }\n if (stableStringify(body[key]) !== stableStringify(writtenFields[key])) {\n return `records a different value for ${key} than the file body it wrote`;\n }\n }\n if (ownedFields !== undefined) {\n // ★반대 방향. 우리가 쓴 본문에 «우리 칸»이 있는데 기록이 그 칸을 말하지 않으면, 그 칸에 대한\n // 판정 자료가 없다는 뜻이다 — 두 map 에서 동시에 지운 기록이 그래서 유효로 읽혔다.\n for (const key of ownedFields) {\n if (Object.prototype.hasOwnProperty.call(body, key)\n && !Object.prototype.hasOwnProperty.call(writtenFields, key)) {\n return `wrote ${key} into the file but does not record what it put there`;\n }\n }\n }\n return undefined;\n}\n\nfunction readOwned(raw: unknown): Owned | undefined {\n if (!isObject(raw)) {\n return undefined;\n }\n if (raw.at === \"absent\") {\n return ABSENT;\n }\n if (raw.at === \"json\") {\n // ⚠value 는 «없어도» 되는 칸이 아니다 — 키가 있어야 한다. null 이 값이기 때문이다.\n return Object.prototype.hasOwnProperty.call(raw, \"value\")\n ? { at: \"json\", value: raw.value }\n : undefined;\n }\n if (raw.at === \"text\") {\n return typeof raw.text === \"string\" ? { at: \"text\", text: raw.text } : undefined;\n }\n return undefined;\n}\n\n/**\n * 객체 칸의 «순서»를 지운 JSON.\n *\n * <p>★{@code JSON.parse}→{@code stringify} 는 공백은 정규화하지만 칸 순서는 그대로 둔다.\n * 그래서 사람이 편집기로 열었다 저장만 해도 「사용자가 고쳤다」로 잡혔다(4차 독립 리뷰 S1).\n *\n * <p>★<b>여기 한 벌만 둔다.</b> 기록의 «상호 일치» 판정과 계획의 «값이 바뀌었나» 판정이 다른\n * 정규형을 쓰면 「한 쪽은 같다고 하고 다른 쪽은 다르다고 한다」가 또 생긴다 — 그것이 다섯 차수를\n * 관통한 실패의 이름이었다.\n *\n * <p>⚠배열 순서는 유지한다 — 거기선 순서가 곧 내용이다(MCP 인자 목록 등).\n */\nexport function stableStringify(value: unknown): string {\n if (Array.isArray(value)) {\n return `[${value.map(stableStringify).join(\",\")}]`;\n }\n if (value && typeof value === \"object\") {\n const entries = Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0));\n return `{${entries.map(([key, item]) => `${JSON.stringify(key)}:${stableStringify(item)}`).join(\",\")}}`;\n }\n return JSON.stringify(value) ?? \"null\";\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((entry) => typeof entry === \"string\");\n}\n","import {\n AGENT_TARGETS,\n readServerEntry,\n buildServerEntry,\n codexAddCommand,\n codexProfileSetup,\n codexRemoveCommand,\n mergeServerEntry,\n readRoleFromEntry,\n removeServerEntry,\n SERVER_NAME,\n} from \"./agentTargets\";\nimport {\n existingMarkerBlock,\n markerEvidence,\n HARNESS_CONFIG_PATH,\n HARNESS_DOC_PATH,\n HARNESS_RECORD_PATH,\n removeMarkerBlock,\n replaceMarkerBlockWith,\n renderAgentNote,\n renderHarnessDoc,\n upsertMarkerBlock,\n} from \"./harnessDoc\";\nimport {\n ABSENT,\n emptyRecord,\n fieldsContractProblem,\n legacyManagedNotice,\n legacyManagedRecord,\n readRecord,\n serializeRecord,\n stableStringify,\n type FileContract,\n type InitRecord,\n type Owned,\n type RecordState,\n} from \"./initRecord\";\nimport { createHash } from \"node:crypto\";\nimport { readConfigRole } from \"./repositoryRole\";\nimport { LEGACY_ROLE_ENV_VAR, ROLE_ENV_VAR, type HarnessRole } from \"./role\";\n\n/**\n * init 이 «무엇을 쓸지»를 순수하게 계산한다. 파일을 읽지도 쓰지도 않는다.\n *\n * ★<b>계획과 적용을 가른 이유.</b> 이 명령은 남의 저장소에 파일을 쓴다 — 가장 위험한 종류의\n * 일이다. 계산이 순수하면 「어떤 상태에서 무엇을 쓰는가」를 전부 시험으로 고정할 수 있고,\n * {@code --dry-run} 이 «진짜로 일어날 일»을 그대로 보여 준다(따로 만든 미리보기가 아니다).\n *\n * <p>★★<b>2026-09-27, 여덟 차례의 독립 리뷰 뒤에 경계를 셋으로 나눴다.</b> 다섯 차수 동안 같은\n * 축이 계속 샜고, 마지막 리뷰가 그 이유에 이름을 붙였다 — 기록이 «경로를 키로 한 평행한 map\n * 아홉 개»여서 나온 결함이 거의 전부 「한 map 은 X 라 하고 다른 map 은 Y 라 한다」였다.\n * 고칠 때마다 나는 그중 <b>한 map</b>을 고쳤다.\n * <ol>\n * <li>{@code initRecord.ts} — 기록의 «형식과 상태». 부재·유효·손상·구판을 명시적으로 돌려준다.</li>\n * <li><b>이 파일</b> — «파일별 복구 계약». 한 파일의 사실이 한 항목에 모이고,\n * 완료·보존·미해결이 {@link Outcome} 타입으로 갈린다.</li>\n * <li>{@code initCommand.applyPlan} — 적용과 기록 저장. 실제 변경과 mkdir 결과를 한 경계에서 모은다.</li>\n * </ol>\n */\n\n/** 규칙 블록을 넣을 지침 파일. 없으면 만드는 것과 있을 때만 고치는 것을 구분한다. */\nconst NOTE_TARGETS = [\n { path: \"AGENTS.md\", createIfMissing: true },\n { path: \"CLAUDE.md\", createIfMissing: false },\n] as const;\n\nexport const MANAGED_PATHS: readonly string[] = [\n ...AGENT_TARGETS.map((target) => target.path),\n ...NOTE_TARGETS.map((target) => target.path),\n HARNESS_DOC_PATH,\n HARNESS_CONFIG_PATH,\n HARNESS_RECORD_PATH,\n];\n\n/** 경로 → 현재 내용. 값이 {@code undefined} 면 «파일 없음». */\nexport type FileSnapshot = ReadonlyMap<string, string | undefined>;\n\nexport interface FileWrite {\n path: string;\n content: string;\n existed: boolean;\n}\n\nexport interface InitPlan {\n writes: FileWrite[];\n deletes: string[];\n /** 사용자가 직접 칠 명령 — 우리가 전역 설정을 고치지 않는다. */\n codexCommand: string;\n /** Codex 에서 세션마다 역할을 바꾸는 법(프로필). 되돌리기 계획에는 없다. */\n codexProfile?: string[];\n notes: string[];\n /** init 계획이 남기는 기록. {@code .ainecto/init-record.json} 에 저장된다. */\n record?: InitRecord;\n /**\n * ★<b>아무것도 하지 말아야 하는 이유.</b> 있으면 부르는 쪽이 멈추고 이 문장을 보여 준다.\n *\n * <p>기록을 읽어 내지 못했을 때 그냥 진행하면 그 파일에 든 «남의 원본 백업»을 백업 없이\n * 덮는다 — 읽기를 거절했는데 쓰기는 거절하지 않은 것이다(2026-09-27 8차 독립 리뷰 I1).\n */\n refusal?: string;\n /**\n * 되돌리기가 «치워도 되는» 디렉터리 — 우리가 만든 것뿐이다.\n *\n * <p>★비었다는 것과 우리 것이라는 것은 다른 사실이다(4차 독립 리뷰 S3).\n */\n removableDirectories?: string[];\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 소유한 값 다루기\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** JSON 값을 {@link Owned} 로. {@code present} 가 false 면 «그 자리에 없다»는 뜻이다. */\nfunction ownedJson(value: unknown, present: boolean): Owned {\n return present ? { at: \"json\", value } : ABSENT;\n}\n\nfunction ownedText(text: string | undefined): Owned {\n return text === undefined ? ABSENT : { at: \"text\", text };\n}\n\n/**\n * 두 소유값이 같은가. ★<b>JSON 타입을 보존한다.</b>\n *\n * <p>예전엔 문자열은 원문 그대로, 객체는 JSON 문자열로 해시해서 <b>객체와 「그 객체의 JSON 을\n * 담은 문자열」이 같은 지문</b>이 됐고, 타입이 다른데도 「원본 복구 완료」로 판정하며 객체\n * 백업을 지웠다(7차 독립 리뷰 I5). 정규화는 «칸 순서와 공백»만 지우는 일이다.\n */\nfunction sameOwned(left: Owned, right: Owned): boolean {\n if (left.at !== right.at) {\n return false;\n }\n if (left.at === \"absent\") {\n return true;\n }\n if (left.at === \"text\" && right.at === \"text\") {\n return left.text === right.text;\n }\n return left.at === \"json\" && right.at === \"json\"\n && stableStringify(left.value) === stableStringify(right.value);\n}\n\n/** 내용 지문. 암호학적 용도가 아니라 «바뀌었나»만 본다. */\nexport function contentFingerprint(content: string): string {\n return createHash(\"sha256\").update(content).digest(\"hex\");\n}\n\nfunction serialize(body: unknown): string {\n return `${JSON.stringify(body, null, 2)}\\n`;\n}\n\n/** 이 경로의 내용 지문. JSON 파일은 칸 순서를 지운 정규형으로 잰다. */\nfunction fingerprintFor(path: string, content: string): string {\n if (!path.endsWith(\".json\")) {\n return contentFingerprint(content);\n }\n try {\n return contentFingerprint(stableStringify(JSON.parse(content)));\n } catch {\n return contentFingerprint(content);\n }\n}\n\nfunction parseJsonObject(content: string): Record<string, unknown> | undefined {\n try {\n const parsed = JSON.parse(content) as unknown;\n return parsed && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : undefined;\n } catch {\n return undefined;\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// config 의 «우리 칸»\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface ConfigBodyValues {\n projectUuid: string;\n projectName: string;\n endpoint: string;\n cliVersion: string;\n versions: Record<string, string>;\n}\n\n/** init 이 config 에 쓰는 내용. ★적는 칸의 진실원이 여기 하나다. */\nfunction configBodyOf(values: ConfigBodyValues): Record<string, unknown> {\n return {\n version: 1,\n project: { uuid: values.projectUuid, name: values.projectName },\n endpoint: values.endpoint,\n generatedBy: values.cliVersion,\n promptVersions: values.versions,\n };\n}\n\n/**\n * config 에서 «우리 것»인 칸. ★여기 없는 칸은 <b>사용자가 적은 것</b>이고 되돌리기가 손대지 않는다.\n *\n * <p>목록을 {@link configBodyOf} 에서 «뽑아낸다» — 손으로 베끼면 칸이 늘 때 잊는다.\n * 같은 자리를 이미 한 번 틀렸다(4차 독립 리뷰 I3).\n *\n * <p>★{@code managed} 는 이 목록에 «없다». 기록이 자기 파일로 나갔기 때문이다 — 사용자가\n * config 에 {@code managed} 라는 칸을 적어 두어도 그것은 사용자 것이다(7차 독립 리뷰 I2).\n */\nconst OUR_CONFIG_FIELDS: readonly string[] = Object.keys(configBodyOf({\n projectUuid: \"\", projectName: \"\", endpoint: \"\", cliVersion: \"\", versions: {},\n}));\n\nconst hasField = (object: Record<string, unknown>, field: string) =>\n Object.prototype.hasOwnProperty.call(object, field);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 계획 — init\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface PlanInitInput {\n role: HarnessRole;\n env?: \"prod\" | \"dev\";\n projectName: string;\n projectUuid: string;\n endpoint: string;\n cliVersion: string;\n files: FileSnapshot;\n /** 직전 실행의 기록 «상태». ★유효하지 않으면 init 이 멈춘다 — 덮으면 백업이 사라진다. */\n previous?: RecordState;\n /** 서버에서 받은 문서 본문. 없으면 패키지 기본값(= 오프라인 기본값)을 쓴다. */\n documents?: { doc?: string; agentNote?: string; versions?: Record<string, string> };\n}\n\n/**\n * ★<b>기록 때문에 멈춰야 하나 — «파일만» 보고 답한다.</b>\n *\n * <p>계획을 세우는 것보다 «앞»에 이 질문이 있어야 한다. 예전엔 이 판정이 {@code planInit} 안에만\n * 있었고, 부르는 쪽은 그 전에 프로젝트를 해결했다 — 프로젝트가 0개면 <b>원격에 프로젝트를 만든\n * 뒤에</b> 「아무것도 바꾸지 않았다」는 예외를 냈다(9차 1차 리뷰 B7). 로컬 쓰기가 0이어도\n * 부수효과가 0인 것은 아니다. 그래서 순수 함수로 빼서 원격 호출 전에 물을 수 있게 한다.\n *\n * <p>⚠{@code planInit} 도 이 함수를 쓴다 — 두 곳에 같은 판단을 두면 어긋난다.\n */\nexport function initRefusal(files: FileSnapshot, previous?: RecordState): string | undefined {\n const state = previous ?? readRecord(files.get(HARNESS_RECORD_PATH));\n if (state.state === \"corrupt\" || state.state === \"legacy\") {\n // ★읽어 내지 못한 기록을 덮으면 그 안의 «남의 원본 백업»이 사라진다. 읽기를 거절했으면\n // 쓰기도 거절해야 한다(8차 독립 리뷰 I1).\n return `${state.reason}. Nothing was changed — move that file aside (or restore it) and run again.`;\n }\n if (state.state === \"absent\" && legacyManagedRecord(files.get(HARNESS_CONFIG_PATH))) {\n // ★구판이 config 에 남긴 기록이다. 우리는 그것을 이행할 수 없고, 덮으면 그 안의 사용자\n // 원본이 «읽을 수는 있지만 쓸 수 없는» 글이 된다 — 아무도 다시 꺼내지 않는다(9차 B6).\n return legacyManagedNotice(HARNESS_CONFIG_PATH);\n }\n const carried = state.state === \"valid\" ? state.record : emptyRecord();\n for (const [path, contract] of Object.entries(carried.files)) {\n if (contract.scope !== \"fields\") {\n continue;\n }\n // ★<b>검증 «전» 기록으로 파일을 고치지 않는다.</b> 같은 완전성 검사가 되돌리기에만 있었고,\n // 재init 은 그 기록을 그대로 실행해 «현재 값»을 새 원본으로 적어 버렸다(3차 리뷰 F1).\n // ⛔로더에 도메인 지식을 넣는 대신, 도메인을 아는 이 경계에서 두 진입점이 같은 검사를 한다.\n const problem = fieldsContractProblem(contract, OUR_CONFIG_FIELDS);\n if (problem !== undefined) {\n return `${HARNESS_RECORD_PATH}'s record for ${path} ${problem}. Nothing was changed — `\n + \"restore that file (or move it aside) and run again.\";\n }\n }\n return undefined;\n}\n\nexport function planInit(input: PlanInitInput): InitPlan {\n const previous = input.previous ?? readRecord(input.files.get(HARNESS_RECORD_PATH));\n const refusal = initRefusal(input.files, previous);\n if (refusal !== undefined) {\n return {\n writes: [], deletes: [], notes: [],\n codexCommand: codexAddCommand({ role: input.role, env: input.env, endpoint: input.endpoint }),\n refusal,\n };\n }\n\n const carriedRecord = previous.state === \"valid\" ? previous.record : emptyRecord();\n\n const entry = buildServerEntry({ role: input.role, env: input.env, endpoint: input.endpoint });\n const writes: FileWrite[] = [];\n const notes: string[] = [];\n const record: InitRecord = {\n version: carriedRecord.version,\n files: { ...carriedRecord.files },\n createdDirectories: [...carriedRecord.createdDirectories],\n };\n\n /**\n * ★<b>이어받은 계약이 아직 참인가.</b> 기록은 «지난 실행의 주장»이고 그 사이에 파일이 바뀔 수\n * 있다. 지금 값이 우리가 쓴 것도 아니고 되돌릴 목표도 아니면 그 백업은 낡은 것이다 —\n * 지금 값이 사용자의 것이므로 그것이 새 기준이 되어야 한다(6차 I3 → 8차 I4).\n */\n const priorOf = (path: string, current: Owned): FileContract | undefined => {\n const prior = record.files[path];\n if (prior === undefined) {\n return undefined;\n }\n if (sameOwned(prior.written, current) || sameOwned(prior.original, current)) {\n return prior;\n }\n delete record.files[path];\n notes.push(`${path}: it changed outside ainecto, so the older backup was dropped and this is the new baseline.`);\n return undefined;\n };\n\n // ── MCP 설정 파일들 — 우리가 «항목 하나»를 소유한다 ──────────────────────────\n for (const target of AGENT_TARGETS) {\n const existing = input.files.get(target.path);\n const currentEntry = existing === undefined ? undefined : readServerEntry(existing);\n const prior = priorOf(target.path, ownedJson(currentEntry, currentEntry !== undefined));\n const merged = mergeServerEntry(existing, entry);\n if (existing === merged.content) {\n continue;\n }\n const before = previousRole(target.path, existing);\n if (merged.replaced && before && before !== input.role) {\n notes.push(`${target.path}: role ${before} → ${input.role}`);\n }\n const original = prior?.original ?? ownedJson(merged.replacedEntry, merged.replaced);\n if (prior === undefined && original.at !== \"absent\") {\n notes.push(`${target.path}: your existing \"${SERVER_NAME}\" entry was saved and will be restored by --undo`);\n }\n record.files[target.path] = {\n scope: \"entry\",\n createdByUs: prior?.createdByUs ?? existing === undefined,\n original,\n written: ownedJson(readServerEntry(merged.content), true),\n fileFingerprint: fingerprintFor(target.path, merged.content),\n };\n writes.push({ path: target.path, content: merged.content, existed: existing !== undefined });\n }\n\n // ── HARNESS.md — 우리가 «파일 전체»를 소유한다 ────────────────────────────────\n const existingDoc = input.files.get(HARNESS_DOC_PATH);\n const priorDoc = priorOf(HARNESS_DOC_PATH, ownedText(existingDoc));\n const docContent = renderHarnessDoc({\n projectName: input.projectName,\n projectUuid: input.projectUuid,\n endpoint: input.endpoint,\n }, input.documents?.doc);\n const docOriginal = priorDoc?.original ?? ownedText(existingDoc);\n if (priorDoc === undefined && docOriginal.at !== \"absent\") {\n notes.push(`${HARNESS_DOC_PATH} already existed; its original was saved and --undo will restore it.`);\n }\n record.files[HARNESS_DOC_PATH] = {\n scope: \"whole\",\n createdByUs: priorDoc?.createdByUs ?? existingDoc === undefined,\n original: docOriginal,\n written: ownedText(docContent),\n fileFingerprint: fingerprintFor(HARNESS_DOC_PATH, docContent),\n };\n if (docContent !== existingDoc) {\n writes.push({ path: HARNESS_DOC_PATH, content: docContent, existed: existingDoc !== undefined });\n }\n\n // ── AGENTS.md / CLAUDE.md — 우리가 «블록 하나»를 소유한다 ─────────────────────\n const note = renderAgentNote(input.documents?.agentNote);\n for (const target of NOTE_TARGETS) {\n const existing = input.files.get(target.path);\n if (existing === undefined && !target.createIfMissing) {\n notes.push(`${target.path} not found — skipped; AGENTS.md already reaches this agent.`);\n continue;\n }\n const blockNow = existing === undefined ? undefined : existingMarkerBlock(existing);\n const carried = record.files[target.path];\n // ⚠아래 판정은 «새 기준을 만들기 전에» 온다. 정상 위치에 블록이 있을 때만 검사하면,\n // 그 블록을 고치고 사본을 옆에 둔 파일이 가드를 건너뛰었다(3차 리뷰 B2).\n let content: string;\n try {\n content = upsertMarkerBlock(existing, note);\n } catch (error) {\n // ★우리 블록을 «다시 찾을 수 있게» 넣을 수 없는 파일이다 — 그 파일만 건너뛰고 나머지\n // init 은 계속한다. ⛔이때 기록은 «한 글자도» 건드리지 않는다: 새 기준도 못 세웠는데\n // 옛 백업을 버리면 양쪽 다 잃는다(7차 독립 리뷰 I4).\n notes.push(`${target.path}: ${error instanceof Error ? error.message : String(error)}`);\n continue;\n }\n if (carried?.scope === \"block\" && unexplainedMarkers(existing, carried) > 0) {\n // ★<b>이 파일의 마커를 기록으로 설명할 수 없다.</b> 우리 블록이 옮겨졌거나 한 벌 더\n // 있을 수 있다는 뜻이다(펜스·인용문 안, 제목만 고친 것, 정상 블록 옆의 사본 포함).\n // 그대로 진행하면 계약을 버려(priorOf) 사용자 원본 백업이 사라지고 파일에는 우리 블록이\n // 둘이 된다 — 그 상태의 undo 는 «새로 더한 것만» 걷어내고 완료로 처리했다(9차 B2).\n // ⇒ 이 파일은 손대지 않고 기록도 그대로 둔다. 자리를 되돌리는 것은 사람 몫이다.\n notes.push(\n `${target.path}: this file has an ainecto marker block that is not where ainecto can find `\n + \"it again (inside a code fence, a quote, or edited). Left untouched and the earlier \"\n + \"backup kept — move that block back to the top level, or remove it, then run again.\",\n );\n continue;\n }\n // ★<b>블록을 «못 찾는다»는 사실은 백업을 버릴 근거가 아니다</b>(3차 리뷰 B2). 마커가\n // 변형·삭제돼 우리 블록이 검출되지 않으면 예전엔 계약을 버려 사용자 원본이 사라졌다.\n // 새 기준은 «정상 위치에 사용자 것이 들어와 있을 때»만 세운다 — 그때만 되돌릴 목표가 바뀐다.\n const prior = blockNow === undefined ? carried : priorOf(target.path, ownedText(blockNow));\n if (content === existing) {\n continue;\n }\n const original = prior?.original ?? ownedText(blockNow);\n if (prior === undefined && original.at !== \"absent\") {\n notes.push(`${target.path}: an existing ainecto block was saved and will be restored by --undo`);\n }\n record.files[target.path] = {\n scope: \"block\",\n createdByUs: prior?.createdByUs ?? existing === undefined,\n original,\n written: ownedText(existingMarkerBlock(content)),\n fileFingerprint: fingerprintFor(target.path, content),\n // init «전»에 이 파일에 있던 관리 블록들의 신원. 되돌리기가 「남은 마커를 설명할 수 있나」를\n // 이것으로 묻는다. ★재init 은 이어받는다 — 다시 재면 우리가 쓴 블록이 «원래 있던 것»이 된다.\n // ★{@code carried} 를 먼저 본다 — {@code priorOf} 가 새 기준을 세웠다는 것이 「남의 예제\n // 목록을 다시 모아도 된다」는 허가가 아니다. 다시 모으면 «우리가 옮겨 둔 사본»이\n // 「원래 있던 예제」로 등록되고, 그다음 되돌리기가 그것을 남긴 채 끝났다(3차 리뷰 B2).\n foreignBlocks: carried?.foreignBlocks ?? prior?.foreignBlocks ?? markerEvidence(existing),\n };\n writes.push({ path: target.path, content, existed: existing !== undefined });\n }\n\n // ── config.json — 우리가 «칸 몇 개»를 소유한다. 나머지는 사용자 것이다 ────────\n const existingConfig = input.files.get(HARNESS_CONFIG_PATH);\n const ourFields = configBodyOf({\n projectUuid: input.projectUuid,\n projectName: input.projectName,\n endpoint: input.endpoint,\n cliVersion: input.cliVersion,\n // ★어느 판의 규칙으로 썼나. 이게 없으면 「무엇이 적혀 있었나」를 나중에 못 되짚는다.\n versions: input.documents?.versions ?? {},\n });\n const theirConfig = existingConfig === undefined ? undefined : parseJsonObject(existingConfig);\n if (existingConfig !== undefined && theirConfig === undefined) {\n // JSON 객체가 아닌 파일은 병합할 수 없다 — 손대지 않는다. ⛔이미 있던 계약도 지우지 않는다:\n // 그 안에 아직 못 되돌린 원본이 있을 수 있다(8차 독립 리뷰 I3).\n notes.push(`${HARNESS_CONFIG_PATH} is not a JSON object — left untouched.`);\n } else {\n const priorConfig = record.files[HARNESS_CONFIG_PATH];\n const originalFields: Record<string, Owned> = {};\n for (const field of OUR_CONFIG_FIELDS) {\n const presentNow = theirConfig !== undefined && hasField(theirConfig, field);\n const currentValue = presentNow ? theirConfig![field] : undefined;\n const priorOriginal = priorConfig?.originalFields?.[field];\n const priorWritten = priorConfig?.writtenFields;\n // ★재init: 사용자가 우리 칸을 고쳤으면 «그 값»이 새 원본이다. 옛 원본을 이어받으면\n // 되돌리기가 두 판 전 값을 복원하며 사용자 편집을 잃는다(8차 독립 리뷰 I4).\n const untouchedByUser = priorWritten !== undefined && hasField(priorWritten, field)\n && stableStringify(currentValue) === stableStringify(priorWritten[field]);\n const next = untouchedByUser && priorOriginal !== undefined\n ? priorOriginal\n : ownedJson(currentValue, presentNow);\n originalFields[field] = next;\n if (priorOriginal !== undefined && !sameOwned(next, priorOriginal)) {\n notes.push(`${HARNESS_CONFIG_PATH}: you changed ${field} — ainecto now treats your value as the one to put back.`);\n }\n }\n const mergedConfig = serialize({ ...(theirConfig ?? {}), ...ourFields });\n record.files[HARNESS_CONFIG_PATH] = {\n scope: \"fields\",\n createdByUs: priorConfig?.createdByUs ?? existingConfig === undefined,\n original: ABSENT,\n written: ownedText(mergedConfig),\n fileFingerprint: fingerprintFor(HARNESS_CONFIG_PATH, mergedConfig),\n writtenFields: { ...ourFields },\n originalFields,\n };\n if (mergedConfig !== existingConfig) {\n writes.push({\n path: HARNESS_CONFIG_PATH,\n content: mergedConfig,\n existed: existingConfig !== undefined,\n });\n }\n }\n\n // ── 기록 — 우리 파일. 통째로 쓰고 통째로 지운다 ───────────────────────────────\n const existingRecord = input.files.get(HARNESS_RECORD_PATH);\n const recordContent = serializeRecord(record);\n // ★변경 없는 재실행은 아무 파일도 안 바꿔야 한다(5차 독립 리뷰 S2). ⚠그렇다고 「쓸 것이\n // 없다」가 「새로 알게 된 사실도 없다」를 뜻해선 안 된다 — mkdir 결과는 적용이 따로 저장한다\n // (8차 독립 리뷰 S1).\n if (recordContent !== existingRecord) {\n writes.push({\n path: HARNESS_RECORD_PATH,\n content: recordContent,\n existed: existingRecord !== undefined,\n });\n }\n\n return {\n writes,\n deletes: [],\n codexCommand: codexAddCommand({ role: input.role, env: input.env, endpoint: input.endpoint }),\n codexProfile: codexProfileSetup({ role: input.role, env: input.env, endpoint: input.endpoint }),\n notes,\n record,\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 계획 — undo\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * 한 파일에 대한 처리 «결과». ★완료·보존·미해결을 타입으로 가른다.\n *\n * <p>예전엔 셋이 같은 코드 경로로 흘렀고, 그래서 「손대지 않음」이 「복구 완료」와 같은 결과가\n * 됐다 — 판단 재료가 없어 아무것도 못 한 파일의 백업까지 지웠다(8차 독립 리뷰 I3).\n */\ntype Outcome =\n /** 목표에 도달했다 — 기록에서 지운다. */\n | { kind: \"done\"; note?: string }\n /** 되돌렸다 — 파일을 쓰고 기록에서 지운다. */\n | { kind: \"write\"; content: string; note?: string }\n /** 되돌렸다 — 파일을 지우고 기록에서 지운다. */\n | { kind: \"delete\"; note?: string }\n /** 이제 사용자 것이다 — 파일은 그대로 두고 기록에서 지운다. */\n | { kind: \"keep\"; note: string }\n /** 아직 못 했다 — ★기록을 «지키고» 이유를 말한다. */\n | { kind: \"unresolved\"; note: string };\n\nexport interface PlanUndoInput {\n files: FileSnapshot;\n /** 기록 «상태». 없으면 스냅샷에서 읽는다. */\n record?: RecordState;\n}\n\n/**\n * ★<b>우리가 쓴 것만 되돌린다.</b> 남의 서버 항목, 사용자가 표식 밖에 적은 글은 그대로 둔다.\n * 파일을 지우는 것은 «우리가 만든 파일»뿐이다.\n */\nexport function planUndo(input: PlanUndoInput): InitPlan {\n const state = input.record ?? readRecord(input.files.get(HARNESS_RECORD_PATH));\n const writes: FileWrite[] = [];\n const deletes: string[] = [];\n const notes: string[] = [];\n const tail = () => {\n notes.push(`Codex keeps its own global config — remove it with: ${codexRemoveCommand()}`);\n notes.push(`If you set ${ROLE_ENV_VAR} (or the older ${LEGACY_ROLE_ENV_VAR}) anywhere, unset it too.`);\n };\n\n if (state.state === \"absent\") {\n // ★기록이 없으면 «아무것도» 되돌리지 않는다. 예전엔 이름이 우리 것이면 지웠는데,\n // init 을 한 적도 없는 저장소의 사용자 항목까지 지웠다(독립 재리뷰 I2).\n // ⚠단 «없다»와 «구판이 다른 자리에 남겼다»는 다른 사실이다. 구판 기록이 있는 저장소에서\n // 「이전 init 기록이 없다」고 말하면, 그 config 안의 사용자 백업을 아무도 다시 꺼내지\n // 않는다 — 되돌릴 것이 없다고 읽기 때문이다(9차 1차 리뷰 B6).\n notes.push(legacyManagedRecord(input.files.get(HARNESS_CONFIG_PATH))\n ? legacyManagedNotice(HARNESS_CONFIG_PATH)\n : `No record of a previous init in ${HARNESS_RECORD_PATH} — no local file was changed.`);\n tail();\n return { writes, deletes, codexCommand: codexRemoveCommand(), notes };\n }\n if (state.state !== \"valid\") {\n // ⛔손상·구판 기록으로 파일을 «지우지» 않는다. 그 안에 아직 못 되돌린 원본이 있을 수 있고,\n // 우리는 그것을 읽어 내지 못했다(8차 독립 리뷰 I1·S2).\n notes.push(\n `${state.reason}. Nothing was changed — that file is kept because it may hold backups `\n + \"--undo still needs. Restore it, or finish the undo with the CLI version that wrote it.\",\n );\n tail();\n return { writes, deletes, codexCommand: codexRemoveCommand(), notes };\n }\n\n const record = state.record;\n /** 남은 의무. ★끝난 항목만 지운다 — 못 한 것은 남는다. */\n const remaining: Record<string, FileContract> = { ...record.files };\n\n for (const [path, contract] of Object.entries(record.files)) {\n const outcome = undoOne(path, contract, input.files.get(path));\n if (outcome.kind !== \"unresolved\" && outcome.kind !== \"keep\" && outcome.note !== undefined) {\n notes.push(outcome.note);\n } else if (outcome.kind === \"unresolved\" || outcome.kind === \"keep\") {\n notes.push(outcome.note);\n }\n if (outcome.kind === \"unresolved\") {\n continue; // 기록을 지킨다.\n }\n delete remaining[path];\n if (outcome.kind === \"write\") {\n writes.push({ path, content: outcome.content, existed: true });\n } else if (outcome.kind === \"delete\") {\n deletes.push(path);\n }\n }\n\n tail();\n\n // ★기록 파일은 «전부 우리 것»이다 — 남은 의무가 있으면 줄여서 다시 쓰고, 없으면 지운다.\n // 「이 칸이 누구 것인가」를 판정할 일이 없다.\n if (input.files.get(HARNESS_RECORD_PATH) !== undefined) {\n if (Object.keys(remaining).length > 0) {\n const reduced: InitRecord = { ...record, files: remaining };\n writes.push({ path: HARNESS_RECORD_PATH, content: serializeRecord(reduced), existed: true });\n notes.push(\n `${HARNESS_RECORD_PATH}: kept, with the finished items removed — it still holds the backups `\n + \"--undo needs. Run --undo again once the items above are resolved.\",\n );\n } else {\n deletes.push(HARNESS_RECORD_PATH);\n }\n }\n\n // ★비었다고 다 치우지 않는다 — 우리가 만든 것만. 그 목록은 적용이 mkdir 결과로 적어 둔다.\n const removableDirectories = parentsOf(deletes)\n .filter((directory) => record.createdDirectories.includes(directory));\n\n return { writes, deletes, codexCommand: codexRemoveCommand(), notes, removableDirectories };\n}\n\n/**\n * ★<b>이 파일에 남은 관리 블록을 기록으로 «설명할 수 있나».</b> 설명되지 않는 것이 하나라도\n * 있으면 우리 블록이 어딘가에 있을 수 있다는 뜻이고, 그러면 의무를 완료로 만들지 않는다.\n *\n * <p>★<b>판정을 뒤집은 자리다</b>(9차 2차 리뷰 B2·N1). 「우리 블록을 알아본다」로 짜면 제목 한 줄\n * 편집·인용문 이동·마커 중첩에 전부 뚫리고, 거꾸로 init 전부터 있던 «똑같은» 예제를 우리 것으로\n * 오인해 정상 되돌리기를 막는다. 그래서 알아보려 하지 않고 <b>기록해 둔 예제를 지워 나간 뒤\n * 남는 것</b>을 센다. 모양 비교는 「적어 둔 예제가 그대로 있나」에만 쓴다.\n */\nfunction unexplainedMarkers(existing: string | undefined, contract: FileContract): number {\n const recorded = [...(contract.foreignBlocks ?? [])];\n let unexplained = 0;\n for (const print of markerEvidence(existing)) {\n const at = recorded.indexOf(print);\n if (at >= 0) {\n recorded.splice(at, 1); // init 전에 있던 그 블록이다 — 우리 일이 아니다.\n } else {\n unexplained += 1;\n }\n }\n return unexplained;\n}\n\n/** 이 파일 하나를 어떻게 할까. ★{@link Outcome} 하나만 돌려준다 — 부수효과 없음. */\nfunction undoOne(path: string, contract: FileContract, existing: string | undefined): Outcome {\n if (existing === undefined) {\n if (contract.original.at !== \"absent\" || contract.scope === \"fields\") {\n // 백업을 든 파일이 사라졌다. 「없으니 건너뛴다」로 기록을 지우면 그 원본은 영영\n // 사라진다 — 사용자가 파일을 되살릴 수도 있다(5차 독립 리뷰 I2).\n return {\n kind: \"unresolved\",\n note: `${path} is gone, so what was there before init could not be put back — `\n + \"the backup is kept. Restore the file and run --undo again.\",\n };\n }\n return { kind: \"done\" };\n }\n switch (contract.scope) {\n case \"entry\": return undoEntry(path, contract, existing);\n case \"block\": return undoBlock(path, contract, existing);\n case \"fields\": return undoFields(path, contract, existing);\n case \"whole\": return undoWhole(path, contract, existing);\n }\n}\n\nfunction undoEntry(path: string, contract: FileContract, existing: string): Outcome {\n const current = readServerEntry(existing);\n const currentOwned = ownedJson(current, current !== undefined);\n if (sameOwned(currentOwned, contract.original)) {\n return {\n kind: \"done\",\n note: contract.original.at === \"absent\"\n ? `${path}: the \"${SERVER_NAME}\" entry ainecto added is already gone.`\n : `${path}: your original \"${SERVER_NAME}\" entry is already back in place.`,\n };\n }\n // ★안내대로 지운 사람에게 같은 안내를 반복하지 않는다 — 남은 일은 원본을 도로 넣는 것이고\n // 그 경로가 바로 아래에 있다(7차 독립 리뷰 S2).\n const goneButWeHoldTheOriginal = current === undefined && contract.original.at !== \"absent\";\n if (!goneButWeHoldTheOriginal && !sameOwned(currentOwned, contract.written)) {\n return {\n kind: \"unresolved\",\n note: `${path}: the \"${SERVER_NAME}\" entry was edited after init — left in place. `\n + \"Remove it by hand if you meant to, then run --undo again.\",\n };\n }\n const restore = contract.original.at === \"json\" ? { value: contract.original.value } : undefined;\n const result = removeServerEntry(existing, restore);\n if (result.emptied && contract.createdByUs) {\n return { kind: \"delete\" };\n }\n if (result.content !== undefined && result.content !== existing) {\n return {\n kind: \"write\",\n content: result.content,\n note: restore === undefined ? undefined : `${path}: restored your original \"${SERVER_NAME}\" entry.`,\n };\n }\n return { kind: \"done\" };\n}\n\nfunction undoBlock(path: string, contract: FileContract, existing: string): Outcome {\n const current = existingMarkerBlock(existing);\n const currentOwned = ownedText(current);\n // ★<b>「예제가 있다」와 「우리 블록이 옮겨져 남았다」를 개수로 가른다.</b> Boolean 하나로는\n // 둘을 표현할 수 없었고, 예제가 있는 파일에서는 우리 블록이 남아 있어도 완료로 읽혔다\n // (8차 독립 리뷰 I5).\n // ★기록으로 설명되지 않는 마커가 있으면, 정상 위치의 블록을 걷어내는 것으로 의무가 끝나지\n // 않는다 — 우리 블록이 그 자리에 있을 수 있다. 개수도 모양도 아니라 «증거 대조»다(9차 2차 B2).\n if (unexplainedMarkers(existing, contract) > 0) {\n return {\n kind: \"unresolved\",\n note: `${path}: this file has an ainecto marker block that --undo cannot account for `\n + \"(inside a code fence, a quote, or edited). Remove it by hand, then run --undo again.\",\n };\n }\n if (sameOwned(currentOwned, contract.original)) {\n return {\n kind: \"done\",\n note: contract.original.at === \"absent\"\n ? `${path}: the ainecto block is already gone.`\n : `${path}: the ainecto block that was there before is already back in place.`,\n };\n }\n if (current === undefined && contract.original.at === \"text\") {\n // ★안내대로 지웠다 — 원본 블록을 도로 넣는다. 예전엔 여기서도 「손으로 지우고 다시\n // 실행하라」를 반복해, 이미 지운 사람에게 실행되지 않는 경로를 요구했다(8차 S3).\n const body = existing.trim()\n ? `${existing.replace(/\\s*$/, \"\")}\\n\\n${contract.original.text}\\n`\n : `${contract.original.text}\\n`;\n return { kind: \"write\", content: body, note: `${path}: restored the ainecto block that was there before.` };\n }\n if (!sameOwned(currentOwned, contract.written)) {\n return {\n kind: \"unresolved\",\n note: `${path}: the ainecto block was edited after init — left in place. `\n + \"Remove the block by hand if you meant to, then run --undo again.\",\n };\n }\n let result: { content: string; removed: boolean; emptied: boolean };\n try {\n result = contract.original.at === \"text\"\n ? { content: replaceMarkerBlockWith(existing, contract.original.text), removed: true, emptied: false }\n : removeMarkerBlock(existing);\n } catch (error) {\n return { kind: \"unresolved\", note: `${path}: ${error instanceof Error ? error.message : String(error)}` };\n }\n if (!result.removed) {\n return {\n kind: \"unresolved\",\n note: `${path}: the ainecto block could not be removed — it is still in the file. `\n + \"Remove it by hand, then run --undo again.\",\n };\n }\n if (result.emptied && contract.createdByUs) {\n return { kind: \"delete\" };\n }\n return {\n kind: \"write\",\n content: result.content,\n note: contract.original.at === \"text\"\n ? `${path}: restored the ainecto block that was there before.`\n : undefined,\n };\n}\n\nfunction undoWhole(path: string, contract: FileContract, existing: string): Outcome {\n if (sameOwned(ownedText(existing), contract.original)) {\n // 사용자가 손으로 원본을 되돌려 놨다 — 목표에 이미 도달했다(6차 독립 리뷰 I2).\n return { kind: \"done\", note: `${path} is already the file that existed before init.` };\n }\n if (!sameOwned(ownedText(existing), contract.written)) {\n if (contract.original.at === \"text\") {\n return {\n kind: \"unresolved\",\n note: `${path} was edited after init — left in place instead of restoring the pre-init file. `\n + \"The backup is kept; run --undo again once you have resolved it.\",\n };\n }\n // 우리가 만든 파일을 사용자가 고쳤다 — 이제 사용자 것이다.\n return { kind: \"keep\", note: `${path} was edited after init — left in place instead of deleting it.` };\n }\n if (contract.original.at === \"text\") {\n return {\n kind: \"write\",\n content: contract.original.text,\n note: `${path}: restored the file that existed before init.`,\n };\n }\n return contract.createdByUs ? { kind: \"delete\" } : { kind: \"done\" };\n}\n\nfunction undoFields(path: string, contract: FileContract, existing: string): Outcome {\n const parsed = parseJsonObject(existing);\n if (parsed === undefined) {\n // ★「손대지 않음」은 «복구 완료»가 아니다. 판단 재료가 없으면 백업을 지킨다(8차 I3).\n return {\n kind: \"unresolved\",\n note: `${path} is not a JSON object any more, so ainecto could not take its fields back out — `\n + \"the backup is kept. Fix the file and run --undo again.\",\n };\n }\n // ★<b>로더와 «같은» 검증을 여기서도 한다.</b> 그리고 여기서는 부르는 쪽이 아는 것을 하나 더\n // 넘긴다 — 어느 칸이 우리 것인지. 그래서 「우리가 쓴 칸인데 기록에 없다」까지 걸린다.\n // ⛔빈 map 으로 메우면 모든 칸이 「우리 것이 아니다」로 읽혀 파일은 그대로 두고 백업만\n // 지운다. 판정 자료가 반쯤 맞으면 그것으로 파일을 고치지 않는다(9차 B1 · 2차 리뷰 B1).\n const contractProblem = fieldsContractProblem(contract, OUR_CONFIG_FIELDS);\n if (contractProblem !== undefined) {\n return {\n kind: \"unresolved\",\n note: `${path}: ainecto's record of the fields it wrote ${contractProblem}, so its fields `\n + \"were left in place — the backup is kept. Restore that record, or remove the fields by hand.\",\n };\n }\n const written = contract.writtenFields!;\n const originals = contract.originalFields!;\n const next: Record<string, unknown> = {};\n const kept: string[] = [];\n for (const [field, value] of Object.entries(parsed)) {\n if (!OUR_CONFIG_FIELDS.includes(field)) {\n next[field] = value; // 사용자 칸 — 손대지 않는다.\n continue;\n }\n if (!hasField(written, field)) {\n // ★우리 칸 이름인데 기록이 그 칸을 말하지 않는다 — 판정 자료가 없다. 「사용자가 고쳤다」도\n // 「우리 것이 아니다」도 근거가 없으므로 완료로 바꾸지 않는다(9차 B1).\n return {\n kind: \"unresolved\",\n note: `${path}: ainecto has no record of what it wrote for ${field}, so its fields were `\n + \"left in place — the backup is kept. Restore that record, or remove the field by hand.\",\n };\n }\n const stillOurs = stableStringify(value) === stableStringify(written[field]);\n if (!stillOurs) {\n // ★이름이 우리 것이어도 «값»은 사용자가 고쳤다. 되돌리기가 그것을 덮지 않는다(7차 I2).\n next[field] = value;\n kept.push(field);\n continue;\n }\n const original = originals[field];\n // ★되돌릴 «목표»를 모르면 지우지 않는다. 예전엔 json 이 아닌 모든 것을 「우리가 더한 칸」으로\n // 묶어 지웠고, 원본이 {at:\"text\"} 로 바뀐 기록 하나가 config 를 «비웠다»(2차 리뷰 B1).\n // 위 검증이 이미 막지만, 이 판단을 그 검증에만 맡기지 않는다 — 여기가 파일을 고치는 자리다.\n if (original === undefined || (original.at !== \"json\" && original.at !== \"absent\")) {\n return {\n kind: \"unresolved\",\n note: `${path}: ainecto cannot tell what was in ${field} before it wrote there, so the `\n + \"file was left as it is — the backup is kept. Remove the field by hand if you meant to.\",\n };\n }\n if (original.at === \"json\") {\n next[field] = original.value; // 원래 있던 칸 → 원본 값으로.\n }\n // ⚠original 이 absent 면 우리가 «더한» 칸이므로 넣지 않는다 = 지운다.\n // ★사용자가 우리 칸을 «지웠으면» 그 칸은 위 루프에 아예 안 들어온다 — 그래서 되살아나지\n // 않는다. 예전엔 뒤에 보충 루프가 있어 삭제를 무조건 되돌렸다(8차 독립 리뷰 I4).\n }\n const note = kept.length === 0 ? undefined\n : `${path}: you changed ${kept.join(\", \")} after init — left as you set it instead of `\n + \"putting the pre-init value back.\";\n if (Object.keys(next).length === 0 && contract.createdByUs) {\n return { kind: \"delete\", note };\n }\n // ★파일이 원래 «빈 객체»였으면 빈 객체를 되돌린다 — 부재와 구별한다(8차 독립 리뷰 I6).\n const body = serialize(next);\n return body === existing\n ? { kind: \"done\", note }\n : {\n kind: \"write\",\n content: body,\n note: note ?? `${path}: removed what ainecto wrote and kept the rest.`,\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 적용이 쓰는 것\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * 기록의 {@code createdDirectories} 를 «실제로 만든 것»으로 갈아 끼운다.\n *\n * <p>★자기 지문을 다시 계산하는 장치가 없다 — 기록이 우리 파일이라 지문을 재지 않기 때문이다.\n * 같은 순환 함정을 세 번 «요령»으로 막은 뒤(4차 I7 · 5차 S3 · 6차) 순환이 생기는 구조를\n * 없애는 쪽이 답이었다.\n */\nexport function withCreatedDirectories(current: string, directories: readonly string[]): string {\n const state = readRecord(current);\n if (state.state !== \"valid\") {\n return current;\n }\n return serializeRecord({ ...state.record, createdDirectories: [...directories] });\n}\n\nexport { readRecord, serializeRecord, emptyRecord } from \"./initRecord\";\nexport type { InitRecord, RecordState, FileContract, Owned } from \"./initRecord\";\n\n/** 이 경로들의 «저장소 안» 부모 디렉터리. 깊은 것부터 — .a/b 를 치워야 .a 가 비워진다. */\nfunction parentsOf(paths: readonly string[]): string[] {\n const directories = new Set<string>();\n for (const path of paths) {\n const parent = path.includes(\"/\") ? path.slice(0, path.lastIndexOf(\"/\")) : \"\";\n if (parent) {\n directories.add(parent);\n }\n }\n return [...directories].sort((left, right) => right.length - left.length);\n}\n\n/** 이 설정 파일에 걸린 역할 — 읽는 규칙은 {@link readConfigRole} 한 곳이다. */\nfunction previousRole(path: string, existing: string | undefined): HarnessRole | undefined {\n const read = readConfigRole(path, existing);\n return read.kind === \"role\" ? read.role : undefined;\n}\n","import { lstat, readFile, realpath } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, resolve, sep } from \"node:path\";\nimport { AGENT_TARGETS, isOurBridge, LEGACY_SERVER_NAME, readRoleFromEntry, SERVER_NAME } from \"./agentTargets\";\nimport { HARNESS_ROLES, type HarnessRole } from \"./role\";\n\n/**\n * ★저장소 역할의 SSOT (설계 0.4.2 §2-1).\n *\n * <p>역할이 «저장된 곳»은 하나다 — init 이 쓴 {@code .mcp.json}·{@code .cursor/mcp.json} 의 {@code ainecto}\n * 항목(0.4.x 가 쓴 {@code ai-erd} 항목도)의 {@code --role}. 에이전트가 실제로 읽는 값이 그것이므로 다른 곳\n * ({@code .ainecto/config.json} 등)에\n * 두 번째 기록을 두지 않는다. init 의 역할 추론과 셸 CLI 의 역할 결정이 모두 이 모듈을 지난다.\n */\n\n/** 명령이 찾은 저장소 역할. */\nexport type RepositoryRole =\n | { kind: \"none\" }\n | { kind: \"role\"; role: HarnessRole; dir: string }\n | { kind: \"conflict\"; dir: string; reason: string };\n\n/** 파일 스냅샷에서 읽은 역할과, 역할을 «읽어 낼 수 없었던» 이유들. */\nexport interface RolesInFiles {\n /** 중복 없는 역할. 둘 이상이면 설정끼리 어긋난 것이다. */\n roles: HarnessRole[];\n /** 읽기 문제(우리 브리지인데 --role 이 없거나 모르는 값, `ainecto`·`ai-erd` 가 든 깨진 JSON). */\n problems: string[];\n /** 어느 파일이든 우리 브리지 항목(또는 읽기 문제)이 있었나 — 이 폴더가 «init 된 폴더»인가. */\n found: boolean;\n}\n\n/** 설정 파일 하나에서 읽은 것. */\nexport type ConfigRole =\n | { kind: \"absent\" }\n | { kind: \"role\"; role: HarnessRole }\n | { kind: \"problem\"; reason: string };\n\n/**\n * ★설정 파일 «하나»에서 우리 브리지의 역할을 읽는 유일한 함수. init 의 역할 변경 알림(initPlan)과\n * 저장소 역할 판정이 모두 이것을 쓴다.\n *\n * <p>멈출 이유는 좁게 둔다(0.4.2 리뷰 P1-3) — 사람의 설정을 잘못 읽어 모든 명령을 막으면 안 된다.\n * <ul>\n * <li>{@code ainecto}(또는 옛 {@code ai-erd}) 항목이 «우리 브리지»가 아니면(mcp-remote·url 방식 등) 역할 없음이다.</li>\n * <li>JSON 이 깨졌어도 원문에 두 이름이 없으면 우리와 무관한 파일이다 — 건너뛴다.</li>\n * <li>우리 브리지인데 {@code --role} 이 없거나 모르는 값이면 멈춘다 — 역할을 모르는 채로 «제한 없음»으로\n * 가지 않는다.</li>\n * <li>★두 이름 모두 우리 브리지인데 역할이 다르면 멈춘다 — 옛 CLI(0.4.x)가 새 CLI 뒤에 init 하면 생긴다.\n * 그 세션은 두 역할의 서버를 함께 본다.</li>\n * </ul>\n */\nexport function readConfigRole(path: string, content: string | undefined): ConfigRole {\n if (content === undefined || !content.trim()) {\n return { kind: \"absent\" };\n }\n let servers: Record<string, unknown>;\n try {\n const parsed = JSON.parse(content) as { mcpServers?: unknown } | null;\n const raw = parsed?.mcpServers;\n servers = typeof raw === \"object\" && raw !== null && !Array.isArray(raw) ? raw as Record<string, unknown> : {};\n } catch {\n return content.includes(SERVER_NAME) || content.includes(LEGACY_SERVER_NAME)\n ? { kind: \"problem\", reason: `${path} is not valid JSON` }\n : { kind: \"absent\" };\n }\n const roles: HarnessRole[] = [];\n for (const key of [SERVER_NAME, LEGACY_SERVER_NAME]) {\n const entry = servers[key];\n if (!isOurBridge(entry)) {\n continue;\n }\n const role = readRoleFromEntry(entry);\n if (role === undefined) {\n return { kind: \"problem\", reason: `${path} has the \"${key}\" bridge without a valid --role` };\n }\n if (!roles.includes(role)) {\n roles.push(role);\n }\n }\n if (roles.length > 1) {\n return {\n kind: \"problem\",\n reason: `${path} has both the \"${SERVER_NAME}\" and the \"${LEGACY_SERVER_NAME}\" bridge with different roles (${roles.join(\", \")})`,\n };\n }\n return roles.length === 0 ? { kind: \"absent\" } : { kind: \"role\", role: roles[0]! };\n}\n\n/**\n * 스냅샷(경로 → 내용)에서 역할을 읽는다. 순수 함수.\n *\n * <p>init 은 {@code roles} 만 본다(자기가 그 파일을 다시 쓰므로 문제를 고칠 수 있다). 셸 명령은\n * {@code problems} 가 있으면 멈춘다.\n */\nexport function rolesInFiles(files: ReadonlyMap<string, string | undefined>): RolesInFiles {\n const roles: HarnessRole[] = [];\n const problems: string[] = [];\n for (const target of AGENT_TARGETS) {\n const read = readConfigRole(target.path, files.get(target.path));\n if (read.kind === \"problem\") {\n problems.push(read.reason);\n } else if (read.kind === \"role\" && !roles.includes(read.role)) {\n roles.push(read.role);\n }\n }\n return { roles, problems, found: roles.length > 0 || problems.length > 0 };\n}\n\n/**\n * 셸 명령의 저장소 역할. ★cwd 에서 위로, 우리 브리지 항목이 있는 «첫 폴더»에서 멈춘다\n * (리뷰 P1-a — 중첩 저장소는 가까운 쪽, git 아닌 하위 폴더·worktree 도 같은 규칙).\n *\n * <p>⚠홈 폴더 자체는 보지 않는다. {@code ~/.cursor/mcp.json} 은 Cursor 의 «전역» 설정이다(실측: 역할 없는\n * {@code ai-erd} 항목이 있었다). ★비교는 «실제 경로»로 한다 — macOS 의 {@code /var} 와 {@code /private/var}\n * 처럼 링크로 갈라진 같은 폴더를 문자열로 비교하면 홈을 못 알아본다(0.4.2 리뷰 P1-1). Windows 는 대소문자를\n * 가리지 않는다.\n *\n * <p>설정 파일이 폴더 «안»을 가리키는 링크면 그대로 읽는다({@code .cursor/mcp.json → ../.mcp.json}). 폴더\n * «밖»을 가리키면 멈춘다.\n */\nexport async function findRepositoryRole(cwd: string, home: string = homedir()): Promise<RepositoryRole> {\n const stopAt = await realOrResolved(home);\n for (let dir = await realOrResolved(cwd); ; dir = dirname(dir)) {\n if (samePath(dir, stopAt)) {\n return { kind: \"none\" };\n }\n const files = new Map<string, string | undefined>();\n let readProblem: string | undefined;\n for (const target of AGENT_TARGETS) {\n try {\n files.set(target.path, await readConfigInside(dir, target.path));\n } catch (error) {\n readProblem = error instanceof Error ? error.message : String(error);\n }\n }\n if (readProblem !== undefined) {\n return { kind: \"conflict\", dir, reason: readProblem };\n }\n const result = rolesInFiles(files);\n if (result.found) {\n if (result.problems.length > 0) {\n return { kind: \"conflict\", dir, reason: result.problems.join(\"; \") };\n }\n if (result.roles.length > 1) {\n return {\n kind: \"conflict\",\n dir,\n reason: `agent configs disagree about the session role (${result.roles.join(\", \")})`,\n };\n }\n return { kind: \"role\", role: result.roles[0]!, dir };\n }\n if (dirname(dir) === dir) {\n return { kind: \"none\" };\n }\n }\n}\n\n/**\n * 멈출 때 쓰는 문장. ★막다른 길이 되지 않게 한다(0.4.2 리뷰 P2): init 은 git 저장소의 루트에서만 돈다.\n * 그 폴더가 git 저장소의 «하위 폴더»면 init 으로는 그 폴더의 설정을 고칠 수 없으므로, 사용자에게 그 파일을\n * 어떻게 둘지 물으라고 말한다.\n */\nexport async function askTheUserToFixRole(dir: string, reason: string): Promise<string> {\n const gitRoot = await findGitRoot(dir);\n const roles = HARNESS_ROLES.join(\", \");\n if (gitRoot !== undefined && !samePath(await realOrResolved(gitRoot), await realOrResolved(dir))) {\n return `Cannot tell this folder's AI session role: ${reason} (in ${dir}, inside the git repository at ${gitRoot}). `\n + \"Ask the user how that AiNecto setting should look — `ainecto init` only sets up a repository root \"\n + `(${gitRoot}).`;\n }\n return `Cannot tell this repository's AI session role: ${reason} (in ${dir}). `\n + `Ask the user which role this repository's AI sessions should have (${roles}), `\n + `then run \\`ainecto init --role <role>\\` in ${dir}.`;\n}\n\nasync function realOrResolved(path: string): Promise<string> {\n try {\n return await realpath(path);\n } catch {\n return resolve(path);\n }\n}\n\nfunction samePath(left: string, right: string): boolean {\n return process.platform === \"win32\" ? left.toLowerCase() === right.toLowerCase() : left === right;\n}\n\n/**\n * 역할을 읽으려고 설정 파일을 연다. 링크면 따라가되, 그 실제 경로가 이 폴더 «안»일 때만 읽는다.\n * (init 의 {@link readManagedFile} 은 쓰기를 위한 문이라 링크를 아예 거절한다 — 역할 읽기에는 너무 좁다.)\n */\nasync function readConfigInside(dir: string, path: string): Promise<string | undefined> {\n let real: string;\n try {\n real = await realpath(join(dir, path));\n } catch (error) {\n if (isNodeError(error, \"ENOENT\") || isNodeError(error, \"ENOTDIR\")) {\n return undefined;\n }\n throw error;\n }\n const realDir = await realOrResolved(dir);\n if (!samePath(real, realDir) && !real.startsWith(realDir + sep)\n && !(process.platform === \"win32\" && real.toLowerCase().startsWith((realDir + sep).toLowerCase()))) {\n throw new Error(`${path} points outside ${dir} (${real})`);\n }\n return readFile(real, \"utf8\");\n}\n\n/** cwd 에서 위로 올라가며 {@code .git} 이 있는 첫 디렉터리. 없으면 undefined. */\nexport async function findGitRoot(cwd: string): Promise<string | undefined> {\n for (let at = resolve(cwd); ; at = dirname(at)) {\n try {\n await lstat(join(at, \".git\"));\n return at;\n } catch {\n // 없다(또는 볼 수 없다) — 한 칸 위로.\n }\n if (dirname(at) === at) {\n return undefined;\n }\n }\n}\n\n/**\n * ★<b>저장소 안의 파일을 읽는 유일한 문.</b> 경계 검사가 읽기 «앞»에 붙어 있다.\n *\n * <p>예전엔 스냅샷만 검사를 했고, 나중에 붙인 역할 추론이 파일을 바로 읽었다. 그래서 저장소 밖을\n * 가리키는 설정 파일을 <b>한 번 읽고 나서</b> 거절했다(2026-09-23 4차 독립 리뷰 I5). 검사와 읽기가\n * 갈라지면, 새로 생긴 경로마다 검사를 잊는다.\n */\nexport async function readManagedFile(root: string, path: string): Promise<string | undefined> {\n await assertInsideRepository(root, path);\n return readIfExists(join(root, path));\n}\n\nexport async function readIfExists(absolutePath: string): Promise<string | undefined> {\n try {\n return await readFile(absolutePath, \"utf8\");\n } catch (error) {\n if (isNodeError(error, \"ENOENT\")) {\n return undefined;\n }\n throw error;\n }\n}\n\n/**\n * ★이 경로가 정말 저장소 «안»인가.\n *\n * <p>{@code join(root, path)} 는 이름을 이어 붙일 뿐이고, {@code readFile}/{@code writeFile}\n * 은 심볼릭 링크를 따라간다. {@code .ainecto → /somewhere/else} 인 저장소에서 undo 를 돌리면\n * 남의 디렉터리 파일이 지워졌다(2026-09-22 독립 리뷰 I4). 실제 경로로 풀어서 경계를 본다.\n */\nexport async function assertInsideRepository(root: string, relativePath: string): Promise<void> {\n const absolutePath = join(root, relativePath);\n const realRoot = await realpath(root);\n let realParent: string;\n try {\n realParent = await realpath(dirname(absolutePath));\n } catch (error) {\n if (isNodeError(error, \"ENOENT\")) {\n return; // 아직 없는 디렉터리는 우리가 만든다 — 링크일 수 없다.\n }\n throw error;\n }\n if (realParent !== realRoot && !realParent.startsWith(realRoot + sep)) {\n throw new Error(\n `${relativePath} resolves outside the repository (${realParent}); refusing to touch it.`,\n );\n }\n try {\n if ((await lstat(absolutePath)).isSymbolicLink()) {\n throw new Error(`${relativePath} is a symbolic link; refusing to write through it.`);\n }\n } catch (error) {\n if (!isNodeError(error, \"ENOENT\")) {\n throw error;\n }\n }\n}\n\nfunction isNodeError(error: unknown, code: string): boolean {\n return typeof error === \"object\" && error !== null && (error as { code?: unknown }).code === code;\n}\n","import {\n HARNESS_CONFIG_PATH,\n HARNESS_DIR,\n HARNESS_DOC_PATH,\n HARNESS_RECORD_PATH,\n LEGACY_HARNESS_DIR,\n} from \"./harnessDoc\";\nimport { legacyManagedNotice, legacyManagedRecord, readRecord, serializeRecord } from \"./initRecord\";\nimport type { FileSnapshot, FileWrite, InitPlan } from \"./initPlan\";\n\n/**\n * 0.4.x 의 하네스 폴더({@code .ai-erd/})를 새 폴더({@code .ainecto/})로 옮긴다 — 순수 함수 둘.\n *\n * <p>★<b>왜 «이동»인가(읽기 대체가 아니라).</b> 읽기 대체(옛 폴더가 있으면 계속 그 폴더를 쓴다)는 경로가\n * 저장소마다 달라진다 — 기록의 경로 키·AGENTS.md 블록이 가리키는 문서 경로·되돌리기·안내문이 전부\n * «어느 폴더인가»를 들고 다녀야 하고, 두 배치가 영구히 남는다. 이동은 한 번이다: 계획은 언제나 새 경로만\n * 보고({@link adoptLegacyLayout} 이 옛 파일을 새 경로에 놓인 것처럼 보여 준다), 적용이 새 경로에 쓰고 옛\n * 파일을 지운다({@link withLegacyMoves}). init·undo 계획 코드는 한 줄도 옛 이름을 모른다.\n *\n * <p>★<b>옮기는 것은 «0.4.x 기록이 있을 때»뿐이다.</b> 기록이 우리 것임을 증명하지 않으면 그 폴더의 파일을\n * 우리 것으로 옮길 근거가 없다 — 그때는 손대지 않고 그 사실만 말한다. 기록을 못 읽으면(손상·다른 판) 멈춘다:\n * 읽기를 거절했으면 쓰기도 거절한다(initRecord 의 원칙 그대로).\n *\n * <p>⚠기록의 형식은 그대로다(판 2). 바뀌는 것은 경로 키({@code .ai-erd/…} → {@code .ainecto/…})와\n * 신원(kind)뿐이고, 두 일 모두 여기서 끝난다.\n */\n\n/** 새 경로 → 옛 경로. */\nexport const LEGACY_PATHS: ReadonlyMap<string, string> = new Map(\n [HARNESS_DOC_PATH, HARNESS_CONFIG_PATH, HARNESS_RECORD_PATH].map((path) => [path, toLegacy(path)]),\n);\n\nexport const LEGACY_RECORD_PATH = toLegacy(HARNESS_RECORD_PATH);\n\n/** 스냅샷이 디스크에서 읽어야 할 옛 경로들. */\nexport const LEGACY_SNAPSHOT_PATHS: readonly string[] = [...LEGACY_PATHS.values()];\n\nexport interface LegacyMove {\n from: string;\n to: string;\n}\n\nexport interface LayoutView {\n /** 계획이 보는 스냅샷 — 새 경로만 있다. 옮길 파일은 새 경로에 놓인 것처럼 들어 있다. */\n files: FileSnapshot;\n moves: LegacyMove[];\n /** 옛 폴더를 0.4.x 가 «만들었나» — 그때만 다 옮긴 뒤 빈 폴더를 치운다. */\n legacyDirCreatedByUs: boolean;\n notes: string[];\n /** 있으면 아무것도 하지 않고 이 문장을 보여 준다. */\n refusal?: string;\n}\n\nexport function adoptLegacyLayout(disk: FileSnapshot): LayoutView {\n const files = new Map<string, string | undefined>();\n for (const [path, content] of disk) {\n if (!LEGACY_SNAPSHOT_PATHS.includes(path)) {\n files.set(path, content);\n }\n }\n const view: LayoutView = { files, moves: [], legacyDirCreatedByUs: false, notes: [] };\n if (!LEGACY_SNAPSHOT_PATHS.some((path) => disk.get(path) !== undefined)) {\n return view;\n }\n\n const legacyRecord = disk.get(LEGACY_RECORD_PATH);\n if (legacyRecord === undefined) {\n const legacyConfig = LEGACY_PATHS.get(HARNESS_CONFIG_PATH)!;\n if (disk.get(HARNESS_RECORD_PATH) === undefined && legacyManagedRecord(disk.get(legacyConfig))) {\n // ★구판(0.2)이 config 에 남긴 기록 — 이행할 수 없고, 무시하고 새 폴더에 쓰면 그 안의 사용자 원본을\n // 아무도 다시 꺼내지 않는다(initRecord.legacyManagedRecord 와 같은 이유).\n return { ...view, refusal: legacyManagedNotice(legacyConfig) };\n }\n view.notes.push(\n `${LEGACY_HARNESS_DIR}/ was left in place — there is no ${LEGACY_RECORD_PATH} showing that an earlier `\n + \"version of this CLI wrote it. Remove it by hand if it is a leftover.\",\n );\n return view;\n }\n\n const state = readRecord(legacyRecord, LEGACY_RECORD_PATH);\n if (state.state !== \"valid\") {\n return {\n ...view,\n refusal: state.state === \"absent\"\n ? `${LEGACY_RECORD_PATH} could not be read. Nothing was changed.`\n : `${state.reason}. Nothing was changed — move that file aside (or restore it) and run again.`,\n };\n }\n const clash = [...LEGACY_PATHS]\n .filter(([to, from]) => disk.get(to) !== undefined && disk.get(from) !== undefined)\n .map(([to]) => to);\n if (clash.length > 0) {\n // ★두 배치가 함께 있다 — 옛 CLI(0.4.x)가 이 CLI 뒤에 init 했거나, 이동이 중간에 끊겼다. 어느 쪽 기록이\n // 지금 파일을 설명하는지 우리가 고를 근거가 없다. 고르면 한쪽 백업을 잃는다.\n return {\n ...view,\n refusal: `Both ${LEGACY_HARNESS_DIR}/ and ${HARNESS_DIR}/ hold AiNecto setup files (${clash.join(\", \")}): `\n + \"an older version of this CLI (0.4.x) ran here after this one, or a move was interrupted. \"\n + \"Nothing was changed. Undo the older setup with `npx -y -p @ai-erd/mcp@0.4.6 ai-erd init --undo` \"\n + `(or remove the ${LEGACY_HARNESS_DIR}/ leftovers by hand), then run again.`,\n };\n }\n\n const record = state.record;\n const renamed = {\n ...record,\n files: Object.fromEntries(Object.entries(record.files).map(([path, contract]) => [toCurrent(path), contract])),\n // «하네스 폴더를 우리가 만들었다»는 같은 사실이다 — 이름만 옮긴다. 새 폴더를 이번에 만들면 적용이 또 적는다.\n createdDirectories: record.createdDirectories.map(toCurrent),\n };\n const moves: LegacyMove[] = [];\n for (const [to, from] of LEGACY_PATHS) {\n const content = disk.get(from);\n if (content === undefined) {\n continue;\n }\n files.set(to, to === HARNESS_RECORD_PATH ? serializeRecord(renamed) : content);\n moves.push({ from, to });\n }\n return {\n files,\n moves,\n legacyDirCreatedByUs: record.createdDirectories.includes(LEGACY_HARNESS_DIR),\n notes: [`${LEGACY_HARNESS_DIR}/ → ${HARNESS_DIR}/: moved what an earlier version of this CLI wrote (the folder was renamed).`],\n };\n}\n\n/**\n * 새 경로만 보고 세운 계획에 «옮기기»를 얹는다.\n *\n * <p>계획이 그 파일을 쓰면 그 내용이 새 경로에 가고, 지우면 새 경로엔 아무것도 안 생긴다. 계획이 손대지\n * 않으면 옛 내용 그대로 새 경로로 간다. 어느 경우든 옛 파일은 지운다 — 옛 폴더에 사본이 남지 않는다.\n */\nexport function withLegacyMoves(plan: InitPlan, view: LayoutView): InitPlan {\n if (view.moves.length === 0) {\n return view.notes.length === 0 ? plan : { ...plan, notes: [...view.notes, ...plan.notes] };\n }\n const movedTo = new Set(view.moves.map((move) => move.to));\n const planned = new Set([...plan.writes.map((write) => write.path), ...plan.deletes]);\n const carried: FileWrite[] = view.moves\n .filter((move) => !planned.has(move.to))\n .map((move) => ({ path: move.to, content: view.files.get(move.to)!, existed: false }));\n return {\n ...plan,\n // 새 경로는 디스크에 아직 없다 — «만든다»가 사실이다.\n writes: [...plan.writes.map((write) => (movedTo.has(write.path) ? { ...write, existed: false } : write)), ...carried],\n // 새 경로의 삭제는 디스크에 없는 파일이다 — 대신 옛 파일을 지운다.\n deletes: [...plan.deletes.filter((path) => !movedTo.has(path)), ...view.moves.map((move) => move.from)],\n notes: [...view.notes, ...plan.notes],\n removableDirectories: view.legacyDirCreatedByUs\n ? [...(plan.removableDirectories ?? []), LEGACY_HARNESS_DIR]\n : plan.removableDirectories,\n };\n}\n\nfunction toLegacy(path: string): string {\n return `${LEGACY_HARNESS_DIR}${path.slice(HARNESS_DIR.length)}`;\n}\n\nfunction toCurrent(path: string): string {\n return path === LEGACY_HARNESS_DIR || path.startsWith(`${LEGACY_HARNESS_DIR}/`)\n ? `${HARNESS_DIR}${path.slice(LEGACY_HARNESS_DIR.length)}`\n : path;\n}\n","import { assertTrustedEndpointUrl } from \"../config/endpoints\";\nimport { documentContractProblem } from \"./harnessDoc\";\n\n/**\n * 저장소에 쓸 하네스 문서를 서버에서 받아 온다.\n *\n * <p>★<b>이것이 「규칙을 고치려면 npm 퍼블리시」를 끊는 지점이다.</b> 예전엔 본문이 패키지\n * 안에 박혀 있어서, 한 줄 고치려면 CLI 를 배포하고 모든 사용자가 init 을 다시 쳐야 했다.\n *\n * <p>⚠<b>못 받으면 «기본값을 썼다»고 적는다.</b> 조용히 패키지 사본으로 떨어지면, 서버에서\n * 규칙을 고쳐도 안 바뀌는 이유를 사용자가 영영 못 찾는다 — 오늘 여러 번 만난 모양이다.\n *\n * <p>MCP 엔드포인트 아래({@code <endpoint>/harness/documents})에 둔 이유: MCP 토큰은 REST\n * ({@code /api/v1/...})에서 거절되고, 도구로 내면 모든 세션의 도구 목록이 한 칸 늘어난다.\n */\nexport interface HarnessDocuments {\n doc?: string;\n agentNote?: string;\n /** 어느 판을 받았나. 못 받았으면 undefined. */\n versions: Record<string, string>;\n /** 못 받은 이유 — 요청 자체가 실패했을 때. 받았으면 undefined. */\n unavailableReason?: string;\n /**\n * ★<b>문서별로 패키지 기본값을 쓴 이유.</b> 서버가 HTTP 200 으로 «빈 문서»를 주거나\n * 계약을 안 지킨 본문을 줘도 예전엔 조용히 패키지 사본으로 떨어졌다 — 사용자는 자기가\n * 서버 판을 받았다고 믿는다(2026-09-23 독립 재리뷰 I5).\n */\n fallbacks: Record<string, string>;\n}\n\nexport interface FetchHarnessDocumentsInput {\n endpoint: string;\n accessToken?: string;\n client?: string;\n fetchImpl?: typeof fetch;\n}\n\nexport const DOC_KEY = \"HARNESS.DOC\";\nexport const AGENT_NOTE_KEY = \"HARNESS.AGENT_NOTE\";\n\nexport async function fetchHarnessDocuments(\n input: FetchHarnessDocumentsInput,\n): Promise<HarnessDocuments> {\n const url = new URL(`${input.endpoint.replace(/\\/$/, \"\")}/harness/documents`);\n assertTrustedEndpointUrl(url, \"harness documents URL\");\n if (input.client) {\n url.searchParams.set(\"client\", input.client);\n }\n const fetchImpl = input.fetchImpl ?? fetch;\n try {\n const response = await fetchImpl(url.toString(), {\n headers: {\n accept: \"application/json\",\n ...(input.accessToken ? { authorization: `Bearer ${input.accessToken}` } : {}),\n },\n });\n if (!response.ok) {\n return { versions: {}, fallbacks: {}, unavailableReason: `server answered HTTP ${response.status}` };\n }\n const payload = (await response.json()) as {\n documents?: Record<string, { body?: unknown; version?: unknown; reason?: unknown }>;\n };\n const documents = payload.documents ?? {};\n const versions: Record<string, string> = {};\n const fallbacks: Record<string, string> = {};\n const bodies: Record<string, string | undefined> = {};\n for (const key of [DOC_KEY, AGENT_NOTE_KEY]) {\n const entry = documents[key];\n const problem = usableBodyProblem(key, entry);\n if (problem) {\n // 서버가 이유를 말해 줬으면 그것을 쓰고, 아니면 우리가 본 것을 쓴다.\n fallbacks[key] = typeof entry?.reason === \"string\" && entry.reason ? entry.reason : problem;\n continue;\n }\n bodies[key] = entry!.body as string;\n if (typeof entry?.version === \"string\") {\n versions[key] = entry.version;\n }\n }\n return { doc: bodies[DOC_KEY], agentNote: bodies[AGENT_NOTE_KEY], versions, fallbacks };\n } catch (error) {\n return {\n versions: {},\n fallbacks: {},\n unavailableReason: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * 이 응답 조각을 저장소에 «써도 되는가». 쓰면 안 되는 이유가 있으면 그 이유를 돌려준다.\n *\n * <p>★서버가 200 을 줬다는 것은 «전송이 됐다»는 뜻이지 «쓸 수 있는 글»이라는 뜻이 아니다.\n * 예전엔 본문이 비어 있지만 않으면 그대로 파일에 썼다 — 변수가 빠진 DOC 이나 관리 마커가\n * 없는 AGENT_NOTE 가 사용자 저장소에 들어갔고, 마커가 없으면 재실행마다 덧붙고 undo 도\n * 못 걷어낸다(2026-09-23 독립 재리뷰 I1).\n */\nfunction usableBodyProblem(key: string, entry: { body?: unknown } | undefined): string | undefined {\n if (typeof entry?.body !== \"string\" || !entry.body.trim()) {\n return `server returned no body for ${key}`;\n }\n return documentContractProblem(key, entry.body);\n}\n","import { createInterface, type Interface } from \"node:readline\";\n\n/**\n * 사람에게 묻는 창구. init 은 이 인터페이스만 알고, 시험은 답을 주입한다(설계 §7).\n *\n * <p>★번호로만 고른다. 화살표 메뉴(raw 모드)를 쓰지 않는 이유: raw 모드에서는 readline 이 Ctrl+C 를\n * 가로채 «멈추지 않는다». cooked 모드면 Ctrl+C 는 OS 가 보내는 SIGINT 로 그대로 끝난다(설계 §4-2).\n */\nexport interface Prompter {\n /** 번호로 하나를 고르게 한다. {@code defaultIndex} 가 없으면 빈 입력은 다시 묻는다. */\n choose<T>(question: string, choices: ReadonlyArray<Choice<T>>, defaultIndex?: number): Promise<T>;\n /** 글 한 줄. 빈 입력이면 기본값. */\n text(question: string, defaultValue: string): Promise<string>;\n close(): void;\n}\n\nexport interface Choice<T> {\n label: string;\n value: T;\n}\n\n/** 질문 중에 입력이 끝났다(EOF, Ctrl+D). init 은 저장소 파일을 쓰지 않고 130 으로 끝낸다. */\nexport class PromptCancelled extends Error {\n constructor() {\n // ★«아무것도 안 썼다»가 아니다 — 질문 전에 끝낸 로그인은 토큰 저장소에 남는다(0.4.1 최종 리뷰 P2).\n super(\"Cancelled — no repository files were written. A sign-in you already completed stays saved.\");\n this.name = \"PromptCancelled\";\n }\n}\n\n/**\n * ★에이전트·CI 가 실행했다는 표지 — TTY 여도 묻지 않는다. <b>확인된 것만</b> 둔다(추측 금지).\n *\n * <p>일부 에이전트는 명령을 pty 에서 돌려 stdin·stdout 이 TTY 로 보인다(설계 §5 «알려진 한계»). 그러면\n * 첫 질문에서 명령이 멈추고, 더 나쁘게는 에이전트가 답을 «쳐서» 역할을 고를 수 있다. 그 길을 닫는다.\n * <ul>\n * <li>{@code CLAUDECODE} — Claude Code 의 셸 도구 환경에 있다(2026-09-29 이 세션의 Bash 도구에서 실측).</li>\n * <li>{@code CI} — CI 의 관례적 표지.</li>\n * <li>{@code GEMINI_CLI} — Gemini CLI 문서: run_shell_command 는 하위 프로세스에 {@code GEMINI_CLI=1} 을 둔다\n * (docs/tools/shell.md).</li>\n * <li>{@code CODEX_SANDBOX} — Codex 가 샌드박스로 돌리는 명령에 둔다({@code codex sandbox -- env} 로 실측,\n * codex-cli 0.153.4). ⚠샌드박스 없이(권한 상승·full access) 돌린 명령에 둔다는 표지는 확인하지 못했다.</li>\n * <li>{@code CURSOR_AGENT} — Cursor 문서(cursor.com/docs/agent/terminal): 에이전트 터미널 감지용.</li>\n * </ul>\n */\nexport const AGENT_ENV_MARKERS = [\"CLAUDECODE\", \"CI\", \"GEMINI_CLI\", \"CODEX_SANDBOX\", \"CURSOR_AGENT\"] as const;\n\n/** 이 환경에 에이전트·CI 표지가 있는가. 빈 값·\"0\"·\"false\" 는 없는 것으로 본다. */\nexport function agentEnvironment(env: NodeJS.ProcessEnv = process.env): string | undefined {\n return AGENT_ENV_MARKERS.find((name) => {\n const value = env[name]?.trim().toLowerCase();\n return value !== undefined && value !== \"\" && value !== \"0\" && value !== \"false\";\n });\n}\n\n/**\n * ★대화형 판정의 유일한 자리(설계 §5): stdin·stdout 이 둘 다 TTY 이고 {@code --json} 이 아니며,\n * 에이전트·CI 표지({@link AGENT_ENV_MARKERS})가 없을 때만. 아니면 묻지 않고, 빠진 값을 말하고 멈춘다.\n */\nexport function isInteractive(\n io: { stdin?: { isTTY?: boolean }; stdout?: { isTTY?: boolean } },\n json: boolean,\n env: NodeJS.ProcessEnv = process.env,\n): boolean {\n return io.stdin?.isTTY === true && io.stdout?.isTTY === true && !json && agentEnvironment(env) === undefined;\n}\n\n/**\n * readline 으로 묻는다. ★init 한 번에 인터페이스 «하나», 줄 반복자 «하나»다 — 질문마다 새로 만들면\n * 파이프 입력에서 첫 인터페이스가 다음 줄들까지 버퍼로 먹고 닫혀 두 번째 질문이 답을 잃는다(설계 §7).\n * 질문은 stderr 에 쓴다 — stdout 은 결과 전용이다.\n */\nexport function createReadlinePrompter(io: { stdin: NodeJS.ReadableStream; stderr: NodeJS.WritableStream }): Prompter {\n let rl: Interface | undefined;\n let lines: AsyncIterator<string> | undefined;\n\n const readLine = async (prompt: string): Promise<string> => {\n io.stderr.write(prompt);\n if (!rl) {\n rl = createInterface({ input: io.stdin, terminal: false });\n lines = rl[Symbol.asyncIterator]();\n }\n const next = await lines!.next();\n if (next.done) {\n io.stderr.write(\"\\n\");\n throw new PromptCancelled();\n }\n return next.value;\n };\n\n return {\n choose: <T>(question: string, choices: ReadonlyArray<Choice<T>>, defaultIndex?: number) =>\n chooseWith(readLine, (text) => io.stderr.write(text), question, choices, defaultIndex),\n text: async (question, defaultValue) => {\n const answer = (await readLine(`${question} [${defaultValue}]: `)).trim();\n return answer || defaultValue;\n },\n close: () => {\n rl?.close();\n },\n };\n}\n\n/**\n * 번호 선택의 규칙 — 입력을 어떻게 읽든 같다. {@code defaultIndex} 는 0부터.\n * 빈 입력: 기본값이 있으면 그것, 없으면 다시 묻는다. 범위 밖·숫자 아님: 다시 묻는다.\n */\nexport async function chooseWith<T>(\n readLine: (prompt: string) => Promise<string>,\n write: (text: string) => void,\n question: string,\n choices: ReadonlyArray<Choice<T>>,\n defaultIndex?: number,\n): Promise<T> {\n if (choices.length === 0) {\n throw new Error(`Nothing to choose for: ${question}`);\n }\n write(`${question}\\n`);\n choices.forEach((choice, index) => write(` [${index + 1}] ${choice.label}\\n`));\n const hint = defaultIndex === undefined ? \"\" : ` [${defaultIndex + 1}]`;\n for (;;) {\n const answer = (await readLine(`Enter a number (1-${choices.length})${hint}: `)).trim();\n if (answer === \"\" && defaultIndex !== undefined) {\n return choices[defaultIndex]!.value;\n }\n const picked = /^\\d+$/.test(answer) ? Number(answer) : NaN;\n if (picked >= 1 && picked <= choices.length) {\n return choices[picked - 1]!.value;\n }\n write(answer === \"\"\n ? \"Please choose one — there is no default here.\\n\"\n : `\"${answer}\" is not one of the numbers above.\\n`);\n }\n}\n","import { FileTokenStore } from \"../../core/auth/tokenStore\";\nimport { OAuthClient } from \"../../core/auth/oauth\";\nimport { resolveEndpoint, assertEnv, type AinectoEnv } from \"../../core/config/endpoints\";\nimport { parsePayloadSource } from \"../../core/input/payloadSource\";\nimport { McpRpcClient, isToolError } from \"../../core/mcp/rpcClient\";\nimport { renderError, renderSuccess } from \"../../core/output/render\";\nimport { getGeneratedTools, loadLiveTools } from \"../../core/catalog\";\nimport type { GeneratedToolDefinition } from \"../../core/catalog/types\";\nimport { runConnector } from \"../mcp/connector\";\nimport { executeGeneratedCommand, matchGeneratedCommand } from \"./generatedCommandRouter\";\nimport { executeAttachmentsUploadCommand, isAttachmentsUploadCommand } from \"./attachmentsUploadCommand\";\nimport { executeInitCommand } from \"./initCommand\";\nimport { createReadlinePrompter, isInteractive } from \"./prompter\";\nimport { CLI_VERSION, PACKAGE_NAME } from \"../../core/version\";\nimport { assertRole, resolveRole, type HarnessRole, type ResolvedRole } from \"../../core/harness/role\";\nimport { askTheUserToFixRole, findRepositoryRole } from \"../../core/harness/repositoryRole\";\n\nexport interface CliIO {\n stdout: NodeJS.WriteStream;\n stderr: NodeJS.WriteStream;\n stdin: NodeJS.ReadStream;\n}\n\nexport async function runAinectoCli(argv: string[], io: CliIO): Promise<number> {\n let parsed: GlobalArgs = { json: argv.includes(\"--json\"), help: false, version: false, positionals: [] };\n try {\n parsed = parseGlobalArgs(argv);\n // ★에이전트는 설치 직후 버전부터 확인한다 — «Unknown command»로 답하면 도움말까지 못 간다(2026-09-29, Codex).\n if (parsed.version || parsed.positionals[0] === \"version\") {\n io.stdout.write(renderSuccess({ version: CLI_VERSION }, { json: parsed.json }));\n return 0;\n }\n if (parsed.help || parsed.positionals.length === 0) {\n io.stdout.write(helpText());\n return 0;\n }\n\n const resolved = resolveEndpoint({ env: parsed.env, endpoint: parsed.endpoint });\n // 플래그·환경변수로 «명시한» 역할. ★auth 는 이것을 읽지 않는다 — 잘못된 AINECTO_ROLE 이 로그인을\n // 막지 않게(0.4.2 리뷰 P2). 저장소 역할과의 판정은 아래 한 곳에서 한다.\n const explicitRole = () => resolveRole({ role: parsed.role });\n const tokenStore = new FileTokenStore();\n /**\n * 인증·RPC 클라이언트. ★토큰은 서버마다 한 칸이고(역할 없음), 역할은 RPC 헤더로만 실린다\n * (설계 0.4.2 §2-3·§2-4). init 은 역할을 «물어서» 정할 수 있으므로 역할이 정해진 뒤 이것을 부른다.\n */\n const connect = (role: HarnessRole | null) => {\n const auth = new OAuthClient({\n endpoint: resolved.endpoint,\n tokenStore,\n // ★init --dry-run 은 토큰을 갱신하지도 않는다 — 「아무것도 바꾸지 않는다」에 로그인 상태도 든다.\n // (init 의 플래그는 positional 로 흘러온다.)\n readOnly: parsed.positionals[0] === \"init\" && parsed.positionals.includes(\"--dry-run\"),\n // ★URL 을 «브라우저를 열기 전에» 알린다. stdout 은 결과 전용이라 stderr 에 쓴다.\n // --json 이면 JSON 한 줄이다(설계 §21-3 (가)). 로그인이 역할과 무관해져 role 칸은 없다(0.4.2 §2-5).\n onAuthorizeUrl: (url) => {\n io.stderr.write(parsed.json\n ? `${JSON.stringify({ event: \"login_url\", url })}\\n`\n : `Opening your browser to sign in to AiNecto. If it does not open, visit:\\n ${url}\\n`);\n },\n });\n const client = new McpRpcClient({ endpoint: resolved.endpoint, tokenProvider: auth, role });\n return { auth, client };\n };\n const [domain, action, ...rest] = parsed.positionals;\n\n if (domain === \"mcp\") {\n await runConnector({\n endpoint: resolved.endpoint,\n // 브리지의 역할은 인자·환경변수에서만 온다 — bin/mcp.ts 와 같은 규칙. 저장소를 적용하지 않는다.\n role: explicitRole().role ?? null,\n input: io.stdin,\n output: io.stdout,\n errorOutput: io.stderr,\n });\n return 0;\n }\n\n if (domain === \"init\") {\n // ⚠init 의 플래그(--role 등)는 전역 파서가 positional 로 흘려보낸다. 그대로 넘긴다.\n return await executeInitCommand({\n argv: parsed.positionals.slice(1),\n role: explicitRole().role,\n connect: (role) => {\n const { auth, client } = connect(role);\n return {\n client,\n // 문서는 인증 후에 받는다 — 토큰이 없으면 패키지 기본값으로 가고, 그 사실을 보고한다.\n // ★«필요할 때» 가져온다. --undo 는 로컬 작업이라 토큰을 건드릴 이유가 없다(S1) — undo 는\n // connect 자체를 부르지 않는다.\n // ★갱신 실패는 «토큰 없음»(→ 로그인)이지만, AINECTO_TOKEN 을 못 쓰는 주소라는 거절은 삼키지 않는다 —\n // 삼키면 그 설정 오류가 브라우저 로그인으로 둔갑한다.\n accessToken: async () => {\n try {\n return await auth.getAccessToken();\n } catch (error) {\n if (process.env.AINECTO_TOKEN) {\n throw error;\n }\n return undefined;\n }\n },\n // 로그인한다 — `ainecto auth login` 과 같은 함수다. 서버마다 한 번이다(0.4.2).\n login: async () => {\n await auth.login();\n },\n };\n },\n // ★대화형일 때만 묻는다(판정은 isInteractive 한 곳). 에이전트·CI 는 TTY 가 아니다.\n prompter: isInteractive(io, parsed.json) ? createReadlinePrompter(io) : undefined,\n endpoint: resolved.endpoint,\n env: resolved.env,\n cliVersion: `${PACKAGE_NAME} ${CLI_VERSION}`,\n cwd: process.cwd(),\n json: parsed.json,\n io,\n });\n }\n\n if (domain === \"auth\") {\n // 로그인은 서버마다 한 번이다 — 역할과 무관하다. 옛 문서를 따라 친 --role 은 알리고 넘어간다.\n if (parsed.role !== undefined) {\n io.stderr.write(\"Sign-in is one per machine; --role is not used by auth.\\n\");\n }\n // ★await 를 빼면 이 try 가 실패를 «못 본다» — 거부 사유가 renderError 를 지나치고\n // 날것의 스택 트레이스로 나간다(2026-09-23 실물 실행에서 발견).\n return await handleAuth(action, connect(null).auth, resolved.endpoint, parsed.json, io);\n }\n\n const env = parsed.env ?? \"prod\";\n // ★카탈로그는 서버의 지금 목록이다. 역할 판정이 실패해도(깨진 저장소) 막지 않고 스냅샷으로 답한다\n // (0.4.2 리뷰 P2 — 깨진 저장소 안에서도 카탈로그를 볼 수 있다).\n if (domain === \"tools\" && action === \"catalog\") {\n return await printCatalog(parsed, io, resolved.endpoint, async () => {\n const explicit = explicitRole();\n return connect(await commandRole(explicit, process.cwd())).client;\n });\n }\n // 스냅샷에 없는 명령은 서버의 지금 목록에서 찾는다 — 서버에 새로 열린 도구를 CLI 재배포 없이 쓴다.\n // ★역할 없이 묻는다: 모르는 명령은 «역할을 못 읽음»이 아니라 «모르는 명령»으로 답해야 한다(0.4.2 리뷰 P2).\n // 역할은 아래 실제 호출에 실리고, 강제는 서버가 한다.\n let routeTools: readonly GeneratedToolDefinition[] = getGeneratedTools(env);\n let remote = isAttachmentsUploadCommand(domain, action)\n || (domain === \"tools\" && (action === \"list\" || action === \"call\"))\n || matchGeneratedCommand(routeTools, parsed.positionals) !== undefined;\n if (!remote) {\n const live = await loadLiveTools(env, connect(null).client).catch(() => undefined);\n if (live && matchGeneratedCommand(live, parsed.positionals)) {\n routeTools = live;\n remote = true;\n }\n }\n if (!remote) {\n throw new Error(domain === \"tools\"\n ? \"Expected tools list, tools call <mcpName>, or tools catalog.\"\n : `Unknown command \"${domain}\".`);\n }\n\n // ★여기부터 원격을 부르는 명령은 «저장소 역할»로 간다(설계 0.4.2 §2-2). mcp·init·auth 는 위에서\n // 끝났다 — 역할이 어긋난 저장소 안에서도 로그인·브리지·init 은 막히지 않는다.\n const explicit = explicitRole();\n const { client } = connect(await commandRole(explicit, process.cwd()));\n\n if (isAttachmentsUploadCommand(domain, action)) {\n return await executeAttachmentsUploadCommand({\n argv: rest,\n client,\n json: parsed.json,\n io,\n });\n }\n\n const generatedResult = await executeGeneratedCommand({\n tools: routeTools,\n argv: parsed.positionals,\n client,\n json: parsed.json,\n io,\n });\n if (generatedResult !== 2) {\n return generatedResult;\n }\n\n if (domain === \"tools\") {\n // ★위와 같은 이유로 await 가 필요하다. 이쪽이 실제로 스택을 뱉고 있었다.\n return await handleTools(action, rest, parsed, client, io);\n }\n\n throw new Error(`Unknown command \"${domain}\".`);\n } catch (error) {\n io.stderr.write(renderError(error, { json: parsed.json }));\n return 1;\n }\n}\n\n/**\n * ★셸 명령의 역할 — 한 곳(설계 0.4.2 §2-2).\n *\n * <p>저장소(cwd 에서 위로, 우리 브리지 항목이 있는 첫 폴더)에 역할 R 이 있으면 R 로 간다. 명시한 역할이 R 과\n * 다르면 거절한다 — 역할을 바꾸는 길은 `ainecto init --role` 하나이고 사용자가 고른다. 저장소를 못\n * 읽으면(어긋남·읽기 문제) 멈추고 사용자에게 물으라고 한다 — 모르는 채로 «제한 없음»으로 가지 않는다.\n * 저장소 밖이면 명시한 역할(없으면 역할 없음 = 제한 없음, 현행).\n */\nexport async function commandRole(explicit: ResolvedRole, cwd: string): Promise<HarnessRole | null> {\n const explicitRole = explicit.role ?? null;\n const found = await findRepositoryRole(cwd);\n if (found.kind === \"conflict\") {\n throw new Error(await askTheUserToFixRole(found.dir, found.reason));\n }\n if (found.kind === \"none\") {\n return explicitRole;\n }\n if (explicitRole !== null && explicitRole !== found.role) {\n // 사용자가 실제로 둔 이름으로 말한다 — AINECTO_ROLE 인지 옛 AI_ERD_ROLE 인지.\n const given = explicit.source === \"env\" ? `${explicit.envVar}=${explicitRole}` : `--role ${explicitRole}`;\n throw new Error(\n `This repository's AI sessions have the role ${found.role} (set in ${found.dir}). `\n + `${given} does not match — the role changes only with \\`ainecto init --role <role>\\`, after asking the user.`,\n );\n }\n return found.role;\n}\n\nasync function handleAuth(\n action: string | undefined,\n auth: OAuthClient,\n endpoint: string,\n json: boolean,\n io: CliIO,\n): Promise<number> {\n if (action === \"login\") {\n await auth.login();\n io.stdout.write(renderSuccess({ ...await nextStep(), endpoint, authenticated: true }, { json }));\n return 0;\n }\n if (action === \"status\") {\n const token = await auth.getAccessToken();\n io.stdout.write(renderSuccess({ ...await nextStep(), endpoint, authenticated: Boolean(token) }, { json }));\n return 0;\n }\n if (action === \"logout\") {\n await auth.logout();\n io.stdout.write(renderSuccess({ endpoint, authenticated: false }, { json }));\n return 0;\n }\n throw new Error(\"Expected auth login, auth status, or auth logout.\");\n}\n\n/**\n * `tools catalog` — ★서버의 지금 목록을 먼저 보여 준다. 스냅샷만 보여 주면 서버에 열린 새 문서 유형(html)을\n * 에이전트가 «CLI 에 없다»고 읽었다(2026-10-10). 못 받으면(로그인 전·오프라인·깨진 저장소) 스냅샷으로\n * 답하되 «낡았을 수 있다»와 그 이유를 같이 싣는다 — 조용히 대체하지 않는다.\n */\nasync function printCatalog(\n parsed: GlobalArgs,\n io: CliIO,\n endpoint: string,\n liveClient: () => Promise<McpRpcClient>,\n): Promise<number> {\n const catalogEnv = parsed.env ?? \"prod\";\n try {\n const tools = await loadLiveTools(catalogEnv, await liveClient());\n io.stdout.write(renderSuccess(tools, { json: parsed.json }));\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n io.stdout.write(renderSuccess(getGeneratedTools(catalogEnv), {\n json: parsed.json,\n warnings: [`Could not read the live tool list from ${endpoint} (${reason}). `\n + `Showing the ${catalogEnv} catalog checked in when this CLI version was built — a snapshot of that `\n + \"server's tools/list that may miss newer document types and tools. Run `ainecto auth login`, then retry.\"],\n }));\n }\n return 0;\n}\n\nasync function handleTools(\n action: string | undefined,\n rest: string[],\n parsed: GlobalArgs,\n client: McpRpcClient,\n io: CliIO,\n): Promise<number> {\n if (action === \"list\") {\n const tools = await client.toolsList();\n io.stdout.write(renderSuccess(tools, { json: parsed.json }));\n return 0;\n }\n\n if (action === \"call\") {\n const toolName = rest[0];\n if (!toolName) {\n throw new Error(\"Expected MCP tool name after tools call.\");\n }\n const toolArgs = rest.slice(1);\n const payloadOptions = parsePayloadArgs(toolArgs);\n const payload = await parsePayloadSource({\n file: payloadOptions.file,\n inline: payloadOptions.inline,\n stdin: io.stdin,\n });\n const result = await client.toolsCall(toolName, payload.value);\n io.stdout.write(renderSuccess(result, { json: parsed.json, warnings: payload.warnings }));\n // 거부 문구는 그대로 보여 주되, 종료 코드로는 «실패»라고 말한다.\n return isToolError(result) ? 1 : 0;\n }\n\n throw new Error(\"Expected tools list, tools call <mcpName>, or tools catalog.\");\n}\n\ninterface GlobalArgs {\n env?: AinectoEnv;\n endpoint?: string;\n role?: HarnessRole;\n json: boolean;\n help: boolean;\n version: boolean;\n positionals: string[];\n}\n\nfunction parseGlobalArgs(argv: string[]): GlobalArgs {\n const result: GlobalArgs = { json: false, help: false, version: false, positionals: [] };\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (!arg) {\n continue;\n }\n if (arg === \"--env\") {\n result.env = assertEnv(requireValue(arg, argv[++index]));\n } else if (arg === \"--endpoint\") {\n result.endpoint = requireValue(arg, argv[++index]);\n } else if (arg === \"--role\") {\n // ★전역 플래그다. 브리지·도구 호출·로그인·init 이 모두 같은 역할을 본다.\n result.role = assertRole(requireValue(arg, argv[++index]));\n } else if (arg === \"--json\") {\n result.json = true;\n } else if (arg === \"--help\" || arg === \"-h\") {\n result.help = true;\n } else if (arg === \"--version\" || arg === \"-v\" || arg === \"-V\") {\n result.version = true;\n } else {\n result.positionals.push(arg);\n }\n }\n return result;\n}\n\nfunction parsePayloadArgs(argv: string[]): { file?: string; inline?: string } {\n const result: { file?: string; inline?: string } = {};\n const inline: string[] = [];\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (!arg) {\n continue;\n }\n if (arg === \"--file\" || arg === \"-f\") {\n result.file = requireValue(arg, argv[++index]);\n } else {\n inline.push(arg);\n }\n }\n if (inline.length > 0) {\n result.inline = inline.join(\" \");\n }\n return result;\n}\n\nfunction requireValue(flag: string, value: string | undefined): string {\n if (!value || value.startsWith(\"--\")) {\n throw new Error(`${flag} requires a value.`);\n }\n return value;\n}\n\n/**\n * ★로그인은 설치의 끝이 아니다. 에이전트가 `auth status --json` 의 authenticated:true 를 보고 «설치 완료»로\n * 닫은 실측(2026-09-29, Codex)이 있다. 이 저장소에 역할이 없으면 결과에 다음 단계를 싣는다 — --json 에도.\n */\nasync function nextStep(): Promise<{ setup?: \"incomplete\"; next?: string }> {\n const found = await findRepositoryRole(process.cwd());\n return found.kind === \"none\" ? { setup: \"incomplete\", next: NEXT_STEP_INIT } : {};\n}\n\n/** 설치·로그인 뒤 «다음에 할 일». 도움말과 auth 결과가 같은 문장을 쓴다. */\n// ★«참고»로 읽히면 넘긴다 — Codex 가 `next` 를 받고도 «업데이트 완료»만 말했다(2026-09-30 실측).\n// 그래서 «사용자가 설치·업데이트·로그인만 부탁했어도 지금 알려라»를 지시문으로 적는다.\nconst NEXT_STEP_INIT = [\n \"AiNecto setup is not finished until `npx -y ainecto@latest init` runs in the repository.\",\n \"AI agents: tell the user this now, even if they only asked to install, update, or sign in. Then ask\",\n \"which role this repository's AI sessions should have — Design, Development, Test, or Validation —\",\n \"never pick one yourself, and run `npx -y ainecto@latest init --role <role>` from the repository root.\",\n \"In a terminal: `npx -y ainecto@latest init` asks for the role and the project.\",\n].join(\"\\n\");\n\nfunction helpText(): string {\n return [\n \"AiNecto CLI\",\n \"\",\n NEXT_STEP_INIT,\n \"\",\n \"Usage:\",\n \" ainecto auth login|status|logout [--env prod|dev] [--json] (one sign-in per machine)\",\n \" ainecto tools list [--env prod|dev] [--endpoint URL] [--json]\",\n \" ainecto tools call <mcpName> [-f payload.json|@-] [inline-json] [--json]\",\n \" ainecto attachments upload --document-uuid <uuid> <file...> [--json]\",\n \" ainecto <generated-command> [flags] [-f payload.json] [--yes] [--json]\",\n \" ainecto mcp [--env prod|dev] [--endpoint URL] [--role design|development|test|validation]\",\n \"\",\n \"Harness:\",\n \" ainecto init [--role <design|development|test|validation>] [--project <uuid>] [--dry-run]\",\n \" In a terminal, asks for the role and project when they are not given.\",\n \" ainecto init --undo\",\n \"\",\n \"`ai-erd` (the older name) is the same command and still works.\",\n \"\",\n ].join(\"\\n\");\n}\n","#!/usr/bin/env node\nimport { runAinectoCli } from \"../adapters/cli/ainectoCli\";\n\nconst exitCode = await runAinectoCli(process.argv.slice(2), {\n stdin: process.stdin,\n stdout: process.stdout,\n stderr: process.stderr,\n});\n\nprocess.exitCode = exitCode;\n"],"mappings":";;;AAAA,SAAS,kBAAkB;AAC3B,SAAS,OAAO,UAAU,QAAQ,IAAI,MAAM,WAAW,aAAa;AACpE,SAAS,eAAe;AACxB,SAAS,SAAS,YAAY;;;ACsBvB,IAAM,gBAAgB,CAAC,UAAU,eAAe,QAAQ,YAAY;AAWpE,IAAM,oBAAoB;AAM1B,IAAM,cAAc;AAGpB,IAAM,eAAe;AAOrB,IAAM,sBAAsB;AAc5B,SAAS,YAAY,QAA6B,CAAC,GAAiB;AACzE,MAAI,MAAM,SAAS,QAAW;AAC5B,WAAO,EAAE,MAAM,WAAW,MAAM,IAAI,GAAG,QAAQ,OAAO;AAAA,EACxD;AACA,QAAM,UAAU,MAAM,WAAW,QAAQ;AACzC,aAAW,UAAU,CAAC,cAAc,mBAAmB,GAAG;AACxD,UAAM,UAAU,QAAQ,MAAM;AAC9B,QAAI,WAAW,QAAQ,KAAK,GAAG;AAC7B,aAAO,EAAE,MAAM,WAAW,OAAO,GAAG,QAAQ,OAAO,OAAO;AAAA,IAC5D;AAAA,EACF;AACA,SAAO,EAAE,QAAQ,OAAO;AAC1B;AAOO,SAAS,WAAW,OAA4B;AACrD,QAAM,aAAa,MAAM,KAAK,EAAE,YAAY;AAC5C,MAAK,cAAoC,SAAS,UAAU,GAAG;AAC7D,WAAO;AAAA,EACT;AACA,QAAM,IAAI;AAAA,IACR,iBAAiB,KAAK,uBAAuB,cAAc,KAAK,IAAI,CAAC;AAAA,EACvE;AACF;;;AD5DO,IAAM,iBAAN,MAA2C;AAAA,EACvC;AAAA,EAET,YAAY,UAAU,KAAK,QAAQ,GAAG,UAAU,GAAG;AACjD,SAAK,WAAW,KAAK,SAAS,aAAa;AAAA,EAC7C;AAAA,EAEA,MAAM,KAAK,UAAuD;AAChE,UAAM,OAAO,MAAM,KAAK,SAAS;AACjC,WAAO,KAAK,SAAS,QAAQ,CAAC;AAAA,EAChC;AAAA,EAEA,MAAM,KAAK,UAAkB,OAAsC;AACjE,sBAAkB,KAAK;AACvB,UAAM,OAAO,MAAM,KAAK,SAAS;AACjC,SAAK,SAAS,QAAQ,CAAC,IAAI,EAAE,GAAG,OAAO,UAAU,YAAW,oBAAI,KAAK,GAAE,YAAY,EAAE;AACrF,UAAM,KAAK,UAAU,IAAI;AAAA,EAC3B;AAAA,EAEA,MAAM,OAAO,UAAiC;AAC5C,UAAM,OAAO,MAAM,KAAK,SAAS;AACjC,WAAO,KAAK,SAAS,QAAQ,CAAC;AAC9B,UAAM,KAAK,UAAU,IAAI;AAAA,EAC3B;AAAA,EAEA,MAAc,WAA+B;AAC3C,QAAI;AACF,YAAM,KAAK,0BAA0B;AACrC,YAAM,MAAM,MAAM,SAAS,KAAK,UAAU,MAAM;AAChD,YAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,UAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG;AAClE,cAAM,IAAI,MAAM,oCAAoC;AAAA,MACtD;AACA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,YAAY,OAAO,QAAQ,GAAG;AAChC,eAAO,CAAC;AAAA,MACV;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAc,UAAU,MAAgC;AACtD,UAAM,MAAM,QAAQ,KAAK,QAAQ,GAAG,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AACpE,UAAM,MAAM,QAAQ,KAAK,QAAQ,GAAG,GAAK;AACzC,UAAM,UAAU,GAAG,KAAK,QAAQ,IAAI,QAAQ,GAAG,IAAI,KAAK,IAAI,CAAC;AAC7D,UAAM,UAAU,SAAS,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,GAAM,EAAE,MAAM,IAAM,CAAC;AAC9E,UAAM,MAAM,SAAS,GAAK;AAC1B,UAAM,OAAO,SAAS,KAAK,QAAQ;AACnC,UAAM,MAAM,KAAK,UAAU,GAAK;AAAA,EAClC;AAAA,EAEA,MAAc,4BAA2C;AACvD,UAAM,UAAU,QAAQ,KAAK,QAAQ;AACrC,UAAM,kBAAkB,SAAS,GAAK;AACtC,UAAM,kBAAkB,KAAK,UAAU,GAAK;AAAA,EAC9C;AACF;AAGO,SAAS,SAAS,UAA0B;AACjD,SAAO,WAAW,QAAQ,EAAE,OAAO,QAAQ,EAAE,OAAO,KAAK;AAC3D;AASO,SAAS,kBAAkB,OAA4C;AAC5E,MAAI,MAAM,OAAO,MAAM,KAAK,EAAE,KAAK,CAAC,UAAU,MAAM,WAAW,iBAAiB,CAAC,GAAG;AAClF,UAAM,IAAI;AAAA,MACR;AAAA,IAEF;AAAA,EACF;AACF;AAsBA,SAAS,YAAY,OAAgB,MAA8C;AACjF,SAAO,iBAAiB,SAAS,UAAU,SAAS,MAAM,SAAS;AACrE;AAEA,eAAe,kBAAkB,MAAc,MAA6B;AAC1E,MAAI;AACF,UAAM,SAAS,MAAM,KAAK,IAAI;AAC9B,SAAK,OAAO,OAAO,QAAW,GAAG;AAC/B,YAAM,MAAM,MAAM,IAAI;AAAA,IACxB;AAAA,EACF,SAAS,OAAO;AACd,QAAI,YAAY,OAAO,QAAQ,GAAG;AAChC;AAAA,IACF;AACA,UAAM;AAAA,EACR;AACF;;;AErJA,SAAS,cAAAA,aAAY,mBAAmB;AACxC,SAAS,oBAAoB;AAC7B,SAAS,aAAmD;AAC5D,SAAS,uBAAuB;;;ACoBhC,IAAM,oBAAgD;AAAA,EACpD,MAAM;AAAA,EACN,KAAK;AACP;AAMA,IAAM,uBAAuB;AAC7B,IAAM,2BAA8C;AAAA,EAClD;AAAA,EACA;AACF;AAYA,IAAM,uBAAoE;AAAA,EACxE,CAAC,kBAAkB,IAAI,GAAG,CAAC,oBAAoB;AACjD;AAEO,SAAS,0BAA0B,UAAqC;AAC7E,SAAO,qBAAqB,kBAAkB,QAAQ,CAAC,KAAK,CAAC;AAC/D;AAEO,SAAS,gBAAgB,QAAiC,CAAC,GAAqB;AACrF,QAAM,UAAU,MAAM,WAAW,QAAQ;AACzC,QAAM,MAAM,MAAM,OAAO;AAEzB,MAAI,MAAM,UAAU;AAClB,WAAO,EAAE,KAAK,UAAU,kBAAkB,MAAM,QAAQ,GAAG,QAAQ,OAAO;AAAA,EAC5E;AAEA,MAAI,QAAQ,sBAAsB;AAChC,WAAO,EAAE,KAAK,UAAU,kBAAkB,QAAQ,oBAAoB,GAAG,QAAQ,MAAM;AAAA,EACzF;AAEA,SAAO,EAAE,KAAK,UAAU,kBAAkB,GAAG,GAAG,QAAQ,UAAU;AACpE;AAEO,SAAS,kBAAkB,UAA0B;AAC1D,QAAM,MAAM,IAAI,IAAI,QAAQ;AAC5B,2BAAyB,KAAK,cAAc;AAC5C,MAAI,OAAO;AACX,SAAO,IAAI,SAAS,EAAE,QAAQ,OAAO,EAAE;AACzC;AAUO,SAAS,qBAAqB,KAAiB,UAA2B;AAC/E,SAAO,kBAAkB,QAAQ,MAAM,kBAAkB,GAAG;AAC9D;AAEO,SAAS,kBAAkB,UAA2B;AAC3D,QAAM,aAAa,kBAAkB,QAAQ;AAC7C,SAAO,OAAO,OAAO,iBAAiB,EAAE,SAAS,UAAU,KACtD,yBAAyB,SAAS,UAAU;AACnD;AAEO,SAAS,yBAAyB,OAAqB,QAAQ,OAAa;AACjF,QAAM,MAAM,OAAO,UAAU,WAAW,IAAI,IAAI,KAAK,IAAI;AACzD,MAAI,IAAI,aAAa,UAAU;AAC7B;AAAA,EACF;AACA,MAAI,IAAI,aAAa,WAAW,mBAAmB,IAAI,QAAQ,GAAG;AAChE;AAAA,EACF;AACA,QAAM,IAAI,MAAM,GAAG,KAAK,2EAA2E;AACrG;AAEO,SAAS,0BAA0B,OAAqB;AAC7D,QAAM,MAAM,IAAI,IAAI,KAAK;AACzB,MAAI,IAAI,aAAa,WAAW,mBAAmB,IAAI,QAAQ,GAAG;AAChE;AAAA,EACF;AACA,QAAM,IAAI,MAAM,4DAA4D;AAC9E;AAEA,SAAS,mBAAmB,UAA2B;AACrD,SAAO,aAAa,eACf,aAAa,eACb,aAAa,SACb,aAAa;AACpB;AAEO,SAAS,UAAU,OAAmD;AAC3E,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AACA,MAAI,UAAU,UAAU,UAAU,OAAO;AACvC,WAAO;AAAA,EACT;AACA,QAAM,IAAI,MAAM,wBAAwB,KAAK,8BAA8B;AAC7E;;;AC3HA,eAAsB,qBACpB,sBACA,aACA,YAA0B,OACS;AACnC,2BAAyB,sBAAsB,oCAAoC;AACnF,4BAA0B,WAAW;AACrC,QAAM,WAAW,MAAM,UAAU,sBAAsB;AAAA,IACrD,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,oBAAoB,QAAQ,mBAAmB;AAAA,IAC1E,MAAM,KAAK,UAAU;AAAA,MACnB,aAAa;AAAA,MACb,eAAe,CAAC,WAAW;AAAA,MAC3B,4BAA4B;AAAA,MAC5B,aAAa,CAAC,sBAAsB,eAAe;AAAA,MACnD,gBAAgB,CAAC,MAAM;AAAA,IACzB,CAAC;AAAA,EACH,CAAC;AACD,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,8CAA8C,SAAS,MAAM,GAAG;AAAA,EAClF;AACA,QAAM,OAAO,MAAM,SAAS,KAAK;AACjC,MAAI,CAAC,SAAS,IAAI,KAAK,OAAO,KAAK,cAAc,UAAU;AACzD,UAAM,IAAI,MAAM,+DAA+D;AAAA,EACjF;AACA,SAAO;AAAA,IACL,UAAU,KAAK;AAAA,IACf,cAAc,OAAO,KAAK,kBAAkB,WAAW,KAAK,gBAAgB;AAAA,EAC9E;AACF;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;;;AFDO,IAAM,2BAA2B;AAMjC,IAAM,kBAAN,cAA8B,MAAM;AAAA,EACzC,YAAqB,MAAwE,SAAiB;AAC5G,UAAM,OAAO;AADM;AAEnB,SAAK,OAAO;AAAA,EACd;AAAA,EAHqB;AAIvB;AAeO,IAAM,cAAN,MAA2C;AAAA,EAKhD,YAA6B,SAA6B;AAA7B;AAC3B,SAAK,YAAY,QAAQ,aAAa;AACtC,SAAK,UAAU,QAAQ,WAAW,QAAQ;AAC1C,SAAK,kBAAkB,QAAQ,eAAe;AAAA,EAChD;AAAA,EAJ6B;AAAA,EAJZ;AAAA,EACA;AAAA,EACA;AAAA,EAQjB,MAAM,iBAA8C;AAClD,UAAM,WAAW,KAAK,QAAQ;AAC9B,QAAI,UAAU;AACZ,oCAA8B,KAAK,QAAQ,UAAU,KAAK,OAAO;AACjE,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,MAAM,KAAK,WAAW;AACrC,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,cAAc,MAAM,GAAG;AAC1B,aAAO,OAAO;AAAA,IAChB;AACA,QAAI,KAAK,QAAQ,UAAU;AACzB,aAAO,UAAU,MAAM,IAAI,SAAY,OAAO;AAAA,IAChD;AAIA,QAAI,CAAC,OAAO,cAAc;AACxB,aAAO,UAAU,MAAM,IAAI,SAAY,OAAO;AAAA,IAChD;AAEA,WAAO,KAAK,mBAAmB,EAAE,GAAG,QAAQ,cAAc,OAAO,aAAa,CAAC;AAAA,EACjF;AAAA,EAEA,MAAM,2BAAwD;AAC5D,UAAM,SAAS,MAAM,KAAK,WAAW;AACrC,QAAI,KAAK,QAAQ,YAAY,CAAC,QAAQ,cAAc;AAClD,aAAO;AAAA,IACT;AACA,WAAO,KAAK,mBAAmB,EAAE,GAAG,QAAQ,cAAc,OAAO,aAAa,CAAC;AAAA,EACjF;AAAA,EAEA,MAAM,QAAiC;AACrC,UAAM,OAAO,iBAAiB;AAC9B,UAAM,QAAQ,mBAAmB;AACjC,UAAM,WAAW,MAAM,uBAAuB,KAAK;AAEnD,QAAI;AACF,YAAM,WAAW,MAAM,sBAAsB,KAAK,QAAQ,UAAU,KAAK,SAAS;AAClF,YAAM,eAAe,SAAS,uBAC1B,MAAM,qBAAqB,SAAS,sBAAsB,SAAS,aAAa,KAAK,SAAS,IAC9F,EAAE,UAAU,cAAc;AAC9B,YAAM,eAAe,IAAI,IAAI,SAAS,qBAAqB;AAC3D,mBAAa,aAAa,IAAI,iBAAiB,MAAM;AACrD,mBAAa,aAAa,IAAI,aAAa,aAAa,QAAQ;AAChE,mBAAa,aAAa,IAAI,gBAAgB,SAAS,WAAW;AAClE,mBAAa,aAAa,IAAI,kBAAkB,KAAK,aAAa;AAClE,mBAAa,aAAa,IAAI,yBAAyB,MAAM;AAC7D,mBAAa,aAAa,IAAI,YAAY,KAAK,QAAQ,QAAQ;AAC/D,mBAAa,aAAa,IAAI,SAAS,KAAK;AAI5C,+BAAyB,cAAc,yBAAyB;AAChE,YAAM,MAAM,aAAa,SAAS;AAClC,WAAK,QAAQ,iBAAiB,GAAG;AAIjC,YAAM,iBAAiB,KAAK,gBAAgB,GAAG,EAAE,KAAK,MAAM,IAAI,QAAe,MAAM,MAAS,CAAC;AAC/F,YAAM,OAAO,MAAM;AAAA,QACjB,QAAQ,KAAK,CAAC,SAAS,YAAY,GAAG,cAAc,CAAC;AAAA,QACrD,KAAK,QAAQ,kBAAkB;AAAA,MACjC;AACA,YAAM,QAAQ,MAAM,cAAc,SAAS,eAAe;AAAA,QACxD,YAAY;AAAA,QACZ;AAAA,QACA,cAAc,SAAS;AAAA,QACvB,WAAW,aAAa;AAAA,QACxB,eAAe,KAAK;AAAA,QACpB,UAAU,KAAK,QAAQ;AAAA,QACvB,GAAI,aAAa,eAAe,EAAE,eAAe,aAAa,aAAa,IAAI,CAAC;AAAA,MAClF,GAAG,KAAK,SAAS;AAEjB,YAAM,SAAS,cAAc,KAAK,QAAQ,UAAU,OAAO,UAAU,YAAY;AACjF,YAAM,KAAK,QAAQ,WAAW,KAAK,KAAK,QAAQ,UAAU,MAAM;AAChE,aAAO;AAAA,IACT,UAAE;AACA,YAAM,SAAS,MAAM;AAAA,IACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,SAAwB;AAC5B,UAAM,KAAK,QAAQ,WAAW,OAAO,KAAK,QAAQ,QAAQ;AAC1D,eAAW,YAAY,0BAA0B,KAAK,QAAQ,QAAQ,GAAG;AACvE,YAAM,KAAK,QAAQ,WAAW,OAAO,QAAQ;AAAA,IAC/C;AAAA,EACF;AAAA;AAAA,EAGA,MAAc,aAAkD;AAC9D,UAAM,MAAM,MAAM,KAAK,QAAQ,WAAW,KAAK,KAAK,QAAQ,QAAQ;AACpE,QAAI,KAAK;AACP,aAAO;AAAA,IACT;AACA,eAAW,YAAY,0BAA0B,KAAK,QAAQ,QAAQ,GAAG;AACvE,YAAM,SAAS,MAAM,KAAK,QAAQ,WAAW,KAAK,QAAQ;AAC1D,UAAI,QAAQ;AACV,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAc,mBAAmB,QAAgF;AAC/G,UAAM,WAAW,MAAM,sBAAsB,KAAK,QAAQ,UAAU,KAAK,SAAS;AAClF,UAAM,QAAQ,MAAM,cAAc,SAAS,eAAe;AAAA,MACxD,YAAY;AAAA,MACZ,eAAe,OAAO;AAAA,MACtB,WAAW,OAAO,YAAY;AAAA,MAC9B,GAAI,OAAO,eAAe,EAAE,eAAe,OAAO,aAAa,IAAI,CAAC;AAAA,MACpE,UAAU,KAAK,QAAQ;AAAA,IACzB,GAAG,KAAK,SAAS;AACjB,UAAM,OAAO,cAAc,KAAK,QAAQ,UAAU,OAAO,UAAU,MAAM;AACzE,UAAM,KAAK,QAAQ,WAAW,KAAK,KAAK,QAAQ,UAAU,IAAI;AAC9D,WAAO,KAAK;AAAA,EACd;AACF;AAEO,SAAS,mBAAoE;AAClF,QAAM,eAAe,YAAY,EAAE,EAAE,SAAS,WAAW;AACzD,QAAM,gBAAgBC,YAAW,QAAQ,EAAE,OAAO,YAAY,EAAE,OAAO,WAAW;AAClF,SAAO,EAAE,cAAc,cAAc;AACvC;AAEO,SAAS,qBAA6B;AAC3C,SAAO,YAAY,EAAE,EAAE,SAAS,WAAW;AAC7C;AAGO,SAAS,UAAU,OAA0C,MAAM,KAAK,IAAI,GAAY;AAC7F,SAAO,MAAM,cAAc,UAAa,MAAM,aAAa;AAC7D;AAEA,eAAe,YAAe,MAAkB,WAA+B;AAC7E,MAAI;AACJ,QAAM,UAAU,IAAI,QAAe,CAAC,GAAG,WAAW;AAChD,YAAQ,WAAW,MAAM;AACvB,YAAM,UAAU,YAAY;AAC5B,YAAM,OAAO,OAAO,UAAU,OAAO,IAAI,GAAG,OAAO,UAAU,YAAY,IAAI,KAAK,GAAG,KAAK,GAAG,SAAS;AACtG,aAAO,IAAI;AAAA,QACT;AAAA,QACA,oCAAoC,IAAI;AAAA,MAC1C,CAAC;AAAA,IACH,GAAG,SAAS;AAAA,EACd,CAAC;AACD,MAAI;AACF,WAAO,MAAM,QAAQ,KAAK,CAAC,MAAM,OAAO,CAAC;AAAA,EAC3C,UAAE;AACA,iBAAa,KAAK;AAAA,EACpB;AACF;AAEO,SAAS,cAAc,OAA0C,MAAM,KAAK,IAAI,GAAY;AACjG,MAAI,CAAC,MAAM,WAAW;AACpB,WAAO;AAAA,EACT;AACA,SAAO,MAAM,YAAY,MAAM;AACjC;AAEA,eAAsB,sBAAsB,UAAkB,YAA0B,OAA+B;AACrH,2BAAyB,UAAU,cAAc;AACjD,QAAM,sBAAsB,MAAM,4BAA4B,UAAU,SAAS;AACjF,2BAAyB,qBAAqB,uCAAuC;AACrF,QAAM,mBAAmB,MAAM,UAAmC,qBAAqB,SAAS;AAChG,QAAM,uBAAuB,iBAAiB;AAC9C,MAAI,CAAC,MAAM,QAAQ,oBAAoB,KAAK,OAAO,qBAAqB,CAAC,MAAM,UAAU;AACvF,UAAM,IAAI,MAAM,0EAA0E;AAAA,EAC5F;AACA,QAAM,aAAa,qBAAqB,CAAC;AACzC,2BAAyB,YAAY,4BAA4B;AACjE,QAAM,cAAc,WAAW,SAAS,eAAe,IACnD,aACA,GAAG,WAAW,QAAQ,OAAO,EAAE,CAAC;AACpC,2BAAyB,aAAa,yCAAyC;AAC/E,QAAM,WAAW,MAAM,UAAmC,aAAa,SAAS;AAChF,MAAI,OAAO,SAAS,2BAA2B,YAAY,OAAO,SAAS,mBAAmB,UAAU;AACtG,UAAM,IAAI,MAAM,0FAA0F;AAAA,EAC5G;AACA,2BAAyB,SAAS,wBAAwB,8BAA8B;AACxF,2BAAyB,SAAS,gBAAgB,sBAAsB;AACxE,MAAI,OAAO,SAAS,0BAA0B,UAAU;AACtD,6BAAyB,SAAS,uBAAuB,oCAAoC;AAAA,EAC/F;AACA,MAAI,OAAO,SAAS,WAAW,UAAU;AACvC,6BAAyB,SAAS,QAAQ,cAAc;AAAA,EAC1D;AACA,QAAM,gCAAgC,iBAAiB,SAAS,gCAAgC;AAChG,MAAI,CAAC,8BAA8B,SAAS,MAAM,GAAG;AACnD,UAAM,IAAI,MAAM,6DAA6D;AAAA,EAC/E;AACA,SAAO;AAAA,IACL,uBAAuB,SAAS;AAAA,IAChC,eAAe,SAAS;AAAA,IACxB,sBAAsB,OAAO,SAAS,0BAA0B,WAAW,SAAS,wBAAwB;AAAA,IAC5G,QAAQ,OAAO,SAAS,WAAW,WAAW,SAAS,SAAS;AAAA,IAChE;AAAA,EACF;AACF;AAEA,eAAe,4BAA4B,UAAkB,WAA0C;AACrG,QAAM,eAAe,IAAI,IAAI,QAAQ;AACrC,2BAAyB,cAAc,cAAc;AACrD,QAAM,WAAW,MAAM,UAAU,cAAc,EAAE,QAAQ,MAAM,CAAC;AAChE,QAAM,YAAY,SAAS,QAAQ,IAAI,kBAAkB;AACzD,QAAM,gBAAgB,YAAY,0BAA0B,WAAW,mBAAmB,IAAI;AAC9F,MAAI,eAAe;AACjB,6BAAyB,eAAe,uCAAuC;AAC/E,WAAO;AAAA,EACT;AACA,QAAM,SAAS,IAAI,IAAI,QAAQ,EAAE;AACjC,QAAM,WAAW,GAAG,MAAM;AAC1B,2BAAyB,UAAU,uCAAuC;AAC1E,SAAO;AACT;AAEO,SAAS,0BAA0B,QAAgB,MAAkC;AAC1F,QAAM,UAAU,IAAI,OAAO,GAAG,IAAI,YAAY;AAC9C,SAAO,QAAQ,KAAK,MAAM,IAAI,CAAC;AACjC;AAEA,eAAe,cACb,eACA,QACA,WACkC;AAClC,2BAAyB,eAAe,sBAAsB;AAC9D,QAAM,WAAW,MAAM,UAAU,eAAe;AAAA,IAC9C,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,oCAAoC;AAAA,IAC/D,MAAM,IAAI,gBAAgB,MAAM;AAAA,EAClC,CAAC;AACD,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,yCAAyC,SAAS,MAAM,GAAG;AAAA,EAC7E;AACA,SAAO,SAAS,KAAK;AACvB;AAKA,SAAS,cACP,UACA,OACA,UACA,UACgB;AAChB,MAAI,OAAO,MAAM,iBAAiB,UAAU;AAC1C,UAAM,IAAI,MAAM,oDAAoD;AAAA,EACtE;AACA,QAAM,YAAY,OAAO,MAAM,eAAe,WAAW,MAAM,aAAa;AAC5E,SAAO;AAAA,IACL;AAAA,IACA,aAAa,MAAM;AAAA,IACnB,cAAc,OAAO,MAAM,kBAAkB,WAAW,MAAM,gBAAgB,UAAU;AAAA,IACxF,WAAW,OAAO,MAAM,eAAe,WAAW,MAAM,aAAa,UAAU;AAAA,IAC/E,WAAW,YAAY,KAAK,IAAI,IAAI,YAAY,MAAO,UAAU;AAAA,IACjE,OAAO,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ,UAAU;AAAA,IACjE,UAAU,UAAU,YAAY;AAAA,IAChC,cAAc,UAAU;AAAA,IACxB,qBAAqB,SAAS;AAAA,IAC9B,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AACF;AAKA,eAAsB,uBAAuB,eAAuB,OAAO,aAIxE;AACD,MAAI;AACJ,MAAI;AACJ,QAAM,cAAc,IAAI,QAAgB,CAACC,UAAS,WAAW;AAC3D,kBAAcA;AACd,iBAAa;AAAA,EACf,CAAC;AACD,cAAY,MAAM,MAAM,MAAS;AAEjC,QAAM,SAAS,aAAa,CAAC,KAAK,QAAQ;AACxC,UAAM,MAAM,IAAI,IAAI,IAAI,OAAO,KAAK,kBAAkB;AACtD,UAAM,QAAQ,IAAI,aAAa,IAAI,OAAO;AAC1C,UAAM,OAAO,IAAI,aAAa,IAAI,MAAM;AACxC,UAAM,QAAQ,IAAI,aAAa,IAAI,OAAO;AAC1C,QAAI,OAAO;AACT,UAAI,UAAU,KAAK,EAAE,gBAAgB,aAAa,CAAC;AACnD,UAAI,IAAI,2DAA2D;AACnE,iBAAW,IAAI,MAAM,+BAA+B,KAAK,EAAE,CAAC;AAC5D;AAAA,IACF;AACA,QAAI,CAAC,SAAS,UAAU,eAAe;AACrC,UAAI,UAAU,KAAK,EAAE,gBAAgB,aAAa,CAAC;AACnD,UAAI,IAAI,mEAAmE;AAC3E,iBAAW,IAAI,MAAM,uBAAuB,CAAC;AAC7C;AAAA,IACF;AACA,QAAI,CAAC,MAAM;AACT,UAAI,UAAU,KAAK,EAAE,gBAAgB,aAAa,CAAC;AACnD,UAAI,IAAI,qBAAqB;AAC7B,iBAAW,IAAI,MAAM,wCAAwC,CAAC;AAC9D;AAAA,IACF;AACA,QAAI,UAAU,KAAK,EAAE,gBAAgB,aAAa,CAAC;AACnD,QAAI,IAAI,6DAA6D;AACrE,gBAAY,IAAI;AAAA,EAClB,CAAC;AAID,QAAM,IAAI,QAAc,CAACA,UAAS,WAAW;AAC3C,WAAO,KAAK,SAAS,CAAC,UAAU,OAAO,IAAI;AAAA,MACzC;AAAA,MACA,iDAAiD,IAAI,KAAK,MAAM,OAAO;AAAA,IAEzE,CAAC,CAAC;AACF,WAAO,OAAO,GAAG,MAAM,MAAMA,SAAQ,CAAC;AAAA,EACxC,CAAC;AACD,QAAM,UAAU,OAAO,QAAQ;AAC/B,MAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAC3C,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACrE;AACA,SAAO;AAAA,IACL,aAAa,oBAAoB,QAAQ,IAAI;AAAA,IAC7C,aAAa,MAAM;AAAA,IACnB,OAAO,MAAM,IAAI,QAAc,CAACA,UAAS,WAAW;AAElD,aAAO,sBAAsB;AAC7B,aAAO,MAAM,CAAC,UAAU,QAAQ,OAAO,KAAK,IAAIA,SAAQ,CAAC;AAAA,IAC3D,CAAC;AAAA,EACH;AACF;AAEA,SAAS,iBAAiB,OAA0B;AAClD,SAAO,MAAM,QAAQ,KAAK,IAAI,MAAM,OAAO,CAAC,SAAyB,OAAO,SAAS,QAAQ,IAAI,CAAC;AACpG;AAEA,eAAe,UAAa,KAAa,WAAqC;AAC5E,2BAAyB,KAAK,oBAAoB;AAClD,QAAM,WAAW,MAAM,UAAU,GAAG;AACpC,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,uCAAuC,GAAG,UAAU,SAAS,MAAM,GAAG;AAAA,EACxF;AACA,SAAO,SAAS,KAAK;AACvB;AAEO,SAAS,sBACd,KACA,WAA4B,QAAQ,UACC;AACrC,2BAAyB,KAAK,yBAAyB;AACvD,MAAI,aAAa,UAAU;AACzB,WAAO,EAAE,SAAS,QAAQ,MAAM,CAAC,GAAG,EAAE;AAAA,EACxC;AACA,MAAI,aAAa,SAAS;AACxB,WAAO,EAAE,SAAS,gBAAgB,MAAM,CAAC,GAAG,EAAE;AAAA,EAChD;AACA,SAAO,EAAE,SAAS,YAAY,MAAM,CAAC,GAAG,EAAE;AAC5C;AAkBO,SAAS,cAAc,KAAa,OAA0B,CAAC,GAAkB;AACtF,QAAM,WAAW,KAAK,YAAY,QAAQ;AAC1C,QAAM,EAAE,SAAS,KAAK,IAAI,sBAAsB,KAAK,QAAQ;AAC7D,QAAM,YAAY,KAAK,aAAa;AACpC,SAAO,IAAI,QAAc,CAACA,UAAS,WAAW;AAC5C,UAAM,cAAc,CAAC,WAAmB,IAAI;AAAA,MAC1C;AAAA,MACA,6CAA6C,OAAO,KAAK,MAAM;AAAA,IACjE;AACA,QAAI;AACJ,QAAI;AACF,cAAQ,UAAU,SAAS,MAAM,EAAE,OAAO,UAAU,UAAU,KAAK,CAAC;AAAA,IACtE,SAAS,OAAO;AACd,aAAO,YAAY,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,CAAC;AAC1E;AAAA,IACF;AACA,UAAM,KAAK,SAAS,CAAC,UAAU,OAAO,YAAY,MAAM,OAAO,CAAC,CAAC;AACjE,QAAI,aAAa,SAAS;AACxB,YAAM,KAAK,SAAS,MAAMA,SAAQ,CAAC;AAAA,IACrC,OAAO;AACL,YAAM,KAAK,QAAQ,CAAC,MAAM,WAAW;AACnC,YAAI,SAAS,GAAG;AACd,UAAAA,SAAQ;AAAA,QACV,OAAO;AACL,iBAAO,YAAY,SAAS,OAAO,cAAc,UAAU,UAAU,KAAK,oBAAoB,IAAI,EAAE,CAAC;AAAA,QACvG;AAAA,MACF,CAAC;AAAA,IACH;AACA,UAAM,MAAM;AAAA,EACd,CAAC;AACH;AAEA,SAAS,YAAY,KAA4B;AAC/C,SAAO,cAAc,GAAG;AAC1B;AAEA,SAAS,8BAA8B,UAAkB,SAAkC;AACzF,MAAI,QAAQ,wCAAwC,KAAK;AACvD;AAAA,EACF;AACA,MAAI,kBAAkB,QAAQ,GAAG;AAC/B;AAAA,EACF;AACA,QAAM,IAAI,MAAM,sKAAsK;AACxL;;;AG1fA,SAAS,YAAAC,iBAAgB;AAgBzB,eAAsB,mBAAmB,OAAmD;AAC1F,QAAM,WAAqB,CAAC;AAC5B,QAAM,aAAa,MAAM,cAAc,MAAM,OAAO,SAAS;AAC7D,QAAM,YAAY,MAAM,WAAW,UAAa,MAAM,WAAW;AACjE,QAAM,WAAW,MAAM,cAAc,UAAa,CAAC;AAEnD,MAAI,MAAM,MAAM;AACd,QAAI,aAAa,UAAU;AACzB,eAAS,KAAK,kEAAkE;AAAA,IAClF;AACA,UAAM,OAAO,MAAM,gBAAgB,MAAM,MAAM,KAAK;AACpD,WAAO,EAAE,OAAO,UAAU,IAAI,GAAG,QAAQ,MAAM,SAAS,OAAO,MAAM,SAAS,OAAO,UAAU,QAAQ,SAAS;AAAA,EAClH;AAEA,MAAI,UAAU;AACZ,QAAI,WAAW;AACb,eAAS,KAAK,iEAAiE;AAAA,IACjF;AACA,UAAM,OAAO,MAAM,aAAa,MAAM,aAAa,MAAM,KAAK;AAC9D,QAAI,CAAC,KAAK,KAAK,GAAG;AAChB,aAAO,EAAE,OAAO,CAAC,GAAG,QAAQ,SAAS,SAAS;AAAA,IAChD;AACA,WAAO,EAAE,OAAO,UAAU,IAAI,GAAG,QAAQ,SAAS,SAAS;AAAA,EAC7D;AAEA,MAAI,WAAW;AACb,UAAM,SAAS,MAAM,WAAW,OAAO,MAAM,aAAa,MAAM,KAAK,IAAI,MAAM;AAC/E,WAAO,EAAE,OAAO,UAAU,MAAM,GAAG,QAAQ,UAAU,SAAS;AAAA,EAChE;AAEA,SAAO,EAAE,OAAO,CAAC,GAAG,QAAQ,SAAS,SAAS;AAChD;AAEA,SAAS,UAAU,MAAmC;AACpD,MAAI,SAAS,UAAa,CAAC,KAAK,KAAK,GAAG;AACtC,WAAO,CAAC;AAAA,EACV;AACA,MAAI;AACF,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,SAAS,OAAO;AACd,UAAM,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACpE,UAAM,IAAI,MAAM,yBAAyB,MAAM,EAAE;AAAA,EACnD;AACF;AAEA,eAAe,gBAAgB,MAAc,OAA4C;AACvF,MAAI,SAAS,OAAO,SAAS,MAAM;AACjC,WAAO,MAAM,aAAa,MAAM,aAAa,MAAM,KAAK;AAAA,EAC1D;AACA,SAAOA,UAAS,MAAM,MAAM;AAC9B;AAEA,eAAe,aAAa,OAAuD;AACjF,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,QAAM,YAAY,MAAM;AACxB,MAAI,OAAO;AACX,mBAAiB,SAAS,OAAO;AAC/B,YAAQ;AAAA,EACV;AACA,SAAO;AACT;;;ACvEO,IAAM,cACX,OAA8C,UAA0B;AAUnE,IAAM,eAAe;AAGrB,IAAM,sBAAsB;AAE5B,IAAM,iBAAiB,GAAG,YAAY,IAAI,WAAW;;;ACmBrD,IAAM,cAAN,cAA0B,MAAM;AAAA,EACrC,YACE,SACS,MACA,SACT;AACA,UAAM,OAAO;AAHJ;AACA;AAAA,EAGX;AAAA,EAJW;AAAA,EACA;AAIb;AAEO,IAAM,eAAN,MAAmB;AAAA,EAIxB,YAA6B,SAA8B;AAA9B;AAC3B,SAAK,YAAY,QAAQ,aAAa;AAAA,EACxC;AAAA,EAF6B;AAAA,EAHZ;AAAA,EACT,SAAS;AAAA,EAMjB,aAA+B;AAC7B,WAAO,KAAK,QAAQ,cAAc;AAAA,MAChC,iBAAiB;AAAA,MACjB,cAAc,CAAC;AAAA,MACf,YAAY,EAAE,MAAM,cAAc,SAAS,YAAY;AAAA,IACzD,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,YAAgC;AACpC,UAAM,SAAS,MAAM,KAAK,QAAQ,cAAc,CAAC,CAAC;AAClD,QAAI,CAACC,UAAS,MAAM,KAAK,CAAC,MAAM,QAAQ,OAAO,KAAK,GAAG;AACrD,YAAM,IAAI,YAAY,sDAAsD,sBAAsB,MAAM;AAAA,IAC1G;AACA,WAAO,OAAO;AAAA,EAChB;AAAA,EAEA,MAAM,UAAU,MAAc,MAAiC;AAC7D,WAAO,KAAK,QAAQ,cAAc,EAAE,MAAM,WAAW,QAAQ,CAAC,EAAE,CAAC;AAAA,EACnE;AAAA,EAEA,MAAM,QAAQ,QAAgB,QAAoC;AAChE,UAAM,WAAW,MAAM,KAAK,QAAQ;AAAA,MAClC,SAAS;AAAA,MACT,IAAI,KAAK;AAAA,MACT;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AACA,QAAI,WAAW,UAAU;AACvB,YAAM,IAAI,YAAY,SAAS,MAAM,SAAS,aAAa,SAAS,KAAK;AAAA,IAC3E;AACA,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,MAAM,QAAQ,SAA+D;AAC3E,UAAM,QAAQ,MAAM,KAAK,QAAQ,eAAe,eAAe;AAC/D,QAAI,WAAW,MAAM,KAAK,SAAS,SAAS,KAAK;AACjD,QAAI,SAAS,WAAW,OAAO,KAAK,QAAQ,eAAe;AACzD,YAAM,YAAY,MAAM,KAAK,QAAQ,cAAc,yBAAyB;AAC5E,UAAI,WAAW;AACb,mBAAW,MAAM,KAAK,SAAS,SAAS,SAAS;AAAA,MACnD;AAAA,IACF;AAEA,QAAI,SAAS,WAAW,OAAO,SAAS,WAAW,KAAK;AACtD,aAAO;AAAA,IACT;AACA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI;AAAA,QACR,qCAAqC,SAAS,MAAM;AAAA,QACpD;AAAA,QACA,iBAAiB,SAAS,QAAQ,MAAM,KAAK,QAAQ,WAAW,QAAQ,GAAG;AAAA,MAC7E;AAAA,IACF;AACA,QAAI,CAAC,KAAK,KAAK,GAAG;AAChB,aAAO;AAAA,IACT;AACA,UAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,QAAI,CAAC,kBAAkB,MAAM,GAAG;AAC9B,YAAM,IAAI,YAAY,6CAA6C,sBAAsB,MAAM;AAAA,IACjG;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,SAAS,SAAyB,OAA8C;AACtF,UAAM,UAAkC;AAAA,MACtC,gBAAgB;AAAA,MAChB,QAAQ;AAAA,IACV;AACA,QAAI,OAAO;AACT,cAAQ,gBAAgB,UAAU,KAAK;AAAA,IACzC;AACA,QAAI,KAAK,QAAQ,MAAM;AACrB,cAAQ,YAAY,YAAY,CAAC,IAAI,KAAK,QAAQ;AAAA,IACpD;AACA,WAAO,KAAK,UAAU,KAAK,QAAQ,UAAU;AAAA,MAC3C,QAAQ;AAAA,MACR;AAAA,MACA,MAAM,KAAK,UAAU,OAAO;AAAA,IAC9B,CAAC;AAAA,EACH;AACF;AAOO,SAAS,YAAY,QAA0B;AACpD,SAAOA,UAAS,MAAM,KAAK,OAAO,YAAY;AAChD;AAEA,SAAS,kBAAkB,OAA0C;AACnE,SAAOA,UAAS,KAAK,KAChB,MAAM,YAAY,UACjB,YAAY,SAAS,WAAW;AACxC;AAEA,SAASA,UAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,iBAAiB,QAAgB,MAAc,SAAqD;AAC3G,QAAM,UAAmC,EAAE,OAAO;AAClD,MAAI,QAAQ,sBAAsB,OAAO,QAAQ,kBAAkB,KAAK;AACtE,YAAQ,OAAO,gBAAgB,IAAI;AAAA,EACrC;AACA,SAAO;AACT;AAEO,SAAS,gBAAgB,MAAsB;AACpD,SAAO,KAAK,SAAS,MAAM,GAAG,KAAK,MAAM,GAAG,GAAG,CAAC,QAAQ;AAC1D;;;AChKO,SAAS,cAAc,MAAe,UAAmD,CAAC,GAAW;AAC1G,MAAI,QAAQ,MAAM;AAChB,UAAM,QAAyB,EAAE,IAAI,MAAM,KAAK;AAChD,QAAI,QAAQ,UAAU,QAAQ;AAC5B,YAAM,WAAW,QAAQ;AAAA,IAC3B;AACA,WAAO,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA;AAAA,EAC1C;AACA,QAAM,WAAW,QAAQ,UAAU,SAAS,GAAG,QAAQ,SAAS,IAAI,CAAC,YAAY,YAAY,OAAO,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,IAAO;AACzH,SAAO,GAAG,QAAQ,GAAG,YAAY,IAAI,CAAC;AAAA;AACxC;AAEO,SAAS,YAAY,OAAgB,UAA8B,CAAC,GAAW;AACpF,QAAM,QAAQ,aAAa,KAAK;AAChC,MAAI,QAAQ,MAAM;AAChB,WAAO,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA;AAAA,EAC1C;AACA,SAAO,UAAU,MAAM,MAAM,OAAO;AAAA;AACtC;AAEO,SAAS,aAAa,OAA+B;AAC1D,MAAI,iBAAiB,OAAO;AAC1B,UAAM,QAAQ;AACd,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,MAAM,MAAM,QAAQ;AAAA,QACpB,SAAS,MAAM;AAAA,QACf,SAAS,cAAc,MAAM,OAAO;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,IAAI,OAAO,OAAO,EAAE,MAAM,aAAa,SAAS,OAAO,KAAK,EAAE,EAAE;AAC3E;AAEO,SAAS,cAAc,OAAyB;AACrD,SAAO,mBAAmB,OAAO,oBAAI,QAAgB,CAAC;AACxD;AAEA,SAAS,YAAY,MAAuB;AAC1C,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,WAAO,KAAK,IAAI,CAAC,SAAS,YAAY,IAAI,CAAC,EAAE,KAAK,IAAI;AAAA,EACxD;AACA,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO;AAAA,EACT;AACA,SAAO,KAAK,UAAU,MAAM,MAAM,CAAC;AACrC;AAEA,SAAS,mBAAmB,OAAgB,MAAgC;AAC1E,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,mBAAmB,KAAK;AAAA,EACjC;AACA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,CAAC,SAAS,mBAAmB,MAAM,IAAI,CAAC;AAAA,EAC3D;AACA,MAAI,SAAS,OAAO,UAAU,UAAU;AACtC,QAAI,KAAK,IAAI,KAAK,GAAG;AACnB,aAAO;AAAA,IACT;AACA,SAAK,IAAI,KAAK;AACd,UAAM,SAAkC,CAAC;AACzC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,aAAO,GAAG,IAAI,YAAY,GAAG,IAAI,eAAe,mBAAmB,OAAO,IAAI;AAAA,IAChF;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,YAAY,KAAsB;AACzC,QAAM,aAAa,IAAI,YAAY,EAAE,QAAQ,MAAM,GAAG;AACtD,SAAO,eAAe,mBACjB,WAAW,SAAS,cAAc,KAClC,WAAW,SAAS,eAAe,KACnC,WAAW,SAAS,eAAe,KACnC,WAAW,SAAS,OAAO;AAClC;AAEA,SAAS,mBAAmB,OAAuB;AACjD,SAAO,MACJ,QAAQ,4FAA4F,gBAAgB,EACpH,QAAQ,oFAAoF,cAAc,EAC1G,QAAQ,4CAA4C,cAAc,EAClE,QAAQ,oEAAoE,cAAc;AAC/F;;;AClGO,IAAM,iBAAiB;AAAA,EAC5B,EAAC,WAAU,oBAAmB,eAAc,CAAC,aAAY,QAAQ,GAAE,SAAQ,YAAW,eAAc,oJAAmJ,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,aAAY,SAAQ,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,yXAAmN,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,wBAAuB,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,SAAQ,EAAC,eAAc,kBAAiB,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,2EAA0E,QAAO,CAAC,OAAM,YAAW,WAAU,WAAU,MAAM,GAAE,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,oMAAmM,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,eAAc,QAAO,OAAO,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EACr4C,EAAC,WAAU,kBAAiB,eAAc,CAAC,WAAU,QAAQ,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,WAAU,SAAQ,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,oBAAmB,EAAC,eAAc,sBAAqB,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,gBAAe,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,eAAc,MAAM,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EACrlB,EAAC,WAAU,mBAAkB,eAAc,CAAC,YAAW,QAAQ,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,YAAW,SAAQ,EAAC,cAAa,EAAC,eAAc,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,sBAAqB,QAAO,SAAQ,GAAE,iBAAgB,EAAC,eAAc,4DAAsD,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EAC1qB,EAAC,WAAU,qBAAoB,eAAc,CAAC,cAAa,QAAQ,GAAE,SAAQ,aAAY,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,cAAa,SAAQ,EAAC,cAAa,EAAC,eAAc,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,kBAAiB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EAC5gB,EAAC,WAAU,sBAAqB,eAAc,CAAC,eAAc,QAAQ,GAAE,SAAQ,cAAa,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,oBAAmB,SAAQ,EAAC,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,MAAK,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EAC7X,EAAC,WAAU,oBAAmB,eAAc,CAAC,aAAY,QAAQ,GAAE,SAAQ,YAAW,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,kBAAiB,SAAQ,EAAC,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,MAAK,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EACrX,EAAC,WAAU,kBAAiB,eAAc,CAAC,WAAU,QAAQ,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,gBAAe,SAAQ,EAAC,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,MAAK,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EAC9W,EAAC,WAAU,mBAAkB,eAAc,CAAC,YAAW,QAAQ,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,iBAAgB,SAAQ,EAAC,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,MAAK,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EACjX,EAAC,WAAU,qBAAoB,eAAc,CAAC,cAAa,QAAQ,GAAE,SAAQ,aAAY,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,mBAAkB,SAAQ,EAAC,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,MAAK,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EACzX,EAAC,WAAU,yBAAwB,eAAc,CAAC,SAAQ,OAAM,uBAAuB,GAAE,SAAQ,WAAU,eAAc,gQAA+P,eAAc,EAAC,cAAa,EAAC,eAAc,EAAC,eAAc,4BAA2B,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,SAAQ,EAAC,eAAc,mBAAkB,SAAQ,EAAC,cAAa,EAAC,UAAS,EAAC,eAAc,kBAAiB,QAAO,CAAC,UAAS,UAAS,QAAQ,GAAE,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,YAAW,EAAC,eAAc,UAAS,QAAO,SAAQ,GAAE,SAAQ,EAAC,eAAc,cAAa,QAAO,SAAQ,GAAE,aAAY,EAAC,eAAc,cAAa,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,gBAAe,QAAO,UAAS,GAAE,UAAS,EAAC,eAAc,UAAS,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,8BAA6B,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,QAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,GAAE,UAAS,EAAC,eAAc,oBAAmB,SAAQ,EAAC,cAAa,EAAC,UAAS,EAAC,eAAc,kBAAiB,QAAO,CAAC,UAAS,UAAS,QAAQ,GAAE,QAAO,SAAQ,GAAE,aAAY,EAAC,eAAc,mBAAkB,QAAO,UAAS,GAAE,SAAQ,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,UAAS,EAAC,eAAc,8DAA6D,QAAO,SAAQ,GAAE,YAAW,EAAC,eAAc,aAAY,QAAO,SAAQ,GAAE,qBAAoB,EAAC,eAAc,uBAAsB,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,cAAa,QAAO,SAAQ,GAAE,mBAAkB,EAAC,eAAc,qBAAoB,QAAO,SAAQ,GAAE,aAAY,EAAC,eAAc,cAAa,QAAO,UAAS,GAAE,QAAO,EAAC,eAAc,8BAA6B,QAAO,SAAQ,GAAE,SAAQ,EAAC,eAAc,6DAA4D,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,QAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,GAAE,SAAQ,EAAC,eAAc,mBAAkB,SAAQ,EAAC,cAAa,EAAC,UAAS,EAAC,eAAc,kBAAiB,QAAO,CAAC,UAAS,UAAS,QAAQ,GAAE,QAAO,SAAQ,GAAE,aAAY,EAAC,eAAc,cAAa,QAAO,SAAQ,GAAE,aAAY,EAAC,eAAc,8CAA6C,QAAO,SAAQ,GAAE,UAAS,EAAC,eAAc,UAAS,QAAO,SAAQ,GAAE,SAAQ,EAAC,eAAc,4FAA2F,QAAO,CAAC,QAAO,aAAY,WAAU,WAAU,YAAW,UAAS,SAAQ,gBAAe,OAAM,WAAU,YAAW,eAAe,GAAE,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,oEAAmE,aAAY,KAAK,QAAO,SAAQ,GAAE,aAAY,EAAC,eAAc,cAAa,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,aAAY,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,mDAAkD,QAAO,SAAQ,GAAE,SAAQ,EAAC,eAAc,SAAQ,QAAO,SAAQ,GAAE,KAAI,EAAC,eAAc,KAAI,QAAO,SAAQ,GAAE,KAAI,EAAC,eAAc,KAAI,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,QAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,eAAc,aAAa,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,eAAc,aAAa,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EACv7G,EAAC,WAAU,oBAAmB,eAAc,CAAC,SAAQ,OAAM,kBAAkB,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,YAAW,EAAC,eAAc,aAAY,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,UAAU,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,UAAU,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EACxW,EAAC,WAAU,qBAAoB,eAAc,CAAC,SAAQ,OAAM,mBAAmB,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,aAAY,EAAC,eAAc,cAAa,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,WAAW,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,WAAW,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EAC9W,EAAC,WAAU,oBAAmB,eAAc,CAAC,SAAQ,OAAM,kBAAkB,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,YAAW,EAAC,eAAc,aAAY,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,UAAU,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,UAAU,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EACxW,EAAC,WAAU,oCAAmC,eAAc,CAAC,SAAQ,OAAM,kCAAkC,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,CAAC,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EAChT,EAAC,WAAU,sBAAqB,eAAc,CAAC,SAAQ,OAAM,oBAAoB,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,eAAc,EAAC,eAAc,yBAAwB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,aAAa,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,aAAa,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EACjY,EAAC,WAAU,uBAAsB,eAAc,CAAC,SAAQ,OAAM,qBAAqB,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,eAAc,EAAC,eAAc,yBAAwB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,aAAa,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,aAAa,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EACnY,EAAC,WAAU,sBAAqB,eAAc,CAAC,SAAQ,OAAM,oBAAoB,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,eAAc,EAAC,eAAc,yBAAwB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,aAAa,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,aAAa,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EACjY,EAAC,WAAU,6BAA4B,eAAc,CAAC,SAAQ,OAAM,2BAA2B,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,qBAAoB,EAAC,eAAc,gDAA+C,QAAO,UAAS,GAAE,kBAAiB,EAAC,eAAc,wEAAuE,QAAO,UAAS,GAAE,eAAc,EAAC,eAAc,qFAAoF,QAAO,UAAS,GAAE,gBAAe,EAAC,eAAc,sBAAqB,QAAO,UAAS,GAAE,UAAS,EAAC,eAAc,mBAAkB,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,oBAAmB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,QAAO,QAAQ,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,UAAS,MAAM,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EACv2B,EAAC,WAAU,qCAAoC,eAAc,CAAC,SAAQ,OAAM,mCAAmC,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,gBAAe,EAAC,eAAc,sCAAqC,QAAO,SAAQ,GAAE,UAAS,EAAC,eAAc,0EAAoE,QAAO,CAAC,QAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,oBAAmB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,QAAO,QAAQ,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,UAAS,MAAM,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EAC1mB,EAAC,WAAU,kBAAiB,eAAc,CAAC,SAAQ,OAAM,gBAAgB,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,cAAa,EAAC,eAAc,qBAAoB,QAAO,CAAC,WAAU,UAAS,UAAU,GAAE,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,gBAAe,SAAQ,EAAC,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,cAAa,aAAa,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,cAAa,aAAa,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EAC/gB,EAAC,WAAU,iBAAgB,eAAc,CAAC,SAAQ,OAAM,eAAe,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,cAAa,EAAC,eAAc,qMAAoM,QAAO,CAAC,WAAU,UAAS,UAAU,GAAE,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,gBAAe,SAAQ,EAAC,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,cAAa,aAAa,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,cAAa,aAAa,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EAC7rB,EAAC,WAAU,qBAAoB,eAAc,CAAC,OAAM,eAAe,GAAE,SAAQ,OAAM,eAAc,wxFAAqmG,eAAc,EAAC,cAAa,EAAC,oBAAmB,EAAC,eAAc,gFAA+E,QAAO,UAAS,GAAE,eAAc,EAAC,eAAc,4BAA2B,QAAO,SAAQ,GAAE,gBAAe,EAAC,eAAc,qBAAoB,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,0CAAyC,SAAQ,EAAC,eAAc,4LAA2L,iBAAgB,EAAC,gBAAe,OAAM,GAAE,SAAQ,CAAC,EAAC,SAAQ,CAAC,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,SAAQ,UAAS,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,uCAAsC,cAAa,EAAC,SAAQ,EAAC,eAAc,kBAAiB,QAAO,SAAQ,GAAE,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,gBAAe,EAAC,eAAc,iBAAgB,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,oCAAmC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,6PAA4P,aAAY,IAAG,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,SAAQ,cAAa,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,GAAE,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,QAAO,CAAC,UAAS,QAAQ,GAAE,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,CAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,CAAC,GAAE,cAAa,EAAC,QAAO,EAAC,eAAc,uCAAsC,cAAa,EAAC,SAAQ,EAAC,eAAc,kBAAiB,QAAO,SAAQ,GAAE,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,gBAAe,EAAC,eAAc,iBAAgB,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,oCAAmC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,6PAA4P,aAAY,IAAG,QAAO,SAAQ,EAAC,GAAE,SAAQ,cAAa,QAAO,SAAQ,GAAE,MAAK,EAAC,eAAc,aAAY,QAAO,CAAC,UAAS,UAAS,QAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,SAAQ,SAAQ,eAAc,qCAAoC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,kCAAiC,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAK,MAAM,GAAE,SAAQ,mBAAkB,QAAO,SAAQ,GAAE,EAAC,SAAQ,CAAC,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,SAAQ,UAAS,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,wCAAuC,cAAa,EAAC,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,SAAQ,GAAE,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,gBAAe,EAAC,eAAc,wBAAuB,QAAO,UAAS,GAAE,eAAc,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,SAAQ,EAAC,eAAc,qBAAoB,QAAO,UAAS,GAAE,aAAY,EAAC,eAAc,gBAAe,QAAO,UAAS,GAAE,QAAO,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,6GAA4G,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,oEAAmE,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,6PAA4P,aAAY,IAAG,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,YAAY,GAAE,SAAQ,eAAc,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,GAAE,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,QAAO,CAAC,UAAS,QAAQ,GAAE,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,CAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,CAAC,GAAE,cAAa,EAAC,QAAO,EAAC,eAAc,wCAAuC,cAAa,EAAC,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,SAAQ,GAAE,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,gBAAe,EAAC,eAAc,wBAAuB,QAAO,UAAS,GAAE,eAAc,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,SAAQ,EAAC,eAAc,qBAAoB,QAAO,UAAS,GAAE,aAAY,EAAC,eAAc,gBAAe,QAAO,UAAS,GAAE,QAAO,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,6GAA4G,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,oEAAmE,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,6PAA4P,aAAY,IAAG,QAAO,SAAQ,EAAC,GAAE,SAAQ,eAAc,QAAO,SAAQ,GAAE,MAAK,EAAC,eAAc,aAAY,QAAO,CAAC,UAAS,UAAS,QAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,SAAQ,UAAS,eAAc,sCAAqC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,kCAAiC,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAK,MAAM,GAAE,SAAQ,oBAAmB,QAAO,SAAQ,GAAE,EAAC,SAAQ,CAAC,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,SAAQ,UAAS,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,uCAAsC,cAAa,EAAC,SAAQ,EAAC,eAAc,2BAA0B,QAAO,UAAS,GAAE,aAAY,EAAC,eAAc,sBAAqB,QAAO,UAAS,GAAE,QAAO,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,2CAA0C,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,6PAA4P,aAAY,IAAG,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,YAAY,GAAE,SAAQ,cAAa,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,GAAE,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,QAAO,CAAC,UAAS,QAAQ,GAAE,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,CAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,CAAC,GAAE,cAAa,EAAC,QAAO,EAAC,eAAc,uCAAsC,cAAa,EAAC,SAAQ,EAAC,eAAc,2BAA0B,QAAO,UAAS,GAAE,aAAY,EAAC,eAAc,sBAAqB,QAAO,UAAS,GAAE,QAAO,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,2CAA0C,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,6PAA4P,aAAY,IAAG,QAAO,SAAQ,EAAC,GAAE,SAAQ,cAAa,QAAO,SAAQ,GAAE,MAAK,EAAC,eAAc,aAAY,QAAO,CAAC,UAAS,UAAS,QAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,SAAQ,SAAQ,eAAc,qCAAoC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,kCAAiC,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAK,MAAM,GAAE,SAAQ,mBAAkB,QAAO,SAAQ,GAAE,EAAC,SAAQ,CAAC,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,SAAQ,UAAS,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,8CAA6C,cAAa,EAAC,eAAc,EAAC,eAAc,qCAAoC,QAAO,SAAQ,GAAE,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,cAAa,EAAC,eAAc,oCAAmC,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,wCAAuC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,6PAA4P,aAAY,IAAG,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,cAAa,aAAa,GAAE,SAAQ,qBAAoB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,GAAE,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,QAAO,CAAC,UAAS,QAAQ,GAAE,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,CAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,CAAC,GAAE,cAAa,EAAC,QAAO,EAAC,eAAc,8CAA6C,cAAa,EAAC,eAAc,EAAC,eAAc,qCAAoC,QAAO,SAAQ,GAAE,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,cAAa,EAAC,eAAc,oCAAmC,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,wCAAuC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,6PAA4P,aAAY,IAAG,QAAO,SAAQ,EAAC,GAAE,SAAQ,qBAAoB,QAAO,SAAQ,GAAE,MAAK,EAAC,eAAc,aAAY,QAAO,CAAC,UAAS,UAAS,QAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,SAAQ,gBAAe,eAAc,4CAA2C,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,kCAAiC,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAK,MAAM,GAAE,SAAQ,0BAAyB,QAAO,SAAQ,GAAE,EAAC,SAAQ,CAAC,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,SAAQ,UAAS,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,qCAAoC,cAAa,EAAC,mBAAkB,EAAC,eAAc,2CAA0C,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,mBAAkB,QAAO,SAAQ,GAAE,aAAY,EAAC,eAAc,qBAAoB,QAAO,SAAQ,GAAE,aAAY,EAAC,eAAc,qBAAoB,QAAO,SAAQ,GAAE,gBAAe,EAAC,eAAc,wEAAuE,QAAO,CAAC,KAAI,KAAI,GAAG,GAAE,QAAO,SAAQ,GAAE,iBAAgB,EAAC,eAAc,2CAA0C,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,6PAA4P,aAAY,IAAG,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,mBAAkB,iBAAgB,cAAc,GAAE,SAAQ,YAAW,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,GAAE,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,QAAO,CAAC,UAAS,QAAQ,GAAE,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,CAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,CAAC,GAAE,cAAa,EAAC,QAAO,EAAC,eAAc,qCAAoC,cAAa,EAAC,mBAAkB,EAAC,eAAc,2CAA0C,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,mBAAkB,QAAO,SAAQ,GAAE,aAAY,EAAC,eAAc,qBAAoB,QAAO,SAAQ,GAAE,aAAY,EAAC,eAAc,qBAAoB,QAAO,SAAQ,GAAE,gBAAe,EAAC,eAAc,wEAAuE,QAAO,CAAC,KAAI,KAAI,GAAG,GAAE,QAAO,SAAQ,GAAE,iBAAgB,EAAC,eAAc,2CAA0C,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,6PAA4P,aAAY,IAAG,QAAO,SAAQ,EAAC,GAAE,SAAQ,YAAW,QAAO,SAAQ,GAAE,MAAK,EAAC,eAAc,aAAY,QAAO,CAAC,UAAS,UAAS,QAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,SAAQ,OAAM,eAAc,mCAAkC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,kCAAiC,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAK,MAAM,GAAE,SAAQ,iBAAgB,QAAO,SAAQ,GAAE,EAAC,SAAQ,CAAC,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,SAAQ,UAAS,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,4CAA2C,cAAa,EAAC,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,oBAAmB,EAAC,eAAc,4CAA2C,QAAO,SAAQ,GAAE,YAAW,EAAC,eAAc,0FAAyF,QAAO,SAAQ,GAAE,kBAAiB,EAAC,eAAc,4CAA2C,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,6PAA4P,aAAY,IAAG,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,YAAW,oBAAmB,gBAAgB,GAAE,SAAQ,mBAAkB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,GAAE,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,QAAO,CAAC,UAAS,QAAQ,GAAE,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,CAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,CAAC,GAAE,cAAa,EAAC,QAAO,EAAC,eAAc,4CAA2C,cAAa,EAAC,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,oBAAmB,EAAC,eAAc,4CAA2C,QAAO,SAAQ,GAAE,YAAW,EAAC,eAAc,0FAAyF,QAAO,SAAQ,GAAE,kBAAiB,EAAC,eAAc,4CAA2C,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,6PAA4P,aAAY,IAAG,QAAO,SAAQ,EAAC,GAAE,SAAQ,mBAAkB,QAAO,SAAQ,GAAE,MAAK,EAAC,eAAc,aAAY,QAAO,CAAC,UAAS,UAAS,QAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,SAAQ,cAAa,eAAc,0CAAyC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,kCAAiC,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAK,MAAM,GAAE,SAAQ,wBAAuB,QAAO,SAAQ,GAAE,EAAC,SAAQ,CAAC,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,SAAQ,UAAS,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,sCAAqC,cAAa,EAAC,QAAO,EAAC,eAAc,cAAa,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,cAAa,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,6PAA4P,aAAY,IAAG,QAAO,SAAQ,EAAC,GAAE,SAAQ,aAAY,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,GAAE,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,QAAO,CAAC,UAAS,QAAQ,GAAE,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,CAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,CAAC,GAAE,cAAa,EAAC,QAAO,EAAC,eAAc,sCAAqC,cAAa,EAAC,QAAO,EAAC,eAAc,cAAa,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,cAAa,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,6PAA4P,aAAY,IAAG,QAAO,SAAQ,EAAC,GAAE,SAAQ,aAAY,QAAO,SAAQ,GAAE,MAAK,EAAC,eAAc,aAAY,QAAO,CAAC,UAAS,UAAS,QAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,SAAQ,QAAO,eAAc,oCAAmC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,kCAAiC,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAK,MAAM,GAAE,SAAQ,kBAAiB,QAAO,SAAQ,GAAE,EAAC,SAAQ,CAAC,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,SAAQ,UAAS,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,4CAA2C,cAAa,EAAC,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,aAAY,EAAC,eAAc,6FAA4F,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,oBAAmB,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,6PAA4P,aAAY,IAAG,QAAO,SAAQ,GAAE,SAAQ,EAAC,eAAc,2FAA0F,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,WAAW,GAAE,SAAQ,mBAAkB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,GAAE,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,QAAO,CAAC,UAAS,QAAQ,GAAE,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,CAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,CAAC,GAAE,cAAa,EAAC,QAAO,EAAC,eAAc,4CAA2C,cAAa,EAAC,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,aAAY,EAAC,eAAc,6FAA4F,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,oBAAmB,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,6PAA4P,aAAY,IAAG,QAAO,SAAQ,GAAE,SAAQ,EAAC,eAAc,2FAA0F,QAAO,SAAQ,EAAC,GAAE,SAAQ,mBAAkB,QAAO,SAAQ,GAAE,MAAK,EAAC,eAAc,aAAY,QAAO,CAAC,UAAS,UAAS,QAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,SAAQ,cAAa,eAAc,0CAAyC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,kCAAiC,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAK,MAAM,GAAE,SAAQ,wBAAuB,QAAO,SAAQ,GAAE,EAAC,SAAQ,CAAC,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,SAAQ,UAAS,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,6CAA4C,cAAa,EAAC,SAAQ,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,qBAAoB,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,6PAA4P,aAAY,IAAG,QAAO,SAAQ,EAAC,GAAE,SAAQ,oBAAmB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,GAAE,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,QAAO,CAAC,UAAS,QAAQ,GAAE,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,CAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,CAAC,GAAE,cAAa,EAAC,QAAO,EAAC,eAAc,6CAA4C,cAAa,EAAC,SAAQ,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,qBAAoB,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,6PAA4P,aAAY,IAAG,QAAO,SAAQ,EAAC,GAAE,SAAQ,oBAAmB,QAAO,SAAQ,GAAE,MAAK,EAAC,eAAc,aAAY,QAAO,CAAC,UAAS,UAAS,QAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,SAAQ,eAAc,eAAc,2CAA0C,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,kCAAiC,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAK,MAAM,GAAE,SAAQ,yBAAwB,QAAO,SAAQ,GAAE,EAAC,SAAQ,CAAC,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,SAAQ,UAAS,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,mDAAkD,cAAa,EAAC,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,cAAa,EAAC,eAAc,0CAAyC,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,sBAAqB,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,oCAAmC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,6PAA4P,aAAY,IAAG,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,cAAa,YAAY,GAAE,SAAQ,0BAAyB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,GAAE,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,QAAO,CAAC,UAAS,QAAQ,GAAE,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,CAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,CAAC,GAAE,cAAa,EAAC,QAAO,EAAC,eAAc,mDAAkD,cAAa,EAAC,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,cAAa,EAAC,eAAc,0CAAyC,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,sBAAqB,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,oCAAmC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,6PAA4P,aAAY,IAAG,QAAO,SAAQ,EAAC,GAAE,SAAQ,0BAAyB,QAAO,SAAQ,GAAE,MAAK,EAAC,eAAc,aAAY,QAAO,CAAC,UAAS,UAAS,QAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,SAAQ,qBAAoB,eAAc,iDAAgD,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,kCAAiC,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAK,MAAM,GAAE,SAAQ,+BAA8B,QAAO,SAAQ,GAAE,EAAC,SAAQ,CAAC,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,SAAQ,UAAS,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,kDAAiD,cAAa,EAAC,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,cAAa,EAAC,eAAc,0CAAyC,QAAO,SAAQ,GAAE,aAAY,EAAC,eAAc,mCAAkC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,6PAA4P,aAAY,IAAG,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,cAAa,WAAW,GAAE,SAAQ,yBAAwB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,GAAE,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,QAAO,CAAC,UAAS,QAAQ,GAAE,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,CAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,CAAC,GAAE,cAAa,EAAC,QAAO,EAAC,eAAc,kDAAiD,cAAa,EAAC,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,cAAa,EAAC,eAAc,0CAAyC,QAAO,SAAQ,GAAE,aAAY,EAAC,eAAc,mCAAkC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,6PAA4P,aAAY,IAAG,QAAO,SAAQ,EAAC,GAAE,SAAQ,yBAAwB,QAAO,SAAQ,GAAE,MAAK,EAAC,eAAc,aAAY,QAAO,CAAC,UAAS,UAAS,QAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,SAAQ,oBAAmB,eAAc,gDAA+C,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,kCAAiC,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAK,MAAM,GAAE,SAAQ,8BAA6B,QAAO,SAAQ,GAAE,EAAC,SAAQ,CAAC,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,SAAQ,UAAS,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,wCAAuC,cAAa,EAAC,mBAAkB,EAAC,eAAc,wCAAuC,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,wBAAuB,QAAO,UAAS,GAAE,QAAO,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,gBAAe,EAAC,eAAc,uCAAsC,QAAO,SAAQ,GAAE,mBAAkB,EAAC,eAAc,0CAAyC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,6PAA4P,aAAY,IAAG,QAAO,SAAQ,EAAC,GAAE,SAAQ,eAAc,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,GAAE,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,QAAO,CAAC,UAAS,QAAQ,GAAE,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,CAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,CAAC,GAAE,cAAa,EAAC,QAAO,EAAC,eAAc,wCAAuC,cAAa,EAAC,mBAAkB,EAAC,eAAc,wCAAuC,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,wBAAuB,QAAO,UAAS,GAAE,QAAO,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,gBAAe,EAAC,eAAc,uCAAsC,QAAO,SAAQ,GAAE,mBAAkB,EAAC,eAAc,0CAAyC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,6PAA4P,aAAY,IAAG,QAAO,SAAQ,EAAC,GAAE,SAAQ,eAAc,QAAO,SAAQ,GAAE,MAAK,EAAC,eAAc,aAAY,QAAO,CAAC,UAAS,UAAS,QAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,SAAQ,UAAS,eAAc,sCAAqC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,kCAAiC,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAK,MAAM,GAAE,SAAQ,oBAAmB,QAAO,SAAQ,GAAE,EAAC,SAAQ,CAAC,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,SAAQ,UAAS,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,sCAAqC,cAAa,EAAC,SAAQ,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,WAAU,EAAC,eAAc,iBAAgB,QAAO,SAAQ,GAAE,UAAS,EAAC,eAAc,WAAU,QAAO,UAAS,GAAE,aAAY,EAAC,eAAc,cAAa,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,eAAc,QAAO,UAAS,GAAE,cAAa,EAAC,eAAc,eAAc,QAAO,UAAS,GAAE,SAAQ,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,6PAA4P,aAAY,IAAG,QAAO,SAAQ,GAAE,SAAQ,EAAC,eAAc,UAAS,QAAO,UAAS,EAAC,GAAE,SAAQ,aAAY,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,GAAE,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,QAAO,CAAC,UAAS,QAAQ,GAAE,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,CAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,CAAC,GAAE,cAAa,EAAC,QAAO,EAAC,eAAc,sCAAqC,cAAa,EAAC,SAAQ,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,WAAU,EAAC,eAAc,iBAAgB,QAAO,SAAQ,GAAE,UAAS,EAAC,eAAc,WAAU,QAAO,UAAS,GAAE,aAAY,EAAC,eAAc,cAAa,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,eAAc,QAAO,UAAS,GAAE,cAAa,EAAC,eAAc,eAAc,QAAO,UAAS,GAAE,SAAQ,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,6PAA4P,aAAY,IAAG,QAAO,SAAQ,GAAE,SAAQ,EAAC,eAAc,UAAS,QAAO,UAAS,EAAC,GAAE,SAAQ,aAAY,QAAO,SAAQ,GAAE,MAAK,EAAC,eAAc,aAAY,QAAO,CAAC,UAAS,UAAS,QAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,SAAQ,QAAO,eAAc,oCAAmC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,kCAAiC,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAK,MAAM,GAAE,SAAQ,kBAAiB,QAAO,SAAQ,CAAC,GAAE,cAAa,EAAC,QAAO,EAAC,eAAc,6JAA4J,SAAQ,CAAC,EAAC,eAAc,uCAAsC,cAAa,EAAC,SAAQ,EAAC,eAAc,kBAAiB,QAAO,SAAQ,GAAE,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,gBAAe,EAAC,eAAc,iBAAgB,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,oCAAmC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,6PAA4P,aAAY,IAAG,QAAO,SAAQ,EAAC,GAAE,SAAQ,cAAa,QAAO,SAAQ,GAAE,EAAC,eAAc,wCAAuC,cAAa,EAAC,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,SAAQ,GAAE,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,gBAAe,EAAC,eAAc,wBAAuB,QAAO,UAAS,GAAE,eAAc,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,SAAQ,EAAC,eAAc,qBAAoB,QAAO,UAAS,GAAE,aAAY,EAAC,eAAc,gBAAe,QAAO,UAAS,GAAE,QAAO,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,6GAA4G,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,oEAAmE,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,6PAA4P,aAAY,IAAG,QAAO,SAAQ,EAAC,GAAE,SAAQ,eAAc,QAAO,SAAQ,GAAE,EAAC,eAAc,uCAAsC,cAAa,EAAC,SAAQ,EAAC,eAAc,2BAA0B,QAAO,UAAS,GAAE,aAAY,EAAC,eAAc,sBAAqB,QAAO,UAAS,GAAE,QAAO,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,2CAA0C,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,6PAA4P,aAAY,IAAG,QAAO,SAAQ,EAAC,GAAE,SAAQ,cAAa,QAAO,SAAQ,GAAE,EAAC,eAAc,8CAA6C,cAAa,EAAC,eAAc,EAAC,eAAc,qCAAoC,QAAO,SAAQ,GAAE,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,cAAa,EAAC,eAAc,oCAAmC,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,wCAAuC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,6PAA4P,aAAY,IAAG,QAAO,SAAQ,EAAC,GAAE,SAAQ,qBAAoB,QAAO,SAAQ,GAAE,EAAC,eAAc,qCAAoC,cAAa,EAAC,mBAAkB,EAAC,eAAc,2CAA0C,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,mBAAkB,QAAO,SAAQ,GAAE,aAAY,EAAC,eAAc,qBAAoB,QAAO,SAAQ,GAAE,aAAY,EAAC,eAAc,qBAAoB,QAAO,SAAQ,GAAE,gBAAe,EAAC,eAAc,wEAAuE,QAAO,CAAC,KAAI,KAAI,GAAG,GAAE,QAAO,SAAQ,GAAE,iBAAgB,EAAC,eAAc,2CAA0C,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,6PAA4P,aAAY,IAAG,QAAO,SAAQ,EAAC,GAAE,SAAQ,YAAW,QAAO,SAAQ,GAAE,EAAC,eAAc,4CAA2C,cAAa,EAAC,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,oBAAmB,EAAC,eAAc,4CAA2C,QAAO,SAAQ,GAAE,YAAW,EAAC,eAAc,0FAAyF,QAAO,SAAQ,GAAE,kBAAiB,EAAC,eAAc,4CAA2C,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,6PAA4P,aAAY,IAAG,QAAO,SAAQ,EAAC,GAAE,SAAQ,mBAAkB,QAAO,SAAQ,GAAE,EAAC,eAAc,sCAAqC,cAAa,EAAC,QAAO,EAAC,eAAc,cAAa,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,cAAa,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,6PAA4P,aAAY,IAAG,QAAO,SAAQ,EAAC,GAAE,SAAQ,aAAY,QAAO,SAAQ,GAAE,EAAC,eAAc,4CAA2C,cAAa,EAAC,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,aAAY,EAAC,eAAc,6FAA4F,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,oBAAmB,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,6PAA4P,aAAY,IAAG,QAAO,SAAQ,GAAE,SAAQ,EAAC,eAAc,2FAA0F,QAAO,SAAQ,EAAC,GAAE,SAAQ,mBAAkB,QAAO,SAAQ,GAAE,EAAC,eAAc,6CAA4C,cAAa,EAAC,SAAQ,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,qBAAoB,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,6PAA4P,aAAY,IAAG,QAAO,SAAQ,EAAC,GAAE,SAAQ,oBAAmB,QAAO,SAAQ,GAAE,EAAC,eAAc,mDAAkD,cAAa,EAAC,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,cAAa,EAAC,eAAc,0CAAyC,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,sBAAqB,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,oCAAmC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,6PAA4P,aAAY,IAAG,QAAO,SAAQ,EAAC,GAAE,SAAQ,0BAAyB,QAAO,SAAQ,GAAE,EAAC,eAAc,kDAAiD,cAAa,EAAC,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,cAAa,EAAC,eAAc,0CAAyC,QAAO,SAAQ,GAAE,aAAY,EAAC,eAAc,mCAAkC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,6PAA4P,aAAY,IAAG,QAAO,SAAQ,EAAC,GAAE,SAAQ,yBAAwB,QAAO,SAAQ,GAAE,EAAC,eAAc,wCAAuC,cAAa,EAAC,mBAAkB,EAAC,eAAc,wCAAuC,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,wBAAuB,QAAO,UAAS,GAAE,QAAO,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,gBAAe,EAAC,eAAc,uCAAsC,QAAO,SAAQ,GAAE,mBAAkB,EAAC,eAAc,0CAAyC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,6PAA4P,aAAY,IAAG,QAAO,SAAQ,EAAC,GAAE,SAAQ,eAAc,QAAO,SAAQ,GAAE,EAAC,eAAc,sCAAqC,cAAa,EAAC,SAAQ,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,WAAU,EAAC,eAAc,iBAAgB,QAAO,SAAQ,GAAE,UAAS,EAAC,eAAc,WAAU,QAAO,UAAS,GAAE,aAAY,EAAC,eAAc,cAAa,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,eAAc,QAAO,UAAS,GAAE,cAAa,EAAC,eAAc,eAAc,QAAO,UAAS,GAAE,SAAQ,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,6PAA4P,aAAY,IAAG,QAAO,SAAQ,GAAE,SAAQ,EAAC,eAAc,UAAS,QAAO,UAAS,EAAC,GAAE,SAAQ,aAAY,QAAO,SAAQ,CAAC,GAAE,QAAO,SAAQ,GAAE,MAAK,EAAC,eAAc,+GAA8G,QAAO,CAAC,UAAS,UAAS,QAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,2DAA0D,QAAO,CAAC,SAAQ,UAAS,SAAQ,gBAAe,OAAM,cAAa,QAAO,cAAa,eAAc,qBAAoB,oBAAmB,UAAS,MAAM,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,qFAAoF,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAK,MAAM,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,gBAAe,eAAc,YAAY,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,eAAc,gBAAe,YAAY,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EACh03C,EAAC,WAAU,sBAAqB,eAAc,CAAC,OAAM,gBAAgB,GAAE,SAAQ,OAAM,eAAc,iOAAgO,eAAc,EAAC,cAAa,EAAC,gBAAe,EAAC,eAAc,qBAAoB,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,sPAAqP,QAAO,UAAS,EAAC,GAAE,YAAW,CAAC,cAAc,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,cAAc,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EAC12B,EAAC,WAAU,gBAAe,eAAc,CAAC,OAAM,UAAU,GAAE,SAAQ,OAAM,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,gBAAe,EAAC,eAAc,qBAAoB,QAAO,SAAQ,GAAE,YAAW,EAAC,eAAc,aAAY,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,gBAAe,UAAU,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,gBAAe,UAAU,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EACjb,EAAC,WAAU,eAAc,eAAc,CAAC,OAAM,SAAS,GAAE,SAAQ,OAAM,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,gBAAe,EAAC,eAAc,qBAAoB,QAAO,SAAQ,GAAE,WAAU,EAAC,eAAc,qBAAoB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,gBAAe,SAAS,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,gBAAe,SAAS,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EACpb,EAAC,WAAU,iBAAgB,eAAc,CAAC,OAAM,WAAW,GAAE,SAAQ,OAAM,eAAc,ibAAgb,eAAc,EAAC,eAAc,+bAA8b,cAAa,EAAC,gBAAe,EAAC,eAAc,qBAAoB,QAAO,SAAQ,GAAE,aAAY,EAAC,eAAc,kGAAiG,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,gBAAe,WAAW,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,gBAAe,WAAW,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EACp4C,EAAC,WAAU,uBAAsB,eAAc,CAAC,OAAM,iBAAiB,GAAE,SAAQ,OAAM,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,gBAAe,EAAC,eAAc,qBAAoB,QAAO,SAAQ,GAAE,kBAAiB,EAAC,eAAc,oBAAmB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,gBAAe,gBAAgB,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,gBAAe,gBAAgB,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EACxd,EAAC,WAAU,kBAAiB,eAAc,CAAC,OAAM,YAAY,GAAE,SAAQ,OAAM,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,gBAAe,EAAC,eAAc,qBAAoB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,cAAc,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,cAAc,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EACxW,EAAC,WAAU,iBAAgB,eAAc,CAAC,OAAM,WAAW,GAAE,SAAQ,OAAM,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,gBAAe,EAAC,eAAc,qBAAoB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,cAAc,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,cAAc,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EACtW,EAAC,WAAU,yBAAwB,eAAc,CAAC,OAAM,mBAAmB,GAAE,SAAQ,OAAM,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,gBAAe,EAAC,eAAc,qBAAoB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,cAAc,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,cAAc,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EACtX,EAAC,WAAU,mBAAkB,eAAc,CAAC,OAAM,aAAa,GAAE,SAAQ,OAAM,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,gBAAe,EAAC,eAAc,qBAAoB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,cAAc,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,cAAc,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EAC1W,EAAC,WAAU,kBAAiB,eAAc,CAAC,cAAa,KAAK,GAAE,SAAQ,cAAa,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,mBAAkB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,MAAM,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EACrV,EAAC,WAAU,gBAAe,eAAc,CAAC,YAAW,KAAK,GAAE,SAAQ,YAAW,eAAc,6WAAmV,eAAc,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,iBAAgB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,MAAM,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EAC7pB,EAAC,WAAU,eAAc,eAAc,CAAC,WAAU,KAAK,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,gBAAe,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,MAAM,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EACzU,EAAC,WAAU,eAAc,eAAc,CAAC,WAAU,KAAK,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,gBAAe,EAAC,eAAc,iBAAgB,QAAO,SAAQ,GAAE,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,EAAC,GAAE,YAAW,CAAC,gBAAe,eAAe,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,gBAAe,eAAe,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EACpc,EAAC,WAAU,iBAAgB,eAAc,CAAC,aAAY,KAAK,GAAE,SAAQ,aAAY,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,kBAAiB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,MAAM,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EACjV,EAAC,WAAU,qBAAoB,eAAc,CAAC,SAAQ,OAAM,mBAAmB,GAAE,SAAQ,WAAU,eAAc,8FAA6F,eAAc,EAAC,wBAAuB,OAAM,cAAa,CAAC,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EACzY,EAAC,WAAU,oBAAmB,eAAc,CAAC,eAAc,MAAM,GAAE,SAAQ,cAAa,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,eAAc,EAAC,eAAc,gBAAe,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,aAAa,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,aAAa,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EAC3W,EAAC,WAAU,kBAAiB,eAAc,CAAC,aAAY,MAAM,GAAE,SAAQ,YAAW,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,cAAa,EAAC,eAAc,wBAAuB,QAAO,SAAQ,GAAE,SAAQ,EAAC,eAAc,yCAAwC,QAAO,UAAS,GAAE,eAAc,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,KAAI,EAAC,eAAc,0GAAyG,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,0FAAyF,QAAO,CAAC,OAAM,YAAW,WAAU,WAAU,MAAM,GAAE,QAAO,SAAQ,EAAC,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EACpxB,EAAC,WAAU,gBAAe,eAAc,CAAC,WAAU,MAAM,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,eAAc,EAAC,eAAc,gBAAe,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,aAAa,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,aAAa,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EAChW,EAAC,WAAU,iBAAgB,eAAc,CAAC,YAAW,MAAM,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,yCAAwC,QAAO,UAAS,GAAE,KAAI,EAAC,eAAc,4BAA2B,QAAO,SAAQ,GAAE,iBAAgB,EAAC,eAAc,2BAA0B,QAAO,SAAQ,EAAC,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EACvd,EAAC,WAAU,cAAa,eAAc,CAAC,SAAQ,MAAM,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,CAAC,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EACxP,EAAC,WAAU,iBAAgB,eAAc,CAAC,YAAW,MAAM,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,gBAAe,EAAC,eAAc,iBAAgB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,cAAc,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,cAAc,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EACtW,EAAC,WAAU,mBAAkB,eAAc,CAAC,cAAa,MAAM,GAAE,SAAQ,aAAY,eAAc,IAAG,eAAc,EAAC,cAAa,CAAC,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EACpQ,EAAC,WAAU,4BAA2B,eAAc,CAAC,YAAW,iBAAiB,GAAE,SAAQ,YAAW,eAAc,kKAAiK,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,WAAU,SAAQ,EAAC,cAAa,EAAC,YAAW,EAAC,eAAc,kUAAgL,QAAO,SAAQ,GAAE,aAAY,EAAC,eAAc,gDAA+C,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,iBAAgB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,QAAO,UAAU,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EACx7B,EAAC,WAAU,8BAA6B,eAAc,CAAC,YAAW,mBAAmB,GAAE,SAAQ,YAAW,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,uBAAsB,SAAQ,EAAC,cAAa,EAAC,WAAU,EAAC,eAAc,yBAAwB,QAAO,SAAQ,GAAE,gBAAe,EAAC,eAAc,wBAAuB,QAAO,SAAQ,GAAE,UAAS,EAAC,eAAc,qBAAoB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,gBAAe,QAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EACxoB,EAAC,WAAU,kBAAiB,eAAc,CAAC,aAAY,MAAM,GAAE,SAAQ,YAAW,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,oBAAmB,EAAC,eAAc,yDAAwD,aAAY,KAAI,aAAY,GAAE,WAAU,0BAAyB,QAAO,SAAQ,GAAE,SAAQ,EAAC,eAAc,SAAQ,SAAQ,EAAC,cAAa,EAAC,iBAAgB,EAAC,eAAc,8CAAwC,QAAO,SAAQ,GAAE,qBAAoB,EAAC,eAAc,8DAAwD,QAAO,SAAQ,GAAE,uBAAsB,EAAC,eAAc,sDAAqD,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,iBAAgB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,MAAK,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EAC75B,EAAC,WAAU,gBAAe,eAAc,CAAC,WAAU,MAAM,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,SAAQ,SAAQ,EAAC,cAAa,EAAC,uBAAsB,EAAC,eAAc,8CAAwC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,eAAc,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,MAAK,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EACzhB,EAAC,WAAU,iBAAgB,eAAc,CAAC,YAAW,MAAM,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,SAAQ,SAAQ,EAAC,cAAa,EAAC,uBAAsB,EAAC,eAAc,4DAA2D,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,gBAAe,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,QAAO,qBAAqB,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,MAAK,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EACrkB,EAAC,WAAU,wBAAuB,eAAc,CAAC,SAAQ,OAAM,sBAAsB,GAAE,SAAQ,cAAa,eAAc,2VAA0V,eAAc,EAAC,cAAa,EAAC,YAAW,EAAC,eAAc,2EAAwB,QAAO,UAAS,GAAE,WAAU,EAAC,eAAc,ofAA4M,QAAO,CAAC,YAAW,mBAAkB,mBAAkB,mBAAkB,mBAAmB,GAAE,QAAO,SAAQ,GAAE,aAAY,EAAC,eAAc,0WAAmS,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,4CAAuB,QAAO,UAAS,EAAC,GAAE,YAAW,CAAC,SAAS,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,SAAS,GAAE,eAAc,iBAAgB,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EACr8C,EAAC,WAAU,oBAAmB,eAAc,CAAC,YAAW,SAAS,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,YAAW,SAAQ,EAAC,cAAa,EAAC,gBAAe,EAAC,eAAc,iBAAgB,QAAO,SAAQ,GAAE,iBAAgB,EAAC,eAAc,6BAA4B,QAAO,UAAS,EAAC,GAAE,YAAW,CAAC,gBAAe,eAAe,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,MAAK,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EACrjB,EAAC,WAAU,oBAAmB,eAAc,CAAC,aAAY,QAAQ,GAAE,SAAQ,YAAW,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,gEAAuB,QAAO,UAAS,GAAE,UAAS,EAAC,eAAc,gEAAuB,QAAO,UAAS,GAAE,eAAc,EAAC,eAAc,2EAAmB,QAAO,SAAQ,GAAE,KAAI,EAAC,eAAc,mCAAS,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,0FAAyF,QAAO,CAAC,OAAM,YAAW,WAAU,WAAU,MAAM,GAAE,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,GAAG,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,GAAG,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EAC5rB,EAAC,WAAU,uBAAsB,eAAc,CAAC,aAAY,WAAW,GAAE,SAAQ,YAAW,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,kBAAiB,SAAQ,EAAC,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,MAAK,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EAC3X,EAAC,WAAU,qBAAoB,eAAc,CAAC,WAAU,WAAW,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,gBAAe,SAAQ,EAAC,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,MAAK,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EACpX,EAAC,WAAU,sBAAqB,eAAc,CAAC,YAAW,WAAW,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,iBAAgB,SAAQ,EAAC,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,MAAK,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EACvX,EAAC,WAAU,wBAAuB,eAAc,CAAC,cAAa,WAAW,GAAE,SAAQ,aAAY,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,mBAAkB,SAAQ,EAAC,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,MAAK,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EAC/X,EAAC,WAAU,oBAAmB,eAAc,CAAC,aAAY,QAAQ,GAAE,SAAQ,YAAW,eAAc,uJAAsJ,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,WAAU,SAAQ,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,yXAAmN,QAAO,SAAQ,GAAE,SAAQ,EAAC,eAAc,aAAY,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,oMAAmM,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,iBAAgB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EAC3nC,EAAC,WAAU,kBAAiB,eAAc,CAAC,WAAU,QAAQ,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,WAAU,SAAQ,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,YAAW,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,eAAc,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,QAAO,MAAM,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EAC3f,EAAC,WAAU,mBAAkB,eAAc,CAAC,YAAW,QAAQ,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,WAAU,SAAQ,EAAC,cAAa,EAAC,eAAc,EAAC,eAAc,mBAAkB,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,YAAW,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,gBAAe,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EACvjB,EAAC,WAAU,qBAAoB,eAAc,CAAC,cAAa,QAAQ,GAAE,SAAQ,aAAY,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,WAAU,SAAQ,EAAC,cAAa,EAAC,eAAc,EAAC,eAAc,mBAAkB,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,YAAW,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,kBAAiB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAAA,EAC/jB,EAAC,WAAU,sBAAqB,eAAc,CAAC,SAAQ,OAAM,oBAAoB,GAAE,SAAQ,cAAa,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,2BAA0B,SAAQ,EAAC,cAAa,EAAC,eAAc,EAAC,eAAc,aAAY,QAAO,SAAQ,GAAE,gBAAe,EAAC,eAAc,wBAAuB,QAAO,SAAQ,GAAE,YAAW,EAAC,eAAc,sBAAqB,QAAO,SAAQ,GAAE,aAAY,EAAC,eAAc,iBAAgB,QAAO,UAAS,GAAE,cAAa,EAAC,eAAc,0EAAyE,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,gBAAe,YAAW,YAAY,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,iBAAgB,eAAc,OAAM,iBAAgB,QAAO,cAAa,mBAAkB;AAC70B;;;AC9DO,IAAMC,kBAAiB;AAAA,EAC5B,EAAC,WAAU,kCAAiC,eAAc,CAAC,aAAY,QAAQ,GAAE,SAAQ,YAAW,eAAc,oJAAmJ,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,aAAY,SAAQ,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,yXAAmN,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,wBAAuB,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,SAAQ,EAAC,eAAc,kBAAiB,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,0EAAyE,QAAO,CAAC,OAAM,WAAU,YAAW,YAAW,MAAM,GAAE,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,0SAAyS,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,eAAc,QAAO,OAAO,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACx/C,EAAC,WAAU,gCAA+B,eAAc,CAAC,WAAU,QAAQ,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,WAAU,SAAQ,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,oBAAmB,EAAC,eAAc,sBAAqB,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,gBAAe,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,eAAc,MAAM,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAClmB,EAAC,WAAU,iCAAgC,eAAc,CAAC,YAAW,QAAQ,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,YAAW,SAAQ,EAAC,cAAa,EAAC,eAAc,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,sBAAqB,QAAO,SAAQ,GAAE,iBAAgB,EAAC,eAAc,4DAAsD,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACvrB,EAAC,WAAU,mCAAkC,eAAc,CAAC,cAAa,QAAQ,GAAE,SAAQ,aAAY,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,cAAa,SAAQ,EAAC,cAAa,EAAC,eAAc,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,kBAAiB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACzhB,EAAC,WAAU,oCAAmC,eAAc,CAAC,eAAc,QAAQ,GAAE,SAAQ,cAAa,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,oBAAmB,SAAQ,EAAC,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,MAAK,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAC1Y,EAAC,WAAU,kCAAiC,eAAc,CAAC,aAAY,QAAQ,GAAE,SAAQ,YAAW,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,kBAAiB,SAAQ,EAAC,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,MAAK,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAClY,EAAC,WAAU,gCAA+B,eAAc,CAAC,WAAU,QAAQ,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,gBAAe,SAAQ,EAAC,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,MAAK,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAC3X,EAAC,WAAU,iCAAgC,eAAc,CAAC,YAAW,QAAQ,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,iBAAgB,SAAQ,EAAC,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,MAAK,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAC9X,EAAC,WAAU,mCAAkC,eAAc,CAAC,cAAa,QAAQ,GAAE,SAAQ,aAAY,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,mBAAkB,SAAQ,EAAC,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,MAAK,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACtY,EAAC,WAAU,uCAAsC,eAAc,CAAC,SAAQ,OAAM,uBAAuB,GAAE,SAAQ,WAAU,eAAc,gQAA+P,eAAc,EAAC,cAAa,EAAC,eAAc,EAAC,eAAc,4BAA2B,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,SAAQ,EAAC,eAAc,mBAAkB,SAAQ,EAAC,cAAa,EAAC,UAAS,EAAC,eAAc,kBAAiB,QAAO,CAAC,UAAS,UAAS,QAAQ,GAAE,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,YAAW,EAAC,eAAc,UAAS,QAAO,SAAQ,GAAE,SAAQ,EAAC,eAAc,cAAa,QAAO,SAAQ,GAAE,aAAY,EAAC,eAAc,cAAa,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,gBAAe,QAAO,UAAS,GAAE,UAAS,EAAC,eAAc,UAAS,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,8BAA6B,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,QAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,GAAE,UAAS,EAAC,eAAc,oBAAmB,SAAQ,EAAC,cAAa,EAAC,UAAS,EAAC,eAAc,kBAAiB,QAAO,CAAC,UAAS,UAAS,QAAQ,GAAE,QAAO,SAAQ,GAAE,aAAY,EAAC,eAAc,mBAAkB,QAAO,UAAS,GAAE,SAAQ,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,YAAW,EAAC,eAAc,aAAY,QAAO,SAAQ,GAAE,qBAAoB,EAAC,eAAc,uBAAsB,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,cAAa,QAAO,SAAQ,GAAE,mBAAkB,EAAC,eAAc,qBAAoB,QAAO,SAAQ,GAAE,aAAY,EAAC,eAAc,cAAa,QAAO,UAAS,GAAE,QAAO,EAAC,eAAc,8BAA6B,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,QAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,GAAE,SAAQ,EAAC,eAAc,mBAAkB,SAAQ,EAAC,cAAa,EAAC,UAAS,EAAC,eAAc,kBAAiB,QAAO,CAAC,UAAS,UAAS,QAAQ,GAAE,QAAO,SAAQ,GAAE,aAAY,EAAC,eAAc,cAAa,QAAO,SAAQ,GAAE,aAAY,EAAC,eAAc,8CAA6C,QAAO,SAAQ,GAAE,UAAS,EAAC,eAAc,UAAS,QAAO,SAAQ,GAAE,SAAQ,EAAC,eAAc,4FAA2F,QAAO,CAAC,QAAO,aAAY,WAAU,WAAU,YAAW,UAAS,SAAQ,gBAAe,OAAM,WAAU,YAAW,eAAe,GAAE,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,oEAAmE,aAAY,KAAK,QAAO,SAAQ,GAAE,aAAY,EAAC,eAAc,cAAa,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,aAAY,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,mDAAkD,QAAO,SAAQ,GAAE,SAAQ,EAAC,eAAc,SAAQ,QAAO,SAAQ,GAAE,KAAI,EAAC,eAAc,KAAI,QAAO,SAAQ,GAAE,KAAI,EAAC,eAAc,KAAI,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,QAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,eAAc,aAAa,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,eAAc,aAAa,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAC1vG,EAAC,WAAU,kCAAiC,eAAc,CAAC,SAAQ,OAAM,kBAAkB,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,YAAW,EAAC,eAAc,aAAY,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,UAAU,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,UAAU,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACrX,EAAC,WAAU,mCAAkC,eAAc,CAAC,SAAQ,OAAM,mBAAmB,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,aAAY,EAAC,eAAc,cAAa,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,WAAW,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,WAAW,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAC3X,EAAC,WAAU,kCAAiC,eAAc,CAAC,SAAQ,OAAM,kBAAkB,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,YAAW,EAAC,eAAc,aAAY,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,UAAU,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,UAAU,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACrX,EAAC,WAAU,kDAAiD,eAAc,CAAC,SAAQ,OAAM,kCAAkC,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,CAAC,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAC7T,EAAC,WAAU,oCAAmC,eAAc,CAAC,SAAQ,OAAM,oBAAoB,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,eAAc,EAAC,eAAc,yBAAwB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,aAAa,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,aAAa,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAC9Y,EAAC,WAAU,qCAAoC,eAAc,CAAC,SAAQ,OAAM,qBAAqB,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,eAAc,EAAC,eAAc,yBAAwB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,aAAa,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,aAAa,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAChZ,EAAC,WAAU,oCAAmC,eAAc,CAAC,SAAQ,OAAM,oBAAoB,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,eAAc,EAAC,eAAc,yBAAwB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,aAAa,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,aAAa,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAC9Y,EAAC,WAAU,2CAA0C,eAAc,CAAC,SAAQ,OAAM,2BAA2B,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,kBAAiB,EAAC,eAAc,wEAAuE,QAAO,UAAS,GAAE,eAAc,EAAC,eAAc,qBAAoB,QAAO,UAAS,GAAE,gBAAe,EAAC,eAAc,sBAAqB,QAAO,UAAS,GAAE,UAAS,EAAC,eAAc,mBAAkB,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,oBAAmB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,QAAO,QAAQ,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,UAAS,MAAM,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAChtB,EAAC,WAAU,mDAAkD,eAAc,CAAC,SAAQ,OAAM,mCAAmC,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,gBAAe,EAAC,eAAc,sCAAqC,QAAO,SAAQ,GAAE,UAAS,EAAC,eAAc,0EAAoE,QAAO,CAAC,QAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,oBAAmB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,QAAO,QAAQ,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,UAAS,MAAM,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACvnB,EAAC,WAAU,gCAA+B,eAAc,CAAC,SAAQ,OAAM,gBAAgB,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,cAAa,EAAC,eAAc,qBAAoB,QAAO,CAAC,WAAU,UAAS,UAAU,GAAE,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,gBAAe,SAAQ,EAAC,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,cAAa,aAAa,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,cAAa,aAAa,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAC5hB,EAAC,WAAU,+BAA8B,eAAc,CAAC,SAAQ,OAAM,eAAe,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,cAAa,EAAC,eAAc,qBAAoB,QAAO,CAAC,WAAU,UAAS,UAAU,GAAE,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,gBAAe,SAAQ,EAAC,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,cAAa,aAAa,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,cAAa,aAAa,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAC1hB,EAAC,WAAU,mCAAkC,eAAc,CAAC,OAAM,eAAe,GAAE,SAAQ,OAAM,eAAc,syFAAmnG,eAAc,EAAC,cAAa,EAAC,oBAAmB,EAAC,eAAc,gFAA+E,QAAO,UAAS,GAAE,eAAc,EAAC,eAAc,4BAA2B,QAAO,SAAQ,GAAE,gBAAe,EAAC,eAAc,qBAAoB,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,0CAAyC,SAAQ,EAAC,eAAc,4LAA2L,iBAAgB,EAAC,gBAAe,OAAM,GAAE,SAAQ,CAAC,EAAC,SAAQ,CAAC,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,SAAQ,UAAS,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,uCAAsC,cAAa,EAAC,SAAQ,EAAC,eAAc,kBAAiB,QAAO,SAAQ,GAAE,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,gBAAe,EAAC,eAAc,iBAAgB,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,oCAAmC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,4MAA2M,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,SAAQ,cAAa,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,GAAE,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,QAAO,CAAC,UAAS,QAAQ,GAAE,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,CAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,CAAC,GAAE,cAAa,EAAC,QAAO,EAAC,eAAc,uCAAsC,cAAa,EAAC,SAAQ,EAAC,eAAc,kBAAiB,QAAO,SAAQ,GAAE,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,gBAAe,EAAC,eAAc,iBAAgB,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,oCAAmC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,4MAA2M,QAAO,SAAQ,EAAC,GAAE,SAAQ,cAAa,QAAO,SAAQ,GAAE,MAAK,EAAC,eAAc,aAAY,QAAO,CAAC,UAAS,UAAS,QAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,SAAQ,SAAQ,eAAc,qCAAoC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,kCAAiC,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAK,MAAM,GAAE,SAAQ,mBAAkB,QAAO,SAAQ,GAAE,EAAC,SAAQ,CAAC,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,SAAQ,UAAS,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,wCAAuC,cAAa,EAAC,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,SAAQ,GAAE,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,gBAAe,EAAC,eAAc,wBAAuB,QAAO,UAAS,GAAE,eAAc,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,SAAQ,EAAC,eAAc,qBAAoB,QAAO,UAAS,GAAE,aAAY,EAAC,eAAc,gBAAe,QAAO,UAAS,GAAE,QAAO,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,6GAA4G,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,oEAAmE,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,4MAA2M,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,YAAY,GAAE,SAAQ,eAAc,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,GAAE,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,QAAO,CAAC,UAAS,QAAQ,GAAE,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,CAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,CAAC,GAAE,cAAa,EAAC,QAAO,EAAC,eAAc,wCAAuC,cAAa,EAAC,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,SAAQ,GAAE,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,gBAAe,EAAC,eAAc,wBAAuB,QAAO,UAAS,GAAE,eAAc,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,SAAQ,EAAC,eAAc,qBAAoB,QAAO,UAAS,GAAE,aAAY,EAAC,eAAc,gBAAe,QAAO,UAAS,GAAE,QAAO,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,6GAA4G,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,oEAAmE,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,4MAA2M,QAAO,SAAQ,EAAC,GAAE,SAAQ,eAAc,QAAO,SAAQ,GAAE,MAAK,EAAC,eAAc,aAAY,QAAO,CAAC,UAAS,UAAS,QAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,SAAQ,UAAS,eAAc,sCAAqC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,kCAAiC,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAK,MAAM,GAAE,SAAQ,oBAAmB,QAAO,SAAQ,GAAE,EAAC,SAAQ,CAAC,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,SAAQ,UAAS,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,uCAAsC,cAAa,EAAC,SAAQ,EAAC,eAAc,2BAA0B,QAAO,UAAS,GAAE,aAAY,EAAC,eAAc,sBAAqB,QAAO,UAAS,GAAE,QAAO,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,2CAA0C,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,4MAA2M,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,YAAY,GAAE,SAAQ,cAAa,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,GAAE,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,QAAO,CAAC,UAAS,QAAQ,GAAE,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,CAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,CAAC,GAAE,cAAa,EAAC,QAAO,EAAC,eAAc,uCAAsC,cAAa,EAAC,SAAQ,EAAC,eAAc,2BAA0B,QAAO,UAAS,GAAE,aAAY,EAAC,eAAc,sBAAqB,QAAO,UAAS,GAAE,QAAO,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,2CAA0C,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,4MAA2M,QAAO,SAAQ,EAAC,GAAE,SAAQ,cAAa,QAAO,SAAQ,GAAE,MAAK,EAAC,eAAc,aAAY,QAAO,CAAC,UAAS,UAAS,QAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,SAAQ,SAAQ,eAAc,qCAAoC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,kCAAiC,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAK,MAAM,GAAE,SAAQ,mBAAkB,QAAO,SAAQ,GAAE,EAAC,SAAQ,CAAC,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,SAAQ,UAAS,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,8CAA6C,cAAa,EAAC,eAAc,EAAC,eAAc,qCAAoC,QAAO,SAAQ,GAAE,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,cAAa,EAAC,eAAc,oCAAmC,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,wCAAuC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,4MAA2M,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,cAAa,aAAa,GAAE,SAAQ,qBAAoB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,GAAE,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,QAAO,CAAC,UAAS,QAAQ,GAAE,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,CAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,CAAC,GAAE,cAAa,EAAC,QAAO,EAAC,eAAc,8CAA6C,cAAa,EAAC,eAAc,EAAC,eAAc,qCAAoC,QAAO,SAAQ,GAAE,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,cAAa,EAAC,eAAc,oCAAmC,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,wCAAuC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,4MAA2M,QAAO,SAAQ,EAAC,GAAE,SAAQ,qBAAoB,QAAO,SAAQ,GAAE,MAAK,EAAC,eAAc,aAAY,QAAO,CAAC,UAAS,UAAS,QAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,SAAQ,gBAAe,eAAc,4CAA2C,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,kCAAiC,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAK,MAAM,GAAE,SAAQ,0BAAyB,QAAO,SAAQ,GAAE,EAAC,SAAQ,CAAC,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,SAAQ,UAAS,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,qCAAoC,cAAa,EAAC,mBAAkB,EAAC,eAAc,2CAA0C,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,mBAAkB,QAAO,SAAQ,GAAE,aAAY,EAAC,eAAc,qBAAoB,QAAO,SAAQ,GAAE,aAAY,EAAC,eAAc,qBAAoB,QAAO,SAAQ,GAAE,gBAAe,EAAC,eAAc,wEAAuE,QAAO,CAAC,KAAI,KAAI,GAAG,GAAE,QAAO,SAAQ,GAAE,iBAAgB,EAAC,eAAc,2CAA0C,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,4MAA2M,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,mBAAkB,iBAAgB,cAAc,GAAE,SAAQ,YAAW,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,GAAE,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,QAAO,CAAC,UAAS,QAAQ,GAAE,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,CAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,CAAC,GAAE,cAAa,EAAC,QAAO,EAAC,eAAc,qCAAoC,cAAa,EAAC,mBAAkB,EAAC,eAAc,2CAA0C,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,mBAAkB,QAAO,SAAQ,GAAE,aAAY,EAAC,eAAc,qBAAoB,QAAO,SAAQ,GAAE,aAAY,EAAC,eAAc,qBAAoB,QAAO,SAAQ,GAAE,gBAAe,EAAC,eAAc,wEAAuE,QAAO,CAAC,KAAI,KAAI,GAAG,GAAE,QAAO,SAAQ,GAAE,iBAAgB,EAAC,eAAc,2CAA0C,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,4MAA2M,QAAO,SAAQ,EAAC,GAAE,SAAQ,YAAW,QAAO,SAAQ,GAAE,MAAK,EAAC,eAAc,aAAY,QAAO,CAAC,UAAS,UAAS,QAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,SAAQ,OAAM,eAAc,mCAAkC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,kCAAiC,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAK,MAAM,GAAE,SAAQ,iBAAgB,QAAO,SAAQ,GAAE,EAAC,SAAQ,CAAC,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,SAAQ,UAAS,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,4CAA2C,cAAa,EAAC,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,oBAAmB,EAAC,eAAc,4CAA2C,QAAO,SAAQ,GAAE,YAAW,EAAC,eAAc,0FAAyF,QAAO,SAAQ,GAAE,kBAAiB,EAAC,eAAc,4CAA2C,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,4MAA2M,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,YAAW,oBAAmB,gBAAgB,GAAE,SAAQ,mBAAkB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,GAAE,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,QAAO,CAAC,UAAS,QAAQ,GAAE,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,CAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,CAAC,GAAE,cAAa,EAAC,QAAO,EAAC,eAAc,4CAA2C,cAAa,EAAC,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,oBAAmB,EAAC,eAAc,4CAA2C,QAAO,SAAQ,GAAE,YAAW,EAAC,eAAc,0FAAyF,QAAO,SAAQ,GAAE,kBAAiB,EAAC,eAAc,4CAA2C,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,4MAA2M,QAAO,SAAQ,EAAC,GAAE,SAAQ,mBAAkB,QAAO,SAAQ,GAAE,MAAK,EAAC,eAAc,aAAY,QAAO,CAAC,UAAS,UAAS,QAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,SAAQ,cAAa,eAAc,0CAAyC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,kCAAiC,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAK,MAAM,GAAE,SAAQ,wBAAuB,QAAO,SAAQ,GAAE,EAAC,SAAQ,CAAC,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,SAAQ,UAAS,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,sCAAqC,cAAa,EAAC,QAAO,EAAC,eAAc,cAAa,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,cAAa,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,4MAA2M,QAAO,SAAQ,EAAC,GAAE,SAAQ,aAAY,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,GAAE,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,QAAO,CAAC,UAAS,QAAQ,GAAE,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,CAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,CAAC,GAAE,cAAa,EAAC,QAAO,EAAC,eAAc,sCAAqC,cAAa,EAAC,QAAO,EAAC,eAAc,cAAa,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,cAAa,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,4MAA2M,QAAO,SAAQ,EAAC,GAAE,SAAQ,aAAY,QAAO,SAAQ,GAAE,MAAK,EAAC,eAAc,aAAY,QAAO,CAAC,UAAS,UAAS,QAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,SAAQ,QAAO,eAAc,oCAAmC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,kCAAiC,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAK,MAAM,GAAE,SAAQ,kBAAiB,QAAO,SAAQ,GAAE,EAAC,SAAQ,CAAC,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,SAAQ,UAAS,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,4CAA2C,cAAa,EAAC,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,aAAY,EAAC,eAAc,6FAA4F,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,oBAAmB,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,4MAA2M,QAAO,SAAQ,GAAE,SAAQ,EAAC,eAAc,2FAA0F,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,WAAW,GAAE,SAAQ,mBAAkB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,GAAE,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,QAAO,CAAC,UAAS,QAAQ,GAAE,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,CAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,CAAC,GAAE,cAAa,EAAC,QAAO,EAAC,eAAc,4CAA2C,cAAa,EAAC,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,aAAY,EAAC,eAAc,6FAA4F,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,oBAAmB,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,4MAA2M,QAAO,SAAQ,GAAE,SAAQ,EAAC,eAAc,2FAA0F,QAAO,SAAQ,EAAC,GAAE,SAAQ,mBAAkB,QAAO,SAAQ,GAAE,MAAK,EAAC,eAAc,aAAY,QAAO,CAAC,UAAS,UAAS,QAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,SAAQ,cAAa,eAAc,0CAAyC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,kCAAiC,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAK,MAAM,GAAE,SAAQ,wBAAuB,QAAO,SAAQ,GAAE,EAAC,SAAQ,CAAC,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,SAAQ,UAAS,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,6CAA4C,cAAa,EAAC,SAAQ,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,qBAAoB,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,4MAA2M,QAAO,SAAQ,EAAC,GAAE,SAAQ,oBAAmB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,GAAE,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,QAAO,CAAC,UAAS,QAAQ,GAAE,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,CAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,CAAC,GAAE,cAAa,EAAC,QAAO,EAAC,eAAc,6CAA4C,cAAa,EAAC,SAAQ,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,qBAAoB,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,4MAA2M,QAAO,SAAQ,EAAC,GAAE,SAAQ,oBAAmB,QAAO,SAAQ,GAAE,MAAK,EAAC,eAAc,aAAY,QAAO,CAAC,UAAS,UAAS,QAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,SAAQ,eAAc,eAAc,2CAA0C,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,kCAAiC,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAK,MAAM,GAAE,SAAQ,yBAAwB,QAAO,SAAQ,GAAE,EAAC,SAAQ,CAAC,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,SAAQ,UAAS,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,mDAAkD,cAAa,EAAC,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,cAAa,EAAC,eAAc,0CAAyC,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,sBAAqB,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,oCAAmC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,4MAA2M,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,cAAa,YAAY,GAAE,SAAQ,0BAAyB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,GAAE,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,QAAO,CAAC,UAAS,QAAQ,GAAE,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,CAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,CAAC,GAAE,cAAa,EAAC,QAAO,EAAC,eAAc,mDAAkD,cAAa,EAAC,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,cAAa,EAAC,eAAc,0CAAyC,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,sBAAqB,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,oCAAmC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,4MAA2M,QAAO,SAAQ,EAAC,GAAE,SAAQ,0BAAyB,QAAO,SAAQ,GAAE,MAAK,EAAC,eAAc,aAAY,QAAO,CAAC,UAAS,UAAS,QAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,SAAQ,qBAAoB,eAAc,iDAAgD,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,kCAAiC,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAK,MAAM,GAAE,SAAQ,+BAA8B,QAAO,SAAQ,GAAE,EAAC,SAAQ,CAAC,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,SAAQ,UAAS,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,kDAAiD,cAAa,EAAC,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,cAAa,EAAC,eAAc,0CAAyC,QAAO,SAAQ,GAAE,aAAY,EAAC,eAAc,mCAAkC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,4MAA2M,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,cAAa,WAAW,GAAE,SAAQ,yBAAwB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,GAAE,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,QAAO,CAAC,UAAS,QAAQ,GAAE,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,CAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,CAAC,GAAE,cAAa,EAAC,QAAO,EAAC,eAAc,kDAAiD,cAAa,EAAC,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,cAAa,EAAC,eAAc,0CAAyC,QAAO,SAAQ,GAAE,aAAY,EAAC,eAAc,mCAAkC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,4MAA2M,QAAO,SAAQ,EAAC,GAAE,SAAQ,yBAAwB,QAAO,SAAQ,GAAE,MAAK,EAAC,eAAc,aAAY,QAAO,CAAC,UAAS,UAAS,QAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,SAAQ,oBAAmB,eAAc,gDAA+C,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,kCAAiC,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAK,MAAM,GAAE,SAAQ,8BAA6B,QAAO,SAAQ,GAAE,EAAC,SAAQ,CAAC,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,SAAQ,UAAS,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,wCAAuC,cAAa,EAAC,mBAAkB,EAAC,eAAc,wCAAuC,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,wBAAuB,QAAO,UAAS,GAAE,QAAO,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,gBAAe,EAAC,eAAc,uCAAsC,QAAO,SAAQ,GAAE,mBAAkB,EAAC,eAAc,0CAAyC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,4MAA2M,QAAO,SAAQ,EAAC,GAAE,SAAQ,eAAc,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,GAAE,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,QAAO,CAAC,UAAS,QAAQ,GAAE,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,CAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,CAAC,GAAE,cAAa,EAAC,QAAO,EAAC,eAAc,wCAAuC,cAAa,EAAC,mBAAkB,EAAC,eAAc,wCAAuC,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,wBAAuB,QAAO,UAAS,GAAE,QAAO,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,gBAAe,EAAC,eAAc,uCAAsC,QAAO,SAAQ,GAAE,mBAAkB,EAAC,eAAc,0CAAyC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,4MAA2M,QAAO,SAAQ,EAAC,GAAE,SAAQ,eAAc,QAAO,SAAQ,GAAE,MAAK,EAAC,eAAc,aAAY,QAAO,CAAC,UAAS,UAAS,QAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,SAAQ,UAAS,eAAc,sCAAqC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,kCAAiC,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAK,MAAM,GAAE,SAAQ,oBAAmB,QAAO,SAAQ,GAAE,EAAC,SAAQ,CAAC,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,SAAQ,UAAS,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,sCAAqC,cAAa,EAAC,SAAQ,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,WAAU,EAAC,eAAc,iBAAgB,QAAO,SAAQ,GAAE,UAAS,EAAC,eAAc,WAAU,QAAO,UAAS,GAAE,aAAY,EAAC,eAAc,cAAa,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,eAAc,QAAO,UAAS,GAAE,cAAa,EAAC,eAAc,eAAc,QAAO,UAAS,GAAE,SAAQ,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,4MAA2M,QAAO,SAAQ,GAAE,SAAQ,EAAC,eAAc,UAAS,QAAO,UAAS,EAAC,GAAE,SAAQ,aAAY,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,GAAE,EAAC,MAAK,EAAC,cAAa,EAAC,MAAK,EAAC,QAAO,CAAC,UAAS,QAAQ,GAAE,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,cAAa,CAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,EAAC,CAAC,GAAE,cAAa,EAAC,QAAO,EAAC,eAAc,sCAAqC,cAAa,EAAC,SAAQ,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,WAAU,EAAC,eAAc,iBAAgB,QAAO,SAAQ,GAAE,UAAS,EAAC,eAAc,WAAU,QAAO,UAAS,GAAE,aAAY,EAAC,eAAc,cAAa,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,eAAc,QAAO,UAAS,GAAE,cAAa,EAAC,eAAc,eAAc,QAAO,UAAS,GAAE,SAAQ,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,4MAA2M,QAAO,SAAQ,GAAE,SAAQ,EAAC,eAAc,UAAS,QAAO,UAAS,EAAC,GAAE,SAAQ,aAAY,QAAO,SAAQ,GAAE,MAAK,EAAC,eAAc,aAAY,QAAO,CAAC,UAAS,UAAS,QAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,SAAQ,QAAO,eAAc,oCAAmC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,kCAAiC,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAK,MAAM,GAAE,SAAQ,kBAAiB,QAAO,SAAQ,CAAC,GAAE,cAAa,EAAC,QAAO,EAAC,eAAc,6JAA4J,SAAQ,CAAC,EAAC,eAAc,uCAAsC,cAAa,EAAC,SAAQ,EAAC,eAAc,kBAAiB,QAAO,SAAQ,GAAE,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,gBAAe,EAAC,eAAc,iBAAgB,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,oCAAmC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,4MAA2M,QAAO,SAAQ,EAAC,GAAE,SAAQ,cAAa,QAAO,SAAQ,GAAE,EAAC,eAAc,wCAAuC,cAAa,EAAC,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,SAAQ,GAAE,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,gBAAe,EAAC,eAAc,wBAAuB,QAAO,UAAS,GAAE,eAAc,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,SAAQ,EAAC,eAAc,qBAAoB,QAAO,UAAS,GAAE,aAAY,EAAC,eAAc,gBAAe,QAAO,UAAS,GAAE,QAAO,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,6GAA4G,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,oEAAmE,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,4MAA2M,QAAO,SAAQ,EAAC,GAAE,SAAQ,eAAc,QAAO,SAAQ,GAAE,EAAC,eAAc,uCAAsC,cAAa,EAAC,SAAQ,EAAC,eAAc,2BAA0B,QAAO,UAAS,GAAE,aAAY,EAAC,eAAc,sBAAqB,QAAO,UAAS,GAAE,QAAO,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,2CAA0C,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,4MAA2M,QAAO,SAAQ,EAAC,GAAE,SAAQ,cAAa,QAAO,SAAQ,GAAE,EAAC,eAAc,8CAA6C,cAAa,EAAC,eAAc,EAAC,eAAc,qCAAoC,QAAO,SAAQ,GAAE,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,cAAa,EAAC,eAAc,oCAAmC,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,wCAAuC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,4MAA2M,QAAO,SAAQ,EAAC,GAAE,SAAQ,qBAAoB,QAAO,SAAQ,GAAE,EAAC,eAAc,qCAAoC,cAAa,EAAC,mBAAkB,EAAC,eAAc,2CAA0C,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,mBAAkB,QAAO,SAAQ,GAAE,aAAY,EAAC,eAAc,qBAAoB,QAAO,SAAQ,GAAE,aAAY,EAAC,eAAc,qBAAoB,QAAO,SAAQ,GAAE,gBAAe,EAAC,eAAc,wEAAuE,QAAO,CAAC,KAAI,KAAI,GAAG,GAAE,QAAO,SAAQ,GAAE,iBAAgB,EAAC,eAAc,2CAA0C,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,4MAA2M,QAAO,SAAQ,EAAC,GAAE,SAAQ,YAAW,QAAO,SAAQ,GAAE,EAAC,eAAc,4CAA2C,cAAa,EAAC,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,oBAAmB,EAAC,eAAc,4CAA2C,QAAO,SAAQ,GAAE,YAAW,EAAC,eAAc,0FAAyF,QAAO,SAAQ,GAAE,kBAAiB,EAAC,eAAc,4CAA2C,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,4MAA2M,QAAO,SAAQ,EAAC,GAAE,SAAQ,mBAAkB,QAAO,SAAQ,GAAE,EAAC,eAAc,sCAAqC,cAAa,EAAC,QAAO,EAAC,eAAc,cAAa,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,cAAa,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,4MAA2M,QAAO,SAAQ,EAAC,GAAE,SAAQ,aAAY,QAAO,SAAQ,GAAE,EAAC,eAAc,4CAA2C,cAAa,EAAC,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,aAAY,EAAC,eAAc,6FAA4F,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,oBAAmB,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,4MAA2M,QAAO,SAAQ,GAAE,SAAQ,EAAC,eAAc,2FAA0F,QAAO,SAAQ,EAAC,GAAE,SAAQ,mBAAkB,QAAO,SAAQ,GAAE,EAAC,eAAc,6CAA4C,cAAa,EAAC,SAAQ,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,qBAAoB,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,4MAA2M,QAAO,SAAQ,EAAC,GAAE,SAAQ,oBAAmB,QAAO,SAAQ,GAAE,EAAC,eAAc,mDAAkD,cAAa,EAAC,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,cAAa,EAAC,eAAc,0CAAyC,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,sBAAqB,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,oCAAmC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,4MAA2M,QAAO,SAAQ,EAAC,GAAE,SAAQ,0BAAyB,QAAO,SAAQ,GAAE,EAAC,eAAc,kDAAiD,cAAa,EAAC,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,GAAE,cAAa,EAAC,eAAc,0CAAyC,QAAO,SAAQ,GAAE,aAAY,EAAC,eAAc,mCAAkC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,4MAA2M,QAAO,SAAQ,EAAC,GAAE,SAAQ,yBAAwB,QAAO,SAAQ,GAAE,EAAC,eAAc,wCAAuC,cAAa,EAAC,mBAAkB,EAAC,eAAc,wCAAuC,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,wBAAuB,QAAO,UAAS,GAAE,QAAO,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,gBAAe,EAAC,eAAc,uCAAsC,QAAO,SAAQ,GAAE,mBAAkB,EAAC,eAAc,0CAAyC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,4MAA2M,QAAO,SAAQ,EAAC,GAAE,SAAQ,eAAc,QAAO,SAAQ,GAAE,EAAC,eAAc,sCAAqC,cAAa,EAAC,SAAQ,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,WAAU,EAAC,eAAc,iBAAgB,QAAO,SAAQ,GAAE,UAAS,EAAC,eAAc,WAAU,QAAO,UAAS,GAAE,aAAY,EAAC,eAAc,cAAa,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,eAAc,QAAO,UAAS,GAAE,cAAa,EAAC,eAAc,eAAc,QAAO,UAAS,GAAE,SAAQ,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,4MAA2M,QAAO,SAAQ,GAAE,SAAQ,EAAC,eAAc,UAAS,QAAO,UAAS,EAAC,GAAE,SAAQ,aAAY,QAAO,SAAQ,CAAC,GAAE,QAAO,SAAQ,GAAE,MAAK,EAAC,eAAc,+GAA8G,QAAO,CAAC,UAAS,UAAS,QAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,2DAA0D,QAAO,CAAC,SAAQ,UAAS,SAAQ,gBAAe,OAAM,cAAa,QAAO,cAAa,eAAc,qBAAoB,oBAAmB,UAAS,MAAM,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,qFAAoF,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAK,MAAM,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,gBAAe,eAAc,YAAY,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,eAAc,gBAAe,YAAY,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAC35yC,EAAC,WAAU,oCAAmC,eAAc,CAAC,OAAM,gBAAgB,GAAE,SAAQ,OAAM,eAAc,iOAAgO,eAAc,EAAC,cAAa,EAAC,gBAAe,EAAC,eAAc,qBAAoB,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,sPAAqP,QAAO,UAAS,EAAC,GAAE,YAAW,CAAC,cAAc,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,cAAc,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACv3B,EAAC,WAAU,8BAA6B,eAAc,CAAC,OAAM,UAAU,GAAE,SAAQ,OAAM,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,gBAAe,EAAC,eAAc,qBAAoB,QAAO,SAAQ,GAAE,YAAW,EAAC,eAAc,aAAY,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,gBAAe,UAAU,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,gBAAe,UAAU,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAC9b,EAAC,WAAU,6BAA4B,eAAc,CAAC,OAAM,SAAS,GAAE,SAAQ,OAAM,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,gBAAe,EAAC,eAAc,qBAAoB,QAAO,SAAQ,GAAE,WAAU,EAAC,eAAc,qBAAoB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,gBAAe,SAAS,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,gBAAe,SAAS,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACjc,EAAC,WAAU,+BAA8B,eAAc,CAAC,OAAM,WAAW,GAAE,SAAQ,OAAM,eAAc,+bAA8b,eAAc,EAAC,eAAc,+bAA8b,cAAa,EAAC,gBAAe,EAAC,eAAc,qBAAoB,QAAO,SAAQ,GAAE,aAAY,EAAC,eAAc,kGAAiG,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,gBAAe,WAAW,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,gBAAe,WAAW,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAC/5C,EAAC,WAAU,qCAAoC,eAAc,CAAC,OAAM,iBAAiB,GAAE,SAAQ,OAAM,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,gBAAe,EAAC,eAAc,qBAAoB,QAAO,SAAQ,GAAE,kBAAiB,EAAC,eAAc,oBAAmB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,gBAAe,gBAAgB,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,gBAAe,gBAAgB,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACre,EAAC,WAAU,gCAA+B,eAAc,CAAC,OAAM,YAAY,GAAE,SAAQ,OAAM,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,gBAAe,EAAC,eAAc,qBAAoB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,cAAc,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,cAAc,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACrX,EAAC,WAAU,+BAA8B,eAAc,CAAC,OAAM,WAAW,GAAE,SAAQ,OAAM,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,gBAAe,EAAC,eAAc,qBAAoB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,cAAc,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,cAAc,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACnX,EAAC,WAAU,uCAAsC,eAAc,CAAC,OAAM,mBAAmB,GAAE,SAAQ,OAAM,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,gBAAe,EAAC,eAAc,qBAAoB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,cAAc,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,cAAc,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACnY,EAAC,WAAU,iCAAgC,eAAc,CAAC,OAAM,aAAa,GAAE,SAAQ,OAAM,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,gBAAe,EAAC,eAAc,qBAAoB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,cAAc,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,cAAc,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACvX,EAAC,WAAU,gCAA+B,eAAc,CAAC,cAAa,KAAK,GAAE,SAAQ,cAAa,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,mBAAkB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,MAAM,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAClW,EAAC,WAAU,8BAA6B,eAAc,CAAC,YAAW,KAAK,GAAE,SAAQ,YAAW,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,iBAAgB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,MAAM,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAC1V,EAAC,WAAU,6BAA4B,eAAc,CAAC,WAAU,KAAK,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,gBAAe,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,MAAM,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACtV,EAAC,WAAU,6BAA4B,eAAc,CAAC,WAAU,KAAK,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,gBAAe,EAAC,eAAc,iBAAgB,QAAO,SAAQ,GAAE,iBAAgB,EAAC,eAAc,kBAAiB,QAAO,UAAS,EAAC,GAAE,YAAW,CAAC,gBAAe,eAAe,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,gBAAe,eAAe,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACjd,EAAC,WAAU,+BAA8B,eAAc,CAAC,aAAY,KAAK,GAAE,SAAQ,aAAY,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,kBAAiB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,MAAM,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAC9V,EAAC,WAAU,kCAAiC,eAAc,CAAC,eAAc,MAAM,GAAE,SAAQ,cAAa,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,eAAc,EAAC,eAAc,gBAAe,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,aAAa,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,aAAa,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACxX,EAAC,WAAU,gCAA+B,eAAc,CAAC,aAAY,MAAM,GAAE,SAAQ,YAAW,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,cAAa,EAAC,eAAc,wBAAuB,QAAO,SAAQ,GAAE,SAAQ,EAAC,eAAc,yCAAwC,QAAO,UAAS,GAAE,eAAc,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,KAAI,EAAC,eAAc,0GAAyG,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,0FAAyF,QAAO,CAAC,OAAM,WAAU,YAAW,YAAW,MAAM,GAAE,QAAO,SAAQ,EAAC,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAClyB,EAAC,WAAU,8BAA6B,eAAc,CAAC,WAAU,MAAM,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,eAAc,EAAC,eAAc,gBAAe,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,aAAa,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,aAAa,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAC7W,EAAC,WAAU,+BAA8B,eAAc,CAAC,YAAW,MAAM,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,yCAAwC,QAAO,UAAS,GAAE,KAAI,EAAC,eAAc,4BAA2B,QAAO,SAAQ,GAAE,iBAAgB,EAAC,eAAc,2BAA0B,QAAO,SAAQ,EAAC,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACpe,EAAC,WAAU,4BAA2B,eAAc,CAAC,SAAQ,MAAM,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,CAAC,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACrQ,EAAC,WAAU,+BAA8B,eAAc,CAAC,YAAW,MAAM,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,gBAAe,EAAC,eAAc,iBAAgB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,cAAc,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,cAAc,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACnX,EAAC,WAAU,iCAAgC,eAAc,CAAC,cAAa,MAAM,GAAE,SAAQ,aAAY,eAAc,IAAG,eAAc,EAAC,cAAa,CAAC,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACjR,EAAC,WAAU,0CAAyC,eAAc,CAAC,YAAW,iBAAiB,GAAE,SAAQ,YAAW,eAAc,kKAAiK,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,WAAU,SAAQ,EAAC,cAAa,EAAC,YAAW,EAAC,eAAc,kUAAgL,QAAO,SAAQ,GAAE,aAAY,EAAC,eAAc,gDAA+C,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,iBAAgB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,QAAO,UAAU,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACr8B,EAAC,WAAU,4CAA2C,eAAc,CAAC,YAAW,mBAAmB,GAAE,SAAQ,YAAW,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,uBAAsB,SAAQ,EAAC,cAAa,EAAC,WAAU,EAAC,eAAc,yBAAwB,QAAO,SAAQ,GAAE,gBAAe,EAAC,eAAc,wBAAuB,QAAO,SAAQ,GAAE,UAAS,EAAC,eAAc,qBAAoB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,gBAAe,QAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACrpB,EAAC,WAAU,gCAA+B,eAAc,CAAC,aAAY,MAAM,GAAE,SAAQ,YAAW,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,oBAAmB,EAAC,eAAc,yDAAwD,aAAY,KAAI,aAAY,GAAE,WAAU,0BAAyB,QAAO,SAAQ,GAAE,SAAQ,EAAC,eAAc,SAAQ,SAAQ,EAAC,cAAa,EAAC,iBAAgB,EAAC,eAAc,8CAAwC,QAAO,SAAQ,GAAE,qBAAoB,EAAC,eAAc,8DAAwD,QAAO,SAAQ,GAAE,uBAAsB,EAAC,eAAc,sDAAqD,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,iBAAgB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,MAAK,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAC16B,EAAC,WAAU,8BAA6B,eAAc,CAAC,WAAU,MAAM,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,SAAQ,SAAQ,EAAC,cAAa,EAAC,uBAAsB,EAAC,eAAc,8CAAwC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,eAAc,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,MAAK,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACtiB,EAAC,WAAU,sCAAqC,eAAc,CAAC,SAAQ,OAAM,sBAAsB,GAAE,SAAQ,cAAa,eAAc,yWAAwW,eAAc,EAAC,cAAa,EAAC,YAAW,EAAC,eAAc,2EAAwB,QAAO,UAAS,GAAE,WAAU,EAAC,eAAc,ofAA4M,QAAO,CAAC,YAAW,mBAAkB,mBAAkB,mBAAkB,mBAAmB,GAAE,QAAO,SAAQ,GAAE,aAAY,EAAC,eAAc,mZAA+R,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,4CAAuB,QAAO,UAAS,EAAC,GAAE,YAAW,CAAC,SAAS,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,SAAS,GAAE,eAAc,iBAAgB,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAC59C,EAAC,WAAU,kCAAiC,eAAc,CAAC,YAAW,SAAS,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,YAAW,SAAQ,EAAC,cAAa,EAAC,gBAAe,EAAC,eAAc,iBAAgB,QAAO,SAAQ,GAAE,iBAAgB,EAAC,eAAc,6BAA4B,QAAO,UAAS,EAAC,GAAE,YAAW,CAAC,gBAAe,eAAe,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,MAAK,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAClkB,EAAC,WAAU,kCAAiC,eAAc,CAAC,aAAY,QAAQ,GAAE,SAAQ,YAAW,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,gEAAuB,QAAO,UAAS,GAAE,UAAS,EAAC,eAAc,gEAAuB,QAAO,UAAS,GAAE,eAAc,EAAC,eAAc,2EAAmB,QAAO,SAAQ,GAAE,KAAI,EAAC,eAAc,mCAAS,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,0FAAyF,QAAO,CAAC,OAAM,WAAU,YAAW,YAAW,MAAM,GAAE,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,GAAG,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,GAAG,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAC1sB,EAAC,WAAU,oCAAmC,eAAc,CAAC,QAAO,eAAe,GAAE,SAAQ,QAAO,eAAc,+LAA8L,eAAc,EAAC,YAAW,CAAC,EAAC,gBAAe,GAAE,oBAAmB,mBAAkB,gBAAe,sBAAqB,cAAa,CAAC,EAAC,QAAO,EAAC,kBAAiB,MAAK,SAAQ,aAAY,GAAE,MAAK,eAAc,QAAO,mBAAkB,CAAC,EAAC,CAAC,GAAE,cAAa,EAAC,gBAAe,EAAC,eAAc,iDAAgD,QAAO,UAAS,GAAE,oBAAmB,EAAC,eAAc,gGAA+F,aAAY,KAAI,aAAY,GAAE,WAAU,0BAAyB,QAAO,SAAQ,GAAE,gBAAe,EAAC,eAAc,sBAAqB,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,oFAAmF,SAAQ,EAAC,wBAAuB,OAAM,cAAa,EAAC,QAAO,EAAC,eAAc,sEAAqE,QAAO,SAAQ,GAAE,MAAK,EAAC,eAAc,kBAAiB,QAAO,CAAC,eAAc,eAAc,gBAAe,gBAAe,aAAY,mBAAkB,eAAc,iBAAgB,cAAc,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,iEAAgE,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAK,QAAO,MAAM,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,gBAAe,gBAAe,YAAY,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,gBAAe,gBAAe,YAAY,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAChwD,EAAC,WAAU,mCAAkC,eAAc,CAAC,QAAO,cAAc,GAAE,SAAQ,QAAO,eAAc,4JAA2J,eAAc,EAAC,cAAa,EAAC,gBAAe,EAAC,eAAc,sBAAqB,QAAO,SAAQ,GAAE,mBAAkB,EAAC,eAAc,qCAAoC,QAAO,UAAS,GAAE,SAAQ,EAAC,eAAc,4DAA2D,QAAO,UAAS,EAAC,GAAE,YAAW,CAAC,cAAc,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,cAAc,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAChtB,EAAC,WAAU,+BAA8B,eAAc,CAAC,QAAO,UAAU,GAAE,SAAQ,QAAO,eAAc,8CAA6C,eAAc,EAAC,cAAa,EAAC,gBAAe,EAAC,eAAc,sBAAqB,QAAO,SAAQ,GAAE,YAAW,EAAC,eAAc,aAAY,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,gBAAe,UAAU,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,gBAAe,UAAU,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAC5e,EAAC,WAAU,oCAAmC,eAAc,CAAC,QAAO,eAAe,GAAE,SAAQ,QAAO,eAAc,iFAAgF,eAAc,EAAC,cAAa,EAAC,gBAAe,EAAC,eAAc,sBAAqB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,cAAc,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,cAAc,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAC5c,EAAC,WAAU,iCAAgC,eAAc,CAAC,QAAO,YAAY,GAAE,SAAQ,QAAO,eAAc,+EAA8E,eAAc,EAAC,cAAa,EAAC,kBAAiB,EAAC,eAAc,oCAAmC,QAAO,SAAQ,GAAE,gBAAe,EAAC,eAAc,sBAAqB,QAAO,SAAQ,GAAE,mBAAkB,EAAC,eAAc,qCAAoC,QAAO,UAAS,GAAE,SAAQ,EAAC,eAAc,2BAA0B,QAAO,UAAS,GAAE,kBAAiB,EAAC,eAAc,0BAAyB,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,0BAAyB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,cAAc,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,cAAc,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACl0B,EAAC,WAAU,4CAA2C,eAAc,CAAC,YAAW,mBAAmB,GAAE,SAAQ,YAAW,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,OAAM,EAAC,eAAc,gBAAe,SAAQ,EAAC,QAAO,UAAS,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,KAAK,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,KAAK,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAChZ,EAAC,WAAU,wCAAuC,eAAc,CAAC,YAAW,eAAe,GAAE,SAAQ,YAAW,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,OAAM,EAAC,eAAc,WAAU,SAAQ,EAAC,QAAO,UAAS,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,KAAK,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,KAAK,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACnY,EAAC,WAAU,sCAAqC,eAAc,CAAC,YAAW,aAAa,GAAE,SAAQ,YAAW,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,QAAO,SAAQ,EAAC,cAAa,EAAC,gBAAe,EAAC,eAAc,iBAAgB,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,YAAW,QAAO,SAAQ,GAAE,aAAY,EAAC,eAAc,cAAa,QAAO,UAAS,GAAE,eAAc,EAAC,eAAc,oBAAmB,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,2BAA0B,SAAQ,EAAC,QAAO,UAAS,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,aAAY,MAAM,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACt3B,EAAC,WAAU,2CAA0C,eAAc,CAAC,YAAW,kBAAkB,GAAE,SAAQ,YAAW,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,aAAY,SAAQ,EAAC,cAAa,EAAC,eAAc,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,gBAAe,EAAC,eAAc,iCAAgC,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,iBAAgB,QAAO,SAAQ,GAAE,YAAW,EAAC,eAAc,sBAAqB,QAAO,UAAS,EAAC,GAAE,YAAW,CAAC,gBAAe,MAAM,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACrsB,EAAC,WAAU,2CAA0C,eAAc,CAAC,YAAW,kBAAkB,GAAE,SAAQ,YAAW,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,aAAY,SAAQ,EAAC,cAAa,EAAC,cAAa,EAAC,eAAc,oBAAmB,QAAO,SAAQ,GAAE,kBAAiB,EAAC,eAAc,mBAAkB,QAAO,SAAQ,GAAE,gBAAe,EAAC,eAAc,gBAAe,QAAO,SAAQ,GAAE,YAAW,EAAC,eAAc,YAAW,QAAO,CAAC,OAAM,UAAS,QAAO,UAAU,GAAE,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,0BAAyB,QAAO,UAAS,GAAE,UAAS,EAAC,eAAc,UAAS,QAAO,CAAC,UAAS,MAAK,UAAS,KAAK,GAAE,QAAO,SAAQ,GAAE,UAAS,EAAC,eAAc,UAAS,QAAO,CAAC,SAAQ,SAAQ,YAAY,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,QAAO,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,oBAAmB,QAAO,SAAQ,GAAE,SAAQ,EAAC,eAAc,SAAQ,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,QAAO,QAAO,CAAC,cAAa,cAAa,SAAQ,eAAc,YAAW,OAAM,QAAO,aAAa,GAAE,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,cAAa,OAAO,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACrwC,EAAC,WAAU,sCAAqC,eAAc,CAAC,YAAW,aAAa,GAAE,SAAQ,YAAW,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,OAAM,EAAC,eAAc,WAAU,SAAQ,EAAC,QAAO,UAAS,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,KAAK,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,KAAK,GAAE,eAAc,aAAY,eAAc,MAAK,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAC9X,EAAC,WAAU,2CAA0C,eAAc,CAAC,YAAW,kBAAkB,GAAE,SAAQ,YAAW,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,OAAM,EAAC,eAAc,gBAAe,SAAQ,EAAC,QAAO,UAAS,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,KAAK,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,KAAK,GAAE,eAAc,aAAY,eAAc,MAAK,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAC7Y,EAAC,WAAU,kCAAiC,eAAc,CAAC,YAAW,SAAS,GAAE,SAAQ,YAAW,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,MAAK,EAAC,eAAc,UAAS,QAAO,UAAS,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,IAAI,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACtV,EAAC,WAAU,uCAAsC,eAAc,CAAC,YAAW,cAAc,GAAE,SAAQ,YAAW,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,MAAK,EAAC,eAAc,eAAc,QAAO,UAAS,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,IAAI,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACrW,EAAC,WAAU,0CAAyC,eAAc,CAAC,YAAW,iBAAiB,GAAE,SAAQ,YAAW,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,UAAS,QAAO,UAAS,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAC/W,EAAC,WAAU,oCAAmC,eAAc,CAAC,YAAW,WAAW,GAAE,SAAQ,YAAW,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,aAAY,EAAC,eAAc,cAAa,QAAO,UAAS,EAAC,GAAE,YAAW,CAAC,WAAW,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,WAAW,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACnX,EAAC,WAAU,yCAAwC,eAAc,CAAC,YAAW,gBAAgB,GAAE,SAAQ,YAAW,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,gBAAe,EAAC,eAAc,iCAAgC,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,cAAc,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,cAAc,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACxZ,EAAC,WAAU,2CAA0C,eAAc,CAAC,YAAW,kBAAkB,GAAE,SAAQ,YAAW,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,UAAS,EAAC,eAAc,eAAc,QAAO,UAAS,GAAE,SAAQ,EAAC,eAAc,UAAS,QAAO,UAAS,EAAC,GAAE,YAAW,CAAC,SAAQ,QAAQ,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,UAAS,OAAO,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAC3b,EAAC,WAAU,yCAAwC,eAAc,CAAC,YAAW,gBAAgB,GAAE,SAAQ,YAAW,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,gBAAe,EAAC,eAAc,iCAAgC,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,cAAc,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,cAAc,GAAE,eAAc,SAAQ,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACxZ,EAAC,WAAU,4CAA2C,eAAc,CAAC,YAAW,mBAAmB,GAAE,SAAQ,YAAW,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,cAAa,SAAQ,EAAC,cAAa,EAAC,WAAU,EAAC,eAAc,WAAU,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,mBAAkB,EAAC,eAAc,uBAAsB,QAAO,UAAS,GAAE,UAAS,EAAC,eAAc,UAAS,QAAO,CAAC,UAAS,UAAS,WAAU,WAAU,YAAW,aAAa,GAAE,QAAO,SAAQ,GAAE,SAAQ,EAAC,eAAc,UAAS,QAAO,UAAS,GAAE,eAAc,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,eAAc,QAAO,UAAS,EAAC,GAAE,YAAW,CAAC,SAAQ,cAAa,QAAQ,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAC16B,EAAC,WAAU,2CAA0C,eAAc,CAAC,YAAW,kBAAkB,GAAE,SAAQ,YAAW,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,UAAS,QAAO,UAAS,GAAE,eAAc,EAAC,eAAc,0BAAyB,SAAQ,EAAC,QAAO,UAAS,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,SAAQ,aAAa,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,SAAQ,aAAa,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAClf,EAAC,WAAU,4CAA2C,eAAc,CAAC,YAAW,mBAAmB,GAAE,SAAQ,YAAW,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,OAAM,EAAC,eAAc,6BAA4B,SAAQ,EAAC,QAAO,UAAS,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,KAAK,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,KAAK,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAC7Z,EAAC,WAAU,4CAA2C,eAAc,CAAC,YAAW,mBAAmB,GAAE,SAAQ,YAAW,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,OAAM,EAAC,eAAc,6BAA4B,SAAQ,EAAC,QAAO,UAAS,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,KAAK,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,KAAK,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAC7Z,EAAC,WAAU,sCAAqC,eAAc,CAAC,YAAW,aAAa,GAAE,SAAQ,YAAW,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,WAAU,SAAQ,EAAC,cAAa,EAAC,gBAAe,EAAC,eAAc,qBAAoB,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,mBAAkB,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,mBAAkB,QAAO,SAAQ,GAAE,MAAK,EAAC,eAAc,UAAS,QAAO,UAAS,GAAE,QAAO,EAAC,eAAc,YAAW,QAAO,SAAQ,GAAE,UAAS,EAAC,eAAc,cAAa,QAAO,CAAC,SAAQ,eAAc,aAAY,WAAW,GAAE,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,mBAAkB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACt3B,EAAC,WAAU,2CAA0C,eAAc,CAAC,YAAW,kBAAkB,GAAE,SAAQ,YAAW,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,WAAU,SAAQ,EAAC,cAAa,EAAC,MAAK,EAAC,eAAc,eAAc,QAAO,UAAS,GAAE,QAAO,EAAC,eAAc,YAAW,QAAO,SAAQ,GAAE,YAAW,EAAC,eAAc,iBAAgB,QAAO,UAAS,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACjlB,EAAC,WAAU,2CAA0C,eAAc,CAAC,YAAW,kBAAkB,GAAE,SAAQ,YAAW,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,WAAU,SAAQ,EAAC,cAAa,EAAC,cAAa,EAAC,eAAc,YAAW,QAAO,SAAQ,GAAE,kBAAiB,EAAC,eAAc,uBAAsB,QAAO,SAAQ,GAAE,MAAK,EAAC,eAAc,eAAc,QAAO,UAAS,GAAE,gBAAe,EAAC,eAAc,oBAAmB,QAAO,SAAQ,GAAE,YAAW,EAAC,eAAc,YAAW,QAAO,CAAC,OAAM,UAAS,QAAO,UAAU,GAAE,QAAO,SAAQ,GAAE,cAAa,EAAC,eAAc,mBAAkB,QAAO,UAAS,GAAE,UAAS,EAAC,eAAc,UAAS,QAAO,CAAC,SAAQ,SAAQ,YAAY,GAAE,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,QAAO,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,eAAc,QAAO,SAAQ,GAAE,SAAQ,EAAC,eAAc,aAAY,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,QAAO,QAAO,CAAC,cAAa,cAAa,SAAQ,eAAc,YAAW,OAAM,QAAO,aAAa,GAAE,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,IAAI,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACvsC,EAAC,WAAU,6CAA4C,eAAc,CAAC,YAAW,oBAAoB,GAAE,SAAQ,YAAW,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,UAAS,EAAC,eAAc,eAAc,QAAO,UAAS,GAAE,SAAQ,EAAC,eAAc,eAAc,SAAQ,EAAC,cAAa,EAAC,WAAU,EAAC,eAAc,iBAAgB,QAAO,UAAS,GAAE,WAAU,EAAC,eAAc,iBAAgB,QAAO,SAAQ,GAAE,UAAS,EAAC,eAAc,eAAc,QAAO,UAAS,EAAC,GAAE,YAAW,CAAC,UAAS,SAAS,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,GAAE,SAAQ,EAAC,eAAc,UAAS,QAAO,UAAS,EAAC,GAAE,YAAW,CAAC,SAAQ,UAAS,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,UAAS,SAAQ,OAAO,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAC9vB,EAAC,WAAU,qCAAoC,eAAc,CAAC,aAAY,WAAW,GAAE,SAAQ,YAAW,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,kBAAiB,SAAQ,EAAC,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,MAAK,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACxY,EAAC,WAAU,mCAAkC,eAAc,CAAC,WAAU,WAAW,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,gBAAe,SAAQ,EAAC,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,MAAK,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACjY,EAAC,WAAU,oCAAmC,eAAc,CAAC,YAAW,WAAW,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,iBAAgB,SAAQ,EAAC,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,MAAK,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACpY,EAAC,WAAU,sCAAqC,eAAc,CAAC,cAAa,WAAW,GAAE,SAAQ,aAAY,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,mBAAkB,SAAQ,EAAC,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,MAAK,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAC5Y,EAAC,WAAU,kCAAiC,eAAc,CAAC,aAAY,QAAQ,GAAE,SAAQ,YAAW,eAAc,uJAAsJ,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,WAAU,SAAQ,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,yXAAmN,QAAO,SAAQ,GAAE,SAAQ,EAAC,eAAc,aAAY,QAAO,SAAQ,GAAE,eAAc,EAAC,eAAc,0SAAyS,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,iBAAgB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAC9uC,EAAC,WAAU,gCAA+B,eAAc,CAAC,WAAU,QAAQ,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,WAAU,SAAQ,EAAC,cAAa,EAAC,QAAO,EAAC,eAAc,YAAW,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,eAAc,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,QAAO,MAAM,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACxgB,EAAC,WAAU,iCAAgC,eAAc,CAAC,YAAW,QAAQ,GAAE,SAAQ,WAAU,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,WAAU,SAAQ,EAAC,cAAa,EAAC,eAAc,EAAC,eAAc,mBAAkB,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,YAAW,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,gBAAe,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EACpkB,EAAC,WAAU,mCAAkC,eAAc,CAAC,cAAa,QAAQ,GAAE,SAAQ,aAAY,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,WAAU,SAAQ,EAAC,cAAa,EAAC,eAAc,EAAC,eAAc,mBAAkB,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,YAAW,QAAO,SAAQ,GAAE,QAAO,EAAC,eAAc,kBAAiB,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,MAAM,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,aAAY,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAAA,EAC5kB,EAAC,WAAU,oCAAmC,eAAc,CAAC,SAAQ,OAAM,oBAAoB,GAAE,SAAQ,cAAa,eAAc,IAAG,eAAc,EAAC,cAAa,EAAC,SAAQ,EAAC,eAAc,2BAA0B,SAAQ,EAAC,cAAa,EAAC,eAAc,EAAC,eAAc,aAAY,QAAO,SAAQ,GAAE,gBAAe,EAAC,eAAc,wBAAuB,QAAO,SAAQ,GAAE,YAAW,EAAC,eAAc,sBAAqB,QAAO,SAAQ,GAAE,aAAY,EAAC,eAAc,iBAAgB,QAAO,UAAS,GAAE,cAAa,EAAC,eAAc,0EAAyE,QAAO,SAAQ,EAAC,GAAE,YAAW,CAAC,gBAAe,YAAW,YAAY,GAAE,QAAO,SAAQ,GAAE,QAAO,QAAO,EAAC,GAAE,YAAW,CAAC,OAAO,GAAE,QAAO,SAAQ,GAAE,YAAW,CAAC,OAAO,GAAE,eAAc,iBAAgB,eAAc,OAAM,iBAAgB,OAAM,cAAa,mBAAkB;AAC11B;;;ACzFA,SAAS,cAAAC,mBAAkB;AAW3B,IAAM,gBAAgB;AAMf,SAAS,aAAa,MAAsB;AACjD,SAAO,KAAK,WAAW,aAAa,IAAI,KAAK,MAAM,cAAc,MAAM,IAAI;AAC7E;AACA,IAAM,uBAAuB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,gBAAgB,OAA0B,eAA0D;AAClH,SAAO,MACJ,IAAI,CAAC,SAAS,cAAc,MAAM,aAAa,CAAC,EAChD,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,cAAc,EAAE,OAAO,CAAC;AACtD;AAEO,SAAS,cAAc,MAAuB,eAAwD;AAC3G,MAAI,CAAC,KAAK,MAAM;AACd,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACjD;AACA,QAAM,WAAW,aAAa,KAAK,IAAI;AACvC,QAAM,QAAQ,WAAW,QAAQ;AACjC,QAAM,cAAc,gBAAgB,KAAK,eAAe,EAAE,MAAM,UAAU,YAAY,CAAC,EAAE,CAAC;AAC1F,QAAM,WAAW,MAAM,QAAQ,YAAY,QAAQ,IAC/C,YAAY,SAAS,OAAO,CAAC,UAA2B,OAAO,UAAU,QAAQ,EAAE,KAAK,IACxF,CAAC;AACL,QAAM,aAAa;AAAA,IACjB,SAAS,KAAK;AAAA,IACd,aAAa,oBAAoB,UAAU,KAAK;AAAA,IAChD;AAAA,IACA,aAAa,KAAK,eAAe;AAAA,IACjC;AAAA,IACA;AAAA,IACA,aAAa,iBAAiB,UAAU,WAAW;AAAA,IACnD,aAAa,iBAAiB,UAAU,IAAI;AAAA,IAC5C;AAAA,IACA,YAAY;AAAA,EACd;AACA,SAAO,EAAE,GAAG,YAAY,YAAY,kBAAkB,UAAU,EAAE;AACpE;AAEO,SAAS,WAAW,cAAiC;AAC1D,MAAI,aAAa,WAAW,MAAM,EAAG,QAAO;AAC5C,MAAI,aAAa,WAAW,OAAO,EAAG,QAAO;AAC7C,MAAI,aAAa,WAAW,WAAW,EAAG,QAAO;AACjD,MAAI,aAAa,WAAW,WAAW,EAAG,QAAO;AACjD,MAAI,aAAa,SAAS,YAAY,KAAK,aAAa,SAAS,QAAQ,EAAG,QAAO;AACnF,MAAI,aAAa,WAAW,OAAO,EAAG,QAAO;AAC7C,MAAI,aAAa,SAAS,WAAW,EAAG,QAAO;AAC/C,MAAI,aAAa,SAAS,UAAU,EAAG,QAAO;AAC9C,SAAO;AACT;AAEO,SAAS,oBAAoB,cAAsB,OAA4B;AACpF,MAAI,UAAU,aAAa,aAAa,WAAW,GAAG,KAAK,GAAG,GAAG;AAC/D,WAAO,CAAC,OAAO,aAAa,aAAa,MAAM,MAAM,SAAS,CAAC,CAAC,CAAC;AAAA,EACnE;AAEA,QAAM,CAAC,MAAM,GAAG,IAAI,IAAI,aAAa,MAAM,GAAG;AAC9C,MAAI,QAAQ,KAAK,SAAS,KAAK,OAAO,IAAI,GAAG;AAC3C,WAAO,CAAC,KAAK,KAAK,GAAG,GAAG,IAAI;AAAA,EAC9B;AAEA,SAAO,CAAC,SAAS,OAAO,aAAa,YAAY,CAAC;AACpD;AAEO,SAAS,iBAAiB,cAAsB,aAAsC;AAC3F,MAAI,aAAa,SAAS,QAAQ,KAAK,aAAa,SAAS,mBAAmB,GAAG;AACjF,WAAO;AAAA,EACT;AACA,QAAM,aAAa,YAAY;AAC/B,MAAI,CAACC,UAAS,UAAU,GAAG;AACzB,WAAO;AAAA,EACT;AACA,QAAM,SAAS,OAAO,OAAO,UAAU;AACvC,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,EACT;AACA,MAAI,OAAO,MAAM,cAAc,GAAG;AAChC,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,iBAAiB,cAAsB,MAAgC;AACrF,MAAI,KAAK,aAAa,oBAAoB,MAAM;AAC9C,WAAO;AAAA,EACT;AACA,SAAO,qBAAqB,KAAK,CAAC,WAAW,aAAa,WAAW,MAAM,CAAC;AAC9E;AAEO,SAAS,kBAAkB,MAA2D;AAC3F,SAAOD,YAAW,QAAQ,EACvB,OAAO,gBAAgB;AAAA,IACtB,MAAM,KAAK;AAAA,IACX,aAAa,KAAK;AAAA,IAClB,aAAa,KAAK;AAAA,EACpB,CAAC,CAAC,EACD,OAAO,KAAK,EACZ,MAAM,GAAG,EAAE;AAChB;AAEO,SAAS,gBAAgB,OAAwB;AACtD,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,IAAI,MAAM,IAAI,eAAe,EAAE,KAAK,GAAG,CAAC;AAAA,EACjD;AACA,MAAIC,UAAS,KAAK,GAAG;AACnB,WAAO,IAAI,OAAO,KAAK,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,GAAG,KAAK,UAAU,GAAG,CAAC,IAAI,gBAAgB,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC;AAAA,EACtH;AACA,SAAO,KAAK,UAAU,KAAK;AAC7B;AAaA,SAAS,gBAAgB,QAAgC;AACvD,SAAO,KAAK,MAAM,gBAAgB,MAAM,CAAC;AAC3C;AAEA,SAAS,eAAe,OAAyB;AAC/C,MAAI,CAACC,UAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AACA,QAAM,OAAO,MAAM;AACnB,SAAO,SAAS,YAAY,SAAS,YAAY,SAAS,aAAa,SAAS;AAClF;AAEA,SAAS,OAAO,OAAwB;AACtC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,SAAS,KAAK;AAClB;AAEA,SAAS,aAAa,OAAuB;AAC3C,SAAO,MAAM,WAAW,KAAK,GAAG;AAClC;AAEA,SAASA,UAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;;;AC3KO,SAAS,kBAAkB,KAAiB;AACjD,SAAO,QAAQ,QAAQC,kBAAW;AACpC;AAOA,eAAsB,cAAc,KAAiB,QAA0D;AAC7G,SAAO,gBAAgB,MAAM,OAAO,UAAU,GAAwB,GAAG;AAC3E;;;ACnBA,SAAS,uBAAuB;AAWhC,eAAsB,eAAe,SAA4C;AAC/E,QAAM,QAAQ,gBAAgB,EAAE,OAAO,QAAQ,OAAO,WAAW,SAAS,CAAC;AAE3E,mBAAiB,QAAQ,OAAO;AAC9B,QAAI,CAAC,KAAK,KAAK,GAAG;AAChB;AAAA,IACF;AACA,QAAI;AACF,YAAM,UAAU,oBAAoB,IAAI;AACxC,YAAM,WAAW,MAAM,QAAQ,OAAO,QAAQ,OAAO;AACrD,UAAI,YAAY,QAAQ,OAAO,QAAW;AACxC,gBAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,QAAQ,CAAC;AAAA,CAAI;AAAA,MACtD;AAAA,IACF,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU;AAAA,QACrC,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,OAAO,EAAE,MAAM,QAAQ,QAAQ;AAAA,MACjC,CAAC,CAAC;AAAA,CAAI;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,MAA8B;AACzD,QAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,MAAI,CAACC,UAAS,MAAM,KAAK,OAAO,YAAY,SAAS,OAAO,OAAO,WAAW,UAAU;AACtF,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC7C;AACA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,IAAI,OAAO,OAAO,OAAO,YAAY,OAAO,OAAO,OAAO,YAAY,OAAO,OAAO,OAAO,OAAO,KAAK;AAAA,IACvG,QAAQ,OAAO;AAAA,IACf,QAAQ,OAAO;AAAA,EACjB;AACF;AAEA,SAASA,UAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;;;AClCA,eAAsB,aAAa,SAA0C;AAG3E,QAAM,OAAO,IAAI,YAAY,EAAE,UAAU,QAAQ,UAAU,YAAY,IAAI,eAAe,EAAE,CAAC;AAC7F,QAAM,SAAS,IAAI,aAAa;AAAA,IAC9B,UAAU,QAAQ;AAAA,IAClB,eAAe;AAAA,IACf,MAAM,QAAQ;AAAA,EAChB,CAAC;AACD,QAAM,eAAe;AAAA,IACnB,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,IAChB,aAAa,QAAQ;AAAA,IACrB;AAAA,EACF,CAAC;AACH;;;AC7BO,IAAM,cAAc;AAAA,EACzB;AAAA,IACE,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,cAAc,CAAC,QAAQ,QAAQ,cAAc,iBAAiB,WAAW;AAAA,IACzE,aAAa;AAAA,IACb,UAAU,CAAC,iCAAiC;AAAA,EAC9C;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,cAAc,CAAC,QAAQ,QAAQ,WAAW;AAAA,IAC1C,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,cAAc,CAAC,QAAQ,QAAQ,eAAe,oBAAoB,WAAW;AAAA,IAC7E,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,cAAc,CAAC,QAAQ,SAAS,QAAQ,eAAe,cAAc,WAAW;AAAA,IAChF,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,cAAc,CAAC,QAAQ,SAAS,QAAQ,eAAe,WAAW;AAAA,IAClE,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,cAAc,CAAC,QAAQ,YAAY,eAAe,aAAa,cAAc;AAAA,IAC7E,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,cAAc,CAAC,QAAQ,QAAQ,eAAe,eAAe;AAAA,IAC7D,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,cAAc,CAAC,QAAQ,QAAQ,mBAAmB,iBAAiB,cAAc;AAAA,IACjF,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,cAAc,CAAC,QAAQ,QAAQ,eAAe;AAAA,IAC9C,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,cAAc,CAAC,QAAQ,QAAQ,eAAe;AAAA,IAC9C,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,cAAc,CAAC,QAAQ,SAAS,cAAc,cAAc,WAAW;AAAA,IACvE,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,cAAc,CAAC,QAAQ,QAAQ,cAAc;AAAA,IAC7C,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,SAAS,CAAC,eAAe;AAAA,IACzB,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,SAAS;AAAA,IACT,SAAS,CAAC,gBAAgB;AAAA,IAC1B,aAAa;AAAA,EACf;AACF;;;AClFO,SAAS,YAAY,MAAe,UAAwB,CAAC,GAAuB;AACzF,QAAM,OAAO,YAAY,IAAI;AAC7B,MAAI,CAAC,KAAK,UAAU,CAAC,KAAK,MAAMC,SAAQ,GAAG;AACzC,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,QAAQ,SAAS,SAAS,QAAQ,UAAU,aAAa,IAAI;AAC7E,MAAI,CAAC,QAAQ,QAAQ;AACnB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,QAAQ,IAAI,CAAC,WAAW,KAAK,IAAI,OAAO,QAAQ,GAAG,KAAK,IAAI,CAAC,QAAQ,WAAW,IAAI,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;AACpH,QAAM,SAAS,QAAQ,IAAI,CAAC,QAAQ,UAAU,OAAO,OAAO,OAAO,KAAK,KAAK,OAAO,MAAM,CAAC,EAAE,KAAK,IAAI;AACtG,QAAM,UAAU,OAAO,IAAI,CAAC,UAAU,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,IAAI;AAClE,QAAM,OAAO,KAAK,IAAI,CAAC,QAAQ,QAAQ,IAAI,CAAC,QAAQ,UAAU,WAAW,IAAI,MAAM,CAAC,EAAE,OAAO,OAAO,KAAK,KAAK,OAAO,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC;AAExI,SAAO,CAAC,QAAQ,SAAS,GAAG,IAAI,EAAE,KAAK,IAAI;AAC7C;AAEA,SAAS,YAAY,MAA0B;AAC7C,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,WAAO;AAAA,EACT;AACA,MAAIA,UAAS,IAAI,GAAG;AAClB,eAAW,OAAO,CAAC,SAAS,YAAY,cAAc,WAAW,aAAa,SAAS,eAAe,WAAW,MAAM,GAAG;AACxH,YAAM,QAAQ,KAAK,GAAG;AACtB,UAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,SAAO,CAAC;AACV;AAEA,SAAS,aAAa,MAA2C;AAC/D,QAAM,YAAY,CAAC,QAAQ,MAAM,QAAQ,SAAS,UAAU,QAAQ,eAAe,gBAAgB,aAAa,WAAW;AAC3H,QAAM,OAAO,IAAI,IAAI,KAAK,QAAQ,CAAC,QAAQ,OAAO,KAAK,GAAG,CAAC,CAAC;AAC5D,QAAM,UAAU,UAAU,OAAO,CAAC,QAAQ,KAAK,IAAI,GAAG,CAAC;AACvD,MAAI,QAAQ,SAAS,GAAG;AACtB,WAAO,QAAQ,MAAM,GAAG,CAAC;AAAA,EAC3B;AACA,SAAO,CAAC,GAAG,IAAI,EAAE,MAAM,GAAG,CAAC;AAC7B;AAEA,SAAS,WAAW,OAAwB;AAC1C,MAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B;AACA,SAAO,OAAO,KAAK;AACrB;AAEA,SAASA,UAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;;;AC5DO,IAAM,kBAAN,cAA8B,MAAM;AAAA,EACzC,YACW,MACT,SACS,SACT;AACA,UAAM,OAAO;AAJJ;AAEA;AAAA,EAGX;AAAA,EALW;AAAA,EAEA;AAIb;;;ACEA,eAAsB,0BACpB,MACA,MACA,OAC4B;AAC5B,QAAM,SAAS,UAAU,IAAI;AAC7B,QAAM,UAAU,MAAM,aAAa,MAAM,QAAQ,KAAK;AACtD,QAAM,OAAO,cAAc,QAAQ,KAAK;AACxC,QAAM,aAAa,oBAAoB,KAAK,WAAW;AAEvD,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,KAAK,GAAG;AACvD,QAAI,QAAQ,OAAO;AACjB;AAAA,IACF;AACA,UAAM,YAAY,iBAAiB,KAAK,UAAU;AAClD,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,gBAAgB,gBAAgB,kBAAkB,GAAG,QAAQ,KAAK,YAAY,KAAK,GAAG,CAAC,KAAK;AAAA,QACpG,MAAM;AAAA,QACN,SAAS,KAAK;AAAA,MAChB,CAAC;AAAA,IACH;AACA,SAAK,SAAS,IAAI,gBAAgB,OAAO,WAAW,SAAS,GAAG,SAAS;AAAA,EAC3E;AAEA,aAAW,YAAY,KAAK,UAAU;AACpC,QAAI,KAAK,QAAQ,MAAM,UAAa,KAAK,QAAQ,MAAM,IAAI;AACzD,YAAM,IAAI,gBAAgB,yBAAyB,8BAA8B,QAAQ,SAAS,KAAK,YAAY,KAAK,GAAG,CAAC,KAAK;AAAA,QAC/H;AAAA,QACA,MAAM,KAAK,aAAa,QAAQ,CAAC;AAAA,QACjC,SAAS,KAAK;AAAA,MAChB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,KAAK,OAAO;AAAA,IACZ,UAAU,QAAQ;AAAA,EACpB;AACF;AAEA,SAAS,cAAc,OAAyC;AAC9D,MAAI,UAAU,UAAa,UAAU,MAAM;AACzC,WAAO,CAAC;AAAA,EACV;AACA,MAAI,CAACC,UAAS,KAAK,GAAG;AACpB,UAAM,IAAI,gBAAgB,mBAAmB,oDAAoD,EAAE,MAAM,CAAC;AAAA,EAC5G;AACA,SAAO,EAAE,GAAG,MAAM;AACpB;AASA,SAAS,UAAU,MAA4B;AAC7C,QAAM,QAA0C,CAAC;AACjD,QAAM,SAAmB,CAAC;AAC1B,MAAI;AACJ,MAAI,MAAM;AAEV,WAAS,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;AACnD,UAAM,MAAM,KAAK,KAAK;AACtB,QAAI,CAAC,KAAK;AACR;AAAA,IACF;AACA,QAAI,QAAQ,YAAY,QAAQ,MAAM;AACpC,aAAO,aAAa,KAAK,KAAK,EAAE,KAAK,CAAC;AACtC;AAAA,IACF;AACA,QAAI,QAAQ,WAAW,QAAQ,MAAM;AACnC,YAAM;AACN,YAAM,MAAM;AACZ;AAAA,IACF;AACA,QAAI,IAAI,WAAW,IAAI,GAAG;AACxB,YAAM,gBAAgB,IAAI,MAAM,CAAC;AACjC,YAAM,UAAU,cAAc,QAAQ,GAAG;AACzC,UAAI,WAAW,GAAG;AAChB,cAAM,MAAM,cAAc,MAAM,GAAG,OAAO;AAC1C,cAAM,GAAG,IAAI,cAAc,MAAM,UAAU,CAAC;AAC5C;AAAA,MACF;AACA,YAAM,OAAO,KAAK,QAAQ,CAAC;AAC3B,UAAI,CAAC,QAAQ,KAAK,WAAW,IAAI,GAAG;AAClC,cAAM,aAAa,IAAI;AACvB;AAAA,MACF;AACA,YAAM,aAAa,IAAI;AACvB,eAAS;AACT;AAAA,IACF;AACA,WAAO,KAAK,GAAG;AAAA,EACjB;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,OAAO,SAAS,IAAI,OAAO,KAAK,GAAG,IAAI;AAAA,EACjD;AACF;AAEA,eAAe,aACb,MACA,QACA,OACwB;AACxB,MAAI,KAAK,gBAAgB,eAAe,OAAO,QAAQ,OAAO,QAAQ;AACpE,WAAO,mBAAmB;AAAA,MACxB,MAAM,OAAO;AAAA,MACb,QAAQ,OAAO;AAAA,MACf;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,OAAO,CAAC,GAAG,QAAQ,SAAS,UAAU,CAAC,EAAE;AACpD;AAEA,SAAS,iBAAiB,MAAc,YAA4D;AAClG,MAAI,WAAW,IAAI,GAAG;AACpB,WAAO;AAAA,EACT;AACA,QAAM,aAAa,KAAK,YAAY;AACpC,SAAO,OAAO,KAAK,UAAU,EAAE,KAAK,CAAC,QAAQ,aAAa,GAAG,MAAM,UAAU;AAC/E;AAEA,SAAS,gBAAgB,OAAyB,QAAgC,KAAsB;AACtG,QAAM,OAAO,QAAQ;AACrB,MAAI,SAAS,WAAW;AACtB,QAAI,OAAO,UAAU,WAAW;AAC9B,aAAO;AAAA,IACT;AACA,QAAI,UAAU,OAAQ,QAAO;AAC7B,QAAI,UAAU,QAAS,QAAO;AAC9B,UAAM,IAAI,gBAAgB,sBAAsB,SAAS,GAAG,wBAAwB,EAAE,KAAK,MAAM,CAAC;AAAA,EACpG;AACA,MAAI,SAAS,UAAU;AACrB,QAAI,OAAO,UAAU,WAAW;AAC9B,YAAM,IAAI,gBAAgB,uBAAuB,KAAK,aAAa,GAAG,CAAC,sBAAsB,EAAE,IAAI,CAAC;AAAA,IACtG;AACA,WAAO;AAAA,EACT;AACA,MAAI,SAAS,WAAW;AACtB,QAAI,OAAO,UAAU,aAAa,CAAC,UAAU,KAAK,KAAK,GAAG;AACxD,YAAM,OAAO,OAAO,UAAU,YAAY,wBAAwB;AAClE,YAAM,IAAI,gBAAgB,MAAM,SAAS,GAAG,yBAAyB,EAAE,KAAK,MAAM,CAAC;AAAA,IACrF;AACA,WAAO,OAAO,SAAS,OAAO,EAAE;AAAA,EAClC;AACA,MAAI,SAAS,UAAU;AACrB,QAAI,OAAO,UAAU,aAAa,OAAO,MAAM,OAAO,KAAK,CAAC,GAAG;AAC7D,YAAM,OAAO,OAAO,UAAU,YAAY,wBAAwB;AAClE,YAAM,IAAI,gBAAgB,MAAM,SAAS,GAAG,uBAAuB,EAAE,KAAK,MAAM,CAAC;AAAA,IACnF;AACA,WAAO,OAAO,KAAK;AAAA,EACrB;AACA,QAAM,IAAI,gBAAgB,4BAA4B,SAAS,GAAG,8EAA8E;AAAA,IAC9I;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,SAAS,oBAAoB,QAAgD;AAC3E,QAAM,aAAa,OAAO;AAC1B,MAAI,CAACA,UAAS,UAAU,GAAG;AACzB,WAAO,CAAC;AAAA,EACV;AACA,QAAM,SAAqC,CAAC;AAC5C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,UAAU,GAAG;AACrD,QAAIA,UAAS,KAAK,GAAG;AACnB,aAAO,GAAG,IAAI;AAAA,IAChB;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,aAAa,OAAuB;AAClD,SAAO,MAAM,QAAQ,UAAU,CAAC,SAAS,IAAI,KAAK,YAAY,CAAC,EAAE,EAAE,YAAY;AACjF;AAEA,SAAS,aAAa,MAAc,OAAmC;AACrE,MAAI,CAAC,SAAS,MAAM,WAAW,IAAI,GAAG;AACpC,UAAM,IAAI,gBAAgB,uBAAuB,GAAG,IAAI,sBAAsB,EAAE,KAAK,CAAC;AAAA,EACxF;AACA,SAAO;AACT;AAEA,SAASA,UAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;;;AC3MA,SAAS,mBAAAC,wBAAuB;AAShC,eAAsB,0BAA0B,SAK9B;AAChB,MAAI,CAAC,QAAQ,KAAK,aAAa;AAC7B;AAAA,EACF;AACA,MAAI,QAAQ,KAAK;AACf;AAAA,EACF;AACA,MAAI,QAAQ,MAAM;AAChB,UAAM,IAAI,gBAAgB,yBAAyB,uBAAuB,QAAQ,KAAK,YAAY,KAAK,GAAG,CAAC,mCAAmC;AAAA,MAC7I,SAAS,QAAQ,KAAK;AAAA,IACxB,CAAC;AAAA,EACH;AAEA,QAAM,SAAS,MAAM,mBAAmB,QAAQ,IAAI,2BAA2B,QAAQ,KAAK,YAAY,KAAK,GAAG,CAAC,4BAA4B;AAC7I,MAAI,OAAO,KAAK,EAAE,YAAY,MAAM,OAAO;AACzC,UAAM,IAAI,gBAAgB,yBAAyB,0CAA0C;AAAA,MAC3F,SAAS,QAAQ,KAAK;AAAA,IACxB,CAAC;AAAA,EACH;AACF;AAEA,eAAe,mBAAmB,IAAoB,SAAkC;AACtF,KAAG,OAAO,MAAM,OAAO;AACvB,QAAM,KAAKC,iBAAgB,EAAE,OAAO,GAAG,OAAO,UAAU,MAAM,CAAC;AAC/D,MAAI;AACF,qBAAiB,QAAQ,IAAI;AAC3B,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,UAAE;AACA,OAAG,MAAM;AAAA,EACX;AACF;;;AC9CO,IAAM,kCAAkC,CAAC,eAAe,QAAQ;;;AC6BhE,SAAS,sBACd,OACA,MACmC;AACnC,QAAM,gBAAgB,KAAK,OAAO,CAAC,QAAQ,CAAC,IAAI,WAAW,GAAG,CAAC;AAC/D,QAAM,UAAU,kBAAkB,OAAO,WAAW;AACpD,QAAM,QAAQ,QACX,OAAO,CAAC,UAAU,SAAS,MAAM,MAAM,aAAa,CAAC,EACrD,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,SAAS,EAAE,KAAK,MAAM,EAAE,CAAC;AAElD,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,cAAc,MAAM,MAAM,IAAI;AAChD,SAAO;AAAA,IACL,MAAM,MAAM;AAAA,IACZ,aAAa,MAAM;AAAA,IACnB,MAAM,KAAK,MAAM,SAAS;AAAA,IAC1B,cAAc,MAAM;AAAA,IACpB,oBAAoB,MAAM,KAAK,gBAAgB,kBAC3C,0HACA;AAAA,EACN;AACF;AAEA,eAAsB,wBAAwB,SAA4D;AACxG,QAAM,QAAQ,sBAAsB,QAAQ,OAAO,QAAQ,IAAI;AAC/D,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,MAAM,0BAA0B,MAAM,MAAM,MAAM,MAAM,QAAQ,GAAG,KAAK;AACvF,QAAM,0BAA0B;AAAA,IAC9B,MAAM,MAAM;AAAA,IACZ,KAAK,OAAO;AAAA,IACZ,MAAM,QAAQ;AAAA,IACd,IAAI,QAAQ;AAAA,EACd,CAAC;AAED,QAAM,SAAS,MAAM,QAAQ,OAAO,UAAU,MAAM,KAAK,SAAS,OAAO,IAAI;AAC7E,QAAM,WAAW,CAAC,GAAG,OAAO,UAAU,GAAI,MAAM,qBAAqB,CAAC,MAAM,kBAAkB,IAAI,CAAC,CAAE;AACrG,UAAQ,GAAG,OAAO,MAAM,sBAAsB,QAAQ;AAAA,IACpD,MAAM,QAAQ;AAAA,IACd;AAAA,IACA,cAAc,MAAM;AAAA,EACtB,CAAC,CAAC;AAEF,SAAO,YAAY,MAAM,IAAI,IAAI;AACnC;AAsBA,SAAS,sBACP,QACA,SAKQ;AACR,MAAI,CAAC,QAAQ,QAAQ,QAAQ,cAAc,eAAe,SAAS;AACjE,UAAM,QAAQ,YAAY,QAAQ,EAAE,SAAS,QAAQ,aAAa,aAAa,CAAC;AAChF,QAAI,OAAO;AACT,YAAM,WAAW,QAAQ,SAAS,SAAS,GAAG,QAAQ,SAAS,IAAI,CAAC,YAAY,YAAY,OAAO,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,IAAO;AACxH,aAAO,GAAG,QAAQ,GAAG,KAAK;AAAA;AAAA,IAC5B;AAAA,EACF;AACA,SAAO,cAAc,QAAQ,EAAE,MAAM,QAAQ,MAAM,UAAU,QAAQ,SAAS,CAAC;AACjF;AAEA,SAAS,kBACP,OACA,eACqG;AACrG,QAAM,SAAS,IAAI,IAAI,cAAc,IAAI,CAAC,iBAAiB,CAAC,aAAa,SAAS,YAAY,CAAC,CAAC;AAChG,QAAM,UAA+G,CAAC;AACtH,aAAW,QAAQ,OAAO;AACxB,UAAM,eAAe,OAAO,IAAI,KAAK,OAAO;AAC5C,YAAQ,KAAK,EAAE,MAAM,KAAK,aAAa,MAAM,aAAa,CAAC;AAC3D,eAAW,SAAS,cAAc,WAAW,CAAC,GAAG;AAC/C,cAAQ,KAAK,EAAE,MAAM,MAAM,MAAM,KAAK,EAAE,OAAO,OAAO,GAAG,MAAM,aAAa,CAAC;AAAA,IAC/E;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,SAAS,QAAkB,QAA2B;AAC7D,SAAO,OAAO,MAAM,CAAC,OAAO,UAAU,OAAO,KAAK,MAAM,KAAK;AAC/D;AAEA,SAAS,cAAc,MAAgB,aAA+B;AACpE,MAAI,UAAU;AACd,WAAS,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;AACnD,QAAI,CAAC,KAAK,KAAK,GAAG,WAAW,GAAG,GAAG;AACjC,UAAI,KAAK,KAAK,MAAM,YAAY,OAAO,GAAG;AACxC,eAAO;AAAA,MACT;AACA,iBAAW;AACX,UAAI,YAAY,YAAY,QAAQ;AAClC,eAAO,QAAQ;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AACA,SAAO,KAAK;AACd;;;ACxJA,SAAS,YAAAC,WAAU,QAAAC,aAAY;AAC/B,SAAS,UAAU,eAAe;AA6C3B,IAAM,wBAAN,cAAoC,MAAM;AAAA,EAC/C,YACW,MACT,SACS,SACT;AACA,UAAM,OAAO;AAJJ;AAEA;AAAA,EAGX;AAAA,EALW;AAAA,EAEA;AAIb;AAEA,eAAsB,kBACpB,QACA,OACkC;AAClC,MAAI,CAAC,MAAM,aAAa,KAAK,GAAG;AAC9B,UAAM,IAAI,sBAAsB,yBAAyB,6CAA+C;AAAA,MACtG,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACA,MAAI,MAAM,MAAM,WAAW,GAAG;AAC5B,UAAM,IAAI,sBAAsB,gBAAgB,uCAAuC;AAAA,EACzF;AAEA,QAAM,YAAY,MAAM,aAAa;AACrC,QAAM,WAAuC,CAAC;AAE9C,WAAS,QAAQ,GAAG,QAAQ,MAAM,MAAM,QAAQ,SAAS,GAAG;AAC1D,UAAM,OAAO,MAAM,MAAM,KAAK;AAC9B,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AACA,aAAS,KAAK,MAAM,uBAAuB,QAAQ,MAAM;AAAA,MACvD,cAAc,MAAM;AAAA,MACpB,UAAU,MAAM;AAAA,MAChB,YAAY,MAAM;AAAA,MAClB,iBAAiB,MAAM,mBAAmB;AAAA,MAC1C,gBAAgB,MAAM,kBAAkB;AAAA,MACxC;AAAA,MACA,YAAY,MAAM;AAAA,MAClB;AAAA,MACA,OAAO,MAAM,MAAM;AAAA,IACrB,CAAC,CAAC;AAAA,EACJ;AAEA,SAAO,EAAE,OAAO,SAAS,QAAQ,SAAS;AAC5C;AA0BA,eAAe,uBACb,QACA,MACA,SACmC;AACnC,QAAM,WAAW,MAAM,iBAAiB,IAAI;AAC5C,eAAa,SAAS,SAAS,KAAK,MAAM,SAAS,QAAQ;AAC3D,QAAM,cAAc,MAAM,mBAAmB,QAAQ,UAAU,OAAO;AAEtE,eAAa,SAAS,OAAO,KAAK,MAAM,SAAS,QAAQ;AACzD,QAAM,YAAY,MAAM,mBAAmB,aAAa,UAAU,QAAQ,SAAS;AACnF,oBAAkB,aAAa,UAAU,SAAS;AAElD,QAAM,OAAO;AAAA,IACX,cAAc,QAAQ;AAAA,IACtB,UAAU,SAAS;AAAA,IACnB,YAAY,YAAY;AAAA,IACxB,aAAa,UAAU;AAAA,IACvB,WAAW,UAAU;AAAA,EACvB;AAEA,eAAa,SAAS,YAAY,KAAK,MAAM,SAAS,QAAQ;AAC9D,QAAM,iBAAiB,MAAM,OAAO,UAAU,QAAQ,gBAAgB,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;AAEvF,eAAa,SAAS,QAAQ,KAAK,MAAM,SAAS,QAAQ;AAC1D,SAAO;AAAA,IACL,MAAM,KAAK;AAAA,IACX,cAAc,QAAQ;AAAA,IACtB,UAAU,SAAS;AAAA,IACnB,YAAY,YAAY;AAAA,IACxB,aAAa,UAAU;AAAA,IACvB,WAAW,UAAU;AAAA,IACrB;AAAA,EACF;AACF;AAEA,eAAe,iBAAiB,MAK7B;AACD,QAAM,QAAQ,MAAMA,MAAK,KAAK,IAAI;AAClC,MAAI,CAAC,MAAM,OAAO,GAAG;AACnB,UAAM,IAAI,sBAAsB,gBAAgB,kCAAkC,KAAK,IAAI,IAAI,EAAE,MAAM,KAAK,KAAK,CAAC;AAAA,EACpH;AACA,QAAM,QAAQ,MAAMD,UAAS,KAAK,IAAI;AACtC,SAAO;AAAA,IACL;AAAA,IACA,UAAU,KAAK,YAAY,SAAS,KAAK,IAAI;AAAA,IAC7C,aAAa,KAAK,eAAe,kBAAkB,KAAK,IAAI;AAAA,IAC5D,WAAW,MAAM;AAAA,EACnB;AACF;AAEA,eAAe,mBACb,QACA,UACA,SAC8B;AAC9B,QAAM,YAAY,KAAK,UAAU;AAAA,IAC/B,cAAc,QAAQ;AAAA,IACtB,UAAU,SAAS;AAAA,IACnB,aAAa,SAAS;AAAA,IACtB,WAAW,SAAS;AAAA,EACtB,CAAC;AACD,QAAM,cAAuC;AAAA,IAC3C,SAAS;AAAA,IACT;AAAA,EACF;AACA,MAAI,QAAQ,aAAa,QAAW;AAClC,gBAAY,WAAW,QAAQ;AAAA,EACjC;AACA,MAAI,QAAQ,eAAe,QAAW;AACpC,gBAAY,aAAa,QAAQ;AAAA,EACnC;AAEA,QAAM,WAAW,qBAAqB,MAAM,OAAO,UAAU,QAAQ,iBAAiB,WAAW,CAAC;AAClG,MAAI,CAACE,UAAS,QAAQ,GAAG;AACvB,UAAM,IAAI,sBAAsB,+BAA+B,kDAAkD;AAAA,EACnH;AACA,QAAM,QAAQ,SAAS;AACvB,QAAM,YAAY,SAAS;AAC3B,QAAM,aAAa,SAAS;AAC5B,MAAI,OAAO,UAAU,YAAY,MAAM,WAAW,GAAG;AACnD,UAAM,IAAI,sBAAsB,+BAA+B,sDAAsD;AAAA,EACvH;AACA,MAAI,OAAO,cAAc,YAAY,UAAU,WAAW,GAAG;AAC3D,UAAM,IAAI,sBAAsB,+BAA+B,0DAA0D;AAAA,EAC3H;AACA,MAAI,OAAO,eAAe,YAAY,WAAW,WAAW,GAAG;AAC7D,UAAM,IAAI,sBAAsB,+BAA+B,2DAA2D;AAAA,EAC5H;AACA,SAAO,EAAE,OAAO,WAAW,WAAW;AACxC;AAEA,eAAe,mBACb,OACA,UACA,WAC4B;AAC5B,QAAM,cAAc;AACpB,MAAI;AACJ,WAAS,UAAU,GAAG,WAAW,aAAa,WAAW,GAAG;AAC1D,QAAI;AACF,YAAM,WAAW,MAAM,UAAU,MAAM,WAAW;AAAA,QAChD,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,eAAe,UAAU,MAAM,KAAK;AAAA,UACpC,gBAAgB,SAAS;AAAA,QAC3B;AAAA,QACA,MAAM,IAAI,WAAW,SAAS,KAAK;AAAA,MACrC,CAAC;AACD,UAAI,oBAAoB,SAAS,MAAM,KAAK,UAAU,aAAa;AACjE;AAAA,MACF;AACA,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,gBAAgB,SAAS,MAAM;AAAA,MACvC;AACA,aAAO,iBAAiB,MAAM,SAAS,KAAK,CAAC;AAAA,IAC/C,SAAS,OAAO;AACd,UAAI,iBAAiB,uBAAuB;AAC1C,cAAM;AAAA,MACR;AACA,2BAAqB;AACrB,UAAI,YAAY,aAAa;AAC3B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,IAAI,sBAAsB,4BAA4B,6BAA6B;AAAA,IACvF,OAAO,8BAA8B,QAAQ,mBAAmB,UAAU,OAAO,kBAAkB;AAAA,EACrG,CAAC;AACH;AAEA,SAAS,gBAAgB,QAAuC;AAC9D,MAAI,WAAW,KAAK;AAClB,WAAO,IAAI,sBAAsB,8BAA8B,oDAAoD,EAAE,OAAO,CAAC;AAAA,EAC/H;AACA,MAAI,WAAW,OAAO,WAAW,KAAK;AACpC,WAAO,IAAI,sBAAsB,mCAAmC,kDAAkD,MAAM,KAAK,EAAE,OAAO,CAAC;AAAA,EAC7I;AACA,SAAO,IAAI,sBAAsB,gCAAgC,sCAAsC,MAAM,KAAK,EAAE,OAAO,CAAC;AAC9H;AAEA,SAAS,oBAAoB,QAAyB;AACpD,SAAO,WAAW,OAAO,UAAU;AACrC;AAEA,SAAS,iBAAiB,MAAiC;AACzD,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,IAAI;AAAA,EAC1B,QAAQ;AACN,UAAM,IAAI,sBAAsB,oCAAoC,6CAA6C;AAAA,EACnH;AACA,MAAI,CAACA,UAAS,MAAM,GAAG;AACrB,UAAM,IAAI,sBAAsB,oCAAoC,4CAA4C;AAAA,EAClH;AACA,MAAI,OAAO,OAAO,eAAe,UAAU;AACzC,UAAM,IAAI,sBAAsB,oCAAoC,qDAAqD;AAAA,EAC3H;AACA,MAAI,OAAO,OAAO,cAAc,YAAY,CAAC,OAAO,SAAS,OAAO,SAAS,GAAG;AAC9E,UAAM,IAAI,sBAAsB,oCAAoC,4DAA4D;AAAA,EAClI;AACA,MAAI,OAAO,OAAO,gBAAgB,UAAU;AAC1C,UAAM,IAAI,sBAAsB,oCAAoC,sDAAsD;AAAA,EAC5H;AACA,SAAO;AAAA,IACL,YAAY,OAAO;AAAA,IACnB,WAAW,OAAO;AAAA,IAClB,aAAa,OAAO;AAAA,EACtB;AACF;AAEA,SAAS,kBACP,OACA,UACA,WACM;AACN,MAAI,UAAU,eAAe,MAAM,YAAY;AAC7C,UAAM,IAAI,sBAAsB,0CAA0C,sEAAsE;AAAA,MAC9I,UAAU,MAAM;AAAA,MAChB,QAAQ,UAAU;AAAA,IACpB,CAAC;AAAA,EACH;AACA,MAAI,UAAU,cAAc,SAAS,WAAW;AAC9C,UAAM,IAAI,sBAAsB,mCAAmC,wEAAwE;AAAA,MACzI,UAAU,SAAS;AAAA,MACnB,QAAQ,UAAU;AAAA,IACpB,CAAC;AAAA,EACH;AACF;AAEA,SAAS,qBAAqB,OAAyB;AACrD,MAAI,CAACA,UAAS,KAAK,KAAK,CAAC,MAAM,QAAQ,MAAM,OAAO,GAAG;AACrD,WAAO;AAAA,EACT;AACA,QAAM,OAAO,MAAM,QAChB,IAAI,CAAC,SAASA,UAAS,IAAI,KAAK,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO,EAAE,EAC9E,KAAK,CAAC,aAAa,SAAS,KAAK,EAAE,WAAW,GAAG,CAAC;AACrD,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AACA,MAAI;AACF,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,aACP,SACA,OACA,MACA,UACM;AACN,UAAQ,aAAa;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,QAAQ;AAAA,IACf,OAAO,QAAQ;AAAA,EACjB,CAAC;AACH;AAEA,SAAS,kBAAkB,MAAsB;AAC/C,QAAM,YAAY,QAAQ,IAAI,EAAE,YAAY;AAC5C,SAAO,kBAAkB,SAAS,KAAK;AACzC;AAEA,IAAM,oBAA4C;AAAA,EAChD,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AACV;AAEA,SAASA,UAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;;;AC9VO,SAAS,2BAA2B,QAA4B,QAAqC;AAC1G,SAAO,WAAW,gCAAgC,CAAC,KAAK,WAAW,gCAAgC,CAAC;AACtG;AAEA,eAAsB,gCAAgC,SAA2D;AAC/G,QAAM,SAAS,2BAA2B,QAAQ,IAAI;AACtD,QAAM,SAAS,MAAM,kBAAkB,QAAQ,QAAQ;AAAA,IACrD,cAAc,OAAO;AAAA,IACrB,OAAO,OAAO,MAAM,IAAI,CAAC,UAAU;AAAA,MACjC;AAAA,MACA,UAAU,OAAO;AAAA,MACjB,aAAa,OAAO;AAAA,IACtB,EAAE;AAAA,IACF,UAAU,OAAO;AAAA,IACjB,YAAY,OAAO;AAAA,IACnB,YAAY,QAAQ,OAAO,SAAY,CAAC,aAAa;AACnD,qBAAe,UAAU,QAAQ,GAAG,MAAM;AAAA,IAC5C;AAAA,EACF,CAAC;AAED,UAAQ,GAAG,OAAO,MAAM,6BAA6B,QAAQ,QAAQ,IAAI,CAAC;AAC1E,SAAO;AACT;AAWA,SAAS,2BAA2B,MAA6C;AAC/E,QAAM,QAAkB,CAAC;AACzB,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI,gBAAgB;AAEpB,WAAS,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;AACnD,UAAM,MAAM,KAAK,KAAK;AACtB,QAAI,CAAC,KAAK;AACR;AAAA,IACF;AACA,QAAI,eAAe;AACjB,YAAM,KAAK,GAAG;AACd;AAAA,IACF;AACA,QAAI,QAAQ,MAAM;AAChB,sBAAgB;AAChB;AAAA,IACF;AACA,QAAI,QAAQ,qBAAqB,QAAQ,kBAAkB;AACzD,qBAAeC,cAAa,KAAK,KAAK,EAAE,KAAK,CAAC;AAC9C;AAAA,IACF;AACA,QAAI,QAAQ,gBAAgB,QAAQ,UAAU;AAC5C,iBAAWA,cAAa,KAAK,KAAK,EAAE,KAAK,CAAC;AAC1C;AAAA,IACF;AACA,QAAI,QAAQ,oBAAoB,QAAQ,iBAAiB;AACvD,oBAAcA,cAAa,KAAK,KAAK,EAAE,KAAK,CAAC;AAC7C;AAAA,IACF;AACA,QAAI,QAAQ,iBAAiB,QAAQ,cAAc;AACjD,iBAAW,qBAAqB,KAAKA,cAAa,KAAK,KAAK,EAAE,KAAK,CAAC,CAAC;AACrE;AAAA,IACF;AACA,QAAI,QAAQ,mBAAmB,QAAQ,gBAAgB;AACrD,mBAAa,qBAAqB,KAAKA,cAAa,KAAK,KAAK,EAAE,KAAK,CAAC,CAAC;AACvE;AAAA,IACF;AACA,QAAI,IAAI,WAAW,IAAI,GAAG;AACxB,YAAM,IAAI,gBAAgB,gBAAgB,gBAAgB,GAAG,4BAA4B,EAAE,MAAM,IAAI,CAAC;AAAA,IACxG;AACA,UAAM,KAAK,GAAG;AAAA,EAChB;AAEA,MAAI,CAAC,cAAc;AACjB,UAAM,IAAI,gBAAgB,yBAAyB,oEAAsE;AAAA,MACvH,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACA,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,IAAI,gBAAgB,gBAAgB,uCAAuC;AAAA,EACnF;AACA,MAAI,YAAY,MAAM,WAAW,GAAG;AAClC,UAAM,IAAI,gBAAgB,sBAAsB,6DAA6D;AAAA,MAC3G,MAAM;AAAA,MACN,OAAO,MAAM;AAAA,IACf,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,MAAc,OAAuB;AACjE,MAAI,CAAC,aAAa,KAAK,KAAK,GAAG;AAC7B,UAAM,IAAI,gBAAgB,sBAAsB,GAAG,IAAI,gCAAgC,EAAE,MAAM,MAAM,CAAC;AAAA,EACxG;AACA,SAAO,OAAO,SAAS,OAAO,EAAE;AAClC;AAEA,SAASA,cAAa,MAAc,OAAmC;AACrE,MAAI,CAAC,SAAS,MAAM,WAAW,IAAI,GAAG;AACpC,UAAM,IAAI,gBAAgB,uBAAuB,GAAG,IAAI,sBAAsB,EAAE,KAAK,CAAC;AAAA,EACxF;AACA,SAAO;AACT;AAEA,SAAS,eAAe,UAAoC,QAAkC;AAC5F,MAAI,SAAS,UAAU,SAAS;AAC9B,WAAO,MAAM,aAAa,SAAS,QAAQ,KAAK,SAAS,QAAQ,CAAC,IAAI,SAAS,KAAK;AAAA,CAAQ;AAAA,EAC9F;AACF;AAEA,SAAS,6BAA6B,QAAiC,MAAuB;AAC5F,MAAI,MAAM;AACR,WAAO,cAAc,QAAQ,EAAE,KAAK,CAAC;AAAA,EACvC;AACA,QAAM,QAAQ;AAAA,IACZ,YAAY,OAAO,KAAK,cAAc,OAAO,UAAU,IAAI,KAAK,GAAG;AAAA,IACnE,GAAG,OAAO,SAAS,IAAI,CAAC,SAAS,KAAK,KAAK,QAAQ,KAAK,KAAK,SAAS,SAAS;AAAA,EACjF;AACA,SAAO,cAAc,MAAM,KAAK,IAAI,GAAG,EAAE,MAAM,MAAM,CAAC;AACxD;;;AC3JA,SAAS,SAAAC,QAAO,SAAAC,QAAO,UAAAC,SAAQ,MAAAC,KAAI,OAAO,QAAAC,OAAM,aAAAC,kBAAiB;AACjE,SAAS,WAAAC,UAAS,QAAAC,OAAM,UAAU,WAAAC,UAAS,OAAAC,YAAW;;;ACDtD,SAAS,YAAAC,iBAAgB;AAyBlB,IAAM,cAAc;AAepB,IAAM,qBAAqB;AAS3B,IAAM,gBAAwC;AAAA,EACnD,EAAE,IAAI,eAAe,OAAO,eAAe,MAAM,YAAY;AAAA,EAC7D,EAAE,IAAI,UAAU,OAAO,UAAU,MAAM,mBAAmB;AAC5D;AAmBO,SAAS,iBAAiB,OAAyC;AACxE,QAAM,OAAO,CAAC,MAAM,cAAc,UAAU,MAAM,IAAI;AACtD,MAAI,MAAM,OAAO,MAAM,QAAQ,QAAQ;AACrC,SAAK,KAAK,SAAS,MAAM,GAAG;AAAA,EAC9B;AAEA,MAAI,MAAM,YAAY,CAAC,qBAAqB,MAAM,OAAO,QAAQ,MAAM,QAAQ,GAAG;AAChF,SAAK,KAAK,cAAc,MAAM,QAAQ;AAAA,EACxC;AACA,SAAO,EAAE,SAAS,OAAO,KAAK;AAChC;AAGO,SAAS,kBAAkB,OAAyC;AACzE,MAAI,CAACC,UAAS,KAAK,KAAK,CAAC,MAAM,QAAQ,MAAM,IAAI,GAAG;AAClD,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,MAAM,KAAK,QAAQ,QAAQ;AACzC,QAAM,QAAQ,SAAS,IAAI,MAAM,KAAK,QAAQ,CAAC,IAAI;AACnD,SAAO,OAAO,UAAU,YAAa,cAAoC,SAAS,KAAK,IAClF,QACD;AACN;AA2BO,SAAS,gBAAgB,UAAuC;AACrE,MAAI,aAAa,QAAW;AAC1B,WAAO;AAAA,EACT;AACA,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,QAAQ;AAClC,UAAM,UAAU,QAAQ;AACxB,WAAOA,UAAS,OAAO,IAAI,QAAQ,SAAS,OAAO,KAAK,WAAW,IAAI;AAAA,EACzE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAMO,SAAS,SAAS,SAAsD;AAC7E,MAAI,OAAO,UAAU,eAAe,KAAK,SAAS,WAAW,GAAG;AAC9D,WAAO;AAAA,EACT;AACA,SAAO,YAAY,QAAQ,kBAAkB,CAAC,IAAI,qBAAqB;AACzE;AAGA,SAAS,eAAe,SAA2C;AACjE,SAAO,YAAY,QAAQ,kBAAkB,CAAC;AAChD;AAMO,SAAS,YAAY,OAAyB;AACnD,MAAI,CAACA,UAAS,KAAK,GAAG;AACpB,WAAO;AAAA,EACT;AACA,QAAM,EAAE,SAAS,KAAK,IAAI;AAC1B,QAAM,UAAU,MAAM,QAAQ,IAAI,IAAI,KAAK,OAAO,CAAC,QAAuB,OAAO,QAAQ,QAAQ,IAAI,CAAC;AACtG,QAAM,eAAe,CAAC,QAAgB,CAAC,cAAc,mBAAmB,EACrE,KAAK,CAAC,SAAS,QAAQ,QAAQ,IAAI,WAAW,GAAG,IAAI,GAAG,CAAC;AAC5D,MAAI,QAAQ,KAAK,CAAC,QAAQ,aAAa,GAAG,KAAK,QAAQ,QAAQ,GAAG;AAChE,WAAO;AAAA,EACT;AACA,QAAM,MAAM,OAAO,YAAY,WAAWC,UAAS,OAAO,IAAI;AAC9D,SAAO,SAAS,SAAS,GAAG;AAC9B;AAMA,IAAM,WAA8B,CAAC,WAAW,UAAU,YAAY;AAE/D,SAAS,iBAAiB,UAA8B,OAAoC;AACjG,QAAM,OAAO,kBAAkB,QAAQ;AACvC,QAAM,UAAU,YAAY,IAAI;AAChC,QAAM,SAAS,SAAS,OAAO;AAC/B,QAAM,WAAW,WAAW;AAC5B,QAAM,gBAAgB,WAAW,SAAY,SAAY,QAAQ,MAAM;AAEvE,MAAI,eAAe,OAAO,GAAG;AAC3B,WAAO,QAAQ,kBAAkB;AAAA,EACnC;AACA,UAAQ,WAAW,IAAI;AACvB,SAAO,EAAE,SAAS,UAAU,EAAE,GAAG,MAAM,YAAY,QAAQ,CAAC,GAAG,UAAU,cAAc;AACzF;AAsBO,SAAS,kBAAkB,UAA8B,SAAsC;AACpG,MAAI,aAAa,QAAW;AAC1B,WAAO,EAAE,SAAS,OAAO,SAAS,MAAM;AAAA,EAC1C;AACA,QAAM,OAAO,kBAAkB,QAAQ;AACvC,QAAM,UAAU,YAAY,IAAI;AAEhC,QAAM,SAAS,SAAS,OAAO;AAC/B,QAAM,UAAU,WAAW;AAC3B,MAAI,YAAY,QAAW;AAGzB,YAAQ,UAAU,WAAW,IAAI,QAAQ;AACzC,WAAO,EAAE,SAAS,UAAU,EAAE,GAAG,MAAM,YAAY,QAAQ,CAAC,GAAG,SAAS,SAAS,MAAM;AAAA,EACzF;AACA,MAAI,WAAW,QAAW;AACxB,WAAO,QAAQ,MAAM;AAAA,EACvB;AACA,QAAM,YAAY,OAAO,KAAK,IAAI,EAAE,OAAO,CAAC,QAAQ,QAAQ,YAAY;AACxE,QAAM,UAAU,OAAO,KAAK,OAAO,EAAE,WAAW,KAAK,UAAU,WAAW;AAC1E,SAAO,EAAE,SAAS,UAAU,EAAE,GAAG,MAAM,YAAY,QAAQ,CAAC,GAAG,SAAS,QAAQ;AAClF;AAGO,SAAS,gBAAgB,OAAiC;AAC/D,QAAM,QAAQ,iBAAiB,KAAK;AACpC,SAAO,iBAAiB,WAAW,OAAO,MAAM,OAAO,IAAI,MAAM,KAAK,KAAK,GAAG,CAAC;AACjF;AAMO,SAAS,kBAAkB,OAAmC;AACnE,QAAM,QAAQ,iBAAiB,KAAK;AACpC,SAAO;AAAA,IACL,oEAAoE,MAAM,IAAI;AAAA,IAC9E;AAAA,IACA,oBAAoB,WAAW;AAAA,IAC/B,kBAAkB,MAAM,OAAO;AAAA,IAC/B,cAAc,KAAK,UAAU,MAAM,IAAI,CAAC;AAAA,IACxC;AAAA,IACA,0CAA0C,MAAM,IAAI;AAAA,IACpD;AAAA,EACF;AACF;AAEO,SAAS,qBAA6B;AAC3C,SAAO,oBAAoB,WAAW;AACxC;AAOA,SAAS,YAAY,MAAwD;AAC3E,QAAM,UAAU,KAAK;AACrB,MAAI,YAAY,QAAW;AACzB,WAAO,CAAC;AAAA,EACV;AACA,MAAI,CAACD,UAAS,OAAO,GAAG;AACtB,UAAM,IAAI;AAAA,MACR;AAAA,IAEF;AAAA,EACF;AACA,SAAO,EAAE,GAAG,QAAQ;AACtB;AAEA,SAAS,kBAAkB,UAAuD;AAChF,MAAI,aAAa,UAAa,CAAC,SAAS,KAAK,GAAG;AAC9C,WAAO,CAAC;AAAA,EACV;AACA,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,QAAQ;AAAA,EAC9B,SAAS,OAAO;AACd,UAAM,IAAI;AAAA,MACR,wGACE,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CACvD;AAAA,IACF;AAAA,EACF;AACA,MAAI,CAACA,UAAS,MAAM,GAAG;AACrB,UAAM,IAAI,MAAM,mEAAmE;AAAA,EACrF;AACA,SAAO;AACT;AAEA,SAAS,UAAU,OAAwB;AACzC,SAAO,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA;AAC1C;AAEA,SAASA,UAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;;;ACnSO,IAAM,eAAe;AACrB,IAAM,aAAa;AAcnB,IAAM,sBAAsB;AAC5B,IAAM,oBAAoB;AAGjC,IAAM,UAAiD;AAAA,EACrD,OAAO,CAAC,cAAc,mBAAmB;AAAA,EACzC,KAAK,CAAC,YAAY,iBAAiB;AACrC;AAGO,IAAM,cAAc;AACpB,IAAM,qBAAqB;AAC3B,IAAM,mBAAmB,GAAG,WAAW;AACvC,IAAM,sBAAsB,GAAG,WAAW;AAoB1C,IAAM,sBAAsB,GAAG,WAAW;AAc1C,SAAS,iBAAiB,OAAwB,UAA2B;AAClF,SAAO,aAAa,YAAY,qBAAqB;AAAA,IACnD,aAAa,MAAM;AAAA,IACnB,aAAa,MAAM;AAAA,IACnB,UAAU,MAAM;AAAA,EAClB,CAAC;AACH;AASO,SAAS,aAAa,UAAkB,QAAwC;AAKrF,SAAO,SAAS,QAAQ,0BAA0B,CAAC,OAAO,SACxD,OAAO,UAAU,eAAe,KAAK,QAAQ,IAAI,IAAI,OAAO,IAAI,IAAK,KAAK;AAC9E;AAEO,IAAM,UAAU;AAChB,IAAM,iBAAiB;AAG9B,IAAM,qBAA+C;AAAA,EACnD,CAAC,OAAO,GAAG,CAAC,eAAe,eAAe,UAAU;AAAA,EACpD,CAAC,cAAc,GAAG,CAAC,kBAAkB,YAAY;AACnD;AASO,SAAS,wBAAwB,KAAa,MAAkC;AACrF,aAAW,QAAQ,mBAAmB,GAAG,KAAK,CAAC,GAAG;AAChD,QAAI,CAAC,KAAK,SAAS,KAAK,IAAI,IAAI,GAAG;AACjC,aAAO,GAAG,GAAG,8BAA8B,IAAI;AAAA,IACjD;AAAA,EACF;AACA,MAAI,QAAQ,gBAAgB;AAE1B,WAAO,oBAAoB,KAAK,mBAAmB,IAAI,CAAC;AAAA,EAC1D;AACA,SAAO;AACT;AAEA,IAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkD1B,cAAc,IAAI,CAAC,WAAW,OAAO,OAAO,MAAM,OAAO,EAAE,CAAC,IAAI,OAAO,IAAI,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,+EACjB,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAY/E,SAAS,gBAAgB,UAA2B;AACzD,SAAO,aAAa,mBAAmB,YAAY,kBAAkB,GAAG;AAAA,IACtE,gBAAgB;AAAA,IAChB,YAAY;AAAA,EACd,CAAC;AACH;AAMA,SAAS,mBAAmB,UAA0B;AACpD,SAAO,SAAS,MAAM,mBAAmB,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,EAAE,KAAK,UAAU;AACxG;AAEA,IAAM,qBAAqB,GAAG,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWxC,UAAU;AAYL,SAAS,oBAAoB,KAAa,MAAkC;AACjF,QAAM,UAAU,KAAK,KAAK;AAC1B,MAAI,CAAC,QAAQ,WAAW,YAAY,GAAG;AACrC,WAAO,GAAG,GAAG,oBAAoB,YAAY;AAAA,EAC/C;AACA,MAAI,CAAC,QAAQ,SAAS,UAAU,GAAG;AACjC,WAAO,GAAG,GAAG,kBAAkB,UAAU;AAAA,EAC3C;AACA,QAAM,QAAQ,QAAQ,MAAM,aAAa,QAAQ,QAAQ,SAAS,WAAW,MAAM;AACnF,MAAI,MAAM,SAAS,YAAY,KAAK,MAAM,SAAS,UAAU,GAAG;AAC9D,WAAO,GAAG,GAAG,6BAA6B,YAAY,YAAY,UAAU;AAAA,EAC9E;AAKA,MAAI,CAAC,MAAM,WAAW,IAAI,GAAG;AAC3B,WAAO,GAAG,GAAG,aAAa,YAAY;AAAA,EACxC;AACA,MAAI,CAAC,MAAM,SAAS,IAAI,GAAG;AACzB,WAAO,GAAG,GAAG,aAAa,UAAU;AAAA,EACtC;AAEA,MAAI,iBAAiB,KAAK,GAAG;AAC3B,WAAO,GAAG,GAAG;AAAA,EACf;AACA,SAAO;AACT;AAGA,SAAS,iBAAiB,SAA0B;AAClD,MAAI;AACJ,aAAW,QAAQ,QAAQ,MAAM,IAAI,GAAG;AACtC,UAAM,QAAQ,QAAQ,IAAI;AAC1B,QAAI,CAAC,MAAO;AACZ,QAAI,CAAC,KAAM,QAAO,EAAE,MAAM,MAAM,MAAM,QAAQ,MAAM,OAAO;AAAA,aAClD,MAAM,SAAS,KAAK,QAAQ,MAAM,UAAU,KAAK,UAAU,MAAM,SAAS,GAAI,QAAO;AAAA,EAChG;AACA,SAAO,SAAS;AAClB;AASO,SAAS,sBAAsB,OAAuB;AAC3D,SAAO,MAAM,KAAK;AACpB;AASO,SAAS,kBAAkB,UAA8B,OAAuB;AACrF,QAAM,UAAU,YAAY;AAC5B,yBAAuB,OAAO;AAE9B,QAAM,aAAa,sBAAsB,KAAK;AAC9C,QAAM,QAAQ,YAAY,OAAO;AACjC,QAAM,WAAW,QACb,GAAG,QAAQ,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,UAAU,GAAG,QAAQ,MAAM,MAAM,GAAG,CAAC,KACxE,GAAG,QAAQ,KAAK,IAAI,GAAG,QAAQ,QAAQ,QAAQ,EAAE,CAAC;AAAA;AAAA,IAAS,EAAE,GAAG,UAAU;AAAA;AAC9E,4BAA0B,UAAU,OAAO;AAC3C,SAAO;AACT;AAcA,SAAS,0BAA0B,UAAkB,UAAwB;AAC3E,MAAI,iBAAiB,UAAU,OAAO,MAAM,KAAK,iBAAiB,UAAU,KAAK,MAAM,GAAG;AACxF;AAAA,EACF;AACA,QAAM,SAAS,iBAAiB,QAAQ,IACpC,mFACA;AACJ,QAAM,IAAI;AAAA,IACR,6EAAwE,MAAM;AAAA,EAEhF;AACF;AAYO,SAAS,uBAAuB,SAAuB;AAC5D,QAAM,SAAS,iBAAiB,SAAS,OAAO;AAChD,QAAM,OAAO,iBAAiB,SAAS,KAAK;AAC5C,MAAI,WAAW,QAAQ,SAAS,GAAG;AACjC,UAAM,IAAI;AAAA,MACR,mCAAmC,MAAM,WAAW,IAAI,8DAClC,YAAY,MAAM,UAAU;AAAA,IACpD;AAAA,EACF;AACA,MAAI,WAAW,GAAG;AAChB;AAAA,EACF;AAGA,MAAI,YAAY,SAAS,OAAO,CAAC,EAAG,KAAK,YAAY,SAAS,SAAS,CAAC,EAAG,IAAI;AAC7E,UAAM,IAAI;AAAA,MACR,qCAAqC,UAAU,mBAAmB,YAAY;AAAA,IAEhF;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,SAAiB,MAA0B;AACnE,MAAI,QAAQ;AACZ,WAAS,MAAM,YAAY,SAAS,MAAM,CAAC,GAAG,QAAQ,QACjD,MAAM,YAAY,SAAS,MAAM,IAAI,KAAK,CAAC,GAAG;AACjD,aAAS;AAAA,EACX;AACA,SAAO;AACT;AAQA,SAAS,YAAY,SAAiB,MAAkB,MAAqC;AAC3F,MAAI;AACJ,aAAW,UAAU,QAAQ,IAAI,GAAG;AAClC,UAAM,KAAK,iBAAiB,SAAS,QAAQ,IAAI;AACjD,QAAI,MAAM,MAAM,SAAS,UAAa,KAAK,KAAK,KAAK;AACnD,aAAO,EAAE,IAAI,QAAQ,OAAO,OAAO;AAAA,IACrC;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAAS,UAAU,SAAiB,MAAkB,MAAqC;AACzF,MAAI;AACJ,aAAW,UAAU,QAAQ,IAAI,GAAG;AAClC,UAAM,KAAK,QAAQ,QAAQ,QAAQ,IAAI;AACvC,QAAI,MAAM,MAAM,SAAS,UAAa,KAAK,KAAK,KAAK;AACnD,aAAO,EAAE,IAAI,QAAQ,OAAO,OAAO;AAAA,IACrC;AAAA,EACF;AACA,SAAO;AACT;AAaA,SAAS,oBAAoB,SAAiB,OAAwB;AACpE,MAAI;AACJ,MAAI,SAAS;AACb,aAAW,QAAQ,QAAQ,MAAM,IAAI,GAAG;AACtC,UAAM,aAAa,SAAS,KAAK,SAAS;AAC1C,QAAI,QAAQ,YAAY;AAEtB,aAAO,SAAS;AAAA,IAClB;AACA,UAAM,QAAQ,QAAQ,IAAI;AAC1B,QAAI,OAAO;AACT,UAAI,CAAC,MAAM;AACT,eAAO,EAAE,MAAM,MAAM,MAAM,QAAQ,MAAM,OAAO;AAAA,MAClD,WAAW,MAAM,SAAS,KAAK,QAAQ,MAAM,UAAU,KAAK,UAAU,MAAM,SAAS,IAAI;AACvF,eAAO;AAAA,MACT;AAAA,IACF;AACA,aAAS;AAAA,EACX;AACA,SAAO,SAAS;AAClB;AAGA,SAAS,QAAQ,MAA0E;AACzF,QAAM,QAAQ,4BAA4B,KAAK,IAAI;AACnD,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,QAAM,MAAM,MAAM,CAAC;AACnB,QAAM,OAAO,MAAM,CAAC,EAAG,KAAK;AAE5B,MAAI,IAAI,WAAW,GAAG,KAAK,KAAK,SAAS,GAAG,GAAG;AAC7C,WAAO;AAAA,EACT;AACA,SAAO,EAAE,MAAM,IAAI,CAAC,GAAI,QAAQ,IAAI,QAAQ,KAAK;AACnD;AASO,SAAS,kBAAkB,UAA6C;AAC7E,QAAM,UAAU,YAAY;AAC5B,yBAAuB,OAAO;AAC9B,QAAM,QAAQ,YAAY,OAAO;AACjC,MAAI,CAAC,OAAO;AACV,WAAO,EAAE,SAAS,SAAS,SAAS,OAAO,SAAS,CAAC,QAAQ,KAAK,EAAE;AAAA,EACtE;AAMA,QAAM,SAAS,QAAQ,MAAM,GAAG,MAAM,KAAK,EAAE,QAAQ,QAAQ,EAAE;AAC/D,QAAM,QAAQ,QAAQ,MAAM,MAAM,GAAG,EAAE,QAAQ,QAAQ,EAAE;AACzD,QAAM,WAAW,UAAU,QACvB,GAAG,MAAM;AAAA;AAAA,EAAO,KAAK,KACrB,SACE,GAAG,MAAM;AAAA,IACT;AACN,SAAO,EAAE,SAAS,SAAS,KAAK,IAAI,WAAW,IAAI,SAAS,MAAM,SAAS,CAAC,SAAS,KAAK,EAAE;AAC9F;AAGO,SAAS,uBAAuB,SAAiB,OAAuB;AAC7E,QAAM,QAAQ,YAAY,OAAO;AACjC,SAAO,QAAQ,GAAG,QAAQ,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,KAAK,GAAG,QAAQ,MAAM,MAAM,GAAG,CAAC,KAAK;AACzF;AAYO,IAAM,iBAAiB;AACvB,IAAM,eAAe;AAoBrB,SAAS,eAAe,SAAuC;AACpE,MAAI,CAAC,SAAS;AACZ,WAAO,CAAC;AAAA,EACV;AAKA,QAAM,QAAQ,YAAY,OAAO;AACjC,QAAM,OAAO,UAAU,SACnB,UACA,QAAQ,MAAM,GAAG,MAAM,KAAK,IAAI,QAAQ,MAAM,MAAM,GAAG;AAC3D,QAAM,WAAqB,CAAC;AAC5B,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,OAAO;AACX,SAAO,MAAM;AACX,UAAM,QAAQ,UAAU,MAAM,SAAS,MAAM;AAC7C,UAAM,QAAQ,UAAU,MAAM,OAAO,MAAM;AAC3C,QAAI,UAAU,UAAa,UAAU,QAAW;AAC9C;AAAA,IACF;AACA,QAAI,UAAU,UAAc,UAAU,UAAa,MAAM,KAAK,MAAM,IAAK;AACvE,cAAQ;AACR,eAAS,MAAO,KAAK,MAAO;AAC5B;AAAA,IACF;AACA,UAAM,UAAU,UAAU,MAAM,OAAO,MAAM,KAAK,MAAM,MAAM;AAC9D,QAAI,YAAY,QAAW;AACzB,gBAAU;AACV,eAAS,MAAM,KAAK,MAAM;AAC1B;AAAA,IACF;AACA,aAAS,KAAK,WAAW,KAAK,MAAM,MAAM,IAAI,QAAQ,KAAK,QAAQ,MAAM,CAAC,CAAC;AAC3E,aAAS,QAAQ,KAAK,QAAQ;AAAA,EAChC;AACA,WAAS,IAAI,GAAG,IAAI,QAAQ,KAAK,EAAG,UAAS,KAAK,cAAc;AAChE,WAAS,IAAI,GAAG,IAAI,MAAM,KAAK,EAAG,UAAS,KAAK,YAAY;AAC5D,SAAO;AACT;AAGA,SAAS,WAAW,OAAuB;AACzC,SAAO,MAAM,MAAM,IAAI,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,EAAE,KAAK,IAAI;AACjG;AAGO,SAAS,oBAAoB,SAAiD;AACnF,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,YAAY,OAAO;AACjC,SAAO,QAAQ,QAAQ,MAAM,MAAM,OAAO,MAAM,GAAG,IAAI;AACzD;AAGA,SAAS,YAAY,SAA6D;AAChF,QAAM,QAAQ,YAAY,SAAS,SAAS,CAAC;AAC7C,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AACA,QAAM,YAAY,YAAY,SAAS,OAAO,MAAM,EAAE;AACtD,MAAI,cAAc,QAAW;AAC3B,WAAO;AAAA,EACT;AACA,SAAO,EAAE,OAAO,MAAM,IAAI,KAAK,UAAU,KAAK,UAAU,OAAO;AACjE;AAeA,SAAS,iBAAiB,SAAiB,QAAgB,MAAsB;AAC/E,WAAS,KAAK,QAAQ,QAAQ,QAAQ,IAAI,GAAG,MAAM,GAAG,KAAK,QAAQ,QAAQ,QAAQ,KAAK,CAAC,GAAG;AAC1F,UAAM,YAAY,QAAQ,YAAY,MAAM,KAAK,CAAC,IAAI;AACtD,QAAI,cAAc,IAAI;AACpB;AAAA,IACF;AACA,UAAM,UAAU,QAAQ,QAAQ,MAAM,EAAE;AACxC,UAAM,QAAQ,UAAU,IAAI,QAAQ,MAAM,EAAE,IAAI,QAAQ,MAAM,IAAI,OAAO,GAAG,MAAM,OAAO,MAAM;AAC/F,QAAI,KAAK,KAAK,MAAM,IAAI;AACtB;AAAA,IACF;AACA,QAAI,oBAAoB,SAAS,EAAE,GAAG;AACpC;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;ACvkBO,IAAM,cAAc;AAMpB,IAAM,qBAAqB;AAG3B,IAAM,iBAAiB;AAcvB,IAAM,SAAgB,EAAE,IAAI,SAAS;AA8ErC,SAAS,cAA0B;AACxC,SAAO,EAAE,SAAS,gBAAgB,OAAO,CAAC,GAAG,oBAAoB,CAAC,EAAE;AACtE;AAkBO,SAAS,WAAW,SAA6B,aAAqB,qBAAkC;AAE7G,QAAME,uBAAsB;AAC5B,MAAI,YAAY,QAAW;AACzB,WAAO,EAAE,OAAO,SAAS;AAAA,EAC3B;AACA,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,OAAO;AAAA,EAC7B,QAAQ;AACN,WAAO,EAAE,OAAO,WAAW,QAAQ,GAAGA,oBAAmB,qBAAqB;AAAA,EAChF;AACA,MAAI,CAAC,SAAS,MAAM,GAAG;AACrB,WAAO,EAAE,OAAO,WAAW,QAAQ,GAAGA,oBAAmB,wBAAwB;AAAA,EACnF;AACA,MAAI,OAAO,SAAS,eAAe,OAAO,SAAS,oBAAoB;AACrE,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ,GAAGA,oBAAmB,mDACvB,KAAK,UAAU,OAAO,IAAI,CAAC;AAAA,IACpC;AAAA,EACF;AACA,MAAI,OAAO,YAAY,gBAAgB;AAGrC,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ,GAAGA,oBAAmB,+DACP,KAAK,UAAU,OAAO,OAAO,CAAC,oBAAoB,cAAc;AAAA,IACzF;AAAA,EACF;AACA,QAAM,QAAQ,OAAO;AACrB,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,WAAO,EAAE,OAAO,WAAW,QAAQ,GAAGA,oBAAmB,yBAAyB;AAAA,EACpF;AACA,QAAM,MAAoC,CAAC;AAC3C,aAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC/C,UAAM,OAAO,aAAa,GAAG;AAC7B,QAAI,aAAa,MAAM;AACrB,aAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ,GAAGA,oBAAmB,8BAA8B,IAAI,cAAS,KAAK,OAAO;AAAA,MACvF;AAAA,IACF;AACA,QAAI,IAAI,IAAI,KAAK;AAAA,EACnB;AACA,QAAM,cAAc,OAAO;AAC3B,MAAI,gBAAgB,UAAa,CAAC,cAAc,WAAW,GAAG;AAC5D,WAAO,EAAE,OAAO,WAAW,QAAQ,GAAGA,oBAAmB,sCAAsC;AAAA,EACjG;AACA,SAAO;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,OAAO;AAAA,MACP,oBAAoB,gBAAgB,SAAY,CAAC,IAAI,CAAC,GAAG,WAAW;AAAA,IACtE;AAAA,EACF;AACF;AASA,IAAM,sBAAsB;AAAA,EAC1B;AAAA,EAAW;AAAA,EAAa;AAAA,EAAe;AAAA,EAAuB;AAAA,EAC9D;AAAA,EAAmB;AAAA,EAAkB;AAAA,EAAc;AACrD;AAUO,SAAS,oBAAoB,eAA4C;AAC9E,MAAI,kBAAkB,QAAW;AAC/B,WAAO;AAAA,EACT;AACA,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,aAAa;AAAA,EACnC,QAAQ;AACN,WAAO;AAAA,EACT;AACA,MAAI,CAAC,SAAS,MAAM,KAAK,CAAC,SAAS,OAAO,OAAO,GAAG;AAClD,WAAO;AAAA,EACT;AACA,QAAM,UAAU,OAAO;AACvB,QAAM,iBAAiB,oBAAoB;AAAA,IACzC,CAAC,QAAQ,OAAO,UAAU,eAAe,KAAK,SAAS,GAAG;AAAA,EAC5D;AACA,MAAI,CAAC,gBAAgB;AACnB,WAAO;AAAA,EACT;AAOA,MAAI,OAAO,OAAO,gBAAgB,UAAU;AAC1C,WAAO;AAAA,EACT;AACA,QAAM,cAAc,QAAQ;AAE5B,SAAO,SAAS,WAAW,KACtB,CAAC,qBAAqB,GAAG,kBAAkB,cAAc,EACzD,KAAK,CAAC,SAAS,OAAO,UAAU,eAAe,KAAK,aAAa,IAAI,CAAC;AAC7E;AAGO,SAAS,oBAAoB,YAA4B;AAC9D,SAAO,GAAG,UAAU,uHACyC,mBAAmB;AAMlF;AAGO,SAAS,gBAAgB,QAA4B;AAC1D,SAAO,GAAG,KAAK,UAAU;AAAA,IACvB,MAAM;AAAA,IACN,SAAS;AAAA,IACT,OAAO,OAAO;AAAA,IACd,oBAAoB,OAAO;AAAA,EAC7B,GAAG,MAAM,CAAC,CAAC;AAAA;AACb;AAQA,SAAS,aAAa,KAA4B;AAChD,MAAI,CAAC,SAAS,GAAG,GAAG;AAClB,WAAO,EAAE,SAAS,uBAAuB;AAAA,EAC3C;AACA,QAAM,QAAQ,IAAI;AAClB,MAAI,UAAU,WAAW,UAAU,WAAW,UAAU,WAAW,UAAU,UAAU;AACrF,WAAO,EAAE,SAAS,yBAAyB,KAAK,UAAU,IAAI,KAAK,CAAC,IAAI;AAAA,EAC1E;AACA,MAAI,OAAO,IAAI,gBAAgB,WAAW;AACxC,WAAO,EAAE,SAAS,gDAAgD;AAAA,EACpE;AACA,QAAM,WAAW,UAAU,IAAI,QAAQ;AACvC,QAAM,UAAU,UAAU,IAAI,OAAO;AACrC,MAAI,aAAa,QAAW;AAC1B,WAAO,EAAE,SAAS,kDAAkD;AAAA,EACtE;AACA,MAAI,YAAY,QAAW;AACzB,WAAO,EAAE,SAAS,+CAA+C;AAAA,EACnE;AACA,MAAI,IAAI,oBAAoB,UAAa,OAAO,IAAI,oBAAoB,UAAU;AAChF,WAAO,EAAE,SAAS,kCAAkC;AAAA,EACtD;AACA,MAAI,IAAI,kBAAkB,UAAa,CAAC,SAAS,IAAI,aAAa,GAAG;AACnE,WAAO,EAAE,SAAS,gCAAgC;AAAA,EACpD;AACA,MAAI;AACJ,MAAI,IAAI,mBAAmB,QAAW;AACpC,QAAI,CAAC,SAAS,IAAI,cAAc,GAAG;AACjC,aAAO,EAAE,SAAS,iCAAiC;AAAA,IACrD;AACA,qBAAiB,CAAC;AAClB,eAAW,CAAC,OAAO,KAAK,KAAK,OAAO,QAAQ,IAAI,cAAc,GAAG;AAC/D,YAAM,QAAQ,UAAU,KAAK;AAC7B,UAAI,UAAU,QAAW;AACvB,eAAO,EAAE,SAAS,0CAA0C,KAAK,GAAG;AAAA,MACtE;AACA,qBAAe,KAAK,IAAI;AAAA,IAC1B;AAAA,EACF;AACA,MAAI,IAAI,kBAAkB,UAAa,CAAC,cAAc,IAAI,aAAa,GAAG;AACxE,WAAO,EAAE,SAAS,gCAAgC;AAAA,EACpD;AACA,MAAI,UAAU,WAAW,IAAI,kBAAkB,QAAW;AAExD,WAAO,EAAE,SAAS,mFAAmF;AAAA,EACvG;AACA,MAAI,UAAU,UAAU;AACtB,UAAM,UAAU,sBAAsB;AAAA,MACpC;AAAA,MACA,eAAe,SAAS,IAAI,aAAa,IAAI,IAAI,gBAAgB;AAAA,MACjE;AAAA,IACF,CAAC;AACD,QAAI,YAAY,QAAW;AACzB,aAAO,EAAE,QAAQ;AAAA,IACnB;AAAA,EACF;AACA,QAAM,WAAyB;AAAA,IAC7B;AAAA,IAAO,aAAa,IAAI;AAAA,IAAa;AAAA,IAAU;AAAA,EACjD;AACA,MAAI,OAAO,IAAI,oBAAoB,SAAU,UAAS,kBAAkB,IAAI;AAC5E,MAAI,SAAS,IAAI,aAAa,EAAG,UAAS,gBAAgB,EAAE,GAAG,IAAI,cAAc;AACjF,MAAI,mBAAmB,OAAW,UAAS,iBAAiB;AAC5D,MAAI,cAAc,IAAI,aAAa,EAAG,UAAS,gBAAgB,CAAC,GAAG,IAAI,aAAa;AACpF,SAAO,EAAE,SAAS;AACpB;AAoBO,SAAS,sBACd,UAKA,aACoB;AACpB,QAAM,EAAE,SAAS,eAAe,eAAe,IAAI;AACnD,MAAI,kBAAkB,QAAW;AAC/B,WAAO;AAAA,EACT;AACA,MAAI,mBAAmB,QAAW;AAChC,WAAO;AAAA,EACT;AACA,QAAM,cAAc,OAAO,KAAK,aAAa,EAAE,KAAK;AACpD,QAAM,eAAe,OAAO,KAAK,cAAc,EAAE,KAAK;AACtD,MAAI,YAAY,WAAW,aAAa,UACjC,YAAY,KAAK,CAAC,KAAK,OAAO,QAAQ,aAAa,EAAE,CAAC,GAAG;AAC9D,WAAO,sCAAsC,YAAY,KAAK,IAAI,KAAK,MAAM,uBAC3D,aAAa,KAAK,IAAI,KAAK,MAAM;AAAA,EACrD;AACA,aAAW,OAAO,aAAa;AAG7B,UAAM,WAAW,eAAe,GAAG;AACnC,QAAI,SAAS,OAAO,YAAY,SAAS,OAAO,QAAQ;AACtD,aAAO,2BAA2B,GAAG,OAAO,SAAS,EAAE;AAAA,IAEzD;AAAA,EACF;AACA,MAAI,QAAQ,OAAO,QAAQ;AACzB,WAAO;AAAA,EACT;AACA,MAAI;AACJ,MAAI;AACF,WAAO,KAAK,MAAM,QAAQ,IAAI;AAAA,EAChC,QAAQ;AACN,WAAO;AAAA,EACT;AACA,MAAI,CAAC,SAAS,IAAI,GAAG;AACnB,WAAO;AAAA,EACT;AACA,aAAW,OAAO,aAAa;AAC7B,QAAI,CAAC,OAAO,UAAU,eAAe,KAAK,MAAM,GAAG,GAAG;AACpD,aAAO,iBAAiB,GAAG;AAAA,IAC7B;AACA,QAAIC,iBAAgB,KAAK,GAAG,CAAC,MAAMA,iBAAgB,cAAc,GAAG,CAAC,GAAG;AACtE,aAAO,iCAAiC,GAAG;AAAA,IAC7C;AAAA,EACF;AACA,MAAI,gBAAgB,QAAW;AAG7B,eAAW,OAAO,aAAa;AAC7B,UAAI,OAAO,UAAU,eAAe,KAAK,MAAM,GAAG,KAC3C,CAAC,OAAO,UAAU,eAAe,KAAK,eAAe,GAAG,GAAG;AAChE,eAAO,SAAS,GAAG;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,UAAU,KAAiC;AAClD,MAAI,CAAC,SAAS,GAAG,GAAG;AAClB,WAAO;AAAA,EACT;AACA,MAAI,IAAI,OAAO,UAAU;AACvB,WAAO;AAAA,EACT;AACA,MAAI,IAAI,OAAO,QAAQ;AAErB,WAAO,OAAO,UAAU,eAAe,KAAK,KAAK,OAAO,IACpD,EAAE,IAAI,QAAQ,OAAO,IAAI,MAAM,IAC/B;AAAA,EACN;AACA,MAAI,IAAI,OAAO,QAAQ;AACrB,WAAO,OAAO,IAAI,SAAS,WAAW,EAAE,IAAI,QAAQ,MAAM,IAAI,KAAK,IAAI;AAAA,EACzE;AACA,SAAO;AACT;AAcO,SAASA,iBAAgB,OAAwB;AACtD,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,IAAI,MAAM,IAAIA,gBAAe,EAAE,KAAK,GAAG,CAAC;AAAA,EACjD;AACA,MAAI,SAAS,OAAO,UAAU,UAAU;AACtC,UAAM,UAAU,OAAO,QAAQ,KAAgC,EAC5D,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,MAAO,OAAO,QAAQ,KAAK,OAAO,QAAQ,IAAI,CAAE;AACvE,WAAO,IAAI,QAAQ,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM,GAAG,KAAK,UAAU,GAAG,CAAC,IAAIA,iBAAgB,IAAI,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC;AAAA,EACtG;AACA,SAAO,KAAK,UAAU,KAAK,KAAK;AAClC;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,CAAC,CAAC,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AACrE;AAEA,SAAS,cAAc,OAAmC;AACxD,SAAO,MAAM,QAAQ,KAAK,KAAK,MAAM,MAAM,CAAC,UAAU,OAAO,UAAU,QAAQ;AACjF;;;AChcA,SAAS,cAAAC,mBAAkB;;;ACtC3B,SAAS,OAAO,YAAAC,WAAU,gBAAgB;AAC1C,SAAS,WAAAC,gBAAe;AACxB,SAAS,WAAAC,UAAS,QAAAC,OAAM,SAAS,WAAW;AAiDrC,SAAS,eAAe,MAAc,SAAyC;AACpF,MAAI,YAAY,UAAa,CAAC,QAAQ,KAAK,GAAG;AAC5C,WAAO,EAAE,MAAM,SAAS;AAAA,EAC1B;AACA,MAAI;AACJ,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,OAAO;AACjC,UAAM,MAAM,QAAQ;AACpB,cAAU,OAAO,QAAQ,YAAY,QAAQ,QAAQ,CAAC,MAAM,QAAQ,GAAG,IAAI,MAAiC,CAAC;AAAA,EAC/G,QAAQ;AACN,WAAO,QAAQ,SAAS,WAAW,KAAK,QAAQ,SAAS,kBAAkB,IACvE,EAAE,MAAM,WAAW,QAAQ,GAAG,IAAI,qBAAqB,IACvD,EAAE,MAAM,SAAS;AAAA,EACvB;AACA,QAAM,QAAuB,CAAC;AAC9B,aAAW,OAAO,CAAC,aAAa,kBAAkB,GAAG;AACnD,UAAM,QAAQ,QAAQ,GAAG;AACzB,QAAI,CAAC,YAAY,KAAK,GAAG;AACvB;AAAA,IACF;AACA,UAAM,OAAO,kBAAkB,KAAK;AACpC,QAAI,SAAS,QAAW;AACtB,aAAO,EAAE,MAAM,WAAW,QAAQ,GAAG,IAAI,aAAa,GAAG,kCAAkC;AAAA,IAC7F;AACA,QAAI,CAAC,MAAM,SAAS,IAAI,GAAG;AACzB,YAAM,KAAK,IAAI;AAAA,IACjB;AAAA,EACF;AACA,MAAI,MAAM,SAAS,GAAG;AACpB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ,GAAG,IAAI,kBAAkB,WAAW,cAAc,kBAAkB,kCAAkC,MAAM,KAAK,IAAI,CAAC;AAAA,IAChI;AAAA,EACF;AACA,SAAO,MAAM,WAAW,IAAI,EAAE,MAAM,SAAS,IAAI,EAAE,MAAM,QAAQ,MAAM,MAAM,CAAC,EAAG;AACnF;AAQO,SAAS,aAAa,OAA8D;AACzF,QAAM,QAAuB,CAAC;AAC9B,QAAM,WAAqB,CAAC;AAC5B,aAAW,UAAU,eAAe;AAClC,UAAM,OAAO,eAAe,OAAO,MAAM,MAAM,IAAI,OAAO,IAAI,CAAC;AAC/D,QAAI,KAAK,SAAS,WAAW;AAC3B,eAAS,KAAK,KAAK,MAAM;AAAA,IAC3B,WAAW,KAAK,SAAS,UAAU,CAAC,MAAM,SAAS,KAAK,IAAI,GAAG;AAC7D,YAAM,KAAK,KAAK,IAAI;AAAA,IACtB;AAAA,EACF;AACA,SAAO,EAAE,OAAO,UAAU,OAAO,MAAM,SAAS,KAAK,SAAS,SAAS,EAAE;AAC3E;AAcA,eAAsB,mBAAmB,KAAa,OAAeC,SAAQ,GAA4B;AACvG,QAAM,SAAS,MAAM,eAAe,IAAI;AACxC,WAAS,MAAM,MAAM,eAAe,GAAG,KAAK,MAAMC,SAAQ,GAAG,GAAG;AAC9D,QAAI,SAAS,KAAK,MAAM,GAAG;AACzB,aAAO,EAAE,MAAM,OAAO;AAAA,IACxB;AACA,UAAM,QAAQ,oBAAI,IAAgC;AAClD,QAAI;AACJ,eAAW,UAAU,eAAe;AAClC,UAAI;AACF,cAAM,IAAI,OAAO,MAAM,MAAM,iBAAiB,KAAK,OAAO,IAAI,CAAC;AAAA,MACjE,SAAS,OAAO;AACd,sBAAc,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MACrE;AAAA,IACF;AACA,QAAI,gBAAgB,QAAW;AAC7B,aAAO,EAAE,MAAM,YAAY,KAAK,QAAQ,YAAY;AAAA,IACtD;AACA,UAAM,SAAS,aAAa,KAAK;AACjC,QAAI,OAAO,OAAO;AAChB,UAAI,OAAO,SAAS,SAAS,GAAG;AAC9B,eAAO,EAAE,MAAM,YAAY,KAAK,QAAQ,OAAO,SAAS,KAAK,IAAI,EAAE;AAAA,MACrE;AACA,UAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,eAAO;AAAA,UACL,MAAM;AAAA,UACN;AAAA,UACA,QAAQ,kDAAkD,OAAO,MAAM,KAAK,IAAI,CAAC;AAAA,QACnF;AAAA,MACF;AACA,aAAO,EAAE,MAAM,QAAQ,MAAM,OAAO,MAAM,CAAC,GAAI,IAAI;AAAA,IACrD;AACA,QAAIA,SAAQ,GAAG,MAAM,KAAK;AACxB,aAAO,EAAE,MAAM,OAAO;AAAA,IACxB;AAAA,EACF;AACF;AAOA,eAAsB,oBAAoB,KAAa,QAAiC;AACtF,QAAM,UAAU,MAAM,YAAY,GAAG;AACrC,QAAM,QAAQ,cAAc,KAAK,IAAI;AACrC,MAAI,YAAY,UAAa,CAAC,SAAS,MAAM,eAAe,OAAO,GAAG,MAAM,eAAe,GAAG,CAAC,GAAG;AAChG,WAAO,8CAA8C,MAAM,QAAQ,GAAG,kCAAkC,OAAO,gHAEvG,OAAO;AAAA,EACjB;AACA,SAAO,kDAAkD,MAAM,QAAQ,GAAG,yEACA,KAAK,iDAC7B,GAAG;AACvD;AAEA,eAAe,eAAe,MAA+B;AAC3D,MAAI;AACF,WAAO,MAAM,SAAS,IAAI;AAAA,EAC5B,QAAQ;AACN,WAAO,QAAQ,IAAI;AAAA,EACrB;AACF;AAEA,SAAS,SAAS,MAAc,OAAwB;AACtD,SAAO,QAAQ,aAAa,UAAU,KAAK,YAAY,MAAM,MAAM,YAAY,IAAI,SAAS;AAC9F;AAMA,eAAe,iBAAiB,KAAa,MAA2C;AACtF,MAAI;AACJ,MAAI;AACF,WAAO,MAAM,SAASC,MAAK,KAAK,IAAI,CAAC;AAAA,EACvC,SAAS,OAAO;AACd,QAAIC,aAAY,OAAO,QAAQ,KAAKA,aAAY,OAAO,SAAS,GAAG;AACjE,aAAO;AAAA,IACT;AACA,UAAM;AAAA,EACR;AACA,QAAM,UAAU,MAAM,eAAe,GAAG;AACxC,MAAI,CAAC,SAAS,MAAM,OAAO,KAAK,CAAC,KAAK,WAAW,UAAU,GAAG,KACvD,EAAE,QAAQ,aAAa,WAAW,KAAK,YAAY,EAAE,YAAY,UAAU,KAAK,YAAY,CAAC,IAAI;AACtG,UAAM,IAAI,MAAM,GAAG,IAAI,mBAAmB,GAAG,KAAK,IAAI,GAAG;AAAA,EAC3D;AACA,SAAOC,UAAS,MAAM,MAAM;AAC9B;AAGA,eAAsB,YAAY,KAA0C;AAC1E,WAAS,KAAK,QAAQ,GAAG,KAAK,KAAKH,SAAQ,EAAE,GAAG;AAC9C,QAAI;AACF,YAAM,MAAMC,MAAK,IAAI,MAAM,CAAC;AAC5B,aAAO;AAAA,IACT,QAAQ;AAAA,IAER;AACA,QAAID,SAAQ,EAAE,MAAM,IAAI;AACtB,aAAO;AAAA,IACT;AAAA,EACF;AACF;AASA,eAAsB,gBAAgB,MAAc,MAA2C;AAC7F,QAAM,uBAAuB,MAAM,IAAI;AACvC,SAAO,aAAaC,MAAK,MAAM,IAAI,CAAC;AACtC;AAEA,eAAsB,aAAa,cAAmD;AACpF,MAAI;AACF,WAAO,MAAME,UAAS,cAAc,MAAM;AAAA,EAC5C,SAAS,OAAO;AACd,QAAID,aAAY,OAAO,QAAQ,GAAG;AAChC,aAAO;AAAA,IACT;AACA,UAAM;AAAA,EACR;AACF;AASA,eAAsB,uBAAuB,MAAc,cAAqC;AAC9F,QAAM,eAAeD,MAAK,MAAM,YAAY;AAC5C,QAAM,WAAW,MAAM,SAAS,IAAI;AACpC,MAAI;AACJ,MAAI;AACF,iBAAa,MAAM,SAASD,SAAQ,YAAY,CAAC;AAAA,EACnD,SAAS,OAAO;AACd,QAAIE,aAAY,OAAO,QAAQ,GAAG;AAChC;AAAA,IACF;AACA,UAAM;AAAA,EACR;AACA,MAAI,eAAe,YAAY,CAAC,WAAW,WAAW,WAAW,GAAG,GAAG;AACrE,UAAM,IAAI;AAAA,MACR,GAAG,YAAY,qCAAqC,UAAU;AAAA,IAChE;AAAA,EACF;AACA,MAAI;AACF,SAAK,MAAM,MAAM,YAAY,GAAG,eAAe,GAAG;AAChD,YAAM,IAAI,MAAM,GAAG,YAAY,oDAAoD;AAAA,IACrF;AAAA,EACF,SAAS,OAAO;AACd,QAAI,CAACA,aAAY,OAAO,QAAQ,GAAG;AACjC,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAASA,aAAY,OAAgB,MAAuB;AAC1D,SAAO,OAAO,UAAU,YAAY,UAAU,QAAS,MAA6B,SAAS;AAC/F;;;AD/NA,IAAM,eAAe;AAAA,EACnB,EAAE,MAAM,aAAa,iBAAiB,KAAK;AAAA,EAC3C,EAAE,MAAM,aAAa,iBAAiB,MAAM;AAC9C;AAEO,IAAM,gBAAmC;AAAA,EAC9C,GAAG,cAAc,IAAI,CAAC,WAAW,OAAO,IAAI;AAAA,EAC5C,GAAG,aAAa,IAAI,CAAC,WAAW,OAAO,IAAI;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AACF;AAyCA,SAAS,UAAU,OAAgB,SAAyB;AAC1D,SAAO,UAAU,EAAE,IAAI,QAAQ,MAAM,IAAI;AAC3C;AAEA,SAAS,UAAU,MAAiC;AAClD,SAAO,SAAS,SAAY,SAAS,EAAE,IAAI,QAAQ,KAAK;AAC1D;AASA,SAAS,UAAU,MAAa,OAAuB;AACrD,MAAI,KAAK,OAAO,MAAM,IAAI;AACxB,WAAO;AAAA,EACT;AACA,MAAI,KAAK,OAAO,UAAU;AACxB,WAAO;AAAA,EACT;AACA,MAAI,KAAK,OAAO,UAAU,MAAM,OAAO,QAAQ;AAC7C,WAAO,KAAK,SAAS,MAAM;AAAA,EAC7B;AACA,SAAO,KAAK,OAAO,UAAU,MAAM,OAAO,UACrCE,iBAAgB,KAAK,KAAK,MAAMA,iBAAgB,MAAM,KAAK;AAClE;AAGO,SAAS,mBAAmB,SAAyB;AAC1D,SAAOC,YAAW,QAAQ,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK;AAC1D;AAEA,SAAS,UAAU,MAAuB;AACxC,SAAO,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA;AACzC;AAGA,SAAS,eAAe,MAAc,SAAyB;AAC7D,MAAI,CAAC,KAAK,SAAS,OAAO,GAAG;AAC3B,WAAO,mBAAmB,OAAO;AAAA,EACnC;AACA,MAAI;AACF,WAAO,mBAAmBD,iBAAgB,KAAK,MAAM,OAAO,CAAC,CAAC;AAAA,EAChE,QAAQ;AACN,WAAO,mBAAmB,OAAO;AAAA,EACnC;AACF;AAEA,SAAS,gBAAgB,SAAsD;AAC7E,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,OAAO;AACjC,WAAO,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,MAAM,IAC/D,SACD;AAAA,EACN,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAeA,SAAS,aAAa,QAAmD;AACvE,SAAO;AAAA,IACL,SAAS;AAAA,IACT,SAAS,EAAE,MAAM,OAAO,aAAa,MAAM,OAAO,YAAY;AAAA,IAC9D,UAAU,OAAO;AAAA,IACjB,aAAa,OAAO;AAAA,IACpB,gBAAgB,OAAO;AAAA,EACzB;AACF;AAWA,IAAM,oBAAuC,OAAO,KAAK,aAAa;AAAA,EACpE,aAAa;AAAA,EAAI,aAAa;AAAA,EAAI,UAAU;AAAA,EAAI,YAAY;AAAA,EAAI,UAAU,CAAC;AAC7E,CAAC,CAAC;AAEF,IAAM,WAAW,CAAC,QAAiC,UACjD,OAAO,UAAU,eAAe,KAAK,QAAQ,KAAK;AA8B7C,SAAS,YAAY,OAAqB,UAA4C;AAC3F,QAAM,QAAQ,YAAY,WAAW,MAAM,IAAI,mBAAmB,CAAC;AACnE,MAAI,MAAM,UAAU,aAAa,MAAM,UAAU,UAAU;AAGzD,WAAO,GAAG,MAAM,MAAM;AAAA,EACxB;AACA,MAAI,MAAM,UAAU,YAAY,oBAAoB,MAAM,IAAI,mBAAmB,CAAC,GAAG;AAGnF,WAAO,oBAAoB,mBAAmB;AAAA,EAChD;AACA,QAAM,UAAU,MAAM,UAAU,UAAU,MAAM,SAAS,YAAY;AACrE,aAAW,CAAC,MAAM,QAAQ,KAAK,OAAO,QAAQ,QAAQ,KAAK,GAAG;AAC5D,QAAI,SAAS,UAAU,UAAU;AAC/B;AAAA,IACF;AAIA,UAAM,UAAU,sBAAsB,UAAU,iBAAiB;AACjE,QAAI,YAAY,QAAW;AACzB,aAAO,GAAG,mBAAmB,iBAAiB,IAAI,IAAI,OAAO;AAAA,IAE/D;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,SAAS,OAAgC;AACvD,QAAM,WAAW,MAAM,YAAY,WAAW,MAAM,MAAM,IAAI,mBAAmB,CAAC;AAClF,QAAM,UAAU,YAAY,MAAM,OAAO,QAAQ;AACjD,MAAI,YAAY,QAAW;AACzB,WAAO;AAAA,MACL,QAAQ,CAAC;AAAA,MAAG,SAAS,CAAC;AAAA,MAAG,OAAO,CAAC;AAAA,MACjC,cAAc,gBAAgB,EAAE,MAAM,MAAM,MAAM,KAAK,MAAM,KAAK,UAAU,MAAM,SAAS,CAAC;AAAA,MAC5F;AAAA,IACF;AAAA,EACF;AAEA,QAAM,gBAAgB,SAAS,UAAU,UAAU,SAAS,SAAS,YAAY;AAEjF,QAAM,QAAQ,iBAAiB,EAAE,MAAM,MAAM,MAAM,KAAK,MAAM,KAAK,UAAU,MAAM,SAAS,CAAC;AAC7F,QAAM,SAAsB,CAAC;AAC7B,QAAM,QAAkB,CAAC;AACzB,QAAM,SAAqB;AAAA,IACzB,SAAS,cAAc;AAAA,IACvB,OAAO,EAAE,GAAG,cAAc,MAAM;AAAA,IAChC,oBAAoB,CAAC,GAAG,cAAc,kBAAkB;AAAA,EAC1D;AAOA,QAAM,UAAU,CAAC,MAAc,YAA6C;AAC1E,UAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,QAAI,UAAU,QAAW;AACvB,aAAO;AAAA,IACT;AACA,QAAI,UAAU,MAAM,SAAS,OAAO,KAAK,UAAU,MAAM,UAAU,OAAO,GAAG;AAC3E,aAAO;AAAA,IACT;AACA,WAAO,OAAO,MAAM,IAAI;AACxB,UAAM,KAAK,GAAG,IAAI,6FAA6F;AAC/G,WAAO;AAAA,EACT;AAGA,aAAW,UAAU,eAAe;AAClC,UAAM,WAAW,MAAM,MAAM,IAAI,OAAO,IAAI;AAC5C,UAAM,eAAe,aAAa,SAAY,SAAY,gBAAgB,QAAQ;AAClF,UAAM,QAAQ,QAAQ,OAAO,MAAM,UAAU,cAAc,iBAAiB,MAAS,CAAC;AACtF,UAAM,SAAS,iBAAiB,UAAU,KAAK;AAC/C,QAAI,aAAa,OAAO,SAAS;AAC/B;AAAA,IACF;AACA,UAAM,SAAS,aAAa,OAAO,MAAM,QAAQ;AACjD,QAAI,OAAO,YAAY,UAAU,WAAW,MAAM,MAAM;AACtD,YAAM,KAAK,GAAG,OAAO,IAAI,UAAU,MAAM,WAAM,MAAM,IAAI,EAAE;AAAA,IAC7D;AACA,UAAM,WAAW,OAAO,YAAY,UAAU,OAAO,eAAe,OAAO,QAAQ;AACnF,QAAI,UAAU,UAAa,SAAS,OAAO,UAAU;AACnD,YAAM,KAAK,GAAG,OAAO,IAAI,oBAAoB,WAAW,kDAAkD;AAAA,IAC5G;AACA,WAAO,MAAM,OAAO,IAAI,IAAI;AAAA,MAC1B,OAAO;AAAA,MACP,aAAa,OAAO,eAAe,aAAa;AAAA,MAChD;AAAA,MACA,SAAS,UAAU,gBAAgB,OAAO,OAAO,GAAG,IAAI;AAAA,MACxD,iBAAiB,eAAe,OAAO,MAAM,OAAO,OAAO;AAAA,IAC7D;AACA,WAAO,KAAK,EAAE,MAAM,OAAO,MAAM,SAAS,OAAO,SAAS,SAAS,aAAa,OAAU,CAAC;AAAA,EAC7F;AAGA,QAAM,cAAc,MAAM,MAAM,IAAI,gBAAgB;AACpD,QAAM,WAAW,QAAQ,kBAAkB,UAAU,WAAW,CAAC;AACjE,QAAM,aAAa,iBAAiB;AAAA,IAClC,aAAa,MAAM;AAAA,IACnB,aAAa,MAAM;AAAA,IACnB,UAAU,MAAM;AAAA,EAClB,GAAG,MAAM,WAAW,GAAG;AACvB,QAAM,cAAc,UAAU,YAAY,UAAU,WAAW;AAC/D,MAAI,aAAa,UAAa,YAAY,OAAO,UAAU;AACzD,UAAM,KAAK,GAAG,gBAAgB,sEAAsE;AAAA,EACtG;AACA,SAAO,MAAM,gBAAgB,IAAI;AAAA,IAC/B,OAAO;AAAA,IACP,aAAa,UAAU,eAAe,gBAAgB;AAAA,IACtD,UAAU;AAAA,IACV,SAAS,UAAU,UAAU;AAAA,IAC7B,iBAAiB,eAAe,kBAAkB,UAAU;AAAA,EAC9D;AACA,MAAI,eAAe,aAAa;AAC9B,WAAO,KAAK,EAAE,MAAM,kBAAkB,SAAS,YAAY,SAAS,gBAAgB,OAAU,CAAC;AAAA,EACjG;AAGA,QAAM,OAAO,gBAAgB,MAAM,WAAW,SAAS;AACvD,aAAW,UAAU,cAAc;AACjC,UAAM,WAAW,MAAM,MAAM,IAAI,OAAO,IAAI;AAC5C,QAAI,aAAa,UAAa,CAAC,OAAO,iBAAiB;AACrD,YAAM,KAAK,GAAG,OAAO,IAAI,kEAA6D;AACtF;AAAA,IACF;AACA,UAAM,WAAW,aAAa,SAAY,SAAY,oBAAoB,QAAQ;AAClF,UAAM,UAAU,OAAO,MAAM,OAAO,IAAI;AAGxC,QAAI;AACJ,QAAI;AACF,gBAAU,kBAAkB,UAAU,IAAI;AAAA,IAC5C,SAAS,OAAO;AAId,YAAM,KAAK,GAAG,OAAO,IAAI,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AACtF;AAAA,IACF;AACA,QAAI,SAAS,UAAU,WAAW,mBAAmB,UAAU,OAAO,IAAI,GAAG;AAM3E,YAAM;AAAA,QACJ,GAAG,OAAO,IAAI;AAAA,MAGhB;AACA;AAAA,IACF;AAIA,UAAM,QAAQ,aAAa,SAAY,UAAU,QAAQ,OAAO,MAAM,UAAU,QAAQ,CAAC;AACzF,QAAI,YAAY,UAAU;AACxB;AAAA,IACF;AACA,UAAM,WAAW,OAAO,YAAY,UAAU,QAAQ;AACtD,QAAI,UAAU,UAAa,SAAS,OAAO,UAAU;AACnD,YAAM,KAAK,GAAG,OAAO,IAAI,sEAAsE;AAAA,IACjG;AACA,WAAO,MAAM,OAAO,IAAI,IAAI;AAAA,MAC1B,OAAO;AAAA,MACP,aAAa,OAAO,eAAe,aAAa;AAAA,MAChD;AAAA,MACA,SAAS,UAAU,oBAAoB,OAAO,CAAC;AAAA,MAC/C,iBAAiB,eAAe,OAAO,MAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMpD,eAAe,SAAS,iBAAiB,OAAO,iBAAiB,eAAe,QAAQ;AAAA,IAC1F;AACA,WAAO,KAAK,EAAE,MAAM,OAAO,MAAM,SAAS,SAAS,aAAa,OAAU,CAAC;AAAA,EAC7E;AAGA,QAAM,iBAAiB,MAAM,MAAM,IAAI,mBAAmB;AAC1D,QAAM,YAAY,aAAa;AAAA,IAC7B,aAAa,MAAM;AAAA,IACnB,aAAa,MAAM;AAAA,IACnB,UAAU,MAAM;AAAA,IAChB,YAAY,MAAM;AAAA;AAAA,IAElB,UAAU,MAAM,WAAW,YAAY,CAAC;AAAA,EAC1C,CAAC;AACD,QAAM,cAAc,mBAAmB,SAAY,SAAY,gBAAgB,cAAc;AAC7F,MAAI,mBAAmB,UAAa,gBAAgB,QAAW;AAG7D,UAAM,KAAK,GAAG,mBAAmB,8CAAyC;AAAA,EAC5E,OAAO;AACL,UAAM,cAAc,OAAO,MAAM,mBAAmB;AACpD,UAAM,iBAAwC,CAAC;AAC/C,eAAW,SAAS,mBAAmB;AACrC,YAAM,aAAa,gBAAgB,UAAa,SAAS,aAAa,KAAK;AAC3E,YAAM,eAAe,aAAa,YAAa,KAAK,IAAI;AACxD,YAAM,gBAAgB,aAAa,iBAAiB,KAAK;AACzD,YAAM,eAAe,aAAa;AAGlC,YAAM,kBAAkB,iBAAiB,UAAa,SAAS,cAAc,KAAK,KAC7EA,iBAAgB,YAAY,MAAMA,iBAAgB,aAAa,KAAK,CAAC;AAC1E,YAAM,OAAO,mBAAmB,kBAAkB,SAC9C,gBACA,UAAU,cAAc,UAAU;AACtC,qBAAe,KAAK,IAAI;AACxB,UAAI,kBAAkB,UAAa,CAAC,UAAU,MAAM,aAAa,GAAG;AAClE,cAAM,KAAK,GAAG,mBAAmB,iBAAiB,KAAK,+DAA0D;AAAA,MACnH;AAAA,IACF;AACA,UAAM,eAAe,UAAU,EAAE,GAAI,eAAe,CAAC,GAAI,GAAG,UAAU,CAAC;AACvE,WAAO,MAAM,mBAAmB,IAAI;AAAA,MAClC,OAAO;AAAA,MACP,aAAa,aAAa,eAAe,mBAAmB;AAAA,MAC5D,UAAU;AAAA,MACV,SAAS,UAAU,YAAY;AAAA,MAC/B,iBAAiB,eAAe,qBAAqB,YAAY;AAAA,MACjE,eAAe,EAAE,GAAG,UAAU;AAAA,MAC9B;AAAA,IACF;AACA,QAAI,iBAAiB,gBAAgB;AACnC,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS,mBAAmB;AAAA,MAC9B,CAAC;AAAA,IACH;AAAA,EACF;AAGA,QAAM,iBAAiB,MAAM,MAAM,IAAI,mBAAmB;AAC1D,QAAM,gBAAgB,gBAAgB,MAAM;AAI5C,MAAI,kBAAkB,gBAAgB;AACpC,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,mBAAmB;AAAA,IAC9B,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL;AAAA,IACA,SAAS,CAAC;AAAA,IACV,cAAc,gBAAgB,EAAE,MAAM,MAAM,MAAM,KAAK,MAAM,KAAK,UAAU,MAAM,SAAS,CAAC;AAAA,IAC5F,cAAc,kBAAkB,EAAE,MAAM,MAAM,MAAM,KAAK,MAAM,KAAK,UAAU,MAAM,SAAS,CAAC;AAAA,IAC9F;AAAA,IACA;AAAA,EACF;AACF;AAkCO,SAAS,SAAS,OAAgC;AACvD,QAAM,QAAQ,MAAM,UAAU,WAAW,MAAM,MAAM,IAAI,mBAAmB,CAAC;AAC7E,QAAM,SAAsB,CAAC;AAC7B,QAAM,UAAoB,CAAC;AAC3B,QAAM,QAAkB,CAAC;AACzB,QAAM,OAAO,MAAM;AACjB,UAAM,KAAK,4DAAuD,mBAAmB,CAAC,EAAE;AACxF,UAAM,KAAK,cAAc,YAAY,kBAAkB,mBAAmB,2BAA2B;AAAA,EACvG;AAEA,MAAI,MAAM,UAAU,UAAU;AAM5B,UAAM,KAAK,oBAAoB,MAAM,MAAM,IAAI,mBAAmB,CAAC,IAC/D,oBAAoB,mBAAmB,IACvC,mCAAmC,mBAAmB,oCAA+B;AACzF,SAAK;AACL,WAAO,EAAE,QAAQ,SAAS,cAAc,mBAAmB,GAAG,MAAM;AAAA,EACtE;AACA,MAAI,MAAM,UAAU,SAAS;AAG3B,UAAM;AAAA,MACJ,GAAG,MAAM,MAAM;AAAA,IAEjB;AACA,SAAK;AACL,WAAO,EAAE,QAAQ,SAAS,cAAc,mBAAmB,GAAG,MAAM;AAAA,EACtE;AAEA,QAAM,SAAS,MAAM;AAErB,QAAM,YAA0C,EAAE,GAAG,OAAO,MAAM;AAElE,aAAW,CAAC,MAAM,QAAQ,KAAK,OAAO,QAAQ,OAAO,KAAK,GAAG;AAC3D,UAAM,UAAU,QAAQ,MAAM,UAAU,MAAM,MAAM,IAAI,IAAI,CAAC;AAC7D,QAAI,QAAQ,SAAS,gBAAgB,QAAQ,SAAS,UAAU,QAAQ,SAAS,QAAW;AAC1F,YAAM,KAAK,QAAQ,IAAI;AAAA,IACzB,WAAW,QAAQ,SAAS,gBAAgB,QAAQ,SAAS,QAAQ;AACnE,YAAM,KAAK,QAAQ,IAAI;AAAA,IACzB;AACA,QAAI,QAAQ,SAAS,cAAc;AACjC;AAAA,IACF;AACA,WAAO,UAAU,IAAI;AACrB,QAAI,QAAQ,SAAS,SAAS;AAC5B,aAAO,KAAK,EAAE,MAAM,SAAS,QAAQ,SAAS,SAAS,KAAK,CAAC;AAAA,IAC/D,WAAW,QAAQ,SAAS,UAAU;AACpC,cAAQ,KAAK,IAAI;AAAA,IACnB;AAAA,EACF;AAEA,OAAK;AAIL,MAAI,MAAM,MAAM,IAAI,mBAAmB,MAAM,QAAW;AACtD,QAAI,OAAO,KAAK,SAAS,EAAE,SAAS,GAAG;AACrC,YAAM,UAAsB,EAAE,GAAG,QAAQ,OAAO,UAAU;AAC1D,aAAO,KAAK,EAAE,MAAM,qBAAqB,SAAS,gBAAgB,OAAO,GAAG,SAAS,KAAK,CAAC;AAC3F,YAAM;AAAA,QACJ,GAAG,mBAAmB;AAAA,MAExB;AAAA,IACF,OAAO;AACL,cAAQ,KAAK,mBAAmB;AAAA,IAClC;AAAA,EACF;AAGA,QAAM,uBAAuB,UAAU,OAAO,EAC3C,OAAO,CAAC,cAAc,OAAO,mBAAmB,SAAS,SAAS,CAAC;AAEtE,SAAO,EAAE,QAAQ,SAAS,cAAc,mBAAmB,GAAG,OAAO,qBAAqB;AAC5F;AAWA,SAAS,mBAAmB,UAA8B,UAAgC;AACxF,QAAM,WAAW,CAAC,GAAI,SAAS,iBAAiB,CAAC,CAAE;AACnD,MAAI,cAAc;AAClB,aAAW,SAAS,eAAe,QAAQ,GAAG;AAC5C,UAAM,KAAK,SAAS,QAAQ,KAAK;AACjC,QAAI,MAAM,GAAG;AACX,eAAS,OAAO,IAAI,CAAC;AAAA,IACvB,OAAO;AACL,qBAAe;AAAA,IACjB;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAAS,QAAQ,MAAc,UAAwB,UAAuC;AAC5F,MAAI,aAAa,QAAW;AAC1B,QAAI,SAAS,SAAS,OAAO,YAAY,SAAS,UAAU,UAAU;AAGpE,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,GAAG,IAAI;AAAA,MAEf;AAAA,IACF;AACA,WAAO,EAAE,MAAM,OAAO;AAAA,EACxB;AACA,UAAQ,SAAS,OAAO;AAAA,IACtB,KAAK;AAAS,aAAO,UAAU,MAAM,UAAU,QAAQ;AAAA,IACvD,KAAK;AAAS,aAAO,UAAU,MAAM,UAAU,QAAQ;AAAA,IACvD,KAAK;AAAU,aAAO,WAAW,MAAM,UAAU,QAAQ;AAAA,IACzD,KAAK;AAAS,aAAO,UAAU,MAAM,UAAU,QAAQ;AAAA,EACzD;AACF;AAEA,SAAS,UAAU,MAAc,UAAwB,UAA2B;AAClF,QAAM,UAAU,gBAAgB,QAAQ;AACxC,QAAM,eAAe,UAAU,SAAS,YAAY,MAAS;AAC7D,MAAI,UAAU,cAAc,SAAS,QAAQ,GAAG;AAC9C,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM,SAAS,SAAS,OAAO,WAC3B,GAAG,IAAI,UAAU,WAAW,2CAC5B,GAAG,IAAI,oBAAoB,WAAW;AAAA,IAC5C;AAAA,EACF;AAGA,QAAM,2BAA2B,YAAY,UAAa,SAAS,SAAS,OAAO;AACnF,MAAI,CAAC,4BAA4B,CAAC,UAAU,cAAc,SAAS,OAAO,GAAG;AAC3E,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM,GAAG,IAAI,UAAU,WAAW;AAAA,IAEpC;AAAA,EACF;AACA,QAAM,UAAU,SAAS,SAAS,OAAO,SAAS,EAAE,OAAO,SAAS,SAAS,MAAM,IAAI;AACvF,QAAM,SAAS,kBAAkB,UAAU,OAAO;AAClD,MAAI,OAAO,WAAW,SAAS,aAAa;AAC1C,WAAO,EAAE,MAAM,SAAS;AAAA,EAC1B;AACA,MAAI,OAAO,YAAY,UAAa,OAAO,YAAY,UAAU;AAC/D,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,OAAO;AAAA,MAChB,MAAM,YAAY,SAAY,SAAY,GAAG,IAAI,6BAA6B,WAAW;AAAA,IAC3F;AAAA,EACF;AACA,SAAO,EAAE,MAAM,OAAO;AACxB;AAEA,SAAS,UAAU,MAAc,UAAwB,UAA2B;AAClF,QAAM,UAAU,oBAAoB,QAAQ;AAC5C,QAAM,eAAe,UAAU,OAAO;AAMtC,MAAI,mBAAmB,UAAU,QAAQ,IAAI,GAAG;AAC9C,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM,GAAG,IAAI;AAAA,IAEf;AAAA,EACF;AACA,MAAI,UAAU,cAAc,SAAS,QAAQ,GAAG;AAC9C,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM,SAAS,SAAS,OAAO,WAC3B,GAAG,IAAI,yCACP,GAAG,IAAI;AAAA,IACb;AAAA,EACF;AACA,MAAI,YAAY,UAAa,SAAS,SAAS,OAAO,QAAQ;AAG5D,UAAM,OAAO,SAAS,KAAK,IACvB,GAAG,SAAS,QAAQ,QAAQ,EAAE,CAAC;AAAA;AAAA,EAAO,SAAS,SAAS,IAAI;AAAA,IAC5D,GAAG,SAAS,SAAS,IAAI;AAAA;AAC7B,WAAO,EAAE,MAAM,SAAS,SAAS,MAAM,MAAM,GAAG,IAAI,sDAAsD;AAAA,EAC5G;AACA,MAAI,CAAC,UAAU,cAAc,SAAS,OAAO,GAAG;AAC9C,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM,GAAG,IAAI;AAAA,IAEf;AAAA,EACF;AACA,MAAI;AACJ,MAAI;AACF,aAAS,SAAS,SAAS,OAAO,SAC9B,EAAE,SAAS,uBAAuB,UAAU,SAAS,SAAS,IAAI,GAAG,SAAS,MAAM,SAAS,MAAM,IACnG,kBAAkB,QAAQ;AAAA,EAChC,SAAS,OAAO;AACd,WAAO,EAAE,MAAM,cAAc,MAAM,GAAG,IAAI,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,GAAG;AAAA,EAC1G;AACA,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM,GAAG,IAAI;AAAA,IAEf;AAAA,EACF;AACA,MAAI,OAAO,WAAW,SAAS,aAAa;AAC1C,WAAO,EAAE,MAAM,SAAS;AAAA,EAC1B;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,OAAO;AAAA,IAChB,MAAM,SAAS,SAAS,OAAO,SAC3B,GAAG,IAAI,wDACP;AAAA,EACN;AACF;AAEA,SAAS,UAAU,MAAc,UAAwB,UAA2B;AAClF,MAAI,UAAU,UAAU,QAAQ,GAAG,SAAS,QAAQ,GAAG;AAErD,WAAO,EAAE,MAAM,QAAQ,MAAM,GAAG,IAAI,iDAAiD;AAAA,EACvF;AACA,MAAI,CAAC,UAAU,UAAU,QAAQ,GAAG,SAAS,OAAO,GAAG;AACrD,QAAI,SAAS,SAAS,OAAO,QAAQ;AACnC,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,GAAG,IAAI;AAAA,MAEf;AAAA,IACF;AAEA,WAAO,EAAE,MAAM,QAAQ,MAAM,GAAG,IAAI,sEAAiE;AAAA,EACvG;AACA,MAAI,SAAS,SAAS,OAAO,QAAQ;AACnC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,SAAS,SAAS;AAAA,MAC3B,MAAM,GAAG,IAAI;AAAA,IACf;AAAA,EACF;AACA,SAAO,SAAS,cAAc,EAAE,MAAM,SAAS,IAAI,EAAE,MAAM,OAAO;AACpE;AAEA,SAAS,WAAW,MAAc,UAAwB,UAA2B;AACnF,QAAM,SAAS,gBAAgB,QAAQ;AACvC,MAAI,WAAW,QAAW;AAExB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM,GAAG,IAAI;AAAA,IAEf;AAAA,EACF;AAKA,QAAM,kBAAkB,sBAAsB,UAAU,iBAAiB;AACzE,MAAI,oBAAoB,QAAW;AACjC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM,GAAG,IAAI,6CAA6C,eAAe;AAAA,IAE3E;AAAA,EACF;AACA,QAAM,UAAU,SAAS;AACzB,QAAM,YAAY,SAAS;AAC3B,QAAM,OAAgC,CAAC;AACvC,QAAM,OAAiB,CAAC;AACxB,aAAW,CAAC,OAAO,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACnD,QAAI,CAAC,kBAAkB,SAAS,KAAK,GAAG;AACtC,WAAK,KAAK,IAAI;AACd;AAAA,IACF;AACA,QAAI,CAAC,SAAS,SAAS,KAAK,GAAG;AAG7B,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,GAAG,IAAI,gDAAgD,KAAK;AAAA,MAEpE;AAAA,IACF;AACA,UAAM,YAAYA,iBAAgB,KAAK,MAAMA,iBAAgB,QAAQ,KAAK,CAAC;AAC3E,QAAI,CAAC,WAAW;AAEd,WAAK,KAAK,IAAI;AACd,WAAK,KAAK,KAAK;AACf;AAAA,IACF;AACA,UAAM,WAAW,UAAU,KAAK;AAIhC,QAAI,aAAa,UAAc,SAAS,OAAO,UAAU,SAAS,OAAO,UAAW;AAClF,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,GAAG,IAAI,qCAAqC,KAAK;AAAA,MAEzD;AAAA,IACF;AACA,QAAI,SAAS,OAAO,QAAQ;AAC1B,WAAK,KAAK,IAAI,SAAS;AAAA,IACzB;AAAA,EAIF;AACA,QAAM,OAAO,KAAK,WAAW,IAAI,SAC7B,GAAG,IAAI,iBAAiB,KAAK,KAAK,IAAI,CAAC;AAE3C,MAAI,OAAO,KAAK,IAAI,EAAE,WAAW,KAAK,SAAS,aAAa;AAC1D,WAAO,EAAE,MAAM,UAAU,KAAK;AAAA,EAChC;AAEA,QAAM,OAAO,UAAU,IAAI;AAC3B,SAAO,SAAS,WACZ,EAAE,MAAM,QAAQ,KAAK,IACrB;AAAA,IACA,MAAM;AAAA,IACN,SAAS;AAAA,IACT,MAAM,QAAQ,GAAG,IAAI;AAAA,EACvB;AACJ;AAaO,SAAS,uBAAuB,SAAiB,aAAwC;AAC9F,QAAM,QAAQ,WAAW,OAAO;AAChC,MAAI,MAAM,UAAU,SAAS;AAC3B,WAAO;AAAA,EACT;AACA,SAAO,gBAAgB,EAAE,GAAG,MAAM,QAAQ,oBAAoB,CAAC,GAAG,WAAW,EAAE,CAAC;AAClF;AAMA,SAAS,UAAU,OAAoC;AACrD,QAAM,cAAc,oBAAI,IAAY;AACpC,aAAW,QAAQ,OAAO;AACxB,UAAM,SAAS,KAAK,SAAS,GAAG,IAAI,KAAK,MAAM,GAAG,KAAK,YAAY,GAAG,CAAC,IAAI;AAC3E,QAAI,QAAQ;AACV,kBAAY,IAAI,MAAM;AAAA,IACxB;AAAA,EACF;AACA,SAAO,CAAC,GAAG,WAAW,EAAE,KAAK,CAAC,MAAM,UAAU,MAAM,SAAS,KAAK,MAAM;AAC1E;AAGA,SAAS,aAAa,MAAc,UAAuD;AACzF,QAAM,OAAO,eAAe,MAAM,QAAQ;AAC1C,SAAO,KAAK,SAAS,SAAS,KAAK,OAAO;AAC5C;;;AE52BO,IAAM,eAA4C,IAAI;AAAA,EAC3D,CAAC,kBAAkB,qBAAqB,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,SAAS,IAAI,CAAC,CAAC;AACnG;AAEO,IAAM,qBAAqB,SAAS,mBAAmB;AAGvD,IAAM,wBAA2C,CAAC,GAAG,aAAa,OAAO,CAAC;AAkB1E,SAAS,kBAAkB,MAAgC;AAChE,QAAM,QAAQ,oBAAI,IAAgC;AAClD,aAAW,CAAC,MAAM,OAAO,KAAK,MAAM;AAClC,QAAI,CAAC,sBAAsB,SAAS,IAAI,GAAG;AACzC,YAAM,IAAI,MAAM,OAAO;AAAA,IACzB;AAAA,EACF;AACA,QAAM,OAAmB,EAAE,OAAO,OAAO,CAAC,GAAG,sBAAsB,OAAO,OAAO,CAAC,EAAE;AACpF,MAAI,CAAC,sBAAsB,KAAK,CAAC,SAAS,KAAK,IAAI,IAAI,MAAM,MAAS,GAAG;AACvE,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,KAAK,IAAI,kBAAkB;AAChD,MAAI,iBAAiB,QAAW;AAC9B,UAAM,eAAe,aAAa,IAAI,mBAAmB;AACzD,QAAI,KAAK,IAAI,mBAAmB,MAAM,UAAa,oBAAoB,KAAK,IAAI,YAAY,CAAC,GAAG;AAG9F,aAAO,EAAE,GAAG,MAAM,SAAS,oBAAoB,YAAY,EAAE;AAAA,IAC/D;AACA,SAAK,MAAM;AAAA,MACT,GAAG,kBAAkB,0CAAqC,kBAAkB;AAAA,IAE9E;AACA,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,WAAW,cAAc,kBAAkB;AACzD,MAAI,MAAM,UAAU,SAAS;AAC3B,WAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS,MAAM,UAAU,WACrB,GAAG,kBAAkB,6CACrB,GAAG,MAAM,MAAM;AAAA,IACrB;AAAA,EACF;AACA,QAAM,QAAQ,CAAC,GAAG,YAAY,EAC3B,OAAO,CAAC,CAAC,IAAI,IAAI,MAAM,KAAK,IAAI,EAAE,MAAM,UAAa,KAAK,IAAI,IAAI,MAAM,MAAS,EACjF,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE;AACnB,MAAI,MAAM,SAAS,GAAG;AAGpB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS,QAAQ,kBAAkB,SAAS,WAAW,+BAA+B,MAAM,KAAK,IAAI,CAAC,gNAGhF,kBAAkB;AAAA,IAC1C;AAAA,EACF;AAEA,QAAM,SAAS,MAAM;AACrB,QAAM,UAAU;AAAA,IACd,GAAG;AAAA,IACH,OAAO,OAAO,YAAY,OAAO,QAAQ,OAAO,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,QAAQ,MAAM,CAAC,UAAU,IAAI,GAAG,QAAQ,CAAC,CAAC;AAAA;AAAA,IAE7G,oBAAoB,OAAO,mBAAmB,IAAI,SAAS;AAAA,EAC7D;AACA,QAAM,QAAsB,CAAC;AAC7B,aAAW,CAAC,IAAI,IAAI,KAAK,cAAc;AACrC,UAAM,UAAU,KAAK,IAAI,IAAI;AAC7B,QAAI,YAAY,QAAW;AACzB;AAAA,IACF;AACA,UAAM,IAAI,IAAI,OAAO,sBAAsB,gBAAgB,OAAO,IAAI,OAAO;AAC7E,UAAM,KAAK,EAAE,MAAM,GAAG,CAAC;AAAA,EACzB;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,sBAAsB,OAAO,mBAAmB,SAAS,kBAAkB;AAAA,IAC3E,OAAO,CAAC,GAAG,kBAAkB,YAAO,WAAW,8EAA8E;AAAA,EAC/H;AACF;AAQO,SAAS,gBAAgB,MAAgB,MAA4B;AAC1E,MAAI,KAAK,MAAM,WAAW,GAAG;AAC3B,WAAO,KAAK,MAAM,WAAW,IAAI,OAAO,EAAE,GAAG,MAAM,OAAO,CAAC,GAAG,KAAK,OAAO,GAAG,KAAK,KAAK,EAAE;AAAA,EAC3F;AACA,QAAM,UAAU,IAAI,IAAI,KAAK,MAAM,IAAI,CAAC,SAAS,KAAK,EAAE,CAAC;AACzD,QAAM,UAAU,oBAAI,IAAI,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI,GAAG,GAAG,KAAK,OAAO,CAAC;AACpF,QAAM,UAAuB,KAAK,MAC/B,OAAO,CAAC,SAAS,CAAC,QAAQ,IAAI,KAAK,EAAE,CAAC,EACtC,IAAI,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,SAAS,KAAK,MAAM,IAAI,KAAK,EAAE,GAAI,SAAS,MAAM,EAAE;AACvF,SAAO;AAAA,IACL,GAAG;AAAA;AAAA,IAEH,QAAQ,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,UAAW,QAAQ,IAAI,MAAM,IAAI,IAAI,EAAE,GAAG,OAAO,SAAS,MAAM,IAAI,KAAM,GAAG,GAAG,OAAO;AAAA;AAAA,IAEpH,SAAS,CAAC,GAAG,KAAK,QAAQ,OAAO,CAAC,SAAS,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,GAAG,KAAK,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC;AAAA,IACtG,OAAO,CAAC,GAAG,KAAK,OAAO,GAAG,KAAK,KAAK;AAAA,IACpC,sBAAsB,KAAK,uBACvB,CAAC,GAAI,KAAK,wBAAwB,CAAC,GAAI,kBAAkB,IACzD,KAAK;AAAA,EACX;AACF;AAEA,SAAS,SAAS,MAAsB;AACtC,SAAO,GAAG,kBAAkB,GAAG,KAAK,MAAM,YAAY,MAAM,CAAC;AAC/D;AAEA,SAAS,UAAU,MAAsB;AACvC,SAAO,SAAS,sBAAsB,KAAK,WAAW,GAAG,kBAAkB,GAAG,IAC1E,GAAG,WAAW,GAAG,KAAK,MAAM,mBAAmB,MAAM,CAAC,KACtD;AACN;;;AC/HO,IAAME,WAAU;AAChB,IAAMC,kBAAiB;AAE9B,eAAsB,sBACpB,OAC2B;AAC3B,QAAM,MAAM,IAAI,IAAI,GAAG,MAAM,SAAS,QAAQ,OAAO,EAAE,CAAC,oBAAoB;AAC5E,2BAAyB,KAAK,uBAAuB;AACrD,MAAI,MAAM,QAAQ;AAChB,QAAI,aAAa,IAAI,UAAU,MAAM,MAAM;AAAA,EAC7C;AACA,QAAM,YAAY,MAAM,aAAa;AACrC,MAAI;AACF,UAAM,WAAW,MAAM,UAAU,IAAI,SAAS,GAAG;AAAA,MAC/C,SAAS;AAAA,QACP,QAAQ;AAAA,QACR,GAAI,MAAM,cAAc,EAAE,eAAe,UAAU,MAAM,WAAW,GAAG,IAAI,CAAC;AAAA,MAC9E;AAAA,IACF,CAAC;AACD,QAAI,CAAC,SAAS,IAAI;AAChB,aAAO,EAAE,UAAU,CAAC,GAAG,WAAW,CAAC,GAAG,mBAAmB,wBAAwB,SAAS,MAAM,GAAG;AAAA,IACrG;AACA,UAAM,UAAW,MAAM,SAAS,KAAK;AAGrC,UAAM,YAAY,QAAQ,aAAa,CAAC;AACxC,UAAM,WAAmC,CAAC;AAC1C,UAAM,YAAoC,CAAC;AAC3C,UAAM,SAA6C,CAAC;AACpD,eAAW,OAAO,CAACD,UAASC,eAAc,GAAG;AAC3C,YAAM,QAAQ,UAAU,GAAG;AAC3B,YAAM,UAAU,kBAAkB,KAAK,KAAK;AAC5C,UAAI,SAAS;AAEX,kBAAU,GAAG,IAAI,OAAO,OAAO,WAAW,YAAY,MAAM,SAAS,MAAM,SAAS;AACpF;AAAA,MACF;AACA,aAAO,GAAG,IAAI,MAAO;AACrB,UAAI,OAAO,OAAO,YAAY,UAAU;AACtC,iBAAS,GAAG,IAAI,MAAM;AAAA,MACxB;AAAA,IACF;AACA,WAAO,EAAE,KAAK,OAAOD,QAAO,GAAG,WAAW,OAAOC,eAAc,GAAG,UAAU,UAAU;AAAA,EACxF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,UAAU,CAAC;AAAA,MACX,WAAW,CAAC;AAAA,MACZ,mBAAmB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC1E;AAAA,EACF;AACF;AAUA,SAAS,kBAAkB,KAAa,OAA2D;AACjG,MAAI,OAAO,OAAO,SAAS,YAAY,CAAC,MAAM,KAAK,KAAK,GAAG;AACzD,WAAO,+BAA+B,GAAG;AAAA,EAC3C;AACA,SAAO,wBAAwB,KAAK,MAAM,IAAI;AAChD;;;ACtGA,SAAS,mBAAAC,wBAAuC;AAsBzC,IAAM,kBAAN,cAA8B,MAAM;AAAA,EACzC,cAAc;AAEZ,UAAM,iGAA4F;AAClG,SAAK,OAAO;AAAA,EACd;AACF;AAiBO,IAAM,oBAAoB,CAAC,cAAc,MAAM,cAAc,iBAAiB,cAAc;AAG5F,SAAS,iBAAiB,MAAyB,QAAQ,KAAyB;AACzF,SAAO,kBAAkB,KAAK,CAAC,SAAS;AACtC,UAAM,QAAQ,IAAI,IAAI,GAAG,KAAK,EAAE,YAAY;AAC5C,WAAO,UAAU,UAAa,UAAU,MAAM,UAAU,OAAO,UAAU;AAAA,EAC3E,CAAC;AACH;AAMO,SAAS,cACd,IACA,MACA,MAAyB,QAAQ,KACxB;AACT,SAAO,GAAG,OAAO,UAAU,QAAQ,GAAG,QAAQ,UAAU,QAAQ,CAAC,QAAQ,iBAAiB,GAAG,MAAM;AACrG;AAOO,SAAS,uBAAuB,IAA+E;AACpH,MAAI;AACJ,MAAI;AAEJ,QAAM,WAAW,OAAO,WAAoC;AAC1D,OAAG,OAAO,MAAM,MAAM;AACtB,QAAI,CAAC,IAAI;AACP,WAAKA,iBAAgB,EAAE,OAAO,GAAG,OAAO,UAAU,MAAM,CAAC;AACzD,cAAQ,GAAG,OAAO,aAAa,EAAE;AAAA,IACnC;AACA,UAAM,OAAO,MAAM,MAAO,KAAK;AAC/B,QAAI,KAAK,MAAM;AACb,SAAG,OAAO,MAAM,IAAI;AACpB,YAAM,IAAI,gBAAgB;AAAA,IAC5B;AACA,WAAO,KAAK;AAAA,EACd;AAEA,SAAO;AAAA,IACL,QAAQ,CAAI,UAAkB,SAAmC,iBAC/D,WAAW,UAAU,CAAC,SAAS,GAAG,OAAO,MAAM,IAAI,GAAG,UAAU,SAAS,YAAY;AAAA,IACvF,MAAM,OAAO,UAAU,iBAAiB;AACtC,YAAM,UAAU,MAAM,SAAS,GAAG,QAAQ,KAAK,YAAY,KAAK,GAAG,KAAK;AACxE,aAAO,UAAU;AAAA,IACnB;AAAA,IACA,OAAO,MAAM;AACX,UAAI,MAAM;AAAA,IACZ;AAAA,EACF;AACF;AAMA,eAAsB,WACpB,UACA,OACA,UACA,SACA,cACY;AACZ,MAAI,QAAQ,WAAW,GAAG;AACxB,UAAM,IAAI,MAAM,0BAA0B,QAAQ,EAAE;AAAA,EACtD;AACA,QAAM,GAAG,QAAQ;AAAA,CAAI;AACrB,UAAQ,QAAQ,CAAC,QAAQ,UAAU,MAAM,MAAM,QAAQ,CAAC,KAAK,OAAO,KAAK;AAAA,CAAI,CAAC;AAC9E,QAAM,OAAO,iBAAiB,SAAY,KAAK,KAAK,eAAe,CAAC;AACpE,aAAS;AACP,UAAM,UAAU,MAAM,SAAS,qBAAqB,QAAQ,MAAM,IAAI,IAAI,IAAI,GAAG,KAAK;AACtF,QAAI,WAAW,MAAM,iBAAiB,QAAW;AAC/C,aAAO,QAAQ,YAAY,EAAG;AAAA,IAChC;AACA,UAAM,SAAS,QAAQ,KAAK,MAAM,IAAI,OAAO,MAAM,IAAI;AACvD,QAAI,UAAU,KAAK,UAAU,QAAQ,QAAQ;AAC3C,aAAO,QAAQ,SAAS,CAAC,EAAG;AAAA,IAC9B;AACA,UAAM,WAAW,KACb,yDACA,IAAI,MAAM;AAAA,CAAsC;AAAA,EACtD;AACF;;;ARnGA,SAAS,WAAW,OAA+C;AACjE,SAAO,MAAM,WAAW,IAAI,MAAM,CAAC,IAAI;AACzC;AA6EA,eAAsB,mBAAmB,SAA8C;AACrF,MAAI;AACF,WAAO,MAAM,QAAQ,OAAO;AAAA,EAC9B,SAAS,OAAO;AACd,QAAI,iBAAiB,iBAAiB;AACpC,cAAQ,GAAG,OAAO,MAAM,GAAG,MAAM,OAAO;AAAA,CAAI;AAC5C,aAAO;AAAA,IACT;AACA,UAAM;AAAA,EACR,UAAE;AACA,YAAQ,UAAU,MAAM;AAAA,EAC1B;AACF;AAEA,eAAe,QAAQ,gBAAqD;AAC1E,MAAI,UAAU;AACd,QAAM,OAAO,cAAc,QAAQ,IAAI;AACvC,QAAM,OAAOC,SAAQ,QAAQ,GAAG;AAGhC,QAAM,YAAY,MAAM,oBAAoB,IAAI;AAGhD,QAAM,OAAO,MAAM,aAAa,IAAI;AACpC,QAAM,SAAS,kBAAkB,IAAI;AACrC,QAAM,QAAQ,OAAO;AAErB,MAAI,KAAK,MAAM;AACb,QAAI,OAAO,YAAY,QAAW;AAEhC,cAAQ,GAAG,OAAO,MAAM;AAAA,QACtB,EAAE,QAAQ,KAAK,SAAS,mBAAmB,QAAQ,SAAS,CAAC,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,GAAG,WAAW,OAAO,OAAO,EAAE;AAAA,QACnH,EAAE,MAAM,QAAQ,KAAK;AAAA,MACvB,CAAC;AACD,aAAO;AAAA,IACT;AACA,UAAMC,QAAO,gBAAgB,SAAS,EAAE,MAAM,CAAC,GAAG,MAAM;AACxD,UAAM,UAAU,MAAMA,OAAM,KAAK,QAAQ,MAAM,KAAK;AACpD,YAAQ,GAAG,OAAO,MAAM;AAAA,MACtB;AAAA,QACE,QAAQ,KAAK,SAAS,mBAAmB;AAAA,QACzC,SAASA,MAAK,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI;AAAA,QAC9C,SAASA,MAAK;AAAA,QACd,OAAO,CAAC,GAAG,WAAW,GAAGA,MAAK,KAAK;AAAA,MACrC;AAAA,MACA,EAAE,MAAM,QAAQ,KAAK;AAAA,IACvB,CAAC;AACD,WAAO;AAAA,EACT;AAMA,QAAM,UAAU,OAAO,WAAW,YAAY,KAAK;AACnD,MAAI,YAAY,QAAW;AACzB,UAAM,IAAI,MAAM,OAAO;AAAA,EACzB;AAIA,QAAM,WAAW,QAAQ;AACzB,QAAM,OAAO,QAAQ,SAAS,WAC1B,MAAM,QAAQ,UAAU,WAAW,aAAa,KAAK,EAAE,KAAK,CAAC,IAC7D,YAAY,KAAK;AAGrB,QAAMC,iBAAgB,MAAM;AAC1B,QAAI;AACF,aAAO,YAAY,KAAK;AAAA,IAC1B,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,GAAG;AACH,MAAI,CAAC,MAAM;AAGT,UAAM,IAAI;AAAA,MACR,qFACM,cAAc,KAAK,IAAI,CAAC;AAAA,IAChC;AAAA,EACF;AAGA,QAAM,YAA8B,UAAU,SAAS,IAAI;AAC3D,YAAU;AAEV,QAAM,eAAe,WAAW,MAAM,KAAK,MAAM;AAEjD,QAAM,UAAU,MAAM,eAAe,WAAW,MAAM,OAAO,MAAM,IAAI;AACvE,MAAI,aAAa,SAAS;AACxB,YAAQ,GAAG,OAAO,MAAM;AAAA,MACtB;AAAA,QACE,SAAS;AAAA,QACT,UAAU,QAAQ;AAAA,MACpB;AAAA,MACA,EAAE,MAAM,QAAQ,KAAK;AAAA,IACvB,CAAC;AACD,WAAO;AAAA,EACT;AAEA,QAAM,YAA8B,KAAK,SACrC,EAAE,UAAU,CAAC,GAAG,WAAW,CAAC,GAAG,mBAAmB,uBAAuB,IACzE,MAAM,sBAAsB;AAAA,IAC5B,UAAU,QAAQ;AAAA,IAClB,aAAa,MAAM,QAAQ,cAAc;AAAA;AAAA;AAAA,IAGzC,QAAQ;AAAA,IACR,WAAW,QAAQ;AAAA,EACrB,CAAC;AAEH,QAAM,OAAO,gBAAgB,SAAS;AAAA,IACpC;AAAA,IACA,KAAK,QAAQ;AAAA,IACb,aAAa,QAAQ;AAAA,IACrB,aAAa,QAAQ;AAAA,IACrB,UAAU,QAAQ;AAAA,IAClB,YAAY,QAAQ;AAAA,IACpB;AAAA,IACA;AAAA,EACF,CAAC,GAAG,MAAM;AACV,MAAI,KAAK,YAAY,QAAW;AAK9B,UAAM,IAAI,MAAM,KAAK,OAAO;AAAA,EAC9B;AACA,QAAM,UAAU,MAAM,MAAM,KAAK,QAAQ,IAAI;AAC7C,MAAI,CAAC,KAAK,UAAUA,kBAAiB,UAAaA,kBAAiB,MAAM;AAGvE,YAAQ,GAAG,OAAO,MAAM,qBAAqBA,aAAY,OAAO,IAAI;AAAA,CAA6D;AAAA,EACnI;AAEA,UAAQ,GAAG,OAAO,MAAM;AAAA,IACtB;AAAA,MACE,QAAQ,KAAK,SAAS,mBAAmB;AAAA,MACzC;AAAA,MACA,SAAS,EAAE,MAAM,QAAQ,MAAM,MAAM,QAAQ,KAAK;AAAA,MAClD,UAAU,QAAQ;AAAA,MAClB,SAAS,KAAK,OAAO,IAAI,CAAC,UAAU,GAAG,MAAM,UAAU,YAAY,SAAS,IAAI,MAAM,IAAI,EAAE;AAAA;AAAA,MAE5F,GAAI,KAAK,QAAQ,SAAS,IAAI,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,MAC3D,OAAO,uEAAuE,KAAK,YAAY;AAAA,MAC/F,iBAAiB,KAAK;AAAA,MACtB,kBAAkB,6CAA6C,YAAY,IAAI,IAAI;AAAA;AAAA;AAAA;AAAA,MAInF,OAAO,CAAC,GAAG,WAAW,GAAG,KAAK,OAAO,GAAG,cAAc,SAAS,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOhE,MAAM;AAAA,QACJ,mHAA8G,IAAI;AAAA,QAClH,QAAQ,gBAAgB;AAAA,QACxB;AAAA,QACA;AAAA,QACA,6EAA6E,WAAW;AAAA,QACxF,gDAAgD,IAAI,0CAA0C,IAAI;AAAA,QAClG,SAAS,WAEL,4GACA,sEAAiE,IAAI;AAAA,QACzE,0EAA0E,WAAW,sBAAsB,WAAW,+DAA+D,WAAW;AAAA;AAAA;AAAA,QAGhM,oCAAoC,kBAAkB,0FACf,WAAW,gCAAgC,kBAAkB,kCAAkC,kBAAkB;AAAA,QACxJ;AAAA,MACF;AAAA,IACF;AAAA,IACA,EAAE,MAAM,QAAQ,KAAK;AAAA,EACvB,CAAC;AACD,SAAO;AACT;AAGA,SAAS,YAAY,OAAyE;AAC5F,QAAM,SAAS,aAAa,KAAK,EAAE;AACnC,MAAI,OAAO,SAAS,GAAG;AACrB,UAAM,IAAI;AAAA,MACR,qEAAqE,OAAO,KAAK,IAAI,CAAC,yEAEhF,cAAc,KAAK,IAAI,CAAC;AAAA,IAChC;AAAA,EACF;AACA,SAAO,OAAO,CAAC;AACjB;AAGA,SAAS,cAAc,WAAuC;AAC5D,QAAM,QAAkB,CAAC;AACzB,MAAI,UAAU,mBAAmB;AAC/B,UAAM,KAAK,yDAAyD,UAAU,iBAAiB,IAAI;AAAA,EACrG;AACA,aAAW,CAAC,KAAK,MAAM,KAAK,OAAO,QAAQ,UAAU,SAAS,GAAG;AAC/D,UAAM,KAAK,GAAG,GAAG,4CAA4C,MAAM,IAAI;AAAA,EACzE;AACA,SAAO;AACT;AAYA,eAAe,eACb,SACA,MACA,QACe;AACf,MAAI,QAAQ,UAAU,QAAW;AAC/B;AAAA,EACF;AACA,MAAI,MAAM,QAAQ,cAAc,GAAG;AACjC;AAAA,EACF;AACA,MAAI,QAAQ;AAEV,UAAM,IAAI;AAAA,MACR;AAAA;AAAA,MACS,aAAa,OAAO,CAAC;AAAA;AAAA;AAAA,IAEhC;AAAA,EACF;AACA,QAAM,QAAQ,MAAM;AACpB,UAAQ,GAAG,OAAO,MAAM,cAAc;AACxC;AASA,eAAe,oBAAoB,KAAgC;AACjE,QAAM,UAAU,MAAM,YAAY,GAAG;AACrC,MAAI,YAAY,QAAW;AAEzB,WAAO,CAAC,GAAG,GAAG,kFAAkF;AAAA,EAClG;AACA,MAAI,YAAY,KAAK;AACnB,UAAM,IAAI;AAAA,MACR,+CAA+C,OAAO;AAAA;AAAA,SAE1C,OAAO;AAAA;AAAA;AAAA,IAErB;AAAA,EACF;AACA,SAAO,CAAC;AACV;AAMA,SAAS,UAAU,SAA6B,MAAqC;AACnF,MAAI,QAAQ,SAAS;AACnB,UAAM,aAAa,QAAQ,QAAQ,IAAI;AACvC,WAAO,EAAE,GAAG,SAAS,GAAG,WAAW;AAAA,EACrC;AACA,MAAI,CAAC,QAAQ,QAAQ;AACnB,UAAM,IAAI,MAAM,wEAAwE;AAAA,EAC1F;AACA,SAAO,EAAE,GAAG,SAAS,QAAQ,QAAQ,OAAO;AAC9C;AAEA,IAAM,eAAmD;AAAA,EACvD,EAAE,OAAO,qDAAqD,OAAO,SAAS;AAAA,EAC9E,EAAE,OAAO,4DAA4D,OAAO,cAAc;AAAA,EAC1F,EAAE,OAAO,6CAA6C,OAAO,OAAO;AAAA,EACpE,EAAE,OAAO,mDAAmD,OAAO,aAAa;AAClF;AAMA,eAAe,QAAQ,UAAoB,SAAwD;AACjG,QAAM,QAAQ,YAAY,SAAY,SAAY,aAAa,UAAU,CAAC,WAAW,OAAO,UAAU,OAAO;AAC7G,SAAO,SAAS;AAAA,IACd,YAAY,SACR,2DACA,gEAAgE,OAAO;AAAA,IAC3E;AAAA,IACA;AAAA,EACF;AACF;AAOA,eAAe,WACb,SACA,MACA,UACA,OACA,MACA,MACA,UACyC;AACzC,QAAM,YAAY,SAAS,YAAY,CAAC,KAAK;AAC7C,QAAM,mBAAmB,YAAY;AACnC,UAAM,OAAO,MAAM,SAAS,KAAK,oBAAoB,KAAK,eAAe,WAAW,IAAI,CAAC;AACzF,WAAO,cAAc,SAAS,IAAI;AAAA,EACpC;AACA,MAAI,SAAS,WAAW,GAAG;AACzB,QAAI,SAAS,UAAU;AACrB,YAAM,IAAI,MAAM,iBAAiB,SAAS,IAAI,CAAC;AAAA,IACjD;AACA,QAAI,KAAK,QAAQ;AACf,YAAM,IAAI,MAAM,mBAAmB,KAAK,eAAe,WAAW,IAAI,CAAC,CAAC;AAAA,IAC1E;AACA,WAAO,iBAAiB;AAAA,EAC1B;AAEA,QAAM,UAAsC,SAAS,IAAI,CAAC,aAAa;AAAA,IACrE,OAAO,GAAG,QAAQ,IAAI,MAAM,QAAQ,IAAI;AAAA,IACxC,OAAO,EAAE,QAAQ;AAAA,EACnB,EAAE;AACF,MAAI,WAAW;AACb,YAAQ,KAAK,EAAE,OAAO,wBAAwB,OAAO,EAAE,QAAQ,KAAK,EAAE,CAAC;AAAA,EACzE;AACA,QAAM,aAAa,UAAU,SAAY,KAAK,SAAS,UAAU,CAAC,YAAY,QAAQ,SAAS,KAAK;AACpG,QAAM,eAAe,cAAc,IAAI,aAAa,SAAS,WAAW,IAAI,IAAI;AAChF,QAAM,SAAS,MAAM,SAAS,OAAO,qDAAqD,SAAS,YAAY;AAC/G,SAAO,YAAY,SAAS,iBAAiB,IAAI,OAAO;AAC1D;AAGA,SAAS,iBAAiB,SAA+C,MAA2B;AAGlG,SAAO,2HACoC,IAAI,IAAI,QAAQ,QAAQ,EAAE,MAAM,4DACpC,IAAI;AAC7C;AAEA,SAAS,mBAAmB,MAAsB;AAEhD,SAAO,yEAAyE,IAAI;AAEtF;AAIA,eAAe,eACb,SACA,MACA,OACA,MACA,MAC0B;AAC1B,QAAM,WAAW,MAAM,aAAa,OAAO;AAE3C,MAAI,KAAK,aAAa;AACpB,UAAM,QAAQ,SAAS,KAAK,CAAC,YAAY,QAAQ,SAAS,KAAK,WAAW;AAC1E,WAAO,SAAS,EAAE,MAAM,KAAK,aAAa,MAAM,KAAK,eAAe,KAAK,YAAY;AAAA,EACvF;AAEA,QAAM,QAAQ,iBAAiB,MAAM,IAAI,mBAAmB,CAAC;AAC7D,MAAI,QAAQ,UAAU;AACpB,WAAO,WAAW,SAAS,MAAM,UAAU,OAAO,MAAM,MAAM,QAAQ,QAAQ;AAAA,EAChF;AACA,MAAI,OAAO;AACT,UAAM,QAAQ,SAAS,KAAK,CAAC,YAAY,QAAQ,SAAS,KAAK;AAC/D,QAAI,OAAO;AACT,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO,SAAS,CAAC;AAAA,EACnB;AACA,MAAI,SAAS,SAAS,GAAG;AACvB,WAAO,EAAE,SAAS,SAAS;AAAA,EAC7B;AAMA,MAAI,SAAS,UAAU;AACrB,UAAM,IAAI,MAAM,iBAAiB,SAAS,IAAI,CAAC;AAAA,EACjD;AAEA,QAAM,OAAO,KAAK,eAAe,WAAW,IAAI;AAChD,MAAI,CAAC,KAAK,KAAK;AACb,UAAM,IAAI;AAAA,MACR,0EAA0E,IAAI;AAAA,IAEhF;AAAA,EACF;AACA,MAAI,KAAK,QAAQ;AACf,UAAM,IAAI,MAAM,mBAAmB,IAAI,CAAC;AAAA,EAC1C;AACA,SAAO,cAAc,SAAS,IAAI;AACpC;AAEA,eAAe,aAAa,SAA2E;AACrG,QAAM,SAAS,MAAM,oBAAoB,SAAS,MAAM,QAAQ,OAAO,UAAU,iBAAiB,CAAC,CAAC,CAAC;AACrG,SAAO,gBAAgB,eAAe,MAAM,CAAC;AAC/C;AAaA,eAAe,oBACb,SACA,KACY;AACZ,MAAI;AACF,WAAO,MAAM,IAAI;AAAA,EACnB,SAAS,OAAO;AACd,QAAI,CAAC,eAAe,KAAK,GAAG;AAC1B,YAAM;AAAA,IACR;AACA,UAAM,IAAI;AAAA,MACR,qBAAqB,QAAQ,QAAQ;AAAA;AAAA,MAC5B,aAAa,OAAO,CAAC;AAAA;AAAA;AAAA,IAEhC;AAAA,EACF;AACF;AAUA,SAAS,aAAa,SAA+D;AACnF,QAAM,SAAS,qBAAqB,QAAQ,KAAK,QAAQ,QAAQ,IAC5D,QAAQ,QAAQ,SAAS,KAAK,UAAU,QAAQ,GAAG,KACpD,eAAe,QAAQ,QAAQ;AAEnC,SAAO,qBAAqB,MAAM;AACpC;AAEA,SAAS,eAAe,OAAyB;AAC/C,SAAO,iBAAiB,eACnB,MAAM,SAAS,oBACd,MAAM,SAA6C,WAAW;AACtE;AAEA,eAAe,cAAc,SAA2B,MAAuD;AAC7G,QAAM,SAAS,MAAM,oBAAoB,SAAS,MAChD,QAAQ,OAAO,UAAU,mBAAmB,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;AACpE,QAAM,UAAU,gBAAgB,eAAe,MAAM,CAAC;AACtD,QAAM,QAAQ,QAAQ,CAAC;AACvB,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,iDAAiD;AAAA,EACnE;AAGA,UAAQ,GAAG,OAAO,MAAM,mBAAmB,MAAM,IAAI,KAAK,MAAM,IAAI;AAAA,CAAM;AAC1E,SAAO;AACT;AAGO,SAAS,eAAe,QAA0B;AACvD,MAAI,CAACC,UAAS,MAAM,KAAK,CAAC,MAAM,QAAQ,OAAO,OAAO,GAAG;AACvD,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,OAAO,QAAQ,KAAK,CAAC,SAASA,UAAS,IAAI,KAAK,KAAK,SAAS,MAAM;AAClF,MAAI,CAACA,UAAS,KAAK,KAAK,OAAO,MAAM,SAAS,UAAU;AACtD,WAAO;AAAA,EACT;AACA,MAAI;AACF,WAAO,KAAK,MAAM,MAAM,IAAI;AAAA,EAC9B,QAAQ;AACN,WAAO,MAAM;AAAA,EACf;AACF;AAMO,SAAS,gBAAgB,OAAuD;AACrF,QAAM,aAAwB,MAAM,QAAQ,KAAK,IAC7C,QACAA,UAAS,KAAK,IACZ,CAAC,YAAY,SAAS,WAAW,QAAQ,MAAM,EAAE,QAAQ,CAAC,QAAQ;AAClE,UAAM,SAAS,MAAM,GAAG;AACxB,WAAO,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC;AAAA,EAC3C,CAAC,IACC,CAAC;AACP,QAAM,WAAkD,CAAC;AACzD,aAAW,aAAa,YAAY;AAClC,QAAIA,UAAS,SAAS,KAAK,OAAO,UAAU,SAAS,UAAU;AAC7D,eAAS,KAAK;AAAA,QACZ,MAAM,UAAU;AAAA,QAChB,MAAM,OAAO,UAAU,SAAS,WAAW,UAAU,OAAO,UAAU;AAAA,MACxE,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,QAAgD;AACxE,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AACA,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,MAAM;AAChC,WAAO,OAAO,OAAO,SAAS,SAAS,WAAW,OAAO,QAAQ,OAAO;AAAA,EAC1E,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAOA,eAAe,aAAa,MAAwD;AAClF,QAAM,WAAW,oBAAI,IAAgC;AACrD,aAAW,QAAQ,CAAC,GAAG,eAAe,GAAG,qBAAqB,GAAG;AAC/D,aAAS,IAAI,MAAM,MAAM,gBAAgB,MAAM,IAAI,CAAC;AAAA,EACtD;AACA,SAAO;AACT;AAYA,eAAe,UACb,MACA,MACA,QACA,UACA,cAAc,MACC;AAEf,aAAW,SAAS,KAAK,QAAQ;AAC/B,UAAM,uBAAuB,MAAM,MAAM,IAAI;AAC7C,UAAM,6BAA6B,MAAM,MAAM,MAAM,QAAQ;AAAA,EAC/D;AACA,aAAW,QAAQ,KAAK,SAAS;AAC/B,UAAM,uBAAuB,MAAM,IAAI;AACvC,UAAM,6BAA6B,MAAM,MAAM,QAAQ;AAAA,EACzD;AACA,MAAI,QAAQ;AACV;AAAA,EACF;AACA,QAAM,UAAoB,CAAC;AAC3B,MAAI;AAQF,UAAMA,aAAW,CAAC,SAAiB,CAAC,gBAAgB,SAAS,uBAAuB,SAAS;AAC7F,UAAM,eAAe,KAAK,OAAO,OAAO,CAAC,UAAUA,WAAS,MAAM,IAAI,CAAC;AACvE,UAAM,gBAAgB,KAAK,QAAQ,OAAO,CAAC,SAASA,WAAS,IAAI,CAAC;AAOlE,UAAM,qBAA+B,CAAC,GAAI,KAAK,QAAQ,sBAAsB,CAAC,CAAE;AAChF,UAAM,sBAAsB,CAAC,gBAAmC;AAC9D,iBAAW,aAAa,aAAa;AACnC,YAAI,CAAC,mBAAmB,SAAS,SAAS,GAAG;AAC3C,6BAAmB,KAAK,SAAS;AAAA,QACnC;AAAA,MACF;AAAA,IACF;AAUA,UAAM,0BAA0B,YAAY;AAC1C,YAAM,QAAQ,KAAK,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,mBAAmB;AACpE,UAAI,CAAC,eAAe,CAAC,KAAK,UAAU,CAAC,SAAS,CAAC,QAAQ,SAAS,mBAAmB,GAAG;AACpF;AAAA,MACF;AACA,YAAM,iBAAiB,MAAM;AAAA,QAC3B,GAAG;AAAA,QACH,SAAS,uBAAuB,MAAM,SAAS,kBAAkB;AAAA,MACnE,CAAC;AAAA,IACH;AAQA,UAAM,6BAA6B,OAAO,YAAqB;AAC7D,UAAI;AACF,cAAM,wBAAwB;AAAA,MAChC,SAAS,OAAO;AACd,YAAI,CAAC,SAAS;AACZ,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,UAAM,QAAQ,OAAO,QAA8B,YAA+B;AAChF,iBAAW,SAAS,QAAQ;AAG1B,cAAM,6BAA6B,MAAM,MAAM,MAAM,QAAQ;AAC7D,cAAM,iBAAiB,MAAM,OAAO,mBAAmB;AACvD,gBAAQ,KAAK,MAAM,IAAI;AAAA,MACzB;AACA,iBAAW,QAAQ,SAAS;AAC1B,cAAM,6BAA6B,MAAM,MAAM,QAAQ;AACvD,cAAMC,IAAGC,MAAK,MAAM,IAAI,GAAG,EAAE,OAAO,KAAK,CAAC;AAC1C,gBAAQ,KAAK,IAAI;AAAA,MACnB;AAAA,IACF;AAEA,QAAI;AACF,YAAM;AAAA,QACJ,cAAc,KAAK,OAAO,OAAO,CAAC,UAAU,CAACF,WAAS,MAAM,IAAI,CAAC,GAAG,WAAW;AAAA,QAC/E,KAAK,QAAQ,OAAO,CAAC,SAAS,CAACA,WAAS,IAAI,CAAC;AAAA,MAC/C;AACA,YAAM,2BAA2B,KAAK;AAEtC,YAAM,MAAM,cAAc,aAAa;AAAA,IACzC,SAAS,OAAO;AACd,YAAM,2BAA2B,IAAI;AACrC,YAAM;AAAA,IACR;AAAA,EACF,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,UAAM,IAAI;AAAA,MACR,GAAG,OAAO;AAAA,uCAA0C,QAAQ,KAAK,IAAI,KAAK,WAAW;AAAA,IACvF;AAAA,EACF;AAMA,aAAW,aAAa,KAAK,wBAAwB,CAAC,GAAG;AACvD,UAAM,MAAME,MAAK,MAAM,SAAS,CAAC,EAAE,MAAM,MAAM,MAAS;AAAA,EAC1D;AACF;AASA,SAAS,cAAc,QAA8B,aAAmC;AACtF,QAAM,SAAS,OAAO,OAAO,CAAC,UAAU,MAAM,SAAS,mBAAmB;AAC1E,QAAM,OAAO,OAAO,OAAO,CAAC,UAAU,MAAM,SAAS,mBAAmB;AAIxE,SAAO,cAAc,CAAC,GAAG,QAAQ,GAAG,IAAI,IAAI,CAAC,GAAG,MAAM,GAAG,MAAM;AACjE;AAIA,eAAe,6BACb,MACA,cACA,UACe;AACf,MAAI,CAAC,SAAS,IAAI,YAAY,GAAG;AAC/B;AAAA,EACF;AACA,QAAM,MAAM,MAAM,aAAaA,MAAK,MAAM,YAAY,CAAC;AACvD,MAAI,QAAQ,SAAS,IAAI,YAAY,GAAG;AACtC,UAAM,IAAI;AAAA,MACR,GAAG,YAAY;AAAA,IACjB;AAAA,EACF;AACF;AAUA,eAAe,iBACb,MACA,OACA,sBACmB;AACnB,QAAM,eAAeA,MAAK,MAAM,MAAM,IAAI;AAC1C,QAAM,kBAAkBC,SAAQ,YAAY;AAC5C,QAAM,eAAe,MAAMC,OAAM,iBAAiB,EAAE,WAAW,KAAK,CAAC;AAKrE,QAAM,UAAU,aAAa,MAAM,cAAc,eAAe;AAChE,yBAAuB,OAAO;AAC9B,QAAM,eAAe,MAAM,SAAS,YAAY;AAChD,QAAM,UAAU,GAAG,YAAY,IAAI,QAAQ,GAAG,IAAI,KAAK,IAAI,CAAC;AAE5D,QAAMC,WAAU,SAAS,MAAM,SAAS,EAAE,UAAU,QAAQ,MAAM,gBAAgB,IAAM,CAAC;AACzF,MAAI,iBAAiB,QAAW;AAC9B,UAAMC,OAAM,SAAS,YAAY;AAAA,EACnC;AACA,QAAMC,QAAO,SAAS,YAAY;AAClC,SAAO;AACT;AASO,SAAS,aAAa,MAAc,cAAkC,iBAAmC;AAC9G,MAAI,iBAAiB,QAAW;AAC9B,WAAO,CAAC;AAAA,EACV;AACA,QAAM,OAAOV,SAAQ,YAAY;AACjC,QAAM,OAAiB,CAAC;AACxB,WAAS,KAAKA,SAAQ,eAAe,KAAK,KAAKM,SAAQ,EAAE,GAAG;AAC1D,UAAM,aAAa,SAAS,MAAM,EAAE;AACpC,QAAI,cAAc,CAAC,WAAW,WAAW,IAAI,GAAG;AAC9C,WAAK,KAAK,WAAW,MAAMK,IAAG,EAAE,KAAK,GAAG,CAAC;AAAA,IAC3C;AACA,QAAI,OAAO,QAAQL,SAAQ,EAAE,MAAM,IAAI;AACrC;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,SAAS,cAAmD;AACzE,MAAI;AACF,YAAQ,MAAMM,MAAK,YAAY,GAAG,OAAO;AAAA,EAC3C,SAAS,OAAO;AACd,QAAIT,UAAS,KAAK,KAAK,MAAM,SAAS,UAAU;AAC9C,aAAO;AAAA,IACT;AACA,UAAM;AAAA,EACR;AACF;AAIA,SAAS,cAAc,MAA0B;AAC/C,QAAM,OAAiB,EAAE,QAAQ,OAAO,MAAM,OAAO,KAAK,MAAM;AAChE,WAAS,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;AACnD,UAAM,MAAM,KAAK,KAAK;AACtB,QAAI,CAAC,KAAK;AACR;AAAA,IACF;AACA,QAAI,QAAQ,aAAa;AACvB,WAAK,cAAcU,cAAa,KAAK,KAAK,EAAE,KAAK,CAAC;AAAA,IACpD,WAAW,QAAQ,kBAAkB;AACnC,WAAK,cAAcA,cAAa,KAAK,KAAK,EAAE,KAAK,CAAC;AAAA,IACpD,WAAW,QAAQ,aAAa;AAC9B,WAAK,SAAS;AAAA,IAChB,WAAW,QAAQ,UAAU;AAC3B,WAAK,OAAO;AAAA,IACd,WAAW,QAAQ,WAAW,QAAQ,MAAM;AAC1C,WAAK,MAAM;AAAA,IACb,WAAW,QAAQ,UAAU;AAAA,IAE7B,OAAO;AACL,YAAM,IAAI,MAAM,qBAAqB,GAAG,EAAE;AAAA,IAC5C;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAASA,cAAa,MAAc,OAAmC;AACrE,MAAI,CAAC,SAAS,MAAM,WAAW,IAAI,GAAG;AACpC,UAAM,IAAI,MAAM,GAAG,IAAI,oBAAoB;AAAA,EAC7C;AACA,SAAO;AACT;AAEA,SAAS,WAAW,MAAsB;AACxC,QAAM,QAAQ,KAAK,MAAM,OAAO,EAAE,OAAO,OAAO;AAChD,SAAO,MAAM,MAAM,SAAS,CAAC,KAAK;AACpC;AAEA,SAASV,UAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;;;ASr5BA,eAAsB,cAAc,MAAgB,IAA4B;AAC9E,MAAI,SAAqB,EAAE,MAAM,KAAK,SAAS,QAAQ,GAAG,MAAM,OAAO,SAAS,OAAO,aAAa,CAAC,EAAE;AACvG,MAAI;AACF,aAAS,gBAAgB,IAAI;AAE7B,QAAI,OAAO,WAAW,OAAO,YAAY,CAAC,MAAM,WAAW;AACzD,SAAG,OAAO,MAAM,cAAc,EAAE,SAAS,YAAY,GAAG,EAAE,MAAM,OAAO,KAAK,CAAC,CAAC;AAC9E,aAAO;AAAA,IACT;AACA,QAAI,OAAO,QAAQ,OAAO,YAAY,WAAW,GAAG;AAClD,SAAG,OAAO,MAAM,SAAS,CAAC;AAC1B,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,gBAAgB,EAAE,KAAK,OAAO,KAAK,UAAU,OAAO,SAAS,CAAC;AAG/E,UAAM,eAAe,MAAM,YAAY,EAAE,MAAM,OAAO,KAAK,CAAC;AAC5D,UAAM,aAAa,IAAI,eAAe;AAKtC,UAAM,UAAU,CAAC,SAA6B;AAC5C,YAAM,OAAO,IAAI,YAAY;AAAA,QAC3B,UAAU,SAAS;AAAA,QACnB;AAAA;AAAA;AAAA,QAGA,UAAU,OAAO,YAAY,CAAC,MAAM,UAAU,OAAO,YAAY,SAAS,WAAW;AAAA;AAAA;AAAA,QAGrF,gBAAgB,CAAC,QAAQ;AACvB,aAAG,OAAO,MAAM,OAAO,OACnB,GAAG,KAAK,UAAU,EAAE,OAAO,aAAa,IAAI,CAAC,CAAC;AAAA,IAC9C;AAAA,IAA8E,GAAG;AAAA,CAAI;AAAA,QAC3F;AAAA,MACF,CAAC;AACD,YAAMW,UAAS,IAAI,aAAa,EAAE,UAAU,SAAS,UAAU,eAAe,MAAM,KAAK,CAAC;AAC1F,aAAO,EAAE,MAAM,QAAAA,QAAO;AAAA,IACxB;AACA,UAAM,CAAC,QAAQ,QAAQ,GAAG,IAAI,IAAI,OAAO;AAEzC,QAAI,WAAW,OAAO;AACpB,YAAM,aAAa;AAAA,QACjB,UAAU,SAAS;AAAA;AAAA,QAEnB,MAAM,aAAa,EAAE,QAAQ;AAAA,QAC7B,OAAO,GAAG;AAAA,QACV,QAAQ,GAAG;AAAA,QACX,aAAa,GAAG;AAAA,MAClB,CAAC;AACD,aAAO;AAAA,IACT;AAEA,QAAI,WAAW,QAAQ;AAErB,aAAO,MAAM,mBAAmB;AAAA,QAC9B,MAAM,OAAO,YAAY,MAAM,CAAC;AAAA,QAChC,MAAM,aAAa,EAAE;AAAA,QACrB,SAAS,CAAC,SAAS;AACjB,gBAAM,EAAE,MAAM,QAAAA,QAAO,IAAI,QAAQ,IAAI;AACrC,iBAAO;AAAA,YACL,QAAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAMA,aAAa,YAAY;AACvB,kBAAI;AACF,uBAAO,MAAM,KAAK,eAAe;AAAA,cACnC,SAAS,OAAO;AACd,oBAAI,QAAQ,IAAI,eAAe;AAC7B,wBAAM;AAAA,gBACR;AACA,uBAAO;AAAA,cACT;AAAA,YACF;AAAA;AAAA,YAEA,OAAO,YAAY;AACjB,oBAAM,KAAK,MAAM;AAAA,YACnB;AAAA,UACF;AAAA,QACF;AAAA;AAAA,QAEA,UAAU,cAAc,IAAI,OAAO,IAAI,IAAI,uBAAuB,EAAE,IAAI;AAAA,QACxE,UAAU,SAAS;AAAA,QACnB,KAAK,SAAS;AAAA,QACd,YAAY,GAAG,YAAY,IAAI,WAAW;AAAA,QAC1C,KAAK,QAAQ,IAAI;AAAA,QACjB,MAAM,OAAO;AAAA,QACb;AAAA,MACF,CAAC;AAAA,IACH;AAEA,QAAI,WAAW,QAAQ;AAErB,UAAI,OAAO,SAAS,QAAW;AAC7B,WAAG,OAAO,MAAM,2DAA2D;AAAA,MAC7E;AAGA,aAAO,MAAM,WAAW,QAAQ,QAAQ,IAAI,EAAE,MAAM,SAAS,UAAU,OAAO,MAAM,EAAE;AAAA,IACxF;AAEA,UAAM,MAAM,OAAO,OAAO;AAG1B,QAAI,WAAW,WAAW,WAAW,WAAW;AAC9C,aAAO,MAAM,aAAa,QAAQ,IAAI,SAAS,UAAU,YAAY;AACnE,cAAMC,YAAW,aAAa;AAC9B,eAAO,QAAQ,MAAM,YAAYA,WAAU,QAAQ,IAAI,CAAC,CAAC,EAAE;AAAA,MAC7D,CAAC;AAAA,IACH;AAIA,QAAI,aAAiD,kBAAkB,GAAG;AAC1E,QAAI,SAAS,2BAA2B,QAAQ,MAAM,KAChD,WAAW,YAAY,WAAW,UAAU,WAAW,WACxD,sBAAsB,YAAY,OAAO,WAAW,MAAM;AAC/D,QAAI,CAAC,QAAQ;AACX,YAAM,OAAO,MAAM,cAAc,KAAK,QAAQ,IAAI,EAAE,MAAM,EAAE,MAAM,MAAM,MAAS;AACjF,UAAI,QAAQ,sBAAsB,MAAM,OAAO,WAAW,GAAG;AAC3D,qBAAa;AACb,iBAAS;AAAA,MACX;AAAA,IACF;AACA,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,WAAW,UACvB,iEACA,oBAAoB,MAAM,IAAI;AAAA,IACpC;AAIA,UAAM,WAAW,aAAa;AAC9B,UAAM,EAAE,OAAO,IAAI,QAAQ,MAAM,YAAY,UAAU,QAAQ,IAAI,CAAC,CAAC;AAErE,QAAI,2BAA2B,QAAQ,MAAM,GAAG;AAC9C,aAAO,MAAM,gCAAgC;AAAA,QAC3C,MAAM;AAAA,QACN;AAAA,QACA,MAAM,OAAO;AAAA,QACb;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,kBAAkB,MAAM,wBAAwB;AAAA,MACpD,OAAO;AAAA,MACP,MAAM,OAAO;AAAA,MACb;AAAA,MACA,MAAM,OAAO;AAAA,MACb;AAAA,IACF,CAAC;AACD,QAAI,oBAAoB,GAAG;AACzB,aAAO;AAAA,IACT;AAEA,QAAI,WAAW,SAAS;AAEtB,aAAO,MAAM,YAAY,QAAQ,MAAM,QAAQ,QAAQ,EAAE;AAAA,IAC3D;AAEA,UAAM,IAAI,MAAM,oBAAoB,MAAM,IAAI;AAAA,EAChD,SAAS,OAAO;AACd,OAAG,OAAO,MAAM,YAAY,OAAO,EAAE,MAAM,OAAO,KAAK,CAAC,CAAC;AACzD,WAAO;AAAA,EACT;AACF;AAUA,eAAsB,YAAY,UAAwB,KAA0C;AAClG,QAAM,eAAe,SAAS,QAAQ;AACtC,QAAM,QAAQ,MAAM,mBAAmB,GAAG;AAC1C,MAAI,MAAM,SAAS,YAAY;AAC7B,UAAM,IAAI,MAAM,MAAM,oBAAoB,MAAM,KAAK,MAAM,MAAM,CAAC;AAAA,EACpE;AACA,MAAI,MAAM,SAAS,QAAQ;AACzB,WAAO;AAAA,EACT;AACA,MAAI,iBAAiB,QAAQ,iBAAiB,MAAM,MAAM;AAExD,UAAM,QAAQ,SAAS,WAAW,QAAQ,GAAG,SAAS,MAAM,IAAI,YAAY,KAAK,UAAU,YAAY;AACvG,UAAM,IAAI;AAAA,MACR,+CAA+C,MAAM,IAAI,YAAY,MAAM,GAAG,MACzE,KAAK;AAAA,IACZ;AAAA,EACF;AACA,SAAO,MAAM;AACf;AAEA,eAAe,WACb,QACA,MACA,UACA,MACA,IACiB;AACjB,MAAI,WAAW,SAAS;AACtB,UAAM,KAAK,MAAM;AACjB,OAAG,OAAO,MAAM,cAAc,EAAE,GAAG,MAAM,SAAS,GAAG,UAAU,eAAe,KAAK,GAAG,EAAE,KAAK,CAAC,CAAC;AAC/F,WAAO;AAAA,EACT;AACA,MAAI,WAAW,UAAU;AACvB,UAAM,QAAQ,MAAM,KAAK,eAAe;AACxC,OAAG,OAAO,MAAM,cAAc,EAAE,GAAG,MAAM,SAAS,GAAG,UAAU,eAAe,QAAQ,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AACzG,WAAO;AAAA,EACT;AACA,MAAI,WAAW,UAAU;AACvB,UAAM,KAAK,OAAO;AAClB,OAAG,OAAO,MAAM,cAAc,EAAE,UAAU,eAAe,MAAM,GAAG,EAAE,KAAK,CAAC,CAAC;AAC3E,WAAO;AAAA,EACT;AACA,QAAM,IAAI,MAAM,mDAAmD;AACrE;AAOA,eAAe,aACb,QACA,IACA,UACA,YACiB;AACjB,QAAM,aAAa,OAAO,OAAO;AACjC,MAAI;AACF,UAAM,QAAQ,MAAM,cAAc,YAAY,MAAM,WAAW,CAAC;AAChE,OAAG,OAAO,MAAM,cAAc,OAAO,EAAE,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,EAC7D,SAAS,OAAO;AACd,UAAM,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACpE,OAAG,OAAO,MAAM,cAAc,kBAAkB,UAAU,GAAG;AAAA,MAC3D,MAAM,OAAO;AAAA,MACb,UAAU,CAAC,0CAA0C,QAAQ,KAAK,MAAM,kBACrD,UAAU,yLACgF;AAAA,IAC/G,CAAC,CAAC;AAAA,EACJ;AACA,SAAO;AACT;AAEA,eAAe,YACb,QACA,MACA,QACA,QACA,IACiB;AACjB,MAAI,WAAW,QAAQ;AACrB,UAAM,QAAQ,MAAM,OAAO,UAAU;AACrC,OAAG,OAAO,MAAM,cAAc,OAAO,EAAE,MAAM,OAAO,KAAK,CAAC,CAAC;AAC3D,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,QAAQ;AACrB,UAAM,WAAW,KAAK,CAAC;AACvB,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,MAAM,0CAA0C;AAAA,IAC5D;AACA,UAAM,WAAW,KAAK,MAAM,CAAC;AAC7B,UAAM,iBAAiB,iBAAiB,QAAQ;AAChD,UAAM,UAAU,MAAM,mBAAmB;AAAA,MACvC,MAAM,eAAe;AAAA,MACrB,QAAQ,eAAe;AAAA,MACvB,OAAO,GAAG;AAAA,IACZ,CAAC;AACD,UAAM,SAAS,MAAM,OAAO,UAAU,UAAU,QAAQ,KAAK;AAC7D,OAAG,OAAO,MAAM,cAAc,QAAQ,EAAE,MAAM,OAAO,MAAM,UAAU,QAAQ,SAAS,CAAC,CAAC;AAExF,WAAO,YAAY,MAAM,IAAI,IAAI;AAAA,EACnC;AAEA,QAAM,IAAI,MAAM,8DAA8D;AAChF;AAYA,SAAS,gBAAgB,MAA4B;AACnD,QAAM,SAAqB,EAAE,MAAM,OAAO,MAAM,OAAO,SAAS,OAAO,aAAa,CAAC,EAAE;AACvF,WAAS,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;AACnD,UAAM,MAAM,KAAK,KAAK;AACtB,QAAI,CAAC,KAAK;AACR;AAAA,IACF;AACA,QAAI,QAAQ,SAAS;AACnB,aAAO,MAAM,UAAUC,cAAa,KAAK,KAAK,EAAE,KAAK,CAAC,CAAC;AAAA,IACzD,WAAW,QAAQ,cAAc;AAC/B,aAAO,WAAWA,cAAa,KAAK,KAAK,EAAE,KAAK,CAAC;AAAA,IACnD,WAAW,QAAQ,UAAU;AAE3B,aAAO,OAAO,WAAWA,cAAa,KAAK,KAAK,EAAE,KAAK,CAAC,CAAC;AAAA,IAC3D,WAAW,QAAQ,UAAU;AAC3B,aAAO,OAAO;AAAA,IAChB,WAAW,QAAQ,YAAY,QAAQ,MAAM;AAC3C,aAAO,OAAO;AAAA,IAChB,WAAW,QAAQ,eAAe,QAAQ,QAAQ,QAAQ,MAAM;AAC9D,aAAO,UAAU;AAAA,IACnB,OAAO;AACL,aAAO,YAAY,KAAK,GAAG;AAAA,IAC7B;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,MAAoD;AAC5E,QAAM,SAA6C,CAAC;AACpD,QAAM,SAAmB,CAAC;AAC1B,WAAS,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;AACnD,UAAM,MAAM,KAAK,KAAK;AACtB,QAAI,CAAC,KAAK;AACR;AAAA,IACF;AACA,QAAI,QAAQ,YAAY,QAAQ,MAAM;AACpC,aAAO,OAAOA,cAAa,KAAK,KAAK,EAAE,KAAK,CAAC;AAAA,IAC/C,OAAO;AACL,aAAO,KAAK,GAAG;AAAA,IACjB;AAAA,EACF;AACA,MAAI,OAAO,SAAS,GAAG;AACrB,WAAO,SAAS,OAAO,KAAK,GAAG;AAAA,EACjC;AACA,SAAO;AACT;AAEA,SAASA,cAAa,MAAc,OAAmC;AACrE,MAAI,CAAC,SAAS,MAAM,WAAW,IAAI,GAAG;AACpC,UAAM,IAAI,MAAM,GAAG,IAAI,oBAAoB;AAAA,EAC7C;AACA,SAAO;AACT;AAMA,eAAe,WAA6D;AAC1E,QAAM,QAAQ,MAAM,mBAAmB,QAAQ,IAAI,CAAC;AACpD,SAAO,MAAM,SAAS,SAAS,EAAE,OAAO,cAAc,MAAM,eAAe,IAAI,CAAC;AAClF;AAKA,IAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,IAAI;AAEX,SAAS,WAAmB;AAC1B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;;;AC5ZA,IAAM,WAAW,MAAM,cAAc,QAAQ,KAAK,MAAM,CAAC,GAAG;AAAA,EAC1D,OAAO,QAAQ;AAAA,EACf,QAAQ,QAAQ;AAAA,EAChB,QAAQ,QAAQ;AAClB,CAAC;AAED,QAAQ,WAAW;","names":["createHash","createHash","resolve","readFile","isRecord","generatedTools","createHash","isRecord","isRecord","generatedTools","isRecord","isRecord","isRecord","createInterface","createInterface","readFile","stat","isRecord","requireValue","chmod","mkdir","rename","rm","stat","writeFile","dirname","join","resolve","sep","basename","isRecord","basename","HARNESS_RECORD_PATH","stableStringify","createHash","readFile","homedir","dirname","join","homedir","dirname","join","isNodeError","readFile","stableStringify","createHash","DOC_KEY","AGENT_NOTE_KEY","createInterface","resolve","plan","previousRole","isRecord","rm","join","dirname","mkdir","writeFile","chmod","rename","sep","stat","requireValue","client","explicit","requireValue"]}
|
|
1
|
+
{"version":3,"sources":["../../src/core/auth/tokenStore.ts","../../src/core/harness/role.ts","../../src/core/auth/oauth.ts","../../src/core/config/endpoints.ts","../../src/core/auth/clientRegistration.ts","../../src/core/input/payloadSource.ts","../../src/core/version.ts","../../src/core/mcp/rpcClient.ts","../../src/core/output/render.ts","../../src/core/catalog/generated.prod.ts","../../src/core/catalog/generated.dev.ts","../../src/core/catalog/generator.ts","../../src/core/catalog/index.ts","../../src/core/mcp/stdioBridge.ts","../../src/adapters/mcp/connector.ts","../../src/core/catalog/enrichments.ts","../../src/core/output/table.ts","../../src/adapters/cli/errors.ts","../../src/adapters/cli/flagParser.ts","../../src/adapters/cli/destructiveConfirmation.ts","../../src/adapters/cli/bespokeCommands.ts","../../src/adapters/cli/generatedCommandRouter.ts","../../src/core/upload/attachmentUpload.ts","../../src/adapters/cli/attachmentsUploadCommand.ts","../../src/adapters/cli/initCommand.ts","../../src/core/harness/agentTargets.ts","../../src/core/harness/harnessDoc.ts","../../src/core/harness/initRecord.ts","../../src/core/harness/initPlan.ts","../../src/core/harness/repositoryRole.ts","../../src/core/harness/documentFetch.ts","../../src/adapters/cli/prompter.ts","../../src/adapters/cli/ainectoCli.ts","../../src/bin/ainecto.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { mkdir, readFile, rename, rm, stat, writeFile, chmod } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { ROLE_SCOPE_PREFIX } from \"../harness/role\";\n\nexport interface StoredTokenSet {\n endpoint: string;\n accessToken: string;\n refreshToken?: string;\n tokenType?: string;\n expiresAt?: number;\n scope?: string;\n clientId?: string;\n clientSecret?: string;\n authorizationServer?: string;\n updatedAt: string;\n}\n\n/**\n * 토큰 저장소 — ★서버(endpoint)마다 «한 칸»이다(설계 0.4.2 §2-4).\n *\n * <p>역할은 더는 토큰 칸이 정하지 않는다. 역할은 저장소(init 이 쓴 --role)에서 와서 요청 헤더로 실린다.\n * 0.4.1 이하가 쓴 역할별 칸은 읽지도 지우지도 않는다(사용자 결정 «마이그레이션은 고려하지 마»).\n */\nexport interface TokenStore {\n load(endpoint: string): Promise<StoredTokenSet | undefined>;\n save(endpoint: string, token: StoredTokenSet): Promise<void>;\n delete(endpoint: string): Promise<void>;\n}\n\ntype TokenFile = Record<string, StoredTokenSet>;\n\nexport class FileTokenStore implements TokenStore {\n readonly filePath: string;\n\n constructor(rootDir = join(homedir(), \".ainecto\")) {\n this.filePath = join(rootDir, \"tokens.json\");\n }\n\n async load(endpoint: string): Promise<StoredTokenSet | undefined> {\n const file = await this.readFile();\n return file[tokenKey(endpoint)];\n }\n\n async save(endpoint: string, token: StoredTokenSet): Promise<void> {\n assertNoRoleScope(token);\n const file = await this.readFile();\n file[tokenKey(endpoint)] = { ...token, endpoint, updatedAt: new Date().toISOString() };\n await this.writeFile(file);\n }\n\n async delete(endpoint: string): Promise<void> {\n const file = await this.readFile();\n delete file[tokenKey(endpoint)];\n await this.writeFile(file);\n }\n\n private async readFile(): Promise<TokenFile> {\n try {\n await this.hardenExistingPermissions();\n const raw = await readFile(this.filePath, \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new Error(\"Token file must contain an object.\");\n }\n return parsed as TokenFile;\n } catch (error) {\n if (isNodeError(error, \"ENOENT\")) {\n return {};\n }\n throw error;\n }\n }\n\n private async writeFile(file: TokenFile): Promise<void> {\n await mkdir(dirname(this.filePath), { recursive: true, mode: 0o700 });\n await chmod(dirname(this.filePath), 0o700);\n const tmpPath = `${this.filePath}.${process.pid}.${Date.now()}.tmp`;\n await writeFile(tmpPath, `${JSON.stringify(file, null, 2)}\\n`, { mode: 0o600 });\n await chmod(tmpPath, 0o600);\n await rename(tmpPath, this.filePath);\n await chmod(this.filePath, 0o600);\n }\n\n private async hardenExistingPermissions(): Promise<void> {\n const dirPath = dirname(this.filePath);\n await chmodIfPermissive(dirPath, 0o700);\n await chmodIfPermissive(this.filePath, 0o600);\n }\n}\n\n/** 서버 하나의 칸. 0.4.1 이하의 «역할 없는» 칸과 같은 키다 — 그때 역할 없이 로그인해 둔 사람은 그대로 쓴다. */\nexport function tokenKey(endpoint: string): string {\n return createHash(\"sha256\").update(endpoint).digest(\"hex\");\n}\n\n/**\n * ★역할 scope 가 든 토큰은 이 칸에 두지 않는다(설계 0.4.2 §2-4, 리뷰 P0-1).\n *\n * <p>토큰에 역할이 박혀 있으면 서버는 헤더보다 토큰을 믿는다. 그런 토큰이 이 한 칸에 들어가면 «모든»\n * 저장소에서 그 역할이 헤더를 이겨 역할이 뒤바뀐다. 지금은 그런 토큰을 받을 경로가 없지만(로그인에 역할을\n * 싣지 않는다), 저장 경계에서 막아 두면 새 경로가 생겨도 조용히 새지 않는다.\n */\nexport function assertNoRoleScope(token: Pick<StoredTokenSet, \"scope\">): void {\n if (token.scope?.split(/\\s+/).some((scope) => scope.startsWith(ROLE_SCOPE_PREFIX))) {\n throw new Error(\n \"Refusing to store a role-scoped access token: sign-in is one per machine and the role comes \"\n + \"from the repository. Run `ainecto auth login` again.\",\n );\n }\n}\n\nexport async function tokenStorePermissions(path: string): Promise<{ mode: number } | undefined> {\n try {\n const result = await stat(path);\n return { mode: result.mode & 0o777 };\n } catch (error) {\n if (isNodeError(error, \"ENOENT\")) {\n return undefined;\n }\n throw error;\n }\n}\n\nexport async function tokenStoreDirectoryPermissions(path: string): Promise<{ mode: number } | undefined> {\n return tokenStorePermissions(dirname(path));\n}\n\nexport async function removeTokenStoreForTests(path: string): Promise<void> {\n await rm(dirname(path), { recursive: true, force: true });\n}\n\nfunction isNodeError(error: unknown, code: string): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error && error.code === code;\n}\n\nasync function chmodIfPermissive(path: string, mode: number): Promise<void> {\n try {\n const result = await stat(path);\n if ((result.mode & 0o077) !== 0) {\n await chmod(path, mode);\n }\n } catch (error) {\n if (isNodeError(error, \"ENOENT\")) {\n return;\n }\n throw error;\n }\n}\n","/**\n * 세션 역할 — AiNecto Harness 의 「하나의 세션은 하나의 역할만 가진다」를 클라이언트 쪽에서\n * 실어 나르는 부분.\n *\n * ★0.4.2: 역할의 «저장 위치»는 하나다 — init 이 저장소에 쓴 {@code .mcp.json}·{@code .cursor/mcp.json}\n * 의 {@code ainecto} 항목의 {@code --role}(판정은 {@code repositoryRole.ts} 한 곳). 로그인은 서버마다\n * 한 번이고 토큰은 역할을 싣지 않는다. 역할은 요청마다 {@link ROLE_HEADER} 로 실리고, 서버는 그 헤더로\n * 도구 목록·거절·인자 판정을 전부 적용한다. 역할은 작업 가드레일이지 보안 경계가 아니다(2026-09-29\n * 사용자 결정 Q1) — 같은 토큰으로 헤더를 빼면 제한이 없다.\n *\n * - 브리지({@code ainecto mcp}): ① {@code --role} 인자(init 이 MCP 설정에 쓴다) ② {@code AINECTO_ROLE}\n * (Codex 처럼 설정이 전역뿐인 에이전트). 세션 시작 때 정해지고 세션 동안 바뀌지 않는다.\n * - 셸 명령({@code ainecto tools call …} 등): 저장소 역할. ①② 를 주면 저장소 역할과 같아야 한다(다르면 거절).\n * - 저장소 밖: 역할 없음 = 제한 없음.\n *\n * ★에이전트가 «사용자의 답으로» 다음 세션의 역할을 적용하는 것은 허용한다(Q2): 고르는 것은 사람,\n * 적용({@code ainecto init --role <role>})은 에이전트. 떠 있는 세션의 역할은 바뀌지 않는다.\n *\n * ⛔«도구로 역할을 선언»하는 길은 택하지 않았다. 에이전트가 «세션 도중에» 스스로 바꿀 수 있으면\n * 제약이 아니다 — 막히는 순간 「역할을 바꿔서 하겠습니다」가 가장 자연스러운 다음 수가 된다.\n *\n * ⚠강제하는 쪽은 서버다. 이 파일은 역할을 «전달»만 한다.\n */\n\nexport const HARNESS_ROLES = [\"design\", \"development\", \"test\", \"validation\"] as const;\n\nexport type HarnessRole = (typeof HARNESS_ROLES)[number];\n\n/**\n * 역할을 싣던 OAuth scope 접두사(0.4.1 이하). 서버의 McpSessionRole.ROLE_SCOPE_PREFIX 와 같다.\n *\n * <p>0.4.2 부터 로그인은 이 scope 를 요구하지 않는다. 남은 쓰임은 하나 — 역할 없는 토큰 칸에\n * 이 scope 가 든 토큰을 «저장하지 않는» 가드({@code tokenStore.assertNoRoleScope}).\n */\nexport const ROLE_SCOPE_PREFIX = \"ainecto:role:\";\n\n/**\n * 서버가 읽는 헤더 이름. 서버의 McpSessionRoleResolver.ROLE_HEADER 와 같아야 한다.\n */\nexport const ROLE_HEADER = \"X-AiNecto-Role\";\n\n/** 설정이 전역뿐인 에이전트(Codex 등)를 위한 환경변수. */\nexport const ROLE_ENV_VAR = \"AINECTO_ROLE\";\n\nexport interface RoleResolutionInput {\n role?: string;\n envVars?: NodeJS.ProcessEnv;\n}\n\nexport interface ResolvedRole {\n role?: HarnessRole;\n source: \"flag\" | \"env\" | \"none\";\n}\n\nexport function resolveRole(input: RoleResolutionInput = {}): ResolvedRole {\n if (input.role !== undefined) {\n return { role: assertRole(input.role), source: \"flag\" };\n }\n const envVars = input.envVars ?? process.env;\n const fromEnv = envVars[ROLE_ENV_VAR];\n if (fromEnv && fromEnv.trim()) {\n return { role: assertRole(fromEnv), source: \"env\" };\n }\n return { source: \"none\" };\n}\n\n/**\n * ⚠여기서는 «틀리면 멈춘다». 서버는 모르는 값을 FULL 로 받아 넘기지만, 그건 남의 설정이\n * 조용히 죽지 않게 하려는 것이고 — 이쪽은 방금 사람이 친 값이라 오타를 알려주는 편이 낫다.\n * 조용히 «역할 없음»으로 도는 것이 이 도구에서 가장 나쁜 실패다.\n */\nexport function assertRole(value: string): HarnessRole {\n const normalized = value.trim().toLowerCase();\n if ((HARNESS_ROLES as readonly string[]).includes(normalized)) {\n return normalized as HarnessRole;\n }\n throw new Error(\n `Invalid role \"${value}\". Expected one of: ${HARNESS_ROLES.join(\", \")}.`,\n );\n}\n\n/** 사람이 읽는 이름. 서버의 거부 안내문과 같은 어휘를 쓴다. */\nexport function roleDisplayName(role: HarnessRole): string {\n return `${role.charAt(0).toUpperCase()}${role.slice(1)} Session`;\n}\n","import { createHash, randomBytes } from \"node:crypto\";\nimport { createServer } from \"node:http\";\nimport { spawn, type ChildProcess, type SpawnOptions } from \"node:child_process\";\nimport { URLSearchParams } from \"node:url\";\nimport type { StoredTokenSet, TokenStore } from \"./tokenStore\";\nimport { registerPublicClient, type ClientRegistrationResult } from \"./clientRegistration\";\nimport { assertTrustedEndpointUrl, isDefaultEndpoint } from \"../config/endpoints\";\n\n/**\n * ★로그인은 서버마다 한 번이다(설계 0.4.2). 토큰은 역할을 싣지 않고, 역할은 저장소에서 와서\n * 요청 헤더로 실린다({@link McpRpcClient}). 그래서 이 클라이언트에는 역할이 없다.\n */\nexport interface OAuthClientOptions {\n endpoint: string;\n tokenStore: TokenStore;\n fetchImpl?: typeof fetch;\n envVars?: NodeJS.ProcessEnv;\n /**\n * 브라우저를 연다. <b>열기에 실패하면 거절</b>하고, 성공이 확인되면(또는 아직 모르면) 가만히 있는다.\n * login 은 이 약속을 «기다리지 않고» 콜백 대기와 경주시킨다 — 여는 명령이 브라우저가 닫힐 때까지\n * 안 끝나는 환경에서 순서대로 기다리면 교착한다.\n */\n openBrowser?: (url: string) => Promise<void>;\n /**\n * 인가 URL 을 «브라우저를 열기 전에» 알린다. CLI 는 stderr 에 한 줄 쓴다 — 브라우저가 안 열려도\n * 사람이 직접 열 수 있고, 에이전트가 실행했다면 명령이 끝날 때 그 줄이 에이전트에게 닿는다.\n */\n onAuthorizeUrl?: (url: string) => void;\n /** 콜백을 기다리는 한도. 기본 5분 — 사람이 로그인하기엔 넉넉하고, 에이전트 셸 도구 최대 한도보다 짧다. */\n loginTimeoutMs?: number;\n /**\n * 토큰 저장소를 «읽기만» 한다 — 갱신하지 않는다(네트워크도, 토큰 파일 쓰기도 없다).\n * {@code init --dry-run} 이 쓴다: 「아무것도 바꾸지 않는다」에 사용자의 로그인 상태도 든다.\n * 갱신이 필요한(만료된) 토큰은 «없음»으로 본다.\n */\n readOnly?: boolean;\n}\n\n/** 로그인 대기 기본 한도(5분). */\nexport const DEFAULT_LOGIN_TIMEOUT_MS = 300_000;\n\n/**\n * 로그인이 «사람 쪽 사정으로» 끝나지 못한 이유. {@code code} 는 {@code --json} 의 {@code error.code} 로\n * 그대로 나간다(종료 코드는 다른 실패와 같은 1 — 받는 쪽은 메시지를 읽고 사람에게 옮긴다).\n */\nexport class OAuthLoginError extends Error {\n constructor(readonly code: \"LOGIN_TIMEOUT\" | \"BROWSER_UNAVAILABLE\" | \"CALLBACK_UNAVAILABLE\", message: string) {\n super(message);\n this.name = \"OAuthLoginError\";\n }\n}\n\nexport interface OAuthMetadata {\n authorizationEndpoint: string;\n tokenEndpoint: string;\n registrationEndpoint?: string;\n issuer?: string;\n codeChallengeMethodsSupported: string[];\n}\n\nexport interface TokenProvider {\n getAccessToken(): Promise<string | undefined>;\n refreshAfterUnauthorized(): Promise<string | undefined>;\n}\n\nexport class OAuthClient implements TokenProvider {\n private readonly fetchImpl: typeof fetch;\n private readonly envVars: NodeJS.ProcessEnv;\n private readonly openBrowserImpl: (url: string) => Promise<void>;\n\n constructor(private readonly options: OAuthClientOptions) {\n this.fetchImpl = options.fetchImpl ?? fetch;\n this.envVars = options.envVars ?? process.env;\n this.openBrowserImpl = options.openBrowser ?? openBrowser;\n }\n\n async getAccessToken(): Promise<string | undefined> {\n const envToken = this.envVars.AINECTO_TOKEN;\n if (envToken) {\n assertEnvTokenEndpointAllowed(this.options.endpoint, this.envVars);\n return envToken;\n }\n\n const stored = await this.options.tokenStore.load(this.options.endpoint);\n if (!stored) {\n return undefined;\n }\n\n if (!shouldRefresh(stored)) {\n return stored.accessToken;\n }\n if (this.options.readOnly) {\n return isExpired(stored) ? undefined : stored.accessToken;\n }\n // ★만료됐는데 갱신할 수단이 없으면 «토큰 없음»이다. 예전엔 만료된 토큰을 그대로 돌려줘서,\n // init 은 로그인 대신 401 안내로 떨어졌고 다른 경로는 받을 게 뻔한 401 을 받으러 갔다\n // (2026-09-29 독립 리뷰 P1-2). 아직 60초 창 안이면 쓸 수 있으므로 돌려준다.\n if (!stored.refreshToken) {\n return isExpired(stored) ? undefined : stored.accessToken;\n }\n\n return this.refreshStoredToken({ ...stored, refreshToken: stored.refreshToken });\n }\n\n async refreshAfterUnauthorized(): Promise<string | undefined> {\n const stored = await this.options.tokenStore.load(this.options.endpoint);\n if (this.options.readOnly || !stored?.refreshToken) {\n return undefined;\n }\n return this.refreshStoredToken({ ...stored, refreshToken: stored.refreshToken });\n }\n\n async login(): Promise<StoredTokenSet> {\n const pkce = generatePkcePair();\n const state = generateOAuthState();\n const loopback = await createLoopbackReceiver(state);\n\n try {\n const metadata = await discoverOAuthMetadata(this.options.endpoint, this.fetchImpl);\n const registration = metadata.registrationEndpoint\n ? await registerPublicClient(metadata.registrationEndpoint, loopback.redirectUri, this.fetchImpl)\n : { clientId: \"ainecto-cli\" };\n const authorizeUrl = new URL(metadata.authorizationEndpoint);\n authorizeUrl.searchParams.set(\"response_type\", \"code\");\n authorizeUrl.searchParams.set(\"client_id\", registration.clientId);\n authorizeUrl.searchParams.set(\"redirect_uri\", loopback.redirectUri);\n authorizeUrl.searchParams.set(\"code_challenge\", pkce.codeChallenge);\n authorizeUrl.searchParams.set(\"code_challenge_method\", \"S256\");\n authorizeUrl.searchParams.set(\"resource\", this.options.endpoint);\n authorizeUrl.searchParams.set(\"state\", state);\n // ★역할을 scope 에 싣지 않는다(설계 0.4.2) — 로그인은 서버마다 한 번이고, 역할은 저장소에서\n // 요청 헤더로 온다. 역할은 작업 가드레일이지 보안 경계가 아니다(2026-09-29 사용자 결정 Q1).\n\n assertTrustedEndpointUrl(authorizeUrl, \"OAuth authorization URL\");\n const url = authorizeUrl.toString();\n this.options.onAuthorizeUrl?.(url);\n // ★셋 중 먼저 오는 것이 결과다 — 콜백 도착 / 브라우저 열기 실패 / 시간 한도.\n // 예전엔 한도가 없고 열기 실패를 못 봐서, 브라우저가 없는 기계에서 말없이 영원히 기다렸다\n // (2026-09-29 독립 리뷰 P1-2). 비TTY(에이전트가 실행)에서는 그 대기가 곧 멈춤이다.\n const browserFailure = this.openBrowserImpl(url).then(() => new Promise<never>(() => undefined));\n const code = await withTimeout(\n Promise.race([loopback.waitForCode(), browserFailure]),\n this.options.loginTimeoutMs ?? DEFAULT_LOGIN_TIMEOUT_MS,\n );\n const token = await exchangeToken(metadata.tokenEndpoint, {\n grant_type: \"authorization_code\",\n code,\n redirect_uri: loopback.redirectUri,\n client_id: registration.clientId,\n code_verifier: pkce.codeVerifier,\n resource: this.options.endpoint,\n ...(registration.clientSecret ? { client_secret: registration.clientSecret } : {}),\n }, this.fetchImpl);\n\n const stored = toStoredToken(this.options.endpoint, token, metadata, registration);\n await this.options.tokenStore.save(this.options.endpoint, stored);\n return stored;\n } finally {\n await loopback.close();\n }\n }\n\n async logout(): Promise<void> {\n await this.options.tokenStore.delete(this.options.endpoint);\n }\n\n /** 부르는 쪽이 refresh token 이 있음을 이미 확인했다 — 타입이 그것을 요구한다. */\n private async refreshStoredToken(stored: StoredTokenSet & { refreshToken: string }): Promise<string | undefined> {\n const metadata = await discoverOAuthMetadata(this.options.endpoint, this.fetchImpl);\n const token = await exchangeToken(metadata.tokenEndpoint, {\n grant_type: \"refresh_token\",\n refresh_token: stored.refreshToken,\n client_id: stored.clientId ?? \"ainecto-cli\",\n ...(stored.clientSecret ? { client_secret: stored.clientSecret } : {}),\n resource: this.options.endpoint,\n }, this.fetchImpl);\n const next = toStoredToken(this.options.endpoint, token, metadata, stored);\n await this.options.tokenStore.save(this.options.endpoint, next);\n return next.accessToken;\n }\n}\n\nexport function generatePkcePair(): { codeVerifier: string; codeChallenge: string } {\n const codeVerifier = randomBytes(32).toString(\"base64url\");\n const codeChallenge = createHash(\"sha256\").update(codeVerifier).digest(\"base64url\");\n return { codeVerifier, codeChallenge };\n}\n\nexport function generateOAuthState(): string {\n return randomBytes(32).toString(\"base64url\");\n}\n\n/** 이미 만료됐는가. 만료 시각이 없으면 만료되지 않은 것으로 본다(서버가 수명을 안 알려 준 토큰). */\nexport function isExpired(token: Pick<StoredTokenSet, \"expiresAt\">, now = Date.now()): boolean {\n return token.expiresAt !== undefined && token.expiresAt <= now;\n}\n\nasync function withTimeout<T>(work: Promise<T>, timeoutMs: number): Promise<T> {\n let timer: NodeJS.Timeout | undefined;\n const timeout = new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n const minutes = timeoutMs / 60_000;\n const span = Number.isInteger(minutes) ? `${minutes} minute${minutes === 1 ? \"\" : \"s\"}` : `${timeoutMs} ms`;\n reject(new OAuthLoginError(\n \"LOGIN_TIMEOUT\",\n `Sign-in was not completed within ${span}. Nothing was saved — run the same command again.`,\n ));\n }, timeoutMs);\n });\n try {\n return await Promise.race([work, timeout]);\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport function shouldRefresh(token: Pick<StoredTokenSet, \"expiresAt\">, now = Date.now()): boolean {\n if (!token.expiresAt) {\n return false;\n }\n return token.expiresAt - now < 60_000;\n}\n\nexport async function discoverOAuthMetadata(endpoint: string, fetchImpl: typeof fetch = fetch): Promise<OAuthMetadata> {\n assertTrustedEndpointUrl(endpoint, \"MCP endpoint\");\n const resourceMetadataUrl = await discoverResourceMetadataUrl(endpoint, fetchImpl);\n assertTrustedEndpointUrl(resourceMetadataUrl, \"OAuth protected resource metadata URL\");\n const resourceMetadata = await fetchJson<Record<string, unknown>>(resourceMetadataUrl, fetchImpl);\n const authorizationServers = resourceMetadata.authorization_servers;\n if (!Array.isArray(authorizationServers) || typeof authorizationServers[0] !== \"string\") {\n throw new Error(\"OAuth protected resource metadata did not include authorization_servers.\");\n }\n const authServer = authorizationServers[0];\n assertTrustedEndpointUrl(authServer, \"OAuth authorization server\");\n const metadataUrl = authServer.includes(\"/.well-known/\")\n ? authServer\n : `${authServer.replace(/\\/$/, \"\")}/.well-known/oauth-authorization-server`;\n assertTrustedEndpointUrl(metadataUrl, \"OAuth authorization server metadata URL\");\n const metadata = await fetchJson<Record<string, unknown>>(metadataUrl, fetchImpl);\n if (typeof metadata.authorization_endpoint !== \"string\" || typeof metadata.token_endpoint !== \"string\") {\n throw new Error(\"OAuth authorization server metadata is missing authorization_endpoint or token_endpoint.\");\n }\n assertTrustedEndpointUrl(metadata.authorization_endpoint, \"OAuth authorization endpoint\");\n assertTrustedEndpointUrl(metadata.token_endpoint, \"OAuth token endpoint\");\n if (typeof metadata.registration_endpoint === \"string\") {\n assertTrustedEndpointUrl(metadata.registration_endpoint, \"OAuth client registration endpoint\");\n }\n if (typeof metadata.issuer === \"string\") {\n assertTrustedEndpointUrl(metadata.issuer, \"OAuth issuer\");\n }\n const codeChallengeMethodsSupported = parseStringArray(metadata.code_challenge_methods_supported);\n if (!codeChallengeMethodsSupported.includes(\"S256\")) {\n throw new Error(\"OAuth authorization server metadata must support PKCE S256.\");\n }\n return {\n authorizationEndpoint: metadata.authorization_endpoint,\n tokenEndpoint: metadata.token_endpoint,\n registrationEndpoint: typeof metadata.registration_endpoint === \"string\" ? metadata.registration_endpoint : undefined,\n issuer: typeof metadata.issuer === \"string\" ? metadata.issuer : undefined,\n codeChallengeMethodsSupported,\n };\n}\n\nasync function discoverResourceMetadataUrl(endpoint: string, fetchImpl: typeof fetch): Promise<string> {\n const challengeUrl = new URL(endpoint);\n assertTrustedEndpointUrl(challengeUrl, \"MCP endpoint\");\n const response = await fetchImpl(challengeUrl, { method: \"GET\" });\n const challenge = response.headers.get(\"www-authenticate\");\n const fromChallenge = challenge ? parseBearerChallengeParam(challenge, \"resource_metadata\") : undefined;\n if (fromChallenge) {\n assertTrustedEndpointUrl(fromChallenge, \"OAuth protected resource metadata URL\");\n return fromChallenge;\n }\n const origin = new URL(endpoint).origin;\n const fallback = `${origin}/.well-known/oauth-protected-resource`;\n assertTrustedEndpointUrl(fallback, \"OAuth protected resource metadata URL\");\n return fallback;\n}\n\nexport function parseBearerChallengeParam(header: string, name: string): string | undefined {\n const pattern = new RegExp(`${name}=\"([^\"]+)\"`);\n return pattern.exec(header)?.[1];\n}\n\nasync function exchangeToken(\n tokenEndpoint: string,\n params: Record<string, string>,\n fetchImpl: typeof fetch,\n): Promise<Record<string, unknown>> {\n assertTrustedEndpointUrl(tokenEndpoint, \"OAuth token endpoint\");\n const response = await fetchImpl(tokenEndpoint, {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams(params),\n });\n if (!response.ok) {\n throw new Error(`OAuth token exchange failed with HTTP ${response.status}.`);\n }\n return response.json() as Promise<Record<string, unknown>>;\n}\n\ntype TokenContext = Partial<Pick<StoredTokenSet, \"refreshToken\" | \"tokenType\" | \"expiresAt\" | \"scope\" | \"clientId\" | \"clientSecret\">>\n & Partial<ClientRegistrationResult>;\n\nfunction toStoredToken(\n endpoint: string,\n token: Record<string, unknown>,\n metadata: OAuthMetadata,\n previous?: TokenContext,\n): StoredTokenSet {\n if (typeof token.access_token !== \"string\") {\n throw new Error(\"OAuth token response did not include access_token.\");\n }\n const expiresIn = typeof token.expires_in === \"number\" ? token.expires_in : undefined;\n return {\n endpoint,\n accessToken: token.access_token,\n refreshToken: typeof token.refresh_token === \"string\" ? token.refresh_token : previous?.refreshToken,\n tokenType: typeof token.token_type === \"string\" ? token.token_type : previous?.tokenType,\n expiresAt: expiresIn ? Date.now() + expiresIn * 1000 : previous?.expiresAt,\n scope: typeof token.scope === \"string\" ? token.scope : previous?.scope,\n clientId: previous?.clientId ?? \"ainecto-cli\",\n clientSecret: previous?.clientSecret,\n authorizationServer: metadata.issuer,\n updatedAt: new Date().toISOString(),\n };\n}\n\n/**\n * 로그인 콜백을 받는 loopback 서버. {@code host} 는 시험이 «바인딩 실패»를 만들 때만 바꾼다.\n */\nexport async function createLoopbackReceiver(expectedState: string, host = \"127.0.0.1\"): Promise<{\n redirectUri: string;\n waitForCode(): Promise<string>;\n close(): Promise<void>;\n}> {\n let resolveCode!: (code: string) => void;\n let rejectCode!: (error: Error) => void;\n const codePromise = new Promise<string>((resolve, reject) => {\n resolveCode = resolve;\n rejectCode = reject;\n });\n codePromise.catch(() => undefined);\n\n const server = createServer((req, res) => {\n const url = new URL(req.url ?? \"/\", \"http://127.0.0.1\");\n const error = url.searchParams.get(\"error\");\n const code = url.searchParams.get(\"code\");\n const state = url.searchParams.get(\"state\");\n if (error) {\n res.writeHead(400, { \"content-type\": \"text/plain\" });\n res.end(\"AiNecto CLI authorization failed. You can close this tab.\");\n rejectCode(new Error(`OAuth authorization failed: ${error}`));\n return;\n }\n if (!state || state !== expectedState) {\n res.writeHead(400, { \"content-type\": \"text/plain\" });\n res.end(\"AiNecto CLI authorization state mismatch. You can close this tab.\");\n rejectCode(new Error(\"OAuth state mismatch.\"));\n return;\n }\n if (!code) {\n res.writeHead(400, { \"content-type\": \"text/plain\" });\n res.end(\"Missing OAuth code.\");\n rejectCode(new Error(\"OAuth redirect did not include a code.\"));\n return;\n }\n res.writeHead(200, { \"content-type\": \"text/plain\" });\n res.end(\"AiNecto CLI authorization complete. You can close this tab.\");\n resolveCode(code);\n });\n\n // ★바인딩이 막히면(에이전트 sandbox 등) 예전엔 error 리스너가 없어 처리되지 않은 예외로 죽었다\n // (2026-09-29 코드 리뷰 P1). 사람이 할 일을 말하는 오류로 바꾼다.\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", (error) => reject(new OAuthLoginError(\n \"CALLBACK_UNAVAILABLE\",\n `Could not start the local sign-in callback on ${host} (${error.message}). `\n + \"If this command runs in a sandbox, allow local network binding or run it outside the sandbox.\",\n )));\n server.listen(0, host, () => resolve());\n });\n const address = server.address();\n if (!address || typeof address === \"string\") {\n throw new Error(\"Loopback OAuth server did not bind to a TCP port.\");\n }\n return {\n redirectUri: `http://127.0.0.1:${address.port}/callback`,\n waitForCode: () => codePromise,\n close: () => new Promise<void>((resolve, reject) => {\n // Node 18 은 브라우저가 붙들고 있는 keep-alive 연결이 끝날 때까지 close 가 늦어진다.\n server.closeAllConnections?.();\n server.close((error) => error ? reject(error) : resolve());\n }),\n };\n}\n\nfunction parseStringArray(value: unknown): string[] {\n return Array.isArray(value) ? value.filter((item): item is string => typeof item === \"string\") : [];\n}\n\nasync function fetchJson<T>(url: string, fetchImpl: typeof fetch): Promise<T> {\n assertTrustedEndpointUrl(url, \"OAuth metadata URL\");\n const response = await fetchImpl(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch OAuth metadata from ${url}: HTTP ${response.status}.`);\n }\n return response.json() as Promise<T>;\n}\n\nexport function getBrowserOpenCommand(\n url: string,\n platform: NodeJS.Platform = process.platform,\n): { command: string; args: string[] } {\n assertTrustedEndpointUrl(url, \"OAuth authorization URL\");\n if (platform === \"darwin\") {\n return { command: \"open\", args: [url] };\n }\n if (platform === \"win32\") {\n return { command: \"explorer.exe\", args: [url] };\n }\n return { command: \"xdg-open\", args: [url] };\n}\n\nexport interface LaunchBrowserDeps {\n platform?: NodeJS.Platform;\n spawnImpl?: (command: string, args: string[], options: SpawnOptions) => ChildProcess;\n}\n\n/**\n * 기본 브라우저 열기. <b>여는 명령이 없거나(ENOENT) 0 이 아닌 코드로 끝나면 거절</b>한다.\n *\n * <p>★예전엔 {@code error} 리스너가 없어 명령이 없으면 처리되지 않은 오류로 죽었고, 명령은 있는데\n * 브라우저가 없으면({@code xdg-open} 비0 종료) 아무 말 없이 콜백을 영원히 기다렸다\n * (2026-09-29 독립 리뷰 P1-2).\n *\n * <p>⚠<b>Windows 는 종료 코드를 보지 않는다.</b> {@code explorer.exe} 는 성공해도 1 로 끝나는 것으로\n * 알려져 있어, 그 코드로 판정하면 정상 환경을 실패로 만든다 — 명령이 «떴다»는 것만 본다\n * (설계 §8-1, Windows 실측 V14 전까지 추정).\n */\nexport function launchBrowser(url: string, deps: LaunchBrowserDeps = {}): Promise<void> {\n const platform = deps.platform ?? process.platform;\n const { command, args } = getBrowserOpenCommand(url, platform);\n const spawnImpl = deps.spawnImpl ?? spawn;\n return new Promise<void>((resolve, reject) => {\n const unavailable = (reason: string) => new OAuthLoginError(\n \"BROWSER_UNAVAILABLE\",\n `Could not open a browser on this machine (${command}: ${reason}). Sign-in needs a browser here.`,\n );\n let child: ChildProcess;\n try {\n child = spawnImpl(command, args, { stdio: \"ignore\", detached: true });\n } catch (error) {\n reject(unavailable(error instanceof Error ? error.message : String(error)));\n return;\n }\n child.once(\"error\", (error) => reject(unavailable(error.message)));\n if (platform === \"win32\") {\n child.once(\"spawn\", () => resolve());\n } else {\n child.once(\"exit\", (code, signal) => {\n if (code === 0) {\n resolve();\n } else {\n reject(unavailable(code === null ? `stopped by ${signal ?? \"a signal\"}` : `exited with code ${code}`));\n }\n });\n }\n child.unref();\n });\n}\n\nfunction openBrowser(url: string): Promise<void> {\n return launchBrowser(url);\n}\n\nfunction assertEnvTokenEndpointAllowed(endpoint: string, envVars: NodeJS.ProcessEnv): void {\n if (envVars.AINECTO_ALLOW_CUSTOM_ENDPOINT_TOKEN === \"1\") {\n return;\n }\n if (isDefaultEndpoint(endpoint)) {\n return;\n }\n throw new Error(\"AINECTO_TOKEN can only be used with the default prod/dev endpoints. Set AINECTO_ALLOW_CUSTOM_ENDPOINT_TOKEN=1 only when you intentionally trust the custom endpoint.\");\n}\n","export type AinectoEnv = \"prod\" | \"dev\";\n\nexport interface EndpointResolutionInput {\n env?: AinectoEnv;\n endpoint?: string;\n envVars?: NodeJS.ProcessEnv;\n}\n\nexport interface ResolvedEndpoint {\n env: AinectoEnv;\n endpoint: string;\n source: \"flag\" | \"env\" | \"default\";\n}\n\n/**\n * 기본 MCP 엔드포인트.\n *\n * OAuth 메타데이터(issuer·resource·authorization_servers)도 ainecto.com 이다.\n */\nconst DEFAULT_ENDPOINTS: Record<AinectoEnv, string> = {\n prod: \"https://ainecto.com/mcp\",\n dev: \"https://dev.ainecto.com/mcp\",\n};\n\nexport function resolveEndpoint(input: EndpointResolutionInput = {}): ResolvedEndpoint {\n const envVars = input.envVars ?? process.env;\n const env = input.env ?? \"prod\";\n\n if (input.endpoint) {\n return { env, endpoint: normalizeEndpoint(input.endpoint), source: \"flag\" };\n }\n\n if (envVars.AINECTO_MCP_ENDPOINT) {\n return { env, endpoint: normalizeEndpoint(envVars.AINECTO_MCP_ENDPOINT), source: \"env\" };\n }\n\n return { env, endpoint: DEFAULT_ENDPOINTS[env], source: \"default\" };\n}\n\nexport function normalizeEndpoint(endpoint: string): string {\n const url = new URL(endpoint);\n assertTrustedEndpointUrl(url, \"MCP endpoint\");\n url.hash = \"\";\n return url.toString().replace(/\\/$/, \"\");\n}\n\n/**\n * ★<b>이 env 의 기본 주소와 «정확히» 같은가.</b>\n *\n * <p>{@link isDefaultEndpoint} 는 prod·dev 를 둘 다 «기본»으로 보는 넓은 판정이라,\n * 「env=prod 인데 endpoint 만 dev」 같은 입력을 기본으로 착각한다. 그 판정으로 설정에서\n * {@code --endpoint} 를 빼면, 조회한 주소와 세션이 붙는 주소가 갈라진다\n * (2026-09-23 독립 재리뷰 I7).\n */\nexport function isDefaultEndpointFor(env: AinectoEnv, endpoint: string): boolean {\n return normalizeEndpoint(endpoint) === DEFAULT_ENDPOINTS[env];\n}\n\nexport function isDefaultEndpoint(endpoint: string): boolean {\n const normalized = normalizeEndpoint(endpoint);\n return Object.values(DEFAULT_ENDPOINTS).includes(normalized);\n}\n\nexport function assertTrustedEndpointUrl(value: string | URL, label = \"URL\"): void {\n const url = typeof value === \"string\" ? new URL(value) : value;\n if (url.protocol === \"https:\") {\n return;\n }\n if (url.protocol === \"http:\" && isLoopbackHostname(url.hostname)) {\n return;\n }\n throw new Error(`${label} must use https, except http is allowed for localhost loopback endpoints.`);\n}\n\nexport function assertLoopbackRedirectUrl(value: string): void {\n const url = new URL(value);\n if (url.protocol === \"http:\" && isLoopbackHostname(url.hostname)) {\n return;\n }\n throw new Error(\"OAuth redirect URI must be an http localhost loopback URL.\");\n}\n\nfunction isLoopbackHostname(hostname: string): boolean {\n return hostname === \"localhost\"\n || hostname === \"127.0.0.1\"\n || hostname === \"::1\"\n || hostname === \"[::1]\";\n}\n\nexport function assertEnv(value: string | undefined): AinectoEnv | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (value === \"prod\" || value === \"dev\") {\n return value;\n }\n throw new Error(`Invalid --env value \"${value}\". Expected \"prod\" or \"dev\".`);\n}\n","import { assertLoopbackRedirectUrl, assertTrustedEndpointUrl } from \"../config/endpoints\";\n\nexport interface ClientRegistrationResult {\n clientId: string;\n clientSecret?: string;\n}\n\nexport async function registerPublicClient(\n registrationEndpoint: string,\n redirectUri: string,\n fetchImpl: typeof fetch = fetch,\n): Promise<ClientRegistrationResult> {\n assertTrustedEndpointUrl(registrationEndpoint, \"OAuth client registration endpoint\");\n assertLoopbackRedirectUrl(redirectUri);\n const response = await fetchImpl(registrationEndpoint, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", accept: \"application/json\" },\n body: JSON.stringify({\n client_name: \"AiNecto CLI\",\n redirect_uris: [redirectUri],\n token_endpoint_auth_method: \"none\",\n grant_types: [\"authorization_code\", \"refresh_token\"],\n response_types: [\"code\"],\n }),\n });\n if (!response.ok) {\n throw new Error(`OAuth client registration failed with HTTP ${response.status}.`);\n }\n const body = await response.json() as unknown;\n if (!isRecord(body) || typeof body.client_id !== \"string\") {\n throw new Error(\"OAuth client registration response did not include client_id.\");\n }\n return {\n clientId: body.client_id,\n clientSecret: typeof body.client_secret === \"string\" ? body.client_secret : undefined,\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { readFile } from \"node:fs/promises\";\n\nexport interface PayloadSourceInput {\n file?: string;\n inline?: string;\n stdin?: NodeJS.ReadStream;\n stdinText?: string;\n stdinIsTTY?: boolean;\n}\n\nexport interface ParsedPayload {\n value: unknown;\n source: \"file\" | \"stdin\" | \"inline\" | \"empty\";\n warnings: string[];\n}\n\nexport async function parsePayloadSource(input: PayloadSourceInput): Promise<ParsedPayload> {\n const warnings: string[] = [];\n const stdinIsTTY = input.stdinIsTTY ?? input.stdin?.isTTY ?? true;\n const hasInline = input.inline !== undefined && input.inline !== \"\";\n const hasStdin = input.stdinText !== undefined || !stdinIsTTY;\n\n if (input.file) {\n if (hasInline || hasStdin) {\n warnings.push(\"Multiple payload sources were provided; --file takes precedence.\");\n }\n const text = await readFileOrStdin(input.file, input);\n return { value: parseJson(text), source: input.file === \"-\" || input.file === \"@-\" ? \"stdin\" : \"file\", warnings };\n }\n\n if (hasStdin) {\n if (hasInline) {\n warnings.push(\"Multiple payload sources were provided; stdin takes precedence.\");\n }\n const text = input.stdinText ?? await readAllStdin(input.stdin);\n if (!text.trim()) {\n return { value: {}, source: \"empty\", warnings };\n }\n return { value: parseJson(text), source: \"stdin\", warnings };\n }\n\n if (hasInline) {\n const inline = input.inline === \"@-\" ? await readAllStdin(input.stdin) : input.inline;\n return { value: parseJson(inline), source: \"inline\", warnings };\n }\n\n return { value: {}, source: \"empty\", warnings };\n}\n\nfunction parseJson(text: string | undefined): unknown {\n if (text === undefined || !text.trim()) {\n return {};\n }\n try {\n return JSON.parse(text);\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error);\n throw new Error(`Invalid JSON payload: ${detail}`);\n }\n}\n\nasync function readFileOrStdin(file: string, input: PayloadSourceInput): Promise<string> {\n if (file === \"-\" || file === \"@-\") {\n return input.stdinText ?? await readAllStdin(input.stdin);\n }\n return readFile(file, \"utf8\");\n}\n\nasync function readAllStdin(stdin: NodeJS.ReadStream | undefined): Promise<string> {\n if (!stdin) {\n return \"\";\n }\n stdin.setEncoding(\"utf8\");\n let text = \"\";\n for await (const chunk of stdin) {\n text += chunk;\n }\n return text;\n}\n","/**\n * CLI 버전. ★진실원은 {@code package.json} 이고 빌드(tsup define)가 그 값을 박는다 —\n * 상수로 또 적으면 릴리스 때 한쪽만 올라가 조용히 거짓이 된다.\n * 번들을 거치지 않는 실행(vitest·tsx)에서는 값이 없으므로 \"dev\" 로 떨어진다.\n */\ndeclare const __AINECTO_CLI_VERSION__: string | undefined;\n\nexport const CLI_VERSION: string =\n typeof __AINECTO_CLI_VERSION__ === \"string\" ? __AINECTO_CLI_VERSION__ : \"dev\";\n\n/**\n * npm 주 이름. ★이 이름을 박는 곳은 여기 하나다 — init 이 쓰는 {@code npx -y <이름> --role …},\n * MCP {@code clientInfo}, User-Agent, init 기록의 {@code generatedBy} 가 모두 이것을 쓴다.\n * {@code package.json} 의 name·{@code server.json} 의 패키지 식별자와 같아야 한다(시험이 대조한다).\n *\n * <p>다른 이름 {@code ainecto}·{@code @ainecto/cli} 에도 같은 코드가 올라가지만(scripts/publish.mjs),\n * 그 판으로 init 해도 이 이름을 쓴다.\n */\nexport const PACKAGE_NAME = \"@ainecto/mcp\";\n\nexport const CLI_USER_AGENT = `${PACKAGE_NAME} ${CLI_VERSION}`;\n","import type { TokenProvider } from \"../auth/oauth\";\nimport { ROLE_HEADER, type HarnessRole } from \"../harness/role\";\nimport { CLI_VERSION, PACKAGE_NAME } from \"../version\";\n\nexport interface JsonRpcRequest {\n jsonrpc: \"2.0\";\n id?: string | number | null;\n method: string;\n params?: unknown;\n}\n\nexport interface JsonRpcSuccess {\n jsonrpc: \"2.0\";\n id?: string | number | null;\n result: unknown;\n}\n\nexport interface JsonRpcFailure {\n jsonrpc: \"2.0\";\n id?: string | number | null;\n error: {\n code: number;\n message: string;\n data?: unknown;\n };\n}\n\nexport type JsonRpcResponse = JsonRpcSuccess | JsonRpcFailure;\n\nexport interface McpRpcClientOptions {\n endpoint: string;\n tokenProvider?: TokenProvider;\n fetchImpl?: typeof fetch;\n envVars?: NodeJS.ProcessEnv;\n /**\n * 세션 역할. ★필수다 — 역할이 없으면 {@code null} 을 «명시»한다(설계 0.4.2 §2-3, 리뷰 P2).\n * 저장소 안에서 이것을 빠뜨리면 요청이 조용히 «제한 없음»으로 간다. 그 빠뜨림을 타입이 잡는다.\n * 값이 있으면 모든 요청의 {@code X-AiNecto-Role} 헤더로 실린다 — 강제는 서버가 한다.\n */\n role: HarnessRole | null;\n}\n\nexport class McpRpcError extends Error {\n constructor(\n message: string,\n readonly code: string,\n readonly details?: unknown,\n ) {\n super(message);\n }\n}\n\nexport class McpRpcClient {\n private readonly fetchImpl: typeof fetch;\n private nextId = 1;\n\n constructor(private readonly options: McpRpcClientOptions) {\n this.fetchImpl = options.fetchImpl ?? fetch;\n }\n\n initialize(): Promise<unknown> {\n return this.request(\"initialize\", {\n protocolVersion: \"2024-11-05\",\n capabilities: {},\n clientInfo: { name: PACKAGE_NAME, version: CLI_VERSION },\n });\n }\n\n async toolsList(): Promise<unknown[]> {\n const result = await this.request(\"tools/list\", {});\n if (!isRecord(result) || !Array.isArray(result.tools)) {\n throw new McpRpcError(\"tools/list response did not include a tools array.\", \"MCP_PROTOCOL_ERROR\", result);\n }\n return result.tools;\n }\n\n async toolsCall(name: string, args: unknown): Promise<unknown> {\n return this.request(\"tools/call\", { name, arguments: args ?? {} });\n }\n\n async request(method: string, params?: unknown): Promise<unknown> {\n const response = await this.sendRaw({\n jsonrpc: \"2.0\",\n id: this.nextId++,\n method,\n params,\n });\n if (!response) {\n return undefined;\n }\n if (\"error\" in response) {\n throw new McpRpcError(response.error.message, \"MCP_ERROR\", response.error);\n }\n return response.result;\n }\n\n async sendRaw(request: JsonRpcRequest): Promise<JsonRpcResponse | undefined> {\n const token = await this.options.tokenProvider?.getAccessToken();\n let response = await this.postJson(request, token);\n if (response.status === 401 && this.options.tokenProvider) {\n const refreshed = await this.options.tokenProvider.refreshAfterUnauthorized();\n if (refreshed) {\n response = await this.postJson(request, refreshed);\n }\n }\n\n if (response.status === 204 || response.status === 202) {\n return undefined;\n }\n const text = await response.text();\n if (!response.ok) {\n throw new McpRpcError(\n `MCP HTTP request failed with HTTP ${response.status}.`,\n \"MCP_HTTP_ERROR\",\n httpErrorDetails(response.status, text, this.options.envVars ?? process.env),\n );\n }\n if (!text.trim()) {\n return undefined;\n }\n const parsed = JSON.parse(text) as unknown;\n if (!isJsonRpcResponse(parsed)) {\n throw new McpRpcError(\"MCP response was not a JSON-RPC response.\", \"MCP_PROTOCOL_ERROR\", parsed);\n }\n return parsed;\n }\n\n private postJson(request: JsonRpcRequest, token: string | undefined): Promise<Response> {\n const headers: Record<string, string> = {\n \"content-type\": \"application/json\",\n accept: \"application/json\",\n };\n if (token) {\n headers.authorization = `Bearer ${token}`;\n }\n if (this.options.role) {\n headers[ROLE_HEADER.toLowerCase()] = this.options.role;\n }\n return this.fetchImpl(this.options.endpoint, {\n method: \"POST\",\n headers,\n body: JSON.stringify(request),\n });\n }\n}\n\n/**\n * ★MCP 는 «도구가 거부/실패했다»를 JSON-RPC error 가 아니라 결과 안의 {@code isError} 로\n * 알린다(2025-06-18 규격). 그래서 최상위 error 만 보면 실패가 성공으로 보고된다 —\n * 셸 자동화는 exit 0 을 받고 다음 단계로 간다(2026-09-22 독립 리뷰 I9).\n */\nexport function isToolError(result: unknown): boolean {\n return isRecord(result) && result.isError === true;\n}\n\nfunction isJsonRpcResponse(value: unknown): value is JsonRpcResponse {\n return isRecord(value)\n && value.jsonrpc === \"2.0\"\n && (\"result\" in value || \"error\" in value);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction httpErrorDetails(status: number, body: string, envVars: NodeJS.ProcessEnv): Record<string, unknown> {\n const details: Record<string, unknown> = { status };\n if (envVars.AINECTO_CLI_DEBUG === \"1\" || envVars.AINECTO_DEBUG === \"1\") {\n details.body = safeBodyPreview(body);\n }\n return details;\n}\n\nexport function safeBodyPreview(body: string): string {\n return body.length > 500 ? `${body.slice(0, 500)}...` : body;\n}\n","export interface CliErrorShape {\n ok: false;\n error: {\n code: string;\n message: string;\n details?: unknown;\n };\n}\n\nexport interface CliSuccessShape {\n ok: true;\n data: unknown;\n warnings?: string[];\n}\n\nexport function renderSuccess(data: unknown, options: { json?: boolean; warnings?: string[] } = {}): string {\n if (options.json) {\n const shape: CliSuccessShape = { ok: true, data };\n if (options.warnings?.length) {\n shape.warnings = options.warnings;\n }\n return `${JSON.stringify(shape, null, 2)}\\n`;\n }\n const warnings = options.warnings?.length ? `${options.warnings.map((warning) => `Warning: ${warning}`).join(\"\\n\")}\\n` : \"\";\n return `${warnings}${renderHuman(data)}\\n`;\n}\n\nexport function renderError(error: unknown, options: { json?: boolean } = {}): string {\n const shape = toErrorShape(error);\n if (options.json) {\n return `${JSON.stringify(shape, null, 2)}\\n`;\n }\n return `Error: ${shape.error.message}\\n`;\n}\n\nexport function toErrorShape(error: unknown): CliErrorShape {\n if (error instanceof Error) {\n const maybe = error as Error & { code?: string; details?: unknown };\n return {\n ok: false,\n error: {\n code: maybe.code ?? \"CLI_ERROR\",\n message: error.message,\n details: redactSecrets(maybe.details),\n },\n };\n }\n return { ok: false, error: { code: \"CLI_ERROR\", message: String(error) } };\n}\n\nexport function redactSecrets(value: unknown): unknown {\n return redactSecretsInner(value, new WeakSet<object>());\n}\n\nfunction renderHuman(data: unknown): string {\n if (Array.isArray(data)) {\n return data.map((item) => renderHuman(item)).join(\"\\n\");\n }\n if (typeof data === \"string\") {\n return data;\n }\n return JSON.stringify(data, null, 2);\n}\n\nfunction redactSecretsInner(value: unknown, seen: WeakSet<object>): unknown {\n if (typeof value === \"string\") {\n return redactSecretString(value);\n }\n if (Array.isArray(value)) {\n return value.map((item) => redactSecretsInner(item, seen));\n }\n if (value && typeof value === \"object\") {\n if (seen.has(value)) {\n return \"[circular]\";\n }\n seen.add(value);\n const output: Record<string, unknown> = {};\n for (const [key, child] of Object.entries(value)) {\n output[key] = isSecretKey(key) ? \"[redacted]\" : redactSecretsInner(child, seen);\n }\n return output;\n }\n return value;\n}\n\nfunction isSecretKey(key: string): boolean {\n const normalized = key.toLowerCase().replace(/-/g, \"_\");\n return normalized === \"authorization\"\n || normalized.includes(\"access_token\")\n || normalized.includes(\"refresh_token\")\n || normalized.includes(\"client_secret\")\n || normalized.includes(\"token\");\n}\n\nfunction redactSecretString(value: string): string {\n return value\n .replace(/(\"(?:authorization|access_token|refresh_token|client_secret|token)\"\\s*:\\s*\")([^\"]*)(\")/gi, \"$1[redacted]$3\")\n .replace(/((?:authorization|access_token|refresh_token|client_secret|token)=)([^&\\s\"']+)/gi, \"$1[redacted]\")\n .replace(/(authorization:\\s*bearer\\s+)([^\\s,}]+)/gi, \"$1[redacted]\")\n .replace(/(bearer\\s+)(eyJ[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+)/gi, \"$1[redacted]\");\n}\n","import type { GeneratedToolDefinition } from \"./types\";\n\nexport const generatedTools = [\n {\"mcpName\":\"create_comments\",\"commandPath\":[\"comments\",\"create\"],\"group\":\"generic\",\"description\":\"Add comments, questions, or replies to a document. Anyone who can read the document may comment and reply. Set parentCommentId to reply to a top-level comment. To mention people, get their userId and displayName from list_mention_candidates, write @<displayName> in the body, and list their userIds in mentionUserIds (clientMutationId is then required). Items are applied in order and each one commits on its own; results report each item (ok, or status and error).\",\"inputSchema\":{\"additionalProperties\":false,\"properties\":{\"documentUuid\":{\"description\":\"Document UUID the comments belong to\",\"type\":\"string\"},\"items\":{\"description\":\"Comments to add, applied in order\",\"items\":{\"additionalProperties\":false,\"properties\":{\"body\":{\"description\":\"Comment text (plain text, 1..10000 characters). To mention someone, include @<displayName> exactly as returned by mcp__ainecto__list_mention_candidates.\",\"maxLength\":10000,\"minLength\":1,\"type\":\"string\"},\"clientMutationId\":{\"description\":\"Idempotency key (visible ASCII, at most 128 characters). Required when mentionUserIds is not empty; reuse the same value when retrying the same item so the mention email is not sent twice.\",\"maxLength\":128,\"type\":\"string\"},\"kind\":{\"description\":\"Top-level comments only: COMMENT (default) or QUESTION. A QUESTION can later be resolved with mcp__ainecto__resolve_comments.\",\"enum\":[\"COMMENT\",\"QUESTION\"],\"type\":\"string\"},\"mentionUserIds\":{\"description\":\"userIds to mention (from mcp__ainecto__list_mention_candidates). Each one's @<displayName> must appear in body; newly mentioned people get a notification email.\",\"items\":{\"type\":\"string\"},\"maxItems\":20,\"type\":\"array\",\"uniqueItems\":true},\"parentCommentId\":{\"description\":\"Reply to this top-level comment id (from mcp__ainecto__list_comments). Replies are one level deep: replying to a reply is rejected.\",\"minimum\":1,\"type\":\"integer\"}},\"required\":[\"body\"],\"type\":\"object\"},\"minItems\":1,\"type\":\"array\"},\"mailLanguage\":{\"description\":\"Language of the mention notification email. Defaults to en.\",\"enum\":[\"en\",\"ko\"],\"type\":\"string\"}},\"required\":[\"documentUuid\",\"items\"],\"type\":\"object\"},\"required\":[\"documentUuid\",\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"a673b909d16835ef\"},\n {\"mcpName\":\"create_documents\",\"commandPath\":[\"documents\",\"create\"],\"group\":\"document\",\"description\":\"Create documents. If a document body is tens of KB or more, prefer request_upload_token (purpose=document.create) and upload the body with curl.\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Documents\",\"items\":{\"properties\":{\"body\":{\"description\":\"Deprecated compatibility alias for typePayload.body when document type is markdown. 본문이 수십 KB 이상으로 크면 LLM 토큰 절약을 위해 `request_upload_token (purpose=document.create)` 를 호출해 uploadUrl 을 받고 curl 로 직접 PUT 으로 보낼 것.\",\"type\":\"string\"},\"folderUuid\":{\"description\":\"Optional folder UUID\",\"type\":\"string\"},\"projectUuid\":{\"description\":\"Project UUID\",\"type\":\"string\"},\"title\":{\"description\":\"Document title\",\"type\":\"string\"},\"type\":{\"description\":\"Document type. Creatable values: erd, markdown, diagram, openapi, html, file.\",\"enum\":[\"erd\",\"markdown\",\"diagram\",\"openapi\",\"html\",\"file\"],\"type\":\"string\"},\"typePayload\":{\"description\":\"Type-specific payload for enabled document types. markdown: {body}; diagram: {diagramSource,sourceLanguage,edgeStyle,isModule,metadata}; openapi: {content}; html: {content} (a full HTML page); file: no JSON payload — bytes go through request_upload_token(purpose=document.create, scopeJson={projectUuid,folderUuid?,type:\\\"file\\\",title,filename}) then one curl PUT (images·PDF·mp4/webm·audio·text/code·CSV only).\",\"type\":\"object\"}},\"required\":[\"projectUuid\",\"type\",\"title\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"aa868b0e2821006a\"},\n {\"mcpName\":\"create_folders\",\"commandPath\":[\"folders\",\"create\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Folders\",\"items\":{\"properties\":{\"name\":{\"description\":\"Folder name\",\"type\":\"string\"},\"parentFolderUuid\":{\"description\":\"Parent folder UUID\",\"type\":\"string\"},\"projectUuid\":{\"description\":\"Project UUID\",\"type\":\"string\"}},\"required\":[\"projectUuid\",\"name\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"30f45b887259609f\"},\n {\"mcpName\":\"create_projects\",\"commandPath\":[\"projects\",\"create\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Projects\",\"items\":{\"properties\":{\"description\":{\"description\":\"Description\",\"type\":\"string\"},\"name\":{\"description\":\"Project name\",\"type\":\"string\"},\"projectKey\":{\"description\":\"Unique project key\",\"type\":\"string\"},\"workspaceUuid\":{\"description\":\"Workspace UUID — null uses user's default workspace\",\"type\":\"string\"}},\"required\":[\"name\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"edf5cf688d7c039a\"},\n {\"mcpName\":\"create_workspaces\",\"commandPath\":[\"workspaces\",\"create\"],\"group\":\"workspace\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Workspaces\",\"items\":{\"properties\":{\"description\":{\"description\":\"Description\",\"type\":\"string\"},\"name\":{\"description\":\"Workspace name\",\"type\":\"string\"}},\"required\":[\"name\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"d9d1b0d561828b8e\"},\n {\"mcpName\":\"delete_attachments\",\"commandPath\":[\"attachments\",\"delete\"],\"group\":\"attachment\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuids\":{\"description\":\"Attachment UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"uuids\"],\"type\":\"object\"},\"required\":[\"uuids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"prod\",\"schemaHash\":\"b22c24bffdfe3d7d\"},\n {\"mcpName\":\"delete_comments\",\"commandPath\":[\"comments\",\"delete\"],\"group\":\"generic\",\"description\":\"Delete your own comments on a document. Only the author can delete. A resolved question and a top-level comment that still has replies cannot be deleted. Each id is applied on its own; results report each id.\",\"inputSchema\":{\"additionalProperties\":false,\"properties\":{\"documentUuid\":{\"description\":\"Document UUID the comments belong to\",\"type\":\"string\"},\"ids\":{\"description\":\"Comment ids to delete (from mcp__ainecto__list_comments)\",\"items\":{\"minimum\":1,\"type\":\"integer\"},\"minItems\":1,\"type\":\"array\"}},\"required\":[\"documentUuid\",\"ids\"],\"type\":\"object\"},\"required\":[\"documentUuid\",\"ids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"prod\",\"schemaHash\":\"17b9658b5a47f866\"},\n {\"mcpName\":\"delete_documents\",\"commandPath\":[\"documents\",\"delete\"],\"group\":\"document\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuids\":{\"description\":\"Document UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"uuids\"],\"type\":\"object\"},\"required\":[\"uuids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"prod\",\"schemaHash\":\"3a725ae70956c270\"},\n {\"mcpName\":\"delete_folders\",\"commandPath\":[\"folders\",\"delete\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuids\":{\"description\":\"Folder UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"uuids\"],\"type\":\"object\"},\"required\":[\"uuids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"prod\",\"schemaHash\":\"2254cde89c9e8f06\"},\n {\"mcpName\":\"delete_projects\",\"commandPath\":[\"projects\",\"delete\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuids\":{\"description\":\"Project UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"uuids\"],\"type\":\"object\"},\"required\":[\"uuids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"prod\",\"schemaHash\":\"6521c33a28cb5465\"},\n {\"mcpName\":\"delete_workspaces\",\"commandPath\":[\"workspaces\",\"delete\"],\"group\":\"workspace\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuids\":{\"description\":\"Workspace UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"uuids\"],\"type\":\"object\"},\"required\":[\"uuids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"prod\",\"schemaHash\":\"3177868221137066\"},\n {\"mcpName\":\"diagram_apply_changes\",\"commandPath\":[\"tools\",\"run\",\"diagram-apply-changes\"],\"group\":\"generic\",\"description\":\"Required single-call mutation path for diagram node/edge/group create/update/delete changes. Put nodes, edges, and groups in one request and call this once. Do not look for type-specific diagram CUD tools; this tool is the only diagram CUD entry point.\",\"inputSchema\":{\"properties\":{\"description\":{\"description\":\"Reason for batch (audit)\",\"type\":\"string\"},\"diagramUuid\":{\"description\":\"Diagram UUID\",\"type\":\"string\"},\"edges\":{\"description\":\"Edge operations\",\"items\":{\"properties\":{\"action\":{\"description\":\"Operation kind\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"bridgeType\":{\"description\":\"Omit (null) for a plain node-to-node edge. Set only when a group is an endpoint: GROUP_TO_GROUP|NODE_TO_GROUP|GROUP_TO_NODE\",\"enum\":[\"GROUP_TO_GROUP\",\"NODE_TO_GROUP\",\"GROUP_TO_NODE\"],\"type\":\"string\"},\"fromUuid\":{\"description\":\"Source\",\"type\":\"string\"},\"label\":{\"description\":\"Edge label\",\"type\":\"string\"},\"lineStyle\":{\"description\":\"Line style\",\"type\":\"string\"},\"strokeColor\":{\"description\":\"Stroke color\",\"type\":\"string\"},\"strokeWidth\":{\"description\":\"Stroke width\",\"type\":\"integer\"},\"toUuid\":{\"description\":\"Target\",\"type\":\"string\"},\"uuid\":{\"description\":\"Required for update/delete\",\"type\":\"string\"}},\"required\":[\"action\"],\"type\":\"object\"},\"type\":\"array\"},\"groups\":{\"description\":\"Group operations\",\"items\":{\"properties\":{\"action\":{\"description\":\"Operation kind\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"collapsed\":{\"description\":\"Collapsed state\",\"type\":\"boolean\"},\"color\":{\"description\":\"Group color\",\"type\":\"string\"},\"height\":{\"description\":\"Explicit height; omit to keep it derived from member nodes\",\"type\":\"number\"},\"linkMode\":{\"description\":\"Link mode\",\"type\":\"string\"},\"linkedDiagramUuid\":{\"description\":\"Linked diagram UUID\",\"type\":\"string\"},\"name\":{\"description\":\"Group name\",\"type\":\"string\"},\"parentGroupUuid\":{\"description\":\"Parent group UUID\",\"type\":\"string\"},\"sortOrder\":{\"description\":\"Sort order\",\"type\":\"integer\"},\"uuid\":{\"description\":\"Required for update/delete\",\"type\":\"string\"},\"width\":{\"description\":\"Explicit width; omit to keep it derived from member nodes\",\"type\":\"number\"}},\"required\":[\"action\"],\"type\":\"object\"},\"type\":\"array\"},\"nodes\":{\"description\":\"Node operations\",\"items\":{\"properties\":{\"action\":{\"description\":\"Operation kind\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"fillColor\":{\"description\":\"Fill color\",\"type\":\"string\"},\"groupUuid\":{\"description\":\"Group UUID; empty string clears membership\",\"type\":\"string\"},\"height\":{\"description\":\"Height\",\"type\":\"number\"},\"shape\":{\"description\":\"Node shape (start/end/diamond/cylinder/parallelogram/stadium/hexagon/rect/roundRect/...)\",\"enum\":[\"rect\",\"roundRect\",\"stadium\",\"diamond\",\"decision\",\"circle\",\"start\",\"doubleCircle\",\"end\",\"hexagon\",\"cylinder\",\"parallelogram\"],\"type\":\"string\"},\"strokeColor\":{\"description\":\"Stroke color\",\"type\":\"string\"},\"text\":{\"description\":\"Node text/label. Supports newlines (\\\\n) for multi-line display.\",\"maxLength\":4000,\"type\":\"string\"},\"textColor\":{\"description\":\"Text color\",\"type\":\"string\"},\"type\":{\"description\":\"Node type\",\"type\":\"string\"},\"uuid\":{\"description\":\"Required for update/delete; optional for create\",\"type\":\"string\"},\"width\":{\"description\":\"Width\",\"type\":\"number\"},\"x\":{\"description\":\"X\",\"type\":\"number\"},\"y\":{\"description\":\"Y\",\"type\":\"number\"}},\"required\":[\"action\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"diagramUuid\",\"description\"],\"type\":\"object\"},\"required\":[\"description\",\"diagramUuid\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"2c829103f86f4168\"},\n {\"mcpName\":\"diagram_get_edge\",\"commandPath\":[\"tools\",\"run\",\"diagram-get-edge\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"edgeUuid\":{\"description\":\"Edge UUID\",\"type\":\"string\"}},\"required\":[\"edgeUuid\"],\"type\":\"object\"},\"required\":[\"edgeUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"2c03c4f7daa69898\"},\n {\"mcpName\":\"diagram_get_group\",\"commandPath\":[\"tools\",\"run\",\"diagram-get-group\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"groupUuid\":{\"description\":\"Group UUID\",\"type\":\"string\"}},\"required\":[\"groupUuid\"],\"type\":\"object\"},\"required\":[\"groupUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"55c5aa27b8cf489d\"},\n {\"mcpName\":\"diagram_get_node\",\"commandPath\":[\"tools\",\"run\",\"diagram-get-node\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"nodeUuid\":{\"description\":\"Node UUID\",\"type\":\"string\"}},\"required\":[\"nodeUuid\"],\"type\":\"object\"},\"required\":[\"nodeUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"646d553238328a9e\"},\n {\"mcpName\":\"diagram_get_pending_llm_requests\",\"commandPath\":[\"tools\",\"run\",\"diagram-get-pending-llm-requests\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{},\"type\":\"object\"},\"required\":[],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"2143d616cf7822bf\"},\n {\"mcpName\":\"diagram_list_edges\",\"commandPath\":[\"tools\",\"run\",\"diagram-list-edges\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"diagramUuid\":{\"description\":\"Diagram document UUID\",\"type\":\"string\"}},\"required\":[\"diagramUuid\"],\"type\":\"object\"},\"required\":[\"diagramUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"4645085bde616381\"},\n {\"mcpName\":\"diagram_list_groups\",\"commandPath\":[\"tools\",\"run\",\"diagram-list-groups\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"diagramUuid\":{\"description\":\"Diagram document UUID\",\"type\":\"string\"}},\"required\":[\"diagramUuid\"],\"type\":\"object\"},\"required\":[\"diagramUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"8a7ca45dd34d1aef\"},\n {\"mcpName\":\"diagram_list_nodes\",\"commandPath\":[\"tools\",\"run\",\"diagram-list-nodes\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"diagramUuid\":{\"description\":\"Diagram document UUID\",\"type\":\"string\"}},\"required\":[\"diagramUuid\"],\"type\":\"object\"},\"required\":[\"diagramUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"d444066b5ca6eeb4\"},\n {\"mcpName\":\"diagram_submit_llm_result\",\"commandPath\":[\"tools\",\"run\",\"diagram-submit-llm-result\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"cachedInputTokens\":{\"description\":\"Cached subset of provider total input tokens\",\"type\":\"integer\"},\"creditsCharged\":{\"description\":\"Deprecated; ignored. Credits are calculated server-side from tokens.\",\"type\":\"integer\"},\"inputTokens\":{\"description\":\"Provider total input tokens; Java persists uncached input after one normalization\",\"type\":\"integer\"},\"outputTokens\":{\"description\":\"Output token count\",\"type\":\"integer\"},\"result\":{\"description\":\"LLM result text\",\"type\":\"string\"},\"uuid\":{\"description\":\"LLM request UUID\",\"type\":\"string\"}},\"required\":[\"uuid\",\"result\"],\"type\":\"object\"},\"required\":[\"result\",\"uuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"870ace32642a770a\"},\n {\"mcpName\":\"diagram_update_llm_request_status\",\"commandPath\":[\"tools\",\"run\",\"diagram-update-llm-request-status\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"errorMessage\":{\"description\":\"Error message (when status=FAILED)\",\"type\":\"string\"},\"status\":{\"description\":\"Target status — currently only FAILED is mutable from caller side\",\"enum\":[\"FAILED\"],\"type\":\"string\"},\"uuid\":{\"description\":\"LLM request UUID\",\"type\":\"string\"}},\"required\":[\"uuid\",\"status\"],\"type\":\"object\"},\"required\":[\"status\",\"uuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"9ad96e3dc5fd2a8f\"},\n {\"mcpName\":\"disable_shares\",\"commandPath\":[\"tools\",\"run\",\"disable-shares\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"targetType\":{\"description\":\"Share target type\",\"enum\":[\"project\",\"folder\",\"document\"],\"type\":\"string\"},\"targetUuids\":{\"description\":\"Target UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"targetType\",\"targetUuids\"],\"type\":\"object\"},\"required\":[\"targetType\",\"targetUuids\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"bd1b310200b78420\"},\n {\"mcpName\":\"enable_shares\",\"commandPath\":[\"tools\",\"run\",\"enable-shares\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"targetType\":{\"description\":\"Share target type. A document gets a shareUrl anyone can open; a project gets a public API path only (there is no public project page); a folder token is stored but nothing public reads it yet.\",\"enum\":[\"project\",\"folder\",\"document\"],\"type\":\"string\"},\"targetUuids\":{\"description\":\"Target UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"targetType\",\"targetUuids\"],\"type\":\"object\"},\"required\":[\"targetType\",\"targetUuids\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"18559d7c0af09d2c\"},\n {\"mcpName\":\"erd_apply_changes\",\"commandPath\":[\"erd\",\"apply-changes\"],\"group\":\"erd\",\"description\":\"Required single-call mutation path for ERD create/update/delete changes. Put tables, columns, indexes, refs, enums, enum_values, and table groups in one operations array and call this once.\\nRules: (1) all data field names are snake_case; (2) for create, generate your own UUIDs and put them in data.uuid, then later operations in the same batch may reference those UUIDs without read-back calls; (3) enum values are separate enum_value operations, not inline on enum; (4) ref.relationship uses short dbdiagram-style symbols: >, <, or -; (5) ref_column operations map FK columns explicitly, never automatically.\\nDo not look for type-specific ERD CUD tools; this tool is the only ERD CUD entry point. If operations is very large, use request_upload_token with purpose=mcp.call and send the tools/call payload with curl to save LLM tokens.\\nOne-call worked example:\\n{\\n \\\"documentUuid\\\": \\\"erd-doc-uuid\\\",\\n \\\"description\\\": \\\"create users/posts ERD\\\",\\n \\\"operations\\\": [\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"table\\\",\\\"data\\\":{\\\"uuid\\\":\\\"tbl_users\\\",\\\"name\\\":\\\"users\\\",\\\"display_order\\\":1}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"column\\\",\\\"data\\\":{\\\"uuid\\\":\\\"col_users_id\\\",\\\"table_uuid\\\":\\\"tbl_users\\\",\\\"name\\\":\\\"id\\\",\\\"type\\\":\\\"bigint\\\",\\\"is_pk\\\":true,\\\"is_not_null\\\":true,\\\"display_order\\\":1}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"column\\\",\\\"data\\\":{\\\"uuid\\\":\\\"col_users_email\\\",\\\"table_uuid\\\":\\\"tbl_users\\\",\\\"name\\\":\\\"email\\\",\\\"type\\\":\\\"varchar(255)\\\",\\\"is_unique\\\":true,\\\"is_not_null\\\":true,\\\"display_order\\\":2}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"table\\\",\\\"data\\\":{\\\"uuid\\\":\\\"tbl_posts\\\",\\\"name\\\":\\\"posts\\\",\\\"display_order\\\":2}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"column\\\",\\\"data\\\":{\\\"uuid\\\":\\\"col_posts_id\\\",\\\"table_uuid\\\":\\\"tbl_posts\\\",\\\"name\\\":\\\"id\\\",\\\"type\\\":\\\"bigint\\\",\\\"is_pk\\\":true,\\\"is_not_null\\\":true,\\\"display_order\\\":1}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"column\\\",\\\"data\\\":{\\\"uuid\\\":\\\"col_posts_author_id\\\",\\\"table_uuid\\\":\\\"tbl_posts\\\",\\\"name\\\":\\\"author_id\\\",\\\"type\\\":\\\"bigint\\\",\\\"is_not_null\\\":true,\\\"display_order\\\":2}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"column\\\",\\\"data\\\":{\\\"uuid\\\":\\\"col_posts_status\\\",\\\"table_uuid\\\":\\\"tbl_posts\\\",\\\"name\\\":\\\"status\\\",\\\"type\\\":\\\"post_status\\\",\\\"is_not_null\\\":true,\\\"display_order\\\":3}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"enum\\\",\\\"data\\\":{\\\"uuid\\\":\\\"enum_post_status\\\",\\\"name\\\":\\\"post_status\\\"}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"enum_value\\\",\\\"data\\\":{\\\"uuid\\\":\\\"enum_post_status_draft\\\",\\\"enum_uuid\\\":\\\"enum_post_status\\\",\\\"value\\\":\\\"draft\\\",\\\"display_order\\\":1}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"enum_value\\\",\\\"data\\\":{\\\"uuid\\\":\\\"enum_post_status_published\\\",\\\"enum_uuid\\\":\\\"enum_post_status\\\",\\\"value\\\":\\\"published\\\",\\\"display_order\\\":2}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"ref\\\",\\\"data\\\":{\\\"uuid\\\":\\\"ref_posts_author\\\",\\\"name\\\":\\\"fk_posts_author\\\",\\\"from_table_uuid\\\":\\\"tbl_posts\\\",\\\"to_table_uuid\\\":\\\"tbl_users\\\",\\\"relationship\\\":\\\">\\\",\\\"on_delete\\\":\\\"cascade\\\"}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"ref_column\\\",\\\"data\\\":{\\\"uuid\\\":\\\"refcol_posts_author\\\",\\\"ref_uuid\\\":\\\"ref_posts_author\\\",\\\"from_column_uuid\\\":\\\"col_posts_author_id\\\",\\\"to_column_uuid\\\":\\\"col_users_id\\\",\\\"display_order\\\":1}}\\n ]\\n}\",\"inputSchema\":{\"properties\":{\"arrangeNewTables\":{\"description\":\"Whether to auto-place newly-created tables after the batch; defaults to true\",\"type\":\"boolean\"},\"description\":{\"description\":\"Reason for batch (audit)\",\"type\":\"string\"},\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"},\"operations\":{\"description\":\"Atomic create/update/delete operations\",\"items\":{\"description\":\"One ERD mutation. Use a single operations array with client-generated data.uuid values to create cross-referenced tables, columns, enums, refs, and ref_columns without read-back calls.\",\"discriminator\":{\"propertyName\":\"type\"},\"oneOf\":[{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='table'.\",\"properties\":{\"alias\":{\"description\":\"Display alias.\",\"type\":\"string\"},\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"header_color\":{\"description\":\"Header color.\",\"type\":\"string\"},\"name\":{\"description\":\"Table name. Required for create.\",\"type\":\"string\"},\"note\":{\"description\":\"Table note.\",\"type\":\"string\"},\"schema_name\":{\"description\":\"Schema name.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"required\":[\"name\"],\"title\":\"table data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='table'.\",\"properties\":{\"alias\":{\"description\":\"Display alias.\",\"type\":\"string\"},\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"header_color\":{\"description\":\"Header color.\",\"type\":\"string\"},\"name\":{\"description\":\"Table name. Required for create.\",\"type\":\"string\"},\"note\":{\"description\":\"Table note.\",\"type\":\"string\"},\"schema_name\":{\"description\":\"Schema name.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"table data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"table\",\"description\":\"Must be 'table' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"table operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='column'.\",\"properties\":{\"default_value\":{\"description\":\"Default value.\",\"type\":\"string\"},\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"is_increment\":{\"description\":\"Auto-increment flag.\",\"type\":\"boolean\"},\"is_not_null\":{\"description\":\"Not-null flag.\",\"type\":\"boolean\"},\"is_pk\":{\"description\":\"Primary key flag.\",\"type\":\"boolean\"},\"is_unique\":{\"description\":\"Unique flag.\",\"type\":\"boolean\"},\"name\":{\"description\":\"Column name.\",\"type\":\"string\"},\"note\":{\"description\":\"Column note.\",\"type\":\"string\"},\"table_uuid\":{\"description\":\"Parent table UUID. Required for create; may be a data.uuid from an earlier table operation in this batch.\",\"type\":\"string\"},\"type\":{\"description\":\"SQL data type. Use this exact field name; do not send data_type.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"required\":[\"table_uuid\"],\"title\":\"column data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='column'.\",\"properties\":{\"default_value\":{\"description\":\"Default value.\",\"type\":\"string\"},\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"is_increment\":{\"description\":\"Auto-increment flag.\",\"type\":\"boolean\"},\"is_not_null\":{\"description\":\"Not-null flag.\",\"type\":\"boolean\"},\"is_pk\":{\"description\":\"Primary key flag.\",\"type\":\"boolean\"},\"is_unique\":{\"description\":\"Unique flag.\",\"type\":\"boolean\"},\"name\":{\"description\":\"Column name.\",\"type\":\"string\"},\"note\":{\"description\":\"Column note.\",\"type\":\"string\"},\"table_uuid\":{\"description\":\"Parent table UUID. Required for create; may be a data.uuid from an earlier table operation in this batch.\",\"type\":\"string\"},\"type\":{\"description\":\"SQL data type. Use this exact field name; do not send data_type.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"column data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"column\",\"description\":\"Must be 'column' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"column operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='index'.\",\"properties\":{\"is_pk\":{\"description\":\"Primary key index flag.\",\"type\":\"boolean\"},\"is_unique\":{\"description\":\"Unique index flag.\",\"type\":\"boolean\"},\"name\":{\"description\":\"Index name.\",\"type\":\"string\"},\"note\":{\"description\":\"Index note.\",\"type\":\"string\"},\"table_uuid\":{\"description\":\"Parent table UUID. Required for create.\",\"type\":\"string\"},\"type\":{\"description\":\"Index type.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"required\":[\"table_uuid\"],\"title\":\"index data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='index'.\",\"properties\":{\"is_pk\":{\"description\":\"Primary key index flag.\",\"type\":\"boolean\"},\"is_unique\":{\"description\":\"Unique index flag.\",\"type\":\"boolean\"},\"name\":{\"description\":\"Index name.\",\"type\":\"string\"},\"note\":{\"description\":\"Index note.\",\"type\":\"string\"},\"table_uuid\":{\"description\":\"Parent table UUID. Required for create.\",\"type\":\"string\"},\"type\":{\"description\":\"Index type.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"index data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"index\",\"description\":\"Must be 'index' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"index operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='index_column'.\",\"properties\":{\"column_uuid\":{\"description\":\"Column UUID. Required for create.\",\"type\":\"string\"},\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"index_uuid\":{\"description\":\"Index UUID. Required for create.\",\"type\":\"string\"},\"sort_order\":{\"description\":\"Sort order, for example ASC or DESC.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"required\":[\"index_uuid\",\"column_uuid\"],\"title\":\"index_column data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='index_column'.\",\"properties\":{\"column_uuid\":{\"description\":\"Column UUID. Required for create.\",\"type\":\"string\"},\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"index_uuid\":{\"description\":\"Index UUID. Required for create.\",\"type\":\"string\"},\"sort_order\":{\"description\":\"Sort order, for example ASC or DESC.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"index_column data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"index_column\",\"description\":\"Must be 'index_column' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"index_column operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='ref'.\",\"properties\":{\"from_table_uuid\":{\"description\":\"Source table UUID. Required for create.\",\"type\":\"string\"},\"name\":{\"description\":\"Reference name.\",\"type\":\"string\"},\"on_delete\":{\"description\":\"ON DELETE action.\",\"type\":\"string\"},\"on_update\":{\"description\":\"ON UPDATE action.\",\"type\":\"string\"},\"relationship\":{\"description\":\"Required for create. Use short dbdiagram-style relationship symbols.\",\"enum\":[\">\",\"<\",\"-\"],\"type\":\"string\"},\"to_table_uuid\":{\"description\":\"Target table UUID. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"required\":[\"from_table_uuid\",\"to_table_uuid\",\"relationship\"],\"title\":\"ref data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='ref'.\",\"properties\":{\"from_table_uuid\":{\"description\":\"Source table UUID. Required for create.\",\"type\":\"string\"},\"name\":{\"description\":\"Reference name.\",\"type\":\"string\"},\"on_delete\":{\"description\":\"ON DELETE action.\",\"type\":\"string\"},\"on_update\":{\"description\":\"ON UPDATE action.\",\"type\":\"string\"},\"relationship\":{\"description\":\"Required for create. Use short dbdiagram-style relationship symbols.\",\"enum\":[\">\",\"<\",\"-\"],\"type\":\"string\"},\"to_table_uuid\":{\"description\":\"Target table UUID. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"ref data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"ref\",\"description\":\"Must be 'ref' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"ref operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='ref_column'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"from_column_uuid\":{\"description\":\"Source column UUID. Required for create.\",\"type\":\"string\"},\"ref_uuid\":{\"description\":\"Reference UUID. Required for create; may be a data.uuid from an earlier ref operation.\",\"type\":\"string\"},\"to_column_uuid\":{\"description\":\"Target column UUID. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"required\":[\"ref_uuid\",\"from_column_uuid\",\"to_column_uuid\"],\"title\":\"ref_column data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='ref_column'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"from_column_uuid\":{\"description\":\"Source column UUID. Required for create.\",\"type\":\"string\"},\"ref_uuid\":{\"description\":\"Reference UUID. Required for create; may be a data.uuid from an earlier ref operation.\",\"type\":\"string\"},\"to_column_uuid\":{\"description\":\"Target column UUID. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"ref_column data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"ref_column\",\"description\":\"Must be 'ref_column' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"ref_column operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='enum'.\",\"properties\":{\"name\":{\"description\":\"Enum name.\",\"type\":\"string\"},\"note\":{\"description\":\"Enum note.\",\"type\":\"string\"},\"schema_name\":{\"description\":\"Schema name.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"enum data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='enum'.\",\"properties\":{\"name\":{\"description\":\"Enum name.\",\"type\":\"string\"},\"note\":{\"description\":\"Enum note.\",\"type\":\"string\"},\"schema_name\":{\"description\":\"Schema name.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"enum data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"enum\",\"description\":\"Must be 'enum' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"enum operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='enum_value'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"enum_uuid\":{\"description\":\"Parent enum UUID. Required for create; may be a data.uuid from an earlier enum operation.\",\"type\":\"string\"},\"note\":{\"description\":\"Enum value note.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"},\"value\":{\"description\":\"Enum value. Inline enum values on enum are not persisted; create enum_value operations.\",\"type\":\"string\"}},\"required\":[\"enum_uuid\"],\"title\":\"enum_value data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='enum_value'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"enum_uuid\":{\"description\":\"Parent enum UUID. Required for create; may be a data.uuid from an earlier enum operation.\",\"type\":\"string\"},\"note\":{\"description\":\"Enum value note.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"},\"value\":{\"description\":\"Enum value. Inline enum values on enum are not persisted; create enum_value operations.\",\"type\":\"string\"}},\"title\":\"enum_value data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"enum_value\",\"description\":\"Must be 'enum_value' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"enum_value operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='table_group'.\",\"properties\":{\"color\":{\"description\":\"Group color.\",\"type\":\"string\"},\"name\":{\"description\":\"Table group name.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"table_group data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='table_group'.\",\"properties\":{\"color\":{\"description\":\"Group color.\",\"type\":\"string\"},\"name\":{\"description\":\"Table group name.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"table_group data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"table_group\",\"description\":\"Must be 'table_group' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"table_group operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='table_group_table'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"group_uuid\":{\"description\":\"Table group UUID. Required for create.\",\"type\":\"string\"},\"schema_name\":{\"description\":\"Table schema name.\",\"type\":\"string\"},\"table_name\":{\"description\":\"Table name. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"required\":[\"group_uuid\",\"table_name\"],\"title\":\"table_group_table data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='table_group_table'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"group_uuid\":{\"description\":\"Table group UUID. Required for create.\",\"type\":\"string\"},\"schema_name\":{\"description\":\"Table schema name.\",\"type\":\"string\"},\"table_name\":{\"description\":\"Table name. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"table_group_table data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"table_group_table\",\"description\":\"Must be 'table_group_table' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"table_group_table operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='table_group_note'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"group_uuid\":{\"description\":\"Table group UUID. Required for create.\",\"type\":\"string\"},\"note_uuid\":{\"description\":\"Note UUID. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"required\":[\"group_uuid\",\"note_uuid\"],\"title\":\"table_group_note data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='table_group_note'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"group_uuid\":{\"description\":\"Table group UUID. Required for create.\",\"type\":\"string\"},\"note_uuid\":{\"description\":\"Note UUID. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"table_group_note data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"table_group_note\",\"description\":\"Must be 'table_group_note' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"table_group_note operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='filter'.\",\"properties\":{\"included_tables\":{\"description\":\"JSON string/list of included tables.\",\"type\":\"string\"},\"is_default\":{\"description\":\"Default filter flag.\",\"type\":\"boolean\"},\"name\":{\"description\":\"Filter name.\",\"type\":\"string\"},\"table_groups\":{\"description\":\"JSON string/object of table groups.\",\"type\":\"string\"},\"table_positions\":{\"description\":\"JSON string/object of table positions.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"filter data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='filter'.\",\"properties\":{\"included_tables\":{\"description\":\"JSON string/list of included tables.\",\"type\":\"string\"},\"is_default\":{\"description\":\"Default filter flag.\",\"type\":\"boolean\"},\"name\":{\"description\":\"Filter name.\",\"type\":\"string\"},\"table_groups\":{\"description\":\"JSON string/object of table groups.\",\"type\":\"string\"},\"table_positions\":{\"description\":\"JSON string/object of table positions.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"filter data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"filter\",\"description\":\"Must be 'filter' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"filter operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='note'.\",\"properties\":{\"color\":{\"description\":\"Note color.\",\"type\":\"string\"},\"content\":{\"description\":\"Note content.\",\"type\":\"string\"},\"height\":{\"description\":\"Height.\",\"type\":\"integer\"},\"icon_name\":{\"description\":\"Icon name.\",\"type\":\"string\"},\"position_x\":{\"description\":\"X position.\",\"type\":\"integer\"},\"position_y\":{\"description\":\"Y position.\",\"type\":\"integer\"},\"title\":{\"description\":\"Note title.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"},\"width\":{\"description\":\"Width.\",\"type\":\"integer\"}},\"title\":\"note data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='note'.\",\"properties\":{\"color\":{\"description\":\"Note color.\",\"type\":\"string\"},\"content\":{\"description\":\"Note content.\",\"type\":\"string\"},\"height\":{\"description\":\"Height.\",\"type\":\"integer\"},\"icon_name\":{\"description\":\"Icon name.\",\"type\":\"string\"},\"position_x\":{\"description\":\"X position.\",\"type\":\"integer\"},\"position_y\":{\"description\":\"Y position.\",\"type\":\"integer\"},\"title\":{\"description\":\"Note title.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"},\"width\":{\"description\":\"Width.\",\"type\":\"integer\"}},\"title\":\"note data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"note\",\"description\":\"Must be 'note' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"note operation\",\"type\":\"object\"}],\"properties\":{\"data\":{\"description\":\"Type-specific payload. All field names are snake_case. For create, data.uuid may be client-supplied and referenced by later operations in the same batch.\",\"oneOf\":[{\"description\":\"Payload for operation.type='table'.\",\"properties\":{\"alias\":{\"description\":\"Display alias.\",\"type\":\"string\"},\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"header_color\":{\"description\":\"Header color.\",\"type\":\"string\"},\"name\":{\"description\":\"Table name. Required for create.\",\"type\":\"string\"},\"note\":{\"description\":\"Table note.\",\"type\":\"string\"},\"schema_name\":{\"description\":\"Schema name.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"table data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='column'.\",\"properties\":{\"default_value\":{\"description\":\"Default value.\",\"type\":\"string\"},\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"is_increment\":{\"description\":\"Auto-increment flag.\",\"type\":\"boolean\"},\"is_not_null\":{\"description\":\"Not-null flag.\",\"type\":\"boolean\"},\"is_pk\":{\"description\":\"Primary key flag.\",\"type\":\"boolean\"},\"is_unique\":{\"description\":\"Unique flag.\",\"type\":\"boolean\"},\"name\":{\"description\":\"Column name.\",\"type\":\"string\"},\"note\":{\"description\":\"Column note.\",\"type\":\"string\"},\"table_uuid\":{\"description\":\"Parent table UUID. Required for create; may be a data.uuid from an earlier table operation in this batch.\",\"type\":\"string\"},\"type\":{\"description\":\"SQL data type. Use this exact field name; do not send data_type.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"column data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='index'.\",\"properties\":{\"is_pk\":{\"description\":\"Primary key index flag.\",\"type\":\"boolean\"},\"is_unique\":{\"description\":\"Unique index flag.\",\"type\":\"boolean\"},\"name\":{\"description\":\"Index name.\",\"type\":\"string\"},\"note\":{\"description\":\"Index note.\",\"type\":\"string\"},\"table_uuid\":{\"description\":\"Parent table UUID. Required for create.\",\"type\":\"string\"},\"type\":{\"description\":\"Index type.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"index data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='index_column'.\",\"properties\":{\"column_uuid\":{\"description\":\"Column UUID. Required for create.\",\"type\":\"string\"},\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"index_uuid\":{\"description\":\"Index UUID. Required for create.\",\"type\":\"string\"},\"sort_order\":{\"description\":\"Sort order, for example ASC or DESC.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"index_column data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='ref'.\",\"properties\":{\"from_table_uuid\":{\"description\":\"Source table UUID. Required for create.\",\"type\":\"string\"},\"name\":{\"description\":\"Reference name.\",\"type\":\"string\"},\"on_delete\":{\"description\":\"ON DELETE action.\",\"type\":\"string\"},\"on_update\":{\"description\":\"ON UPDATE action.\",\"type\":\"string\"},\"relationship\":{\"description\":\"Required for create. Use short dbdiagram-style relationship symbols.\",\"enum\":[\">\",\"<\",\"-\"],\"type\":\"string\"},\"to_table_uuid\":{\"description\":\"Target table UUID. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"ref data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='ref_column'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"from_column_uuid\":{\"description\":\"Source column UUID. Required for create.\",\"type\":\"string\"},\"ref_uuid\":{\"description\":\"Reference UUID. Required for create; may be a data.uuid from an earlier ref operation.\",\"type\":\"string\"},\"to_column_uuid\":{\"description\":\"Target column UUID. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"ref_column data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='enum'.\",\"properties\":{\"name\":{\"description\":\"Enum name.\",\"type\":\"string\"},\"note\":{\"description\":\"Enum note.\",\"type\":\"string\"},\"schema_name\":{\"description\":\"Schema name.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"enum data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='enum_value'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"enum_uuid\":{\"description\":\"Parent enum UUID. Required for create; may be a data.uuid from an earlier enum operation.\",\"type\":\"string\"},\"note\":{\"description\":\"Enum value note.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"},\"value\":{\"description\":\"Enum value. Inline enum values on enum are not persisted; create enum_value operations.\",\"type\":\"string\"}},\"title\":\"enum_value data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='table_group'.\",\"properties\":{\"color\":{\"description\":\"Group color.\",\"type\":\"string\"},\"name\":{\"description\":\"Table group name.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"table_group data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='table_group_table'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"group_uuid\":{\"description\":\"Table group UUID. Required for create.\",\"type\":\"string\"},\"schema_name\":{\"description\":\"Table schema name.\",\"type\":\"string\"},\"table_name\":{\"description\":\"Table name. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"table_group_table data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='table_group_note'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"group_uuid\":{\"description\":\"Table group UUID. Required for create.\",\"type\":\"string\"},\"note_uuid\":{\"description\":\"Note UUID. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"table_group_note data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='filter'.\",\"properties\":{\"included_tables\":{\"description\":\"JSON string/list of included tables.\",\"type\":\"string\"},\"is_default\":{\"description\":\"Default filter flag.\",\"type\":\"boolean\"},\"name\":{\"description\":\"Filter name.\",\"type\":\"string\"},\"table_groups\":{\"description\":\"JSON string/object of table groups.\",\"type\":\"string\"},\"table_positions\":{\"description\":\"JSON string/object of table positions.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"}},\"title\":\"filter data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='note'.\",\"properties\":{\"color\":{\"description\":\"Note color.\",\"type\":\"string\"},\"content\":{\"description\":\"Note content.\",\"type\":\"string\"},\"height\":{\"description\":\"Height.\",\"type\":\"integer\"},\"icon_name\":{\"description\":\"Icon name.\",\"type\":\"string\"},\"position_x\":{\"description\":\"X position.\",\"type\":\"integer\"},\"position_y\":{\"description\":\"Y position.\",\"type\":\"integer\"},\"title\":{\"description\":\"Note title.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID (at most 36 characters, e.g. a standard UUID v4). If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"maxLength\":36,\"type\":\"string\"},\"width\":{\"description\":\"Width.\",\"type\":\"integer\"}},\"title\":\"note data\",\"type\":\"object\"}],\"type\":\"object\"},\"op\":{\"description\":\"Operation. For create, put any new UUID in data.uuid; for update/delete, put target UUID in operation.uuid.\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"description\":\"ERD entity type. This selects the operation.data shape.\",\"enum\":[\"table\",\"column\",\"index\",\"index_column\",\"ref\",\"ref_column\",\"enum\",\"enum_value\",\"table_group\",\"table_group_table\",\"table_group_note\",\"filter\",\"note\"],\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete. Do not use this for create; use data.uuid instead.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"documentUuid\",\"description\",\"operations\"],\"type\":\"object\"},\"required\":[\"description\",\"documentUuid\",\"operations\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"87f5bcf5a253815a\"},\n {\"mcpName\":\"erd_arrange_tables\",\"commandPath\":[\"erd\",\"arrange-tables\"],\"group\":\"erd\",\"description\":\"Arrange ERD tables after edits. Default incremental mode places newly-created tables while preserving existing positions; full=true re-layouts the entire diagram. Use after several separate table edits to tidy the canvas.\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"},\"full\":{\"description\":\"Re-layout the ENTIRE diagram (overwrites existing positions). Default false = arrange only newly-added (uncoordinated) tables to the top-right while preserving existing table positions. Call this after creating several tables to tidy them up.\",\"type\":\"boolean\"}},\"required\":[\"documentUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"651fd0d54e3635ff\"},\n {\"mcpName\":\"erd_get_enum\",\"commandPath\":[\"erd\",\"get-enum\"],\"group\":\"erd\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"},\"enumUuid\":{\"description\":\"Enum UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\",\"enumUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\",\"enumUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"f0d79d7a1996939c\"},\n {\"mcpName\":\"erd_get_ref\",\"commandPath\":[\"erd\",\"get-ref\"],\"group\":\"erd\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"},\"refUuid\":{\"description\":\"Relationship UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\",\"refUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\",\"refUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"5b47fe7d99e60d4d\"},\n {\"mcpName\":\"erd_get_table\",\"commandPath\":[\"erd\",\"get-table\"],\"group\":\"erd\",\"description\":\"Get one ERD table with nested columns and indexes. Returns persistent table/column/index UUIDs usable directly as erd_apply_changes update/delete targets and ref_column column references. Column fields use apply_changes snake_case names: uuid, table_uuid, name, type, is_pk, is_unique, is_not_null, is_increment, default_value, note, display_order. Index fields include uuid, name, columns (column UUIDs), is_unique, is_pk, type.\",\"inputSchema\":{\"description\":\"Get one ERD table with nested columns and indexes. Returns persistent table/column/index UUIDs usable directly as mcp__ainecto__erd_apply_changes update/delete targets and ref_column column references. Column fields use apply_changes snake_case names: uuid, table_uuid, name, type, is_pk, is_unique, is_not_null, is_increment, default_value, note, display_order. Index fields include uuid, name, columns (column UUIDs), is_unique, is_pk, type.\",\"properties\":{\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"},\"tableUuid\":{\"description\":\"Table UUID. Response includes columns[] and indexes[] with persistent UUIDs for apply_changes.\",\"type\":\"string\"}},\"required\":[\"documentUuid\",\"tableUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\",\"tableUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"0dc13648bf3fbf8f\"},\n {\"mcpName\":\"erd_get_table_group\",\"commandPath\":[\"erd\",\"get-table-group\"],\"group\":\"erd\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"},\"tableGroupUuid\":{\"description\":\"Table group UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\",\"tableGroupUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\",\"tableGroupUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"3db246dfe8663370\"},\n {\"mcpName\":\"erd_list_enums\",\"commandPath\":[\"erd\",\"list-enums\"],\"group\":\"erd\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"4d1f602fa487a0e4\"},\n {\"mcpName\":\"erd_list_refs\",\"commandPath\":[\"erd\",\"list-refs\"],\"group\":\"erd\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"307d766c777bbe8c\"},\n {\"mcpName\":\"erd_list_table_groups\",\"commandPath\":[\"erd\",\"list-table-groups\"],\"group\":\"erd\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"775bff53bbc21c9e\"},\n {\"mcpName\":\"erd_list_tables\",\"commandPath\":[\"erd\",\"list-tables\"],\"group\":\"erd\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"34324dfc7ef461c8\"},\n {\"mcpName\":\"get_attachment\",\"commandPath\":[\"attachment\",\"get\"],\"group\":\"attachment\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuid\":{\"description\":\"Attachment UUID\",\"type\":\"string\"}},\"required\":[\"uuid\"],\"type\":\"object\"},\"required\":[\"uuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"1e0e7f1bf33b669c\"},\n {\"mcpName\":\"get_document\",\"commandPath\":[\"document\",\"get\"],\"group\":\"document\",\"description\":\"Read a document. The body comes back for the types whose create/update take one: markdown → content; openapi → content (the spec text) + format/specVersion/pathCount/operationCount; html → content (the HTML text); file → file {filename, contentType, sizeBytes, viewerKind} + content for text/CSV (first 64 KB); diagram → diagramSource/sourceLanguage/edgeStyle/isModule/metadata; erd → metadata only (read tables/refs via erd_list_*).\",\"inputSchema\":{\"properties\":{\"uuid\":{\"description\":\"Document UUID\",\"type\":\"string\"}},\"required\":[\"uuid\"],\"type\":\"object\"},\"required\":[\"uuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"2efef592c2d6dd7a\"},\n {\"mcpName\":\"get_project\",\"commandPath\":[\"project\",\"get\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuid\":{\"description\":\"Project UUID\",\"type\":\"string\"}},\"required\":[\"uuid\"],\"type\":\"object\"},\"required\":[\"uuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"192403c3484ac774\"},\n {\"mcpName\":\"get_version\",\"commandPath\":[\"version\",\"get\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"Document UUID\",\"type\":\"string\"},\"versionNumber\":{\"description\":\"Version number\",\"type\":\"integer\"}},\"required\":[\"documentUuid\",\"versionNumber\"],\"type\":\"object\"},\"required\":[\"documentUuid\",\"versionNumber\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"4e308c1a8c7203d1\"},\n {\"mcpName\":\"get_workspace\",\"commandPath\":[\"workspace\",\"get\"],\"group\":\"workspace\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuid\":{\"description\":\"Workspace UUID\",\"type\":\"string\"}},\"required\":[\"uuid\"],\"type\":\"object\"},\"required\":[\"uuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"db6d1b4879d57c56\"},\n {\"mcpName\":\"identity_get_self\",\"commandPath\":[\"tools\",\"run\",\"identity-get-self\"],\"group\":\"generic\",\"description\":\"Return the authenticated MCP caller identity summary; never returns email or token claims.\",\"inputSchema\":{\"additionalProperties\":false,\"properties\":{},\"type\":\"object\"},\"required\":[],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"f29c86804eb91700\"},\n {\"mcpName\":\"list_attachments\",\"commandPath\":[\"attachments\",\"list\"],\"group\":\"attachment\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"projectUuid\":{\"description\":\"Project UUID\",\"type\":\"string\"}},\"required\":[\"projectUuid\"],\"type\":\"object\"},\"required\":[\"projectUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"fae7152d1e4a930b\"},\n {\"mcpName\":\"list_comments\",\"commandPath\":[\"comments\",\"list\"],\"group\":\"generic\",\"description\":\"List the active comments on a document, oldest first, including replies (a reply has parentCommentId set; replies are one level deep). Each comment has id, kind (COMMENT or QUESTION), body, author, mentions (userId, label and position in the body), and for questions questionState (UNANSWERED, ANSWERED, RESOLVED) and resolvedAt. Anyone who can read the document can list its comments.\",\"inputSchema\":{\"additionalProperties\":false,\"properties\":{\"documentUuid\":{\"description\":\"Document UUID the comments belong to\",\"type\":\"string\"}},\"required\":[\"documentUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"4c60115a00f61404\"},\n {\"mcpName\":\"list_documents\",\"commandPath\":[\"documents\",\"list\"],\"group\":\"document\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"folderUuid\":{\"description\":\"Optional folder UUID\",\"type\":\"string\"},\"limit\":{\"description\":\"Result cap when q is set (default 50)\",\"type\":\"integer\"},\"projectUuid\":{\"description\":\"Project UUID\",\"type\":\"string\"},\"q\":{\"description\":\"Optional full-text query. When provided, results come from the search index instead of folder listing.\",\"type\":\"string\"},\"type\":{\"description\":\"Optional document type filter. Readable values: erd, markdown, diagram, openapi, html, file.\",\"enum\":[\"erd\",\"markdown\",\"diagram\",\"openapi\",\"html\",\"file\"],\"type\":\"string\"}},\"type\":\"object\"},\"required\":[],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"2171496b44dc2abf\"},\n {\"mcpName\":\"list_folders\",\"commandPath\":[\"folders\",\"list\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"projectUuid\":{\"description\":\"Project UUID\",\"type\":\"string\"}},\"required\":[\"projectUuid\"],\"type\":\"object\"},\"required\":[\"projectUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"461dc6735ac92c3b\"},\n {\"mcpName\":\"list_mention_candidates\",\"commandPath\":[\"mention-candidates\",\"list\"],\"group\":\"generic\",\"description\":\"List the people you can mention in comments on a document: userId and displayName. Only people who can read the document are listed. To mention someone, write @<displayName> exactly in the comment body and pass their userId in mentionUserIds of create_comments or update_comments. Page with nextCursor while hasMore is true.\",\"inputSchema\":{\"additionalProperties\":false,\"properties\":{\"cursor\":{\"description\":\"nextCursor from the previous page (same documentUuid and query).\",\"type\":\"string\"},\"documentUuid\":{\"description\":\"Document UUID the comments belong to\",\"type\":\"string\"},\"limit\":{\"description\":\"Page size, 1..50. Defaults to 20.\",\"maximum\":50,\"minimum\":1,\"type\":\"integer\"},\"query\":{\"description\":\"Name filter, 0..100 characters. Omit or leave empty for the first page of everyone.\",\"maxLength\":100,\"type\":\"string\"}},\"required\":[\"documentUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"896a5a6ff357268b\"},\n {\"mcpName\":\"list_projects\",\"commandPath\":[\"projects\",\"list\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"limit\":{\"description\":\"Result cap when q is set (default 50)\",\"type\":\"integer\"},\"q\":{\"description\":\"Optional full-text query\",\"type\":\"string\"},\"workspaceUuid\":{\"description\":\"Optional Workspace UUID\",\"type\":\"string\"}},\"type\":\"object\"},\"required\":[],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"939bfcc088425771\"},\n {\"mcpName\":\"list_trash\",\"commandPath\":[\"trash\",\"list\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{},\"type\":\"object\"},\"required\":[],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"329250aecc06a298\"},\n {\"mcpName\":\"list_versions\",\"commandPath\":[\"versions\",\"list\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"Document UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"f08f9faee3ba9107\"},\n {\"mcpName\":\"list_workspaces\",\"commandPath\":[\"workspaces\",\"list\"],\"group\":\"workspace\",\"description\":\"\",\"inputSchema\":{\"properties\":{},\"type\":\"object\"},\"required\":[],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"39dba0089fdbdf6a\"},\n {\"mcpName\":\"markdown_append_document\",\"commandPath\":[\"markdown\",\"append-document\"],\"group\":\"markdown\",\"description\":\"Append to Markdown documents. If the appended body is tens of KB or more, prefer request_upload_token (purpose=document.append) and upload the body with curl.\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Appends\",\"items\":{\"properties\":{\"addition\":{\"description\":\"Body addition. 추가할 내용이 크면 (수십 KB 이상) LLM 토큰 절약을 위해 `request_upload_token (purpose=document.append, scopeJson={documentUuid, separator})` 로 uploadUrl 을 받고 curl 로 PUT 으로 보낼 것.\",\"type\":\"string\"},\"separator\":{\"description\":\"Separator between existing body and addition\",\"type\":\"string\"},\"uuid\":{\"description\":\"Document UUID\",\"type\":\"string\"}},\"required\":[\"uuid\",\"addition\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"bf82401f055f29b0\"},\n {\"mcpName\":\"markdown_generate_document\",\"commandPath\":[\"markdown\",\"generate-document\"],\"group\":\"markdown\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Generation requests\",\"items\":{\"properties\":{\"context\":{\"description\":\"Optional JSON context\",\"type\":\"string\"},\"documentUuid\":{\"description\":\"Target document UUID\",\"type\":\"string\"},\"prompt\":{\"description\":\"Generation prompt\",\"type\":\"string\"}},\"required\":[\"documentUuid\",\"prompt\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"1e4724ea42f25743\"},\n {\"mcpName\":\"move_documents\",\"commandPath\":[\"documents\",\"move\"],\"group\":\"document\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"clientMutationId\":{\"description\":\"Optional mutation identifier for client retry tracing\",\"maxLength\":128,\"minLength\":1,\"pattern\":\"^[\\\\x21-\\\\x7E]{1,128}$\",\"type\":\"string\"},\"items\":{\"description\":\"Moves\",\"items\":{\"properties\":{\"newFolderUuid\":{\"description\":\"New folder UUID — null/empty for root\",\"type\":\"string\"},\"targetProjectUuid\":{\"description\":\"Target project UUID — omit to stay in current project\",\"type\":\"string\"},\"targetWorkspaceUuid\":{\"description\":\"Guard only: must match targetProjectUuid workspace\",\"type\":\"string\"},\"uuid\":{\"description\":\"Document UUID\",\"type\":\"string\"}},\"required\":[\"uuid\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"prod\",\"schemaHash\":\"45899053743a0c1e\"},\n {\"mcpName\":\"move_folders\",\"commandPath\":[\"folders\",\"move\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Moves\",\"items\":{\"properties\":{\"newParentFolderUuid\":{\"description\":\"New parent UUID — null/empty for root\",\"type\":\"string\"},\"uuid\":{\"description\":\"Folder UUID\",\"type\":\"string\"}},\"required\":[\"uuid\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"prod\",\"schemaHash\":\"eff4458d2f35587a\"},\n {\"mcpName\":\"move_projects\",\"commandPath\":[\"projects\",\"move\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Moves\",\"items\":{\"properties\":{\"targetWorkspaceUuid\":{\"description\":\"Destination workspace UUID (you need write access there)\",\"type\":\"string\"},\"uuid\":{\"description\":\"Project UUID\",\"type\":\"string\"}},\"required\":[\"uuid\",\"targetWorkspaceUuid\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"prod\",\"schemaHash\":\"abe0196da3c48ad5\"},\n {\"mcpName\":\"request_upload_token\",\"commandPath\":[\"tools\",\"run\",\"request-upload-token\"],\"group\":\"attachment\",\"description\":\"Use this for large payloads of tens of KB or more to save LLM tokens. purpose=mcp.call returns a short-lived bearer token that can call any MCP tool, including erd_apply_changes, via curl. purpose=document.create/update/append uploads document bodies directly to the upload endpoint with PUT/curl. Tokens are reusable for 5 minutes by default.\",\"inputSchema\":{\"properties\":{\"maxBytes\":{\"description\":\"최대 업로드 byte (서버 측 한도)\",\"type\":\"integer\"},\"purpose\":{\"description\":\"Token 용도. `mcp.call` 은 curl 로 /mcp 호출, `document.create/update/append` 는 PUT body 로 본문 업로드, `attachment.upload` 는 파일 bytes 업로드. 콘텐츠가 크면 (수십 KB 이상) LLM 토큰 절약을 위해 이 도구로 5분 재사용 토큰을 받고 curl 로 보내는 것을 강력 권장.\",\"enum\":[\"mcp.call\",\"document.create\",\"document.update\",\"document.append\",\"attachment.upload\"],\"type\":\"string\"},\"scopeJson\":{\"description\":\"선택 — JSON scope. document.create 는 projectUuid, type, title 을 포함하고 creatable type values 는 erd, markdown, diagram, openapi, html, file. document.update/document.append 는 documentUuid 를 포함. type=file 은 filename 도 포함(확장자로 형식 판정) — PUT 의 Content-Type 은 파일 MIME, 본문은 파일 바이트. attachment.upload: {documentUuid, filename}; storageKey 는 서버가 발급 scope 에 넣는다.\",\"type\":\"string\"},\"ttlSeconds\":{\"description\":\"TTL (초). 기본 300 (5분)\",\"type\":\"integer\"}},\"required\":[\"purpose\"],\"type\":\"object\"},\"required\":[\"purpose\"],\"payloadMode\":\"binary-upload\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"fe1984b3979abf86\"},\n {\"mcpName\":\"resolve_comments\",\"commandPath\":[\"tools\",\"run\",\"resolve-comments\"],\"group\":\"generic\",\"description\":\"Mark questions on a document as resolved. Only top-level comments with kind QUESTION can be resolved, and it needs edit access to the document (readers can comment but cannot resolve). Resolving cannot be undone. Each id is applied on its own; results report each id.\",\"inputSchema\":{\"additionalProperties\":false,\"properties\":{\"documentUuid\":{\"description\":\"Document UUID the comments belong to\",\"type\":\"string\"},\"ids\":{\"description\":\"Question ids to resolve (top-level comments with kind QUESTION)\",\"items\":{\"minimum\":1,\"type\":\"integer\"},\"minItems\":1,\"type\":\"array\"}},\"required\":[\"documentUuid\",\"ids\"],\"type\":\"object\"},\"required\":[\"documentUuid\",\"ids\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"7b32b72b3a0d64ba\"},\n {\"mcpName\":\"restore_versions\",\"commandPath\":[\"versions\",\"restore\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Restores\",\"items\":{\"properties\":{\"documentUuid\":{\"description\":\"Document UUID\",\"type\":\"string\"},\"versionNumber\":{\"description\":\"Version number to restore\",\"type\":\"integer\"}},\"required\":[\"documentUuid\",\"versionNumber\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"prod\",\"schemaHash\":\"005b5b08a19fc605\"},\n {\"mcpName\":\"search_documents\",\"commandPath\":[\"documents\",\"search\"],\"group\":\"document\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"limit\":{\"description\":\"결과 개수 (기본 20, 최대 50)\",\"type\":\"integer\"},\"offset\":{\"description\":\"페이지네이션 offset (기본 0)\",\"type\":\"integer\"},\"projectUuid\":{\"description\":\"특정 프로젝트로 한정 (선택)\",\"type\":\"string\"},\"q\":{\"description\":\"검색 키워드\",\"type\":\"string\"},\"type\":{\"description\":\"Optional document type filter. Readable values: erd, markdown, diagram, openapi, html, file.\",\"enum\":[\"erd\",\"markdown\",\"diagram\",\"openapi\",\"html\",\"file\"],\"type\":\"string\"}},\"required\":[\"q\"],\"type\":\"object\"},\"required\":[\"q\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"e82abba1358754e8\"},\n {\"mcpName\":\"unarchive_documents\",\"commandPath\":[\"documents\",\"unarchive\"],\"group\":\"document\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuids\":{\"description\":\"Document UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"uuids\"],\"type\":\"object\"},\"required\":[\"uuids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"prod\",\"schemaHash\":\"f2810e71583a320f\"},\n {\"mcpName\":\"unarchive_folders\",\"commandPath\":[\"folders\",\"unarchive\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuids\":{\"description\":\"Folder UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"uuids\"],\"type\":\"object\"},\"required\":[\"uuids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"prod\",\"schemaHash\":\"2a24cc44696b7906\"},\n {\"mcpName\":\"unarchive_projects\",\"commandPath\":[\"projects\",\"unarchive\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuids\":{\"description\":\"Project UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"uuids\"],\"type\":\"object\"},\"required\":[\"uuids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"prod\",\"schemaHash\":\"6925e444671afe19\"},\n {\"mcpName\":\"unarchive_workspaces\",\"commandPath\":[\"workspaces\",\"unarchive\"],\"group\":\"workspace\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuids\":{\"description\":\"Workspace UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"uuids\"],\"type\":\"object\"},\"required\":[\"uuids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"prod\",\"schemaHash\":\"8dafe9bc6378c3f2\"},\n {\"mcpName\":\"update_comments\",\"commandPath\":[\"comments\",\"update\"],\"group\":\"generic\",\"description\":\"Edit your own comments on a document. Only the author can edit, and only while they can still read the document. A resolved question and a top-level comment that already has replies are locked. Items are applied in order and each one commits on its own; results report each item.\",\"inputSchema\":{\"additionalProperties\":false,\"properties\":{\"documentUuid\":{\"description\":\"Document UUID the comments belong to\",\"type\":\"string\"},\"items\":{\"description\":\"Edits, applied in order\",\"items\":{\"additionalProperties\":false,\"properties\":{\"body\":{\"description\":\"New comment text (replaces the old text).\",\"maxLength\":10000,\"minLength\":1,\"type\":\"string\"},\"clientMutationId\":{\"description\":\"Idempotency key (visible ASCII, at most 128 characters). Required when mentionUserIds is not empty; reuse the same value when retrying the same item so the mention email is not sent twice.\",\"maxLength\":128,\"type\":\"string\"},\"id\":{\"description\":\"Comment id (from mcp__ainecto__list_comments)\",\"minimum\":1,\"type\":\"integer\"},\"mentionUserIds\":{\"description\":\"The complete set of userIds mentioned after the edit; omit to remove all mentions. Each one's @<displayName> must appear in body. Only people who were not mentioned before get a notification email.\",\"items\":{\"type\":\"string\"},\"maxItems\":20,\"type\":\"array\",\"uniqueItems\":true}},\"required\":[\"id\",\"body\"],\"type\":\"object\"},\"minItems\":1,\"type\":\"array\"},\"mailLanguage\":{\"description\":\"Language of the mention notification email. Defaults to en.\",\"enum\":[\"en\",\"ko\"],\"type\":\"string\"}},\"required\":[\"documentUuid\",\"items\"],\"type\":\"object\"},\"required\":[\"documentUuid\",\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"fa37fedfdebd8d54\"},\n {\"mcpName\":\"update_documents\",\"commandPath\":[\"documents\",\"update\"],\"group\":\"document\",\"description\":\"Update documents. If a replacement body is tens of KB or more, prefer request_upload_token (purpose=document.update) and upload the body with curl.\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Updates\",\"items\":{\"properties\":{\"body\":{\"description\":\"Deprecated compatibility alias for typePayload.body when document type is markdown. 본문이 수십 KB 이상으로 크면 LLM 토큰 절약을 위해 `request_upload_token (purpose=document.update)` 를 호출해 uploadUrl 을 받고 curl 로 직접 PUT 으로 보낼 것.\",\"type\":\"string\"},\"title\":{\"description\":\"New title\",\"type\":\"string\"},\"typePayload\":{\"description\":\"Type-specific payload for enabled document types. markdown: {body}; diagram: {diagramSource,sourceLanguage,edgeStyle,isModule,metadata}; openapi: {content}; html: {content} (a full HTML page); file: {file:{filename,contentType,sizeBytes,viewerKind}} (+content for text/CSV, first 64 KB).\",\"type\":\"object\"},\"uuid\":{\"description\":\"Document UUID\",\"type\":\"string\"}},\"required\":[\"uuid\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"c2088f9ef5b49c6c\"},\n {\"mcpName\":\"update_folders\",\"commandPath\":[\"folders\",\"update\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Updates\",\"items\":{\"properties\":{\"name\":{\"description\":\"New name\",\"type\":\"string\"},\"uuid\":{\"description\":\"Folder UUID\",\"type\":\"string\"}},\"required\":[\"uuid\",\"name\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"43c58a96ee632b5f\"},\n {\"mcpName\":\"update_projects\",\"commandPath\":[\"projects\",\"update\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Updates\",\"items\":{\"properties\":{\"description\":{\"description\":\"New description\",\"type\":\"string\"},\"name\":{\"description\":\"New name\",\"type\":\"string\"},\"uuid\":{\"description\":\"Project UUID\",\"type\":\"string\"}},\"required\":[\"uuid\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"7d849ef0a830aa8c\"},\n {\"mcpName\":\"update_workspaces\",\"commandPath\":[\"workspaces\",\"update\"],\"group\":\"workspace\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Updates\",\"items\":{\"properties\":{\"description\":{\"description\":\"New description\",\"type\":\"string\"},\"name\":{\"description\":\"New name\",\"type\":\"string\"},\"uuid\":{\"description\":\"Workspace UUID\",\"type\":\"string\"}},\"required\":[\"uuid\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"553275e6da799c5a\"},\n {\"mcpName\":\"upload_attachments\",\"commandPath\":[\"tools\",\"run\",\"upload-attachments\"],\"group\":\"attachment\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Attachments to register\",\"items\":{\"properties\":{\"contentType\":{\"description\":\"MIME type\",\"type\":\"string\"},\"documentUuid\":{\"description\":\"Parent document UUID\",\"type\":\"string\"},\"filename\":{\"description\":\"Original file name\",\"type\":\"string\"},\"sizeBytes\":{\"description\":\"Size in bytes\",\"type\":\"integer\"},\"storageKey\":{\"description\":\"Storage key returned by request_upload_token purpose=attachment.upload\",\"type\":\"string\"}},\"required\":[\"documentUuid\",\"filename\",\"storageKey\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"binary-upload\",\"destructive\":false,\"sourceCatalog\":\"prod\",\"schemaHash\":\"deda4a56fbbe064f\"},\n] satisfies GeneratedToolDefinition[];\n","import type { GeneratedToolDefinition } from \"./types\";\n\nexport const generatedTools = [\n {\"mcpName\":\"mcp__ainecto__create_documents\",\"commandPath\":[\"documents\",\"create\"],\"group\":\"document\",\"description\":\"Create documents. If a document body is tens of KB or more, prefer request_upload_token (purpose=document.create) and upload the body with curl.\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Documents\",\"items\":{\"properties\":{\"body\":{\"description\":\"Deprecated compatibility alias for typePayload.body when document type is markdown. 본문이 수십 KB 이상으로 크면 LLM 토큰 절약을 위해 `request_upload_token (purpose=document.create)` 를 호출해 uploadUrl 을 받고 curl 로 직접 PUT 으로 보낼 것.\",\"type\":\"string\"},\"folderUuid\":{\"description\":\"Optional folder UUID\",\"type\":\"string\"},\"projectUuid\":{\"description\":\"Project UUID\",\"type\":\"string\"},\"title\":{\"description\":\"Document title\",\"type\":\"string\"},\"type\":{\"description\":\"Document type. Enabled values: erd, diagram, markdown, testcase, task.\",\"enum\":[\"erd\",\"diagram\",\"markdown\",\"testcase\",\"task\"],\"type\":\"string\"},\"typePayload\":{\"description\":\"Type-specific payload for enabled document types. markdown: {body}; diagram: {diagramSource,sourceLanguage,edgeStyle,isModule,metadata}; testcase: {defaultEnvironment (max 50 chars), defaultTestAccount (max 100 chars)}; task: no typePayload; board and default statuses are seeded automatically.\",\"type\":\"object\"}},\"required\":[\"projectUuid\",\"type\",\"title\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"6abbab093274fceb\"},\n {\"mcpName\":\"mcp__ainecto__create_folders\",\"commandPath\":[\"folders\",\"create\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Folders\",\"items\":{\"properties\":{\"name\":{\"description\":\"Folder name\",\"type\":\"string\"},\"parentFolderUuid\":{\"description\":\"Parent folder UUID\",\"type\":\"string\"},\"projectUuid\":{\"description\":\"Project UUID\",\"type\":\"string\"}},\"required\":[\"projectUuid\",\"name\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"d423d3c265631664\"},\n {\"mcpName\":\"mcp__ainecto__create_projects\",\"commandPath\":[\"projects\",\"create\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Projects\",\"items\":{\"properties\":{\"description\":{\"description\":\"Description\",\"type\":\"string\"},\"name\":{\"description\":\"Project name\",\"type\":\"string\"},\"projectKey\":{\"description\":\"Unique project key\",\"type\":\"string\"},\"workspaceUuid\":{\"description\":\"Workspace UUID — null uses user's default workspace\",\"type\":\"string\"}},\"required\":[\"name\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"396c80c6cc2ba41a\"},\n {\"mcpName\":\"mcp__ainecto__create_workspaces\",\"commandPath\":[\"workspaces\",\"create\"],\"group\":\"workspace\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Workspaces\",\"items\":{\"properties\":{\"description\":{\"description\":\"Description\",\"type\":\"string\"},\"name\":{\"description\":\"Workspace name\",\"type\":\"string\"}},\"required\":[\"name\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"d663d461f9c9da65\"},\n {\"mcpName\":\"mcp__ainecto__delete_attachments\",\"commandPath\":[\"attachments\",\"delete\"],\"group\":\"attachment\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuids\":{\"description\":\"Attachment UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"uuids\"],\"type\":\"object\"},\"required\":[\"uuids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"dev\",\"schemaHash\":\"6e55e6511d732199\"},\n {\"mcpName\":\"mcp__ainecto__delete_documents\",\"commandPath\":[\"documents\",\"delete\"],\"group\":\"document\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuids\":{\"description\":\"Document UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"uuids\"],\"type\":\"object\"},\"required\":[\"uuids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"dev\",\"schemaHash\":\"5fbc7c142bb4a49d\"},\n {\"mcpName\":\"mcp__ainecto__delete_folders\",\"commandPath\":[\"folders\",\"delete\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuids\":{\"description\":\"Folder UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"uuids\"],\"type\":\"object\"},\"required\":[\"uuids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"dev\",\"schemaHash\":\"49fa7c0f823871b2\"},\n {\"mcpName\":\"mcp__ainecto__delete_projects\",\"commandPath\":[\"projects\",\"delete\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuids\":{\"description\":\"Project UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"uuids\"],\"type\":\"object\"},\"required\":[\"uuids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"dev\",\"schemaHash\":\"e1a86ddaa9638298\"},\n {\"mcpName\":\"mcp__ainecto__delete_workspaces\",\"commandPath\":[\"workspaces\",\"delete\"],\"group\":\"workspace\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuids\":{\"description\":\"Workspace UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"uuids\"],\"type\":\"object\"},\"required\":[\"uuids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"dev\",\"schemaHash\":\"2aca644f7a105b06\"},\n {\"mcpName\":\"mcp__ainecto__diagram_apply_changes\",\"commandPath\":[\"tools\",\"run\",\"diagram-apply-changes\"],\"group\":\"generic\",\"description\":\"Required single-call mutation path for diagram node/edge/group create/update/delete changes. Put nodes, edges, and groups in one request and call this once. Do not look for type-specific diagram CUD tools; this tool is the only diagram CUD entry point.\",\"inputSchema\":{\"properties\":{\"description\":{\"description\":\"Reason for batch (audit)\",\"type\":\"string\"},\"diagramUuid\":{\"description\":\"Diagram UUID\",\"type\":\"string\"},\"edges\":{\"description\":\"Edge operations\",\"items\":{\"properties\":{\"action\":{\"description\":\"Operation kind\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"bridgeType\":{\"description\":\"Bridge type\",\"type\":\"string\"},\"fromUuid\":{\"description\":\"Source\",\"type\":\"string\"},\"label\":{\"description\":\"Edge label\",\"type\":\"string\"},\"lineStyle\":{\"description\":\"Line style\",\"type\":\"string\"},\"strokeColor\":{\"description\":\"Stroke color\",\"type\":\"string\"},\"strokeWidth\":{\"description\":\"Stroke width\",\"type\":\"integer\"},\"toUuid\":{\"description\":\"Target\",\"type\":\"string\"},\"uuid\":{\"description\":\"Required for update/delete\",\"type\":\"string\"}},\"required\":[\"action\"],\"type\":\"object\"},\"type\":\"array\"},\"groups\":{\"description\":\"Group operations\",\"items\":{\"properties\":{\"action\":{\"description\":\"Operation kind\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"collapsed\":{\"description\":\"Collapsed state\",\"type\":\"boolean\"},\"color\":{\"description\":\"Group color\",\"type\":\"string\"},\"linkMode\":{\"description\":\"Link mode\",\"type\":\"string\"},\"linkedDiagramUuid\":{\"description\":\"Linked diagram UUID\",\"type\":\"string\"},\"name\":{\"description\":\"Group name\",\"type\":\"string\"},\"parentGroupUuid\":{\"description\":\"Parent group UUID\",\"type\":\"string\"},\"sortOrder\":{\"description\":\"Sort order\",\"type\":\"integer\"},\"uuid\":{\"description\":\"Required for update/delete\",\"type\":\"string\"}},\"required\":[\"action\"],\"type\":\"object\"},\"type\":\"array\"},\"nodes\":{\"description\":\"Node operations\",\"items\":{\"properties\":{\"action\":{\"description\":\"Operation kind\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"fillColor\":{\"description\":\"Fill color\",\"type\":\"string\"},\"groupUuid\":{\"description\":\"Group UUID; empty string clears membership\",\"type\":\"string\"},\"height\":{\"description\":\"Height\",\"type\":\"number\"},\"shape\":{\"description\":\"Node shape (start/end/diamond/cylinder/parallelogram/stadium/hexagon/rect/roundRect/...)\",\"enum\":[\"rect\",\"roundRect\",\"stadium\",\"diamond\",\"decision\",\"circle\",\"start\",\"doubleCircle\",\"end\",\"hexagon\",\"cylinder\",\"parallelogram\"],\"type\":\"string\"},\"strokeColor\":{\"description\":\"Stroke color\",\"type\":\"string\"},\"text\":{\"description\":\"Node text/label. Supports newlines (\\\\n) for multi-line display.\",\"maxLength\":4000,\"type\":\"string\"},\"textColor\":{\"description\":\"Text color\",\"type\":\"string\"},\"type\":{\"description\":\"Node type\",\"type\":\"string\"},\"uuid\":{\"description\":\"Required for update/delete; optional for create\",\"type\":\"string\"},\"width\":{\"description\":\"Width\",\"type\":\"number\"},\"x\":{\"description\":\"X\",\"type\":\"number\"},\"y\":{\"description\":\"Y\",\"type\":\"number\"}},\"required\":[\"action\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"diagramUuid\",\"description\"],\"type\":\"object\"},\"required\":[\"description\",\"diagramUuid\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"1c87428fea4bb77a\"},\n {\"mcpName\":\"mcp__ainecto__diagram_get_edge\",\"commandPath\":[\"tools\",\"run\",\"diagram-get-edge\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"edgeUuid\":{\"description\":\"Edge UUID\",\"type\":\"string\"}},\"required\":[\"edgeUuid\"],\"type\":\"object\"},\"required\":[\"edgeUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"b147277e74d3b0f7\"},\n {\"mcpName\":\"mcp__ainecto__diagram_get_group\",\"commandPath\":[\"tools\",\"run\",\"diagram-get-group\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"groupUuid\":{\"description\":\"Group UUID\",\"type\":\"string\"}},\"required\":[\"groupUuid\"],\"type\":\"object\"},\"required\":[\"groupUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"4516fc00303ab8db\"},\n {\"mcpName\":\"mcp__ainecto__diagram_get_node\",\"commandPath\":[\"tools\",\"run\",\"diagram-get-node\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"nodeUuid\":{\"description\":\"Node UUID\",\"type\":\"string\"}},\"required\":[\"nodeUuid\"],\"type\":\"object\"},\"required\":[\"nodeUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"20f370ff4438c4b0\"},\n {\"mcpName\":\"mcp__ainecto__diagram_get_pending_llm_requests\",\"commandPath\":[\"tools\",\"run\",\"diagram-get-pending-llm-requests\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{},\"type\":\"object\"},\"required\":[],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"0ec4dd6d61584a98\"},\n {\"mcpName\":\"mcp__ainecto__diagram_list_edges\",\"commandPath\":[\"tools\",\"run\",\"diagram-list-edges\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"diagramUuid\":{\"description\":\"Diagram document UUID\",\"type\":\"string\"}},\"required\":[\"diagramUuid\"],\"type\":\"object\"},\"required\":[\"diagramUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"fee200dd1433daf9\"},\n {\"mcpName\":\"mcp__ainecto__diagram_list_groups\",\"commandPath\":[\"tools\",\"run\",\"diagram-list-groups\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"diagramUuid\":{\"description\":\"Diagram document UUID\",\"type\":\"string\"}},\"required\":[\"diagramUuid\"],\"type\":\"object\"},\"required\":[\"diagramUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"852a19cda307f863\"},\n {\"mcpName\":\"mcp__ainecto__diagram_list_nodes\",\"commandPath\":[\"tools\",\"run\",\"diagram-list-nodes\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"diagramUuid\":{\"description\":\"Diagram document UUID\",\"type\":\"string\"}},\"required\":[\"diagramUuid\"],\"type\":\"object\"},\"required\":[\"diagramUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"a8c41752151ade3e\"},\n {\"mcpName\":\"mcp__ainecto__diagram_submit_llm_result\",\"commandPath\":[\"tools\",\"run\",\"diagram-submit-llm-result\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"creditsCharged\":{\"description\":\"Deprecated; ignored. Credits are calculated server-side from tokens.\",\"type\":\"integer\"},\"inputTokens\":{\"description\":\"Input token count\",\"type\":\"integer\"},\"outputTokens\":{\"description\":\"Output token count\",\"type\":\"integer\"},\"result\":{\"description\":\"LLM result text\",\"type\":\"string\"},\"uuid\":{\"description\":\"LLM request UUID\",\"type\":\"string\"}},\"required\":[\"uuid\",\"result\"],\"type\":\"object\"},\"required\":[\"result\",\"uuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"374654baa87c1bb8\"},\n {\"mcpName\":\"mcp__ainecto__diagram_update_llm_request_status\",\"commandPath\":[\"tools\",\"run\",\"diagram-update-llm-request-status\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"errorMessage\":{\"description\":\"Error message (when status=FAILED)\",\"type\":\"string\"},\"status\":{\"description\":\"Target status — currently only FAILED is mutable from caller side\",\"enum\":[\"FAILED\"],\"type\":\"string\"},\"uuid\":{\"description\":\"LLM request UUID\",\"type\":\"string\"}},\"required\":[\"uuid\",\"status\"],\"type\":\"object\"},\"required\":[\"status\",\"uuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"25537b63698bc33d\"},\n {\"mcpName\":\"mcp__ainecto__disable_shares\",\"commandPath\":[\"tools\",\"run\",\"disable-shares\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"targetType\":{\"description\":\"Share target type\",\"enum\":[\"project\",\"folder\",\"document\"],\"type\":\"string\"},\"targetUuids\":{\"description\":\"Target UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"targetType\",\"targetUuids\"],\"type\":\"object\"},\"required\":[\"targetType\",\"targetUuids\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"a4b4358eff0faa97\"},\n {\"mcpName\":\"mcp__ainecto__enable_shares\",\"commandPath\":[\"tools\",\"run\",\"enable-shares\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"targetType\":{\"description\":\"Share target type\",\"enum\":[\"project\",\"folder\",\"document\"],\"type\":\"string\"},\"targetUuids\":{\"description\":\"Target UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"targetType\",\"targetUuids\"],\"type\":\"object\"},\"required\":[\"targetType\",\"targetUuids\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"ebace643de07e826\"},\n {\"mcpName\":\"mcp__ainecto__erd_apply_changes\",\"commandPath\":[\"erd\",\"apply-changes\"],\"group\":\"erd\",\"description\":\"Required single-call mutation path for ERD create/update/delete changes. Put tables, columns, indexes, refs, enums, enum_values, and table groups in one operations array and call this once.\\nRules: (1) all data field names are snake_case; (2) for create, generate your own UUIDs and put them in data.uuid, then later operations in the same batch may reference those UUIDs without read-back calls; (3) enum values are separate enum_value operations, not inline on enum; (4) ref.relationship uses short dbdiagram-style symbols: >, <, or -; (5) ref_column operations map FK columns explicitly, never automatically.\\nDo not look for type-specific ERD CUD tools; this tool is the only ERD CUD entry point. If operations is very large, use mcp__ainecto__request_upload_token with purpose=mcp.call and send the tools/call payload with curl to save LLM tokens.\\nOne-call worked example:\\n{\\n \\\"documentUuid\\\": \\\"erd-doc-uuid\\\",\\n \\\"description\\\": \\\"create users/posts ERD\\\",\\n \\\"operations\\\": [\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"table\\\",\\\"data\\\":{\\\"uuid\\\":\\\"tbl_users\\\",\\\"name\\\":\\\"users\\\",\\\"display_order\\\":1}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"column\\\",\\\"data\\\":{\\\"uuid\\\":\\\"col_users_id\\\",\\\"table_uuid\\\":\\\"tbl_users\\\",\\\"name\\\":\\\"id\\\",\\\"type\\\":\\\"bigint\\\",\\\"is_pk\\\":true,\\\"is_not_null\\\":true,\\\"display_order\\\":1}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"column\\\",\\\"data\\\":{\\\"uuid\\\":\\\"col_users_email\\\",\\\"table_uuid\\\":\\\"tbl_users\\\",\\\"name\\\":\\\"email\\\",\\\"type\\\":\\\"varchar(255)\\\",\\\"is_unique\\\":true,\\\"is_not_null\\\":true,\\\"display_order\\\":2}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"table\\\",\\\"data\\\":{\\\"uuid\\\":\\\"tbl_posts\\\",\\\"name\\\":\\\"posts\\\",\\\"display_order\\\":2}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"column\\\",\\\"data\\\":{\\\"uuid\\\":\\\"col_posts_id\\\",\\\"table_uuid\\\":\\\"tbl_posts\\\",\\\"name\\\":\\\"id\\\",\\\"type\\\":\\\"bigint\\\",\\\"is_pk\\\":true,\\\"is_not_null\\\":true,\\\"display_order\\\":1}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"column\\\",\\\"data\\\":{\\\"uuid\\\":\\\"col_posts_author_id\\\",\\\"table_uuid\\\":\\\"tbl_posts\\\",\\\"name\\\":\\\"author_id\\\",\\\"type\\\":\\\"bigint\\\",\\\"is_not_null\\\":true,\\\"display_order\\\":2}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"column\\\",\\\"data\\\":{\\\"uuid\\\":\\\"col_posts_status\\\",\\\"table_uuid\\\":\\\"tbl_posts\\\",\\\"name\\\":\\\"status\\\",\\\"type\\\":\\\"post_status\\\",\\\"is_not_null\\\":true,\\\"display_order\\\":3}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"enum\\\",\\\"data\\\":{\\\"uuid\\\":\\\"enum_post_status\\\",\\\"name\\\":\\\"post_status\\\"}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"enum_value\\\",\\\"data\\\":{\\\"uuid\\\":\\\"enum_post_status_draft\\\",\\\"enum_uuid\\\":\\\"enum_post_status\\\",\\\"value\\\":\\\"draft\\\",\\\"display_order\\\":1}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"enum_value\\\",\\\"data\\\":{\\\"uuid\\\":\\\"enum_post_status_published\\\",\\\"enum_uuid\\\":\\\"enum_post_status\\\",\\\"value\\\":\\\"published\\\",\\\"display_order\\\":2}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"ref\\\",\\\"data\\\":{\\\"uuid\\\":\\\"ref_posts_author\\\",\\\"name\\\":\\\"fk_posts_author\\\",\\\"from_table_uuid\\\":\\\"tbl_posts\\\",\\\"to_table_uuid\\\":\\\"tbl_users\\\",\\\"relationship\\\":\\\">\\\",\\\"on_delete\\\":\\\"cascade\\\"}},\\n {\\\"op\\\":\\\"create\\\",\\\"type\\\":\\\"ref_column\\\",\\\"data\\\":{\\\"uuid\\\":\\\"refcol_posts_author\\\",\\\"ref_uuid\\\":\\\"ref_posts_author\\\",\\\"from_column_uuid\\\":\\\"col_posts_author_id\\\",\\\"to_column_uuid\\\":\\\"col_users_id\\\",\\\"display_order\\\":1}}\\n ]\\n}\",\"inputSchema\":{\"properties\":{\"arrangeNewTables\":{\"description\":\"Whether to auto-place newly-created tables after the batch; defaults to true\",\"type\":\"boolean\"},\"description\":{\"description\":\"Reason for batch (audit)\",\"type\":\"string\"},\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"},\"operations\":{\"description\":\"Atomic create/update/delete operations\",\"items\":{\"description\":\"One ERD mutation. Use a single operations array with client-generated data.uuid values to create cross-referenced tables, columns, enums, refs, and ref_columns without read-back calls.\",\"discriminator\":{\"propertyName\":\"type\"},\"oneOf\":[{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='table'.\",\"properties\":{\"alias\":{\"description\":\"Display alias.\",\"type\":\"string\"},\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"header_color\":{\"description\":\"Header color.\",\"type\":\"string\"},\"name\":{\"description\":\"Table name. Required for create.\",\"type\":\"string\"},\"note\":{\"description\":\"Table note.\",\"type\":\"string\"},\"schema_name\":{\"description\":\"Schema name.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"required\":[\"name\"],\"title\":\"table data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='table'.\",\"properties\":{\"alias\":{\"description\":\"Display alias.\",\"type\":\"string\"},\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"header_color\":{\"description\":\"Header color.\",\"type\":\"string\"},\"name\":{\"description\":\"Table name. Required for create.\",\"type\":\"string\"},\"note\":{\"description\":\"Table note.\",\"type\":\"string\"},\"schema_name\":{\"description\":\"Schema name.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"table data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"table\",\"description\":\"Must be 'table' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"table operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='column'.\",\"properties\":{\"default_value\":{\"description\":\"Default value.\",\"type\":\"string\"},\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"is_increment\":{\"description\":\"Auto-increment flag.\",\"type\":\"boolean\"},\"is_not_null\":{\"description\":\"Not-null flag.\",\"type\":\"boolean\"},\"is_pk\":{\"description\":\"Primary key flag.\",\"type\":\"boolean\"},\"is_unique\":{\"description\":\"Unique flag.\",\"type\":\"boolean\"},\"name\":{\"description\":\"Column name.\",\"type\":\"string\"},\"note\":{\"description\":\"Column note.\",\"type\":\"string\"},\"table_uuid\":{\"description\":\"Parent table UUID. Required for create; may be a data.uuid from an earlier table operation in this batch.\",\"type\":\"string\"},\"type\":{\"description\":\"SQL data type. Use this exact field name; do not send data_type.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"required\":[\"table_uuid\"],\"title\":\"column data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='column'.\",\"properties\":{\"default_value\":{\"description\":\"Default value.\",\"type\":\"string\"},\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"is_increment\":{\"description\":\"Auto-increment flag.\",\"type\":\"boolean\"},\"is_not_null\":{\"description\":\"Not-null flag.\",\"type\":\"boolean\"},\"is_pk\":{\"description\":\"Primary key flag.\",\"type\":\"boolean\"},\"is_unique\":{\"description\":\"Unique flag.\",\"type\":\"boolean\"},\"name\":{\"description\":\"Column name.\",\"type\":\"string\"},\"note\":{\"description\":\"Column note.\",\"type\":\"string\"},\"table_uuid\":{\"description\":\"Parent table UUID. Required for create; may be a data.uuid from an earlier table operation in this batch.\",\"type\":\"string\"},\"type\":{\"description\":\"SQL data type. Use this exact field name; do not send data_type.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"column data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"column\",\"description\":\"Must be 'column' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"column operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='index'.\",\"properties\":{\"is_pk\":{\"description\":\"Primary key index flag.\",\"type\":\"boolean\"},\"is_unique\":{\"description\":\"Unique index flag.\",\"type\":\"boolean\"},\"name\":{\"description\":\"Index name.\",\"type\":\"string\"},\"note\":{\"description\":\"Index note.\",\"type\":\"string\"},\"table_uuid\":{\"description\":\"Parent table UUID. Required for create.\",\"type\":\"string\"},\"type\":{\"description\":\"Index type.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"required\":[\"table_uuid\"],\"title\":\"index data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='index'.\",\"properties\":{\"is_pk\":{\"description\":\"Primary key index flag.\",\"type\":\"boolean\"},\"is_unique\":{\"description\":\"Unique index flag.\",\"type\":\"boolean\"},\"name\":{\"description\":\"Index name.\",\"type\":\"string\"},\"note\":{\"description\":\"Index note.\",\"type\":\"string\"},\"table_uuid\":{\"description\":\"Parent table UUID. Required for create.\",\"type\":\"string\"},\"type\":{\"description\":\"Index type.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"index data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"index\",\"description\":\"Must be 'index' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"index operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='index_column'.\",\"properties\":{\"column_uuid\":{\"description\":\"Column UUID. Required for create.\",\"type\":\"string\"},\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"index_uuid\":{\"description\":\"Index UUID. Required for create.\",\"type\":\"string\"},\"sort_order\":{\"description\":\"Sort order, for example ASC or DESC.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"required\":[\"index_uuid\",\"column_uuid\"],\"title\":\"index_column data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='index_column'.\",\"properties\":{\"column_uuid\":{\"description\":\"Column UUID. Required for create.\",\"type\":\"string\"},\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"index_uuid\":{\"description\":\"Index UUID. Required for create.\",\"type\":\"string\"},\"sort_order\":{\"description\":\"Sort order, for example ASC or DESC.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"index_column data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"index_column\",\"description\":\"Must be 'index_column' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"index_column operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='ref'.\",\"properties\":{\"from_table_uuid\":{\"description\":\"Source table UUID. Required for create.\",\"type\":\"string\"},\"name\":{\"description\":\"Reference name.\",\"type\":\"string\"},\"on_delete\":{\"description\":\"ON DELETE action.\",\"type\":\"string\"},\"on_update\":{\"description\":\"ON UPDATE action.\",\"type\":\"string\"},\"relationship\":{\"description\":\"Required for create. Use short dbdiagram-style relationship symbols.\",\"enum\":[\">\",\"<\",\"-\"],\"type\":\"string\"},\"to_table_uuid\":{\"description\":\"Target table UUID. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"required\":[\"from_table_uuid\",\"to_table_uuid\",\"relationship\"],\"title\":\"ref data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='ref'.\",\"properties\":{\"from_table_uuid\":{\"description\":\"Source table UUID. Required for create.\",\"type\":\"string\"},\"name\":{\"description\":\"Reference name.\",\"type\":\"string\"},\"on_delete\":{\"description\":\"ON DELETE action.\",\"type\":\"string\"},\"on_update\":{\"description\":\"ON UPDATE action.\",\"type\":\"string\"},\"relationship\":{\"description\":\"Required for create. Use short dbdiagram-style relationship symbols.\",\"enum\":[\">\",\"<\",\"-\"],\"type\":\"string\"},\"to_table_uuid\":{\"description\":\"Target table UUID. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"ref data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"ref\",\"description\":\"Must be 'ref' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"ref operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='ref_column'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"from_column_uuid\":{\"description\":\"Source column UUID. Required for create.\",\"type\":\"string\"},\"ref_uuid\":{\"description\":\"Reference UUID. Required for create; may be a data.uuid from an earlier ref operation.\",\"type\":\"string\"},\"to_column_uuid\":{\"description\":\"Target column UUID. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"required\":[\"ref_uuid\",\"from_column_uuid\",\"to_column_uuid\"],\"title\":\"ref_column data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='ref_column'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"from_column_uuid\":{\"description\":\"Source column UUID. Required for create.\",\"type\":\"string\"},\"ref_uuid\":{\"description\":\"Reference UUID. Required for create; may be a data.uuid from an earlier ref operation.\",\"type\":\"string\"},\"to_column_uuid\":{\"description\":\"Target column UUID. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"ref_column data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"ref_column\",\"description\":\"Must be 'ref_column' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"ref_column operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='enum'.\",\"properties\":{\"name\":{\"description\":\"Enum name.\",\"type\":\"string\"},\"note\":{\"description\":\"Enum note.\",\"type\":\"string\"},\"schema_name\":{\"description\":\"Schema name.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"enum data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='enum'.\",\"properties\":{\"name\":{\"description\":\"Enum name.\",\"type\":\"string\"},\"note\":{\"description\":\"Enum note.\",\"type\":\"string\"},\"schema_name\":{\"description\":\"Schema name.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"enum data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"enum\",\"description\":\"Must be 'enum' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"enum operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='enum_value'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"enum_uuid\":{\"description\":\"Parent enum UUID. Required for create; may be a data.uuid from an earlier enum operation.\",\"type\":\"string\"},\"note\":{\"description\":\"Enum value note.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"},\"value\":{\"description\":\"Enum value. Inline enum values on enum are not persisted; create enum_value operations.\",\"type\":\"string\"}},\"required\":[\"enum_uuid\"],\"title\":\"enum_value data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='enum_value'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"enum_uuid\":{\"description\":\"Parent enum UUID. Required for create; may be a data.uuid from an earlier enum operation.\",\"type\":\"string\"},\"note\":{\"description\":\"Enum value note.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"},\"value\":{\"description\":\"Enum value. Inline enum values on enum are not persisted; create enum_value operations.\",\"type\":\"string\"}},\"title\":\"enum_value data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"enum_value\",\"description\":\"Must be 'enum_value' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"enum_value operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='table_group'.\",\"properties\":{\"color\":{\"description\":\"Group color.\",\"type\":\"string\"},\"name\":{\"description\":\"Table group name.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"table_group data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='table_group'.\",\"properties\":{\"color\":{\"description\":\"Group color.\",\"type\":\"string\"},\"name\":{\"description\":\"Table group name.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"table_group data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"table_group\",\"description\":\"Must be 'table_group' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"table_group operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='table_group_table'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"group_uuid\":{\"description\":\"Table group UUID. Required for create.\",\"type\":\"string\"},\"schema_name\":{\"description\":\"Table schema name.\",\"type\":\"string\"},\"table_name\":{\"description\":\"Table name. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"required\":[\"group_uuid\",\"table_name\"],\"title\":\"table_group_table data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='table_group_table'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"group_uuid\":{\"description\":\"Table group UUID. Required for create.\",\"type\":\"string\"},\"schema_name\":{\"description\":\"Table schema name.\",\"type\":\"string\"},\"table_name\":{\"description\":\"Table name. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"table_group_table data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"table_group_table\",\"description\":\"Must be 'table_group_table' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"table_group_table operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='table_group_note'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"group_uuid\":{\"description\":\"Table group UUID. Required for create.\",\"type\":\"string\"},\"note_uuid\":{\"description\":\"Note UUID. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"required\":[\"group_uuid\",\"note_uuid\"],\"title\":\"table_group_note data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='table_group_note'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"group_uuid\":{\"description\":\"Table group UUID. Required for create.\",\"type\":\"string\"},\"note_uuid\":{\"description\":\"Note UUID. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"table_group_note data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"table_group_note\",\"description\":\"Must be 'table_group_note' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"table_group_note operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='filter'.\",\"properties\":{\"included_tables\":{\"description\":\"JSON string/list of included tables.\",\"type\":\"string\"},\"is_default\":{\"description\":\"Default filter flag.\",\"type\":\"boolean\"},\"name\":{\"description\":\"Filter name.\",\"type\":\"string\"},\"table_groups\":{\"description\":\"JSON string/object of table groups.\",\"type\":\"string\"},\"table_positions\":{\"description\":\"JSON string/object of table positions.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"filter data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='filter'.\",\"properties\":{\"included_tables\":{\"description\":\"JSON string/list of included tables.\",\"type\":\"string\"},\"is_default\":{\"description\":\"Default filter flag.\",\"type\":\"boolean\"},\"name\":{\"description\":\"Filter name.\",\"type\":\"string\"},\"table_groups\":{\"description\":\"JSON string/object of table groups.\",\"type\":\"string\"},\"table_positions\":{\"description\":\"JSON string/object of table positions.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"filter data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"filter\",\"description\":\"Must be 'filter' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"filter operation\",\"type\":\"object\"},{\"allOf\":[{\"if\":{\"properties\":{\"op\":{\"const\":\"create\",\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{\"data\":{\"description\":\"Payload for operation.type='note'.\",\"properties\":{\"color\":{\"description\":\"Note color.\",\"type\":\"string\"},\"content\":{\"description\":\"Note content.\",\"type\":\"string\"},\"height\":{\"description\":\"Height.\",\"type\":\"integer\"},\"icon_name\":{\"description\":\"Icon name.\",\"type\":\"string\"},\"position_x\":{\"description\":\"X position.\",\"type\":\"integer\"},\"position_y\":{\"description\":\"Y position.\",\"type\":\"integer\"},\"title\":{\"description\":\"Note title.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"},\"width\":{\"description\":\"Width.\",\"type\":\"integer\"}},\"title\":\"note data\",\"type\":\"object\"}},\"required\":[\"data\"],\"type\":\"object\"}},{\"if\":{\"properties\":{\"op\":{\"enum\":[\"update\",\"delete\"],\"type\":\"string\"}},\"required\":[\"op\"],\"type\":\"object\"},\"then\":{\"properties\":{},\"required\":[\"uuid\"],\"type\":\"object\"}}],\"properties\":{\"data\":{\"description\":\"Payload for operation.type='note'.\",\"properties\":{\"color\":{\"description\":\"Note color.\",\"type\":\"string\"},\"content\":{\"description\":\"Note content.\",\"type\":\"string\"},\"height\":{\"description\":\"Height.\",\"type\":\"integer\"},\"icon_name\":{\"description\":\"Icon name.\",\"type\":\"string\"},\"position_x\":{\"description\":\"X position.\",\"type\":\"integer\"},\"position_y\":{\"description\":\"Y position.\",\"type\":\"integer\"},\"title\":{\"description\":\"Note title.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"},\"width\":{\"description\":\"Width.\",\"type\":\"integer\"}},\"title\":\"note data\",\"type\":\"object\"},\"op\":{\"description\":\"Operation\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"const\":\"note\",\"description\":\"Must be 'note' for this payload.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"title\":\"note operation\",\"type\":\"object\"}],\"properties\":{\"data\":{\"description\":\"Type-specific payload. All field names are snake_case. For create, data.uuid may be client-supplied and referenced by later operations in the same batch.\",\"oneOf\":[{\"description\":\"Payload for operation.type='table'.\",\"properties\":{\"alias\":{\"description\":\"Display alias.\",\"type\":\"string\"},\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"header_color\":{\"description\":\"Header color.\",\"type\":\"string\"},\"name\":{\"description\":\"Table name. Required for create.\",\"type\":\"string\"},\"note\":{\"description\":\"Table note.\",\"type\":\"string\"},\"schema_name\":{\"description\":\"Schema name.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"table data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='column'.\",\"properties\":{\"default_value\":{\"description\":\"Default value.\",\"type\":\"string\"},\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"is_increment\":{\"description\":\"Auto-increment flag.\",\"type\":\"boolean\"},\"is_not_null\":{\"description\":\"Not-null flag.\",\"type\":\"boolean\"},\"is_pk\":{\"description\":\"Primary key flag.\",\"type\":\"boolean\"},\"is_unique\":{\"description\":\"Unique flag.\",\"type\":\"boolean\"},\"name\":{\"description\":\"Column name.\",\"type\":\"string\"},\"note\":{\"description\":\"Column note.\",\"type\":\"string\"},\"table_uuid\":{\"description\":\"Parent table UUID. Required for create; may be a data.uuid from an earlier table operation in this batch.\",\"type\":\"string\"},\"type\":{\"description\":\"SQL data type. Use this exact field name; do not send data_type.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"column data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='index'.\",\"properties\":{\"is_pk\":{\"description\":\"Primary key index flag.\",\"type\":\"boolean\"},\"is_unique\":{\"description\":\"Unique index flag.\",\"type\":\"boolean\"},\"name\":{\"description\":\"Index name.\",\"type\":\"string\"},\"note\":{\"description\":\"Index note.\",\"type\":\"string\"},\"table_uuid\":{\"description\":\"Parent table UUID. Required for create.\",\"type\":\"string\"},\"type\":{\"description\":\"Index type.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"index data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='index_column'.\",\"properties\":{\"column_uuid\":{\"description\":\"Column UUID. Required for create.\",\"type\":\"string\"},\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"index_uuid\":{\"description\":\"Index UUID. Required for create.\",\"type\":\"string\"},\"sort_order\":{\"description\":\"Sort order, for example ASC or DESC.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"index_column data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='ref'.\",\"properties\":{\"from_table_uuid\":{\"description\":\"Source table UUID. Required for create.\",\"type\":\"string\"},\"name\":{\"description\":\"Reference name.\",\"type\":\"string\"},\"on_delete\":{\"description\":\"ON DELETE action.\",\"type\":\"string\"},\"on_update\":{\"description\":\"ON UPDATE action.\",\"type\":\"string\"},\"relationship\":{\"description\":\"Required for create. Use short dbdiagram-style relationship symbols.\",\"enum\":[\">\",\"<\",\"-\"],\"type\":\"string\"},\"to_table_uuid\":{\"description\":\"Target table UUID. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"ref data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='ref_column'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"from_column_uuid\":{\"description\":\"Source column UUID. Required for create.\",\"type\":\"string\"},\"ref_uuid\":{\"description\":\"Reference UUID. Required for create; may be a data.uuid from an earlier ref operation.\",\"type\":\"string\"},\"to_column_uuid\":{\"description\":\"Target column UUID. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"ref_column data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='enum'.\",\"properties\":{\"name\":{\"description\":\"Enum name.\",\"type\":\"string\"},\"note\":{\"description\":\"Enum note.\",\"type\":\"string\"},\"schema_name\":{\"description\":\"Schema name.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"enum data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='enum_value'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"enum_uuid\":{\"description\":\"Parent enum UUID. Required for create; may be a data.uuid from an earlier enum operation.\",\"type\":\"string\"},\"note\":{\"description\":\"Enum value note.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"},\"value\":{\"description\":\"Enum value. Inline enum values on enum are not persisted; create enum_value operations.\",\"type\":\"string\"}},\"title\":\"enum_value data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='table_group'.\",\"properties\":{\"color\":{\"description\":\"Group color.\",\"type\":\"string\"},\"name\":{\"description\":\"Table group name.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"table_group data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='table_group_table'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"group_uuid\":{\"description\":\"Table group UUID. Required for create.\",\"type\":\"string\"},\"schema_name\":{\"description\":\"Table schema name.\",\"type\":\"string\"},\"table_name\":{\"description\":\"Table name. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"table_group_table data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='table_group_note'.\",\"properties\":{\"display_order\":{\"description\":\"Display order.\",\"type\":\"integer\"},\"group_uuid\":{\"description\":\"Table group UUID. Required for create.\",\"type\":\"string\"},\"note_uuid\":{\"description\":\"Note UUID. Required for create.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"table_group_note data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='filter'.\",\"properties\":{\"included_tables\":{\"description\":\"JSON string/list of included tables.\",\"type\":\"string\"},\"is_default\":{\"description\":\"Default filter flag.\",\"type\":\"boolean\"},\"name\":{\"description\":\"Filter name.\",\"type\":\"string\"},\"table_groups\":{\"description\":\"JSON string/object of table groups.\",\"type\":\"string\"},\"table_positions\":{\"description\":\"JSON string/object of table positions.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"}},\"title\":\"filter data\",\"type\":\"object\"},{\"description\":\"Payload for operation.type='note'.\",\"properties\":{\"color\":{\"description\":\"Note color.\",\"type\":\"string\"},\"content\":{\"description\":\"Note content.\",\"type\":\"string\"},\"height\":{\"description\":\"Height.\",\"type\":\"integer\"},\"icon_name\":{\"description\":\"Icon name.\",\"type\":\"string\"},\"position_x\":{\"description\":\"X position.\",\"type\":\"integer\"},\"position_y\":{\"description\":\"Y position.\",\"type\":\"integer\"},\"title\":{\"description\":\"Note title.\",\"type\":\"string\"},\"uuid\":{\"description\":\"Optional on create: client-generated UUID. If supplied, later operations in the same batch can reference it. Do not put create UUIDs in operation.uuid; operation.uuid is only the update/delete target.\",\"type\":\"string\"},\"width\":{\"description\":\"Width.\",\"type\":\"integer\"}},\"title\":\"note data\",\"type\":\"object\"}],\"type\":\"object\"},\"op\":{\"description\":\"Operation. For create, put any new UUID in data.uuid; for update/delete, put target UUID in operation.uuid.\",\"enum\":[\"create\",\"update\",\"delete\"],\"type\":\"string\"},\"type\":{\"description\":\"ERD entity type. This selects the operation.data shape.\",\"enum\":[\"table\",\"column\",\"index\",\"index_column\",\"ref\",\"ref_column\",\"enum\",\"enum_value\",\"table_group\",\"table_group_table\",\"table_group_note\",\"filter\",\"note\"],\"type\":\"string\"},\"uuid\":{\"description\":\"Target UUID for update/delete. Do not use this for create; use data.uuid instead.\",\"type\":\"string\"}},\"required\":[\"op\",\"type\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"documentUuid\",\"description\",\"operations\"],\"type\":\"object\"},\"required\":[\"description\",\"documentUuid\",\"operations\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"dd64d1f996060ab1\"},\n {\"mcpName\":\"mcp__ainecto__erd_arrange_tables\",\"commandPath\":[\"erd\",\"arrange-tables\"],\"group\":\"erd\",\"description\":\"Arrange ERD tables after edits. Default incremental mode places newly-created tables while preserving existing positions; full=true re-layouts the entire diagram. Use after several separate table edits to tidy the canvas.\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"},\"full\":{\"description\":\"Re-layout the ENTIRE diagram (overwrites existing positions). Default false = arrange only newly-added (uncoordinated) tables to the top-right while preserving existing table positions. Call this after creating several tables to tidy them up.\",\"type\":\"boolean\"}},\"required\":[\"documentUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"d2e66548e3d60d30\"},\n {\"mcpName\":\"mcp__ainecto__erd_get_enum\",\"commandPath\":[\"erd\",\"get-enum\"],\"group\":\"erd\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"},\"enumUuid\":{\"description\":\"Enum UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\",\"enumUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\",\"enumUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"1e477b3fadb50c6b\"},\n {\"mcpName\":\"mcp__ainecto__erd_get_ref\",\"commandPath\":[\"erd\",\"get-ref\"],\"group\":\"erd\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"},\"refUuid\":{\"description\":\"Relationship UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\",\"refUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\",\"refUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"40bf1eb02e7a9730\"},\n {\"mcpName\":\"mcp__ainecto__erd_get_table\",\"commandPath\":[\"erd\",\"get-table\"],\"group\":\"erd\",\"description\":\"Get one ERD table with nested columns and indexes. Returns persistent table/column/index UUIDs usable directly as mcp__ainecto__erd_apply_changes update/delete targets and ref_column column references. Column fields use apply_changes snake_case names: uuid, table_uuid, name, type, is_pk, is_unique, is_not_null, is_increment, default_value, note, display_order. Index fields include uuid, name, columns (column UUIDs), is_unique, is_pk, type.\",\"inputSchema\":{\"description\":\"Get one ERD table with nested columns and indexes. Returns persistent table/column/index UUIDs usable directly as mcp__ainecto__erd_apply_changes update/delete targets and ref_column column references. Column fields use apply_changes snake_case names: uuid, table_uuid, name, type, is_pk, is_unique, is_not_null, is_increment, default_value, note, display_order. Index fields include uuid, name, columns (column UUIDs), is_unique, is_pk, type.\",\"properties\":{\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"},\"tableUuid\":{\"description\":\"Table UUID. Response includes columns[] and indexes[] with persistent UUIDs for apply_changes.\",\"type\":\"string\"}},\"required\":[\"documentUuid\",\"tableUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\",\"tableUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"8edd40794f39f47a\"},\n {\"mcpName\":\"mcp__ainecto__erd_get_table_group\",\"commandPath\":[\"erd\",\"get-table-group\"],\"group\":\"erd\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"},\"tableGroupUuid\":{\"description\":\"Table group UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\",\"tableGroupUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\",\"tableGroupUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"bcd417344639c0c9\"},\n {\"mcpName\":\"mcp__ainecto__erd_list_enums\",\"commandPath\":[\"erd\",\"list-enums\"],\"group\":\"erd\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"e0c2207905dbb068\"},\n {\"mcpName\":\"mcp__ainecto__erd_list_refs\",\"commandPath\":[\"erd\",\"list-refs\"],\"group\":\"erd\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"9ae2e04c310b57f2\"},\n {\"mcpName\":\"mcp__ainecto__erd_list_table_groups\",\"commandPath\":[\"erd\",\"list-table-groups\"],\"group\":\"erd\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"dc8811071df04ac2\"},\n {\"mcpName\":\"mcp__ainecto__erd_list_tables\",\"commandPath\":[\"erd\",\"list-tables\"],\"group\":\"erd\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"ERD document UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"ca05b35b174fc209\"},\n {\"mcpName\":\"mcp__ainecto__get_attachment\",\"commandPath\":[\"attachment\",\"get\"],\"group\":\"attachment\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuid\":{\"description\":\"Attachment UUID\",\"type\":\"string\"}},\"required\":[\"uuid\"],\"type\":\"object\"},\"required\":[\"uuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"12bee70f6d254a5d\"},\n {\"mcpName\":\"mcp__ainecto__get_document\",\"commandPath\":[\"document\",\"get\"],\"group\":\"document\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuid\":{\"description\":\"Document UUID\",\"type\":\"string\"}},\"required\":[\"uuid\"],\"type\":\"object\"},\"required\":[\"uuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"4949c8a5bb425491\"},\n {\"mcpName\":\"mcp__ainecto__get_project\",\"commandPath\":[\"project\",\"get\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuid\":{\"description\":\"Project UUID\",\"type\":\"string\"}},\"required\":[\"uuid\"],\"type\":\"object\"},\"required\":[\"uuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"b4ee9097f4b80df4\"},\n {\"mcpName\":\"mcp__ainecto__get_version\",\"commandPath\":[\"version\",\"get\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"Document UUID\",\"type\":\"string\"},\"versionNumber\":{\"description\":\"Version number\",\"type\":\"integer\"}},\"required\":[\"documentUuid\",\"versionNumber\"],\"type\":\"object\"},\"required\":[\"documentUuid\",\"versionNumber\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"ad81d04200d3d7f5\"},\n {\"mcpName\":\"mcp__ainecto__get_workspace\",\"commandPath\":[\"workspace\",\"get\"],\"group\":\"workspace\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuid\":{\"description\":\"Workspace UUID\",\"type\":\"string\"}},\"required\":[\"uuid\"],\"type\":\"object\"},\"required\":[\"uuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"ef7bae555463116e\"},\n {\"mcpName\":\"mcp__ainecto__list_attachments\",\"commandPath\":[\"attachments\",\"list\"],\"group\":\"attachment\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"projectUuid\":{\"description\":\"Project UUID\",\"type\":\"string\"}},\"required\":[\"projectUuid\"],\"type\":\"object\"},\"required\":[\"projectUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"a75657bb2e5eb383\"},\n {\"mcpName\":\"mcp__ainecto__list_documents\",\"commandPath\":[\"documents\",\"list\"],\"group\":\"document\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"folderUuid\":{\"description\":\"Optional folder UUID\",\"type\":\"string\"},\"limit\":{\"description\":\"Result cap when q is set (default 50)\",\"type\":\"integer\"},\"projectUuid\":{\"description\":\"Project UUID\",\"type\":\"string\"},\"q\":{\"description\":\"Optional full-text query. When provided, results come from the search index instead of folder listing.\",\"type\":\"string\"},\"type\":{\"description\":\"Optional document type filter. Enabled values: erd, diagram, markdown, testcase, task.\",\"enum\":[\"erd\",\"diagram\",\"markdown\",\"testcase\",\"task\"],\"type\":\"string\"}},\"type\":\"object\"},\"required\":[],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"e5d92431322ac0e3\"},\n {\"mcpName\":\"mcp__ainecto__list_folders\",\"commandPath\":[\"folders\",\"list\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"projectUuid\":{\"description\":\"Project UUID\",\"type\":\"string\"}},\"required\":[\"projectUuid\"],\"type\":\"object\"},\"required\":[\"projectUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"f3cde57fe87d375c\"},\n {\"mcpName\":\"mcp__ainecto__list_projects\",\"commandPath\":[\"projects\",\"list\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"limit\":{\"description\":\"Result cap when q is set (default 50)\",\"type\":\"integer\"},\"q\":{\"description\":\"Optional full-text query\",\"type\":\"string\"},\"workspaceUuid\":{\"description\":\"Optional Workspace UUID\",\"type\":\"string\"}},\"type\":\"object\"},\"required\":[],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"9174d6965d7e53f5\"},\n {\"mcpName\":\"mcp__ainecto__list_trash\",\"commandPath\":[\"trash\",\"list\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{},\"type\":\"object\"},\"required\":[],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"82f8586d68bfcd7d\"},\n {\"mcpName\":\"mcp__ainecto__list_versions\",\"commandPath\":[\"versions\",\"list\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"Document UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"370e4b8b8ec18e18\"},\n {\"mcpName\":\"mcp__ainecto__list_workspaces\",\"commandPath\":[\"workspaces\",\"list\"],\"group\":\"workspace\",\"description\":\"\",\"inputSchema\":{\"properties\":{},\"type\":\"object\"},\"required\":[],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"7c32c74000696b2f\"},\n {\"mcpName\":\"mcp__ainecto__markdown_append_document\",\"commandPath\":[\"markdown\",\"append-document\"],\"group\":\"markdown\",\"description\":\"Append to Markdown documents. If the appended body is tens of KB or more, prefer request_upload_token (purpose=document.append) and upload the body with curl.\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Appends\",\"items\":{\"properties\":{\"addition\":{\"description\":\"Body addition. 추가할 내용이 크면 (수십 KB 이상) LLM 토큰 절약을 위해 `request_upload_token (purpose=document.append, scopeJson={documentUuid, separator})` 로 uploadUrl 을 받고 curl 로 PUT 으로 보낼 것.\",\"type\":\"string\"},\"separator\":{\"description\":\"Separator between existing body and addition\",\"type\":\"string\"},\"uuid\":{\"description\":\"Document UUID\",\"type\":\"string\"}},\"required\":[\"uuid\",\"addition\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"f189514b3cccd1cc\"},\n {\"mcpName\":\"mcp__ainecto__markdown_generate_document\",\"commandPath\":[\"markdown\",\"generate-document\"],\"group\":\"markdown\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Generation requests\",\"items\":{\"properties\":{\"context\":{\"description\":\"Optional JSON context\",\"type\":\"string\"},\"documentUuid\":{\"description\":\"Target document UUID\",\"type\":\"string\"},\"prompt\":{\"description\":\"Generation prompt\",\"type\":\"string\"}},\"required\":[\"documentUuid\",\"prompt\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"72114a2d2642ed92\"},\n {\"mcpName\":\"mcp__ainecto__move_documents\",\"commandPath\":[\"documents\",\"move\"],\"group\":\"document\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"clientMutationId\":{\"description\":\"Optional mutation identifier for client retry tracing\",\"maxLength\":128,\"minLength\":1,\"pattern\":\"^[\\\\x21-\\\\x7E]{1,128}$\",\"type\":\"string\"},\"items\":{\"description\":\"Moves\",\"items\":{\"properties\":{\"newFolderUuid\":{\"description\":\"New folder UUID — null/empty for root\",\"type\":\"string\"},\"targetProjectUuid\":{\"description\":\"Target project UUID — omit to stay in current project\",\"type\":\"string\"},\"targetWorkspaceUuid\":{\"description\":\"Guard only: must match targetProjectUuid workspace\",\"type\":\"string\"},\"uuid\":{\"description\":\"Document UUID\",\"type\":\"string\"}},\"required\":[\"uuid\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"dev\",\"schemaHash\":\"9758d6a262913a3f\"},\n {\"mcpName\":\"mcp__ainecto__move_folders\",\"commandPath\":[\"folders\",\"move\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Moves\",\"items\":{\"properties\":{\"newParentFolderUuid\":{\"description\":\"New parent UUID — null/empty for root\",\"type\":\"string\"},\"uuid\":{\"description\":\"Folder UUID\",\"type\":\"string\"}},\"required\":[\"uuid\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"dev\",\"schemaHash\":\"612a779b1fd176bb\"},\n {\"mcpName\":\"mcp__ainecto__request_upload_token\",\"commandPath\":[\"tools\",\"run\",\"request-upload-token\"],\"group\":\"attachment\",\"description\":\"Use this for large payloads of tens of KB or more to save LLM tokens. purpose=mcp.call returns a short-lived bearer token that can call any MCP tool, including mcp__ainecto__erd_apply_changes, via curl. purpose=document.create/update/append uploads document bodies directly to the upload endpoint with PUT/curl. Tokens are reusable for 5 minutes by default.\",\"inputSchema\":{\"properties\":{\"maxBytes\":{\"description\":\"최대 업로드 byte (서버 측 한도)\",\"type\":\"integer\"},\"purpose\":{\"description\":\"Token 용도. `mcp.call` 은 curl 로 /mcp 호출, `document.create/update/append` 는 PUT body 로 본문 업로드, `attachment.upload` 는 파일 bytes 업로드. 콘텐츠가 크면 (수십 KB 이상) LLM 토큰 절약을 위해 이 도구로 5분 재사용 토큰을 받고 curl 로 보내는 것을 강력 권장.\",\"enum\":[\"mcp.call\",\"document.create\",\"document.update\",\"document.append\",\"attachment.upload\"],\"type\":\"string\"},\"scopeJson\":{\"description\":\"선택 — JSON scope. document.create 는 projectUuid, type, title 을 포함하고 enabled type values 는 erd, diagram, markdown, testcase, task. document.update/document.append 는 documentUuid 를 포함. attachment.upload: {documentUuid, filename, contentType?, sizeBytes?}; storageKey 는 서버가 발급 scope 에 추가.\",\"type\":\"string\"},\"ttlSeconds\":{\"description\":\"TTL (초). 기본 300 (5분)\",\"type\":\"integer\"}},\"required\":[\"purpose\"],\"type\":\"object\"},\"required\":[\"purpose\"],\"payloadMode\":\"binary-upload\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"cc5db0cc4a9d9603\"},\n {\"mcpName\":\"mcp__ainecto__restore_versions\",\"commandPath\":[\"versions\",\"restore\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Restores\",\"items\":{\"properties\":{\"documentUuid\":{\"description\":\"Document UUID\",\"type\":\"string\"},\"versionNumber\":{\"description\":\"Version number to restore\",\"type\":\"integer\"}},\"required\":[\"documentUuid\",\"versionNumber\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"dev\",\"schemaHash\":\"c4f448cc3b96c7a6\"},\n {\"mcpName\":\"mcp__ainecto__search_documents\",\"commandPath\":[\"documents\",\"search\"],\"group\":\"document\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"limit\":{\"description\":\"결과 개수 (기본 20, 최대 50)\",\"type\":\"integer\"},\"offset\":{\"description\":\"페이지네이션 offset (기본 0)\",\"type\":\"integer\"},\"projectUuid\":{\"description\":\"특정 프로젝트로 한정 (선택)\",\"type\":\"string\"},\"q\":{\"description\":\"검색 키워드\",\"type\":\"string\"},\"type\":{\"description\":\"Optional document type filter. Enabled values: erd, diagram, markdown, testcase, task.\",\"enum\":[\"erd\",\"diagram\",\"markdown\",\"testcase\",\"task\"],\"type\":\"string\"}},\"required\":[\"q\"],\"type\":\"object\"},\"required\":[\"q\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"89efa02eab3c01a1\"},\n {\"mcpName\":\"mcp__ainecto__task_apply_changes\",\"commandPath\":[\"task\",\"apply-changes\"],\"group\":\"task\",\"description\":\"Task CUD entry point. Applies one atomic batch using operation objects shaped exactly as {op, uuid, data}. There is no partial success mode; any validation failure aborts the whole batch.\",\"inputSchema\":{\"examples\":[{\"baseRevision\":1,\"clientMutationId\":\"task-mutation-1\",\"documentUuid\":\"task-document-uuid\",\"operations\":[{\"data\":{\"parentTaskUuid\":null,\"title\":\"Task title\"},\"op\":\"create_task\",\"uuid\":\"client-task-uuid\"}]}],\"properties\":{\"baseRevision\":{\"description\":\"Current board revision from task_get_snapshot\",\"type\":\"integer\"},\"clientMutationId\":{\"description\":\"Optional idempotency key. Visible ASCII, 1-128 chars; will become required in a later phase.\",\"maxLength\":128,\"minLength\":1,\"pattern\":\"^[\\\\x21-\\\\x7E]{1,128}$\",\"type\":\"string\"},\"documentUuid\":{\"description\":\"Task document UUID\",\"type\":\"string\"},\"operations\":{\"description\":\"Atomic batch. No partial success mode; validation failure aborts all operations.\",\"items\":{\"additionalProperties\":false,\"properties\":{\"data\":{\"description\":\"Operation payload. Keep all operation-specific fields inside data.\",\"type\":\"object\"},\"op\":{\"description\":\"Operation type\",\"enum\":[\"create_task\",\"update_task\",\"archive_task\",\"restore_task\",\"move_task\",\"transition_task\",\"assign_task\",\"schedule_task\",\"set_progress\"],\"type\":\"string\"},\"uuid\":{\"description\":\"Task UUID. For create_task this is the client-generated UUID.\",\"type\":\"string\"}},\"required\":[\"op\",\"uuid\",\"data\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"documentUuid\",\"baseRevision\",\"operations\"],\"type\":\"object\"},\"required\":[\"baseRevision\",\"documentUuid\",\"operations\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"085eb6e8a3eae2c8\"},\n {\"mcpName\":\"mcp__ainecto__task_get_snapshot\",\"commandPath\":[\"task\",\"get-snapshot\"],\"group\":\"task\",\"description\":\"Get one Task document snapshot. Returns board revision, statuses, tasks, member summaries, and permissions. Use before mutations to obtain baseRevision.\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"Task document UUID\",\"type\":\"string\"},\"includeArchived\":{\"description\":\"Whether to include archived tasks\",\"type\":\"boolean\"},\"limit\":{\"description\":\"Maximum tasks to return; defaults to server snapshot cap\",\"type\":\"integer\"}},\"required\":[\"documentUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"a11876f9b475338a\"},\n {\"mcpName\":\"mcp__ainecto__task_get_task\",\"commandPath\":[\"task\",\"get-task\"],\"group\":\"task\",\"description\":\"Get one task by UUID from a Task document.\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"Task document UUID\",\"type\":\"string\"},\"taskUuid\":{\"description\":\"Task UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\",\"taskUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\",\"taskUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"96b1ea530c583337\"},\n {\"mcpName\":\"mcp__ainecto__task_list_statuses\",\"commandPath\":[\"task\",\"list-statuses\"],\"group\":\"task\",\"description\":\"List statuses for a Task document. Status slug is intentionally not returned.\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"Task document UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"864ea509c54fe2e7\"},\n {\"mcpName\":\"mcp__ainecto__task_list_tasks\",\"commandPath\":[\"task\",\"list-tasks\"],\"group\":\"task\",\"description\":\"List tasks in a Task document with optional parent/status/assignee filters.\",\"inputSchema\":{\"properties\":{\"assigneeUserId\":{\"description\":\"Optional assignee user id filter\",\"type\":\"string\"},\"documentUuid\":{\"description\":\"Task document UUID\",\"type\":\"string\"},\"includeArchived\":{\"description\":\"Whether to include archived tasks\",\"type\":\"boolean\"},\"limit\":{\"description\":\"Maximum tasks to return\",\"type\":\"integer\"},\"parentTaskUuid\":{\"description\":\"Optional parent filter\",\"type\":\"string\"},\"statusUuid\":{\"description\":\"Optional status filter\",\"type\":\"string\"}},\"required\":[\"documentUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"be8dc0a4ecd117a8\"},\n {\"mcpName\":\"mcp__ainecto__testcase_archive_scenarios\",\"commandPath\":[\"testcase\",\"archive-scenarios\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"ids\":{\"description\":\"Scenario ids\",\"items\":{\"type\":\"integer\"},\"type\":\"array\"}},\"required\":[\"ids\"],\"type\":\"object\"},\"required\":[\"ids\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"a5a8768d14ebaed7\"},\n {\"mcpName\":\"mcp__ainecto__testcase_complete_runs\",\"commandPath\":[\"testcase\",\"complete-runs\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"ids\":{\"description\":\"Run ids\",\"items\":{\"type\":\"integer\"},\"type\":\"array\"}},\"required\":[\"ids\"],\"type\":\"object\"},\"required\":[\"ids\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"84bc3dad482ac61a\"},\n {\"mcpName\":\"mcp__ainecto__testcase_create_runs\",\"commandPath\":[\"testcase\",\"create-runs\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Runs\",\"items\":{\"properties\":{\"buildVersion\":{\"description\":\"Build version\",\"type\":\"string\"},\"description\":{\"description\":\"Description\",\"type\":\"string\"},\"environment\":{\"description\":\"Environment\",\"type\":\"string\"},\"name\":{\"description\":\"Run name\",\"type\":\"string\"},\"projectId\":{\"description\":\"Project id\",\"type\":\"integer\"},\"testAccount\":{\"description\":\"SUT test account\",\"type\":\"string\"},\"testCaseIds\":{\"description\":\"Test case ids to attach\",\"items\":{\"type\":\"integer\"},\"type\":\"array\"}},\"required\":[\"projectId\",\"name\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"6a08117c79f589a1\"},\n {\"mcpName\":\"mcp__ainecto__testcase_create_scenarios\",\"commandPath\":[\"testcase\",\"create-scenarios\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Scenarios\",\"items\":{\"properties\":{\"description\":{\"description\":\"Description\",\"type\":\"string\"},\"documentUuid\":{\"description\":\"Parent testcase document UUID\",\"type\":\"string\"},\"name\":{\"description\":\"Scenario name\",\"type\":\"string\"},\"parentId\":{\"description\":\"Parent scenario id\",\"type\":\"integer\"}},\"required\":[\"documentUuid\",\"name\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"4686fd0f078a65e8\"},\n {\"mcpName\":\"mcp__ainecto__testcase_create_testcases\",\"commandPath\":[\"testcase\",\"create-testcases\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Testcases\",\"items\":{\"properties\":{\"assigneeId\":{\"description\":\"Assignee user id\",\"type\":\"string\"},\"expectedResult\":{\"description\":\"Expected result\",\"type\":\"string\"},\"precondition\":{\"description\":\"Precondition\",\"type\":\"string\"},\"priority\":{\"description\":\"Priority\",\"enum\":[\"LOW\",\"MEDIUM\",\"HIGH\",\"CRITICAL\"],\"type\":\"string\"},\"scenarioId\":{\"description\":\"Scenario id (required)\",\"type\":\"integer\"},\"source\":{\"description\":\"Source\",\"enum\":[\"MANUAL\",\"AI\",\"IMPORT\",\"MCP\"],\"type\":\"string\"},\"status\":{\"description\":\"Status\",\"enum\":[\"DRAFT\",\"READY\",\"DEPRECATED\"],\"type\":\"string\"},\"tags\":{\"description\":\"Tags\",\"type\":\"string\"},\"testAccount\":{\"description\":\"SUT test account\",\"type\":\"string\"},\"title\":{\"description\":\"Title\",\"type\":\"string\"},\"type\":{\"description\":\"Type\",\"enum\":[\"FUNCTIONAL\",\"REGRESSION\",\"SMOKE\",\"PERFORMANCE\",\"SECURITY\",\"E2E\",\"UNIT\",\"INTEGRATION\"],\"type\":\"string\"}},\"required\":[\"scenarioId\",\"title\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"ae90d4749debacf0\"},\n {\"mcpName\":\"mcp__ainecto__testcase_delete_runs\",\"commandPath\":[\"testcase\",\"delete-runs\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"ids\":{\"description\":\"Run ids\",\"items\":{\"type\":\"integer\"},\"type\":\"array\"}},\"required\":[\"ids\"],\"type\":\"object\"},\"required\":[\"ids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"dev\",\"schemaHash\":\"1ba26baf794bde57\"},\n {\"mcpName\":\"mcp__ainecto__testcase_delete_testcases\",\"commandPath\":[\"testcase\",\"delete-testcases\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"ids\":{\"description\":\"Testcase ids\",\"items\":{\"type\":\"integer\"},\"type\":\"array\"}},\"required\":[\"ids\"],\"type\":\"object\"},\"required\":[\"ids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"dev\",\"schemaHash\":\"ab095f553bf46937\"},\n {\"mcpName\":\"mcp__ainecto__testcase_get_run\",\"commandPath\":[\"testcase\",\"get-run\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"id\":{\"description\":\"Run id\",\"type\":\"integer\"}},\"required\":[\"id\"],\"type\":\"object\"},\"required\":[\"id\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"713c83514cf07d68\"},\n {\"mcpName\":\"mcp__ainecto__testcase_get_testcase\",\"commandPath\":[\"testcase\",\"get-testcase\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"id\":{\"description\":\"Testcase id\",\"type\":\"integer\"}},\"required\":[\"id\"],\"type\":\"object\"},\"required\":[\"id\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"54e497a2e3c9978d\"},\n {\"mcpName\":\"mcp__ainecto__testcase_list_executions\",\"commandPath\":[\"testcase\",\"list-executions\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"runId\":{\"description\":\"Run id\",\"type\":\"integer\"}},\"required\":[\"runId\"],\"type\":\"object\"},\"required\":[\"runId\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"a5a2abcf9e43225e\"},\n {\"mcpName\":\"mcp__ainecto__testcase_list_runs\",\"commandPath\":[\"testcase\",\"list-runs\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"projectId\":{\"description\":\"Project id\",\"type\":\"integer\"}},\"required\":[\"projectId\"],\"type\":\"object\"},\"required\":[\"projectId\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"b7d5275b67bb11d9\"},\n {\"mcpName\":\"mcp__ainecto__testcase_list_scenarios\",\"commandPath\":[\"testcase\",\"list-scenarios\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"Parent testcase document UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"2486ade3c9cb0984\"},\n {\"mcpName\":\"mcp__ainecto__testcase_list_step_checks\",\"commandPath\":[\"testcase\",\"list-step-checks\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"caseId\":{\"description\":\"Testcase id\",\"type\":\"integer\"},\"runId\":{\"description\":\"Run id\",\"type\":\"integer\"}},\"required\":[\"runId\",\"caseId\"],\"type\":\"object\"},\"required\":[\"caseId\",\"runId\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"f2d5b45c0d64cd5c\"},\n {\"mcpName\":\"mcp__ainecto__testcase_list_testcases\",\"commandPath\":[\"testcase\",\"list-testcases\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"documentUuid\":{\"description\":\"Parent testcase document UUID\",\"type\":\"string\"}},\"required\":[\"documentUuid\"],\"type\":\"object\"},\"required\":[\"documentUuid\"],\"payloadMode\":\"flags\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"ef40927392d5a684\"},\n {\"mcpName\":\"mcp__ainecto__testcase_record_executions\",\"commandPath\":[\"testcase\",\"record-executions\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Executions\",\"items\":{\"properties\":{\"comment\":{\"description\":\"Comment\",\"type\":\"string\"},\"defectLinks\":{\"description\":\"Defect URLs\",\"type\":\"string\"},\"durationSeconds\":{\"description\":\"Duration in seconds\",\"type\":\"integer\"},\"result\":{\"description\":\"Result\",\"enum\":[\"PASSED\",\"FAILED\",\"BLOCKED\",\"SKIPPED\",\"UNTESTED\",\"IN_PROGRESS\"],\"type\":\"string\"},\"runId\":{\"description\":\"Run id\",\"type\":\"integer\"},\"testAccount\":{\"description\":\"SUT account\",\"type\":\"string\"},\"testCaseId\":{\"description\":\"Testcase id\",\"type\":\"integer\"}},\"required\":[\"runId\",\"testCaseId\",\"result\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"071a2075d00bff9b\"},\n {\"mcpName\":\"mcp__ainecto__testcase_remove_run_cases\",\"commandPath\":[\"testcase\",\"remove-run-cases\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"runId\":{\"description\":\"Run id\",\"type\":\"integer\"},\"testCaseIds\":{\"description\":\"Testcase ids to remove\",\"items\":{\"type\":\"integer\"},\"type\":\"array\"}},\"required\":[\"runId\",\"testCaseIds\"],\"type\":\"object\"},\"required\":[\"runId\",\"testCaseIds\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"7aef8a39afe88c5c\"},\n {\"mcpName\":\"mcp__ainecto__testcase_reorder_scenarios\",\"commandPath\":[\"testcase\",\"reorder-scenarios\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"ids\":{\"description\":\"Scenario ids in new order\",\"items\":{\"type\":\"integer\"},\"type\":\"array\"}},\"required\":[\"ids\"],\"type\":\"object\"},\"required\":[\"ids\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"7faf43a0b53c2988\"},\n {\"mcpName\":\"mcp__ainecto__testcase_reorder_testcases\",\"commandPath\":[\"testcase\",\"reorder-testcases\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"ids\":{\"description\":\"Testcase ids in new order\",\"items\":{\"type\":\"integer\"},\"type\":\"array\"}},\"required\":[\"ids\"],\"type\":\"object\"},\"required\":[\"ids\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"5f27d8b94aca5334\"},\n {\"mcpName\":\"mcp__ainecto__testcase_update_runs\",\"commandPath\":[\"testcase\",\"update-runs\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Updates\",\"items\":{\"properties\":{\"buildVersion\":{\"description\":\"New build version\",\"type\":\"string\"},\"description\":{\"description\":\"New description\",\"type\":\"string\"},\"environment\":{\"description\":\"New environment\",\"type\":\"string\"},\"id\":{\"description\":\"Run id\",\"type\":\"integer\"},\"name\":{\"description\":\"New name\",\"type\":\"string\"},\"status\":{\"description\":\"New status\",\"enum\":[\"DRAFT\",\"IN_PROGRESS\",\"COMPLETED\",\"CANCELLED\"],\"type\":\"string\"},\"testAccount\":{\"description\":\"New SUT account\",\"type\":\"string\"}},\"required\":[\"id\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"370074b6681d495f\"},\n {\"mcpName\":\"mcp__ainecto__testcase_update_scenarios\",\"commandPath\":[\"testcase\",\"update-scenarios\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Updates\",\"items\":{\"properties\":{\"id\":{\"description\":\"Scenario id\",\"type\":\"integer\"},\"name\":{\"description\":\"New name\",\"type\":\"string\"},\"parentId\":{\"description\":\"New parent id\",\"type\":\"integer\"}},\"required\":[\"id\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"929c8647c06c5fdd\"},\n {\"mcpName\":\"mcp__ainecto__testcase_update_testcases\",\"commandPath\":[\"testcase\",\"update-testcases\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Updates\",\"items\":{\"properties\":{\"assigneeId\":{\"description\":\"Assignee\",\"type\":\"string\"},\"expectedResult\":{\"description\":\"New expected result\",\"type\":\"string\"},\"id\":{\"description\":\"Testcase id\",\"type\":\"integer\"},\"precondition\":{\"description\":\"New precondition\",\"type\":\"string\"},\"priority\":{\"description\":\"Priority\",\"enum\":[\"LOW\",\"MEDIUM\",\"HIGH\",\"CRITICAL\"],\"type\":\"string\"},\"scenarioId\":{\"description\":\"New scenario id\",\"type\":\"integer\"},\"status\":{\"description\":\"Status\",\"enum\":[\"DRAFT\",\"READY\",\"DEPRECATED\"],\"type\":\"string\"},\"tags\":{\"description\":\"Tags\",\"type\":\"string\"},\"testAccount\":{\"description\":\"SUT account\",\"type\":\"string\"},\"title\":{\"description\":\"New title\",\"type\":\"string\"},\"type\":{\"description\":\"Type\",\"enum\":[\"FUNCTIONAL\",\"REGRESSION\",\"SMOKE\",\"PERFORMANCE\",\"SECURITY\",\"E2E\",\"UNIT\",\"INTEGRATION\"],\"type\":\"string\"}},\"required\":[\"id\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"b562a7b860f6036c\"},\n {\"mcpName\":\"mcp__ainecto__testcase_upsert_step_checks\",\"commandPath\":[\"testcase\",\"upsert-step-checks\"],\"group\":\"testcase\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"caseId\":{\"description\":\"Testcase id\",\"type\":\"integer\"},\"items\":{\"description\":\"Step checks\",\"items\":{\"properties\":{\"checked\":{\"description\":\"Checked state\",\"type\":\"boolean\"},\"comment\":{\"description\":\"Per-step note\",\"type\":\"string\"},\"stepId\":{\"description\":\"TestStep id\",\"type\":\"integer\"}},\"required\":[\"stepId\",\"checked\"],\"type\":\"object\"},\"type\":\"array\"},\"runId\":{\"description\":\"Run id\",\"type\":\"integer\"}},\"required\":[\"runId\",\"caseId\",\"items\"],\"type\":\"object\"},\"required\":[\"caseId\",\"items\",\"runId\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"ac5768125a9fd15c\"},\n {\"mcpName\":\"mcp__ainecto__unarchive_documents\",\"commandPath\":[\"documents\",\"unarchive\"],\"group\":\"document\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuids\":{\"description\":\"Document UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"uuids\"],\"type\":\"object\"},\"required\":[\"uuids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"dev\",\"schemaHash\":\"4aae7df04fba8779\"},\n {\"mcpName\":\"mcp__ainecto__unarchive_folders\",\"commandPath\":[\"folders\",\"unarchive\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuids\":{\"description\":\"Folder UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"uuids\"],\"type\":\"object\"},\"required\":[\"uuids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"dev\",\"schemaHash\":\"e307cab0ebafd179\"},\n {\"mcpName\":\"mcp__ainecto__unarchive_projects\",\"commandPath\":[\"projects\",\"unarchive\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuids\":{\"description\":\"Project UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"uuids\"],\"type\":\"object\"},\"required\":[\"uuids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"dev\",\"schemaHash\":\"15ea4a409d1549de\"},\n {\"mcpName\":\"mcp__ainecto__unarchive_workspaces\",\"commandPath\":[\"workspaces\",\"unarchive\"],\"group\":\"workspace\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"uuids\":{\"description\":\"Workspace UUIDs\",\"items\":{\"type\":\"string\"},\"type\":\"array\"}},\"required\":[\"uuids\"],\"type\":\"object\"},\"required\":[\"uuids\"],\"payloadMode\":\"file-json\",\"destructive\":true,\"sourceCatalog\":\"dev\",\"schemaHash\":\"641de5b64ec75ab2\"},\n {\"mcpName\":\"mcp__ainecto__update_documents\",\"commandPath\":[\"documents\",\"update\"],\"group\":\"document\",\"description\":\"Update documents. If a replacement body is tens of KB or more, prefer request_upload_token (purpose=document.update) and upload the body with curl.\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Updates\",\"items\":{\"properties\":{\"body\":{\"description\":\"Deprecated compatibility alias for typePayload.body when document type is markdown. 본문이 수십 KB 이상으로 크면 LLM 토큰 절약을 위해 `request_upload_token (purpose=document.update)` 를 호출해 uploadUrl 을 받고 curl 로 직접 PUT 으로 보낼 것.\",\"type\":\"string\"},\"title\":{\"description\":\"New title\",\"type\":\"string\"},\"typePayload\":{\"description\":\"Type-specific payload for enabled document types. markdown: {body}; diagram: {diagramSource,sourceLanguage,edgeStyle,isModule,metadata}; testcase: {defaultEnvironment (max 50 chars), defaultTestAccount (max 100 chars)}; task: no typePayload; board and default statuses are seeded automatically.\",\"type\":\"object\"},\"uuid\":{\"description\":\"Document UUID\",\"type\":\"string\"}},\"required\":[\"uuid\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"778908eec43aba81\"},\n {\"mcpName\":\"mcp__ainecto__update_folders\",\"commandPath\":[\"folders\",\"update\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Updates\",\"items\":{\"properties\":{\"name\":{\"description\":\"New name\",\"type\":\"string\"},\"uuid\":{\"description\":\"Folder UUID\",\"type\":\"string\"}},\"required\":[\"uuid\",\"name\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"7bef3b4702df1f00\"},\n {\"mcpName\":\"mcp__ainecto__update_projects\",\"commandPath\":[\"projects\",\"update\"],\"group\":\"generic\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Updates\",\"items\":{\"properties\":{\"description\":{\"description\":\"New description\",\"type\":\"string\"},\"name\":{\"description\":\"New name\",\"type\":\"string\"},\"uuid\":{\"description\":\"Project UUID\",\"type\":\"string\"}},\"required\":[\"uuid\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"10cc0d84aeb2192b\"},\n {\"mcpName\":\"mcp__ainecto__update_workspaces\",\"commandPath\":[\"workspaces\",\"update\"],\"group\":\"workspace\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Updates\",\"items\":{\"properties\":{\"description\":{\"description\":\"New description\",\"type\":\"string\"},\"name\":{\"description\":\"New name\",\"type\":\"string\"},\"uuid\":{\"description\":\"Workspace UUID\",\"type\":\"string\"}},\"required\":[\"uuid\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"file-json\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"723e4f6d36ee9d02\"},\n {\"mcpName\":\"mcp__ainecto__upload_attachments\",\"commandPath\":[\"tools\",\"run\",\"upload-attachments\"],\"group\":\"attachment\",\"description\":\"\",\"inputSchema\":{\"properties\":{\"items\":{\"description\":\"Attachments to register\",\"items\":{\"properties\":{\"contentType\":{\"description\":\"MIME type\",\"type\":\"string\"},\"documentUuid\":{\"description\":\"Parent document UUID\",\"type\":\"string\"},\"filename\":{\"description\":\"Original file name\",\"type\":\"string\"},\"sizeBytes\":{\"description\":\"Size in bytes\",\"type\":\"integer\"},\"storageKey\":{\"description\":\"Storage key returned by request_upload_token purpose=attachment.upload\",\"type\":\"string\"}},\"required\":[\"documentUuid\",\"filename\",\"storageKey\"],\"type\":\"object\"},\"type\":\"array\"}},\"required\":[\"items\"],\"type\":\"object\"},\"required\":[\"items\"],\"payloadMode\":\"binary-upload\",\"destructive\":false,\"sourceCatalog\":\"dev\",\"schemaHash\":\"0622e590de3404dd\"},\n] satisfies GeneratedToolDefinition[];\n","import { createHash } from \"node:crypto\";\nimport type { GeneratedToolDefinition, JsonSchema, McpToolListItem, PayloadMode, ToolGroup } from \"./types\";\n\n/**\n * 서버가 도구 이름 앞에 달던 prefix.\n *\n * ★2026-09-22 부터 서버는 이 prefix 를 «떼고» 내보낸다 — MCP 클라이언트가 자기 서버 별칭을\n * 한 번 더 얹기 때문에, 서버까지 붙이면 `mcp__ainecto__mcp__ainecto__list_projects` 가 된다.\n * 그래서 여기서는 prefix 를 «있으면 뗀다»로만 다룬다. 옛 카탈로그(이미 받아 둔 generated.*.ts)\n * 에는 긴 이름이 남아 있고 서버가 그것도 계속 받아주므로, 두 형태가 함께 산다.\n */\nconst LEGACY_PREFIX = \"mcp__ainecto__\";\n\n/**\n * 서버 prefix 를 뗀 «맨 이름». 카탈로그가 어느 판에서 왔든(긴 이름·짧은 이름) 같은 도구를 같은\n * 이름으로 가리키려면 이 한 곳을 거친다 — 표시 정보(enrichments)를 이름으로 붙일 때 특히.\n */\nexport function bareToolName(name: string): string {\n return name.startsWith(LEGACY_PREFIX) ? name.slice(LEGACY_PREFIX.length) : name;\n}\nconst DESTRUCTIVE_PREFIXES = [\n \"delete_\",\n \"remove_\",\n \"archive_\",\n \"unarchive_\",\n \"restore_\",\n \"move_\",\n \"erd_delete_\",\n \"erd_remove_\",\n \"task_delete_\",\n \"testcase_delete_\",\n];\n\nexport function generateCatalog(tools: McpToolListItem[], sourceCatalog: \"prod\" | \"dev\"): GeneratedToolDefinition[] {\n return tools\n .map((tool) => normalizeTool(tool, sourceCatalog))\n .sort((a, b) => a.mcpName.localeCompare(b.mcpName));\n}\n\nexport function normalizeTool(tool: McpToolListItem, sourceCatalog: \"prod\" | \"dev\"): GeneratedToolDefinition {\n if (!tool.name) {\n throw new Error(\"Unsupported tool name: empty.\");\n }\n const stripped = bareToolName(tool.name);\n const group = inferGroup(stripped);\n const inputSchema = normalizeSchema(tool.inputSchema ?? { type: \"object\", properties: {} });\n const required = Array.isArray(inputSchema.required)\n ? inputSchema.required.filter((value): value is string => typeof value === \"string\").sort()\n : [];\n const definition = {\n mcpName: tool.name,\n commandPath: generateCommandPath(stripped, group),\n group,\n description: tool.description ?? \"\",\n inputSchema,\n required,\n payloadMode: inferPayloadMode(stripped, inputSchema),\n destructive: inferDestructive(stripped, tool),\n sourceCatalog,\n schemaHash: \"\",\n } satisfies GeneratedToolDefinition;\n return { ...definition, schemaHash: computeSchemaHash(definition) };\n}\n\nexport function inferGroup(strippedName: string): ToolGroup {\n if (strippedName.startsWith(\"erd_\")) return \"erd\";\n if (strippedName.startsWith(\"flow_\")) return \"flow\";\n if (strippedName.startsWith(\"testcase_\")) return \"testcase\";\n if (strippedName.startsWith(\"markdown_\")) return \"markdown\";\n if (strippedName.includes(\"attachment\") || strippedName.includes(\"upload\")) return \"attachment\";\n if (strippedName.startsWith(\"task_\")) return \"task\";\n if (strippedName.includes(\"workspace\")) return \"workspace\";\n if (strippedName.includes(\"document\")) return \"document\";\n return \"generic\";\n}\n\nexport function generateCommandPath(strippedName: string, group: ToolGroup): string[] {\n if (group !== \"generic\" && strippedName.startsWith(`${group}_`)) {\n return [group, snakeToKebab(strippedName.slice(group.length + 1))];\n }\n\n const [verb, ...rest] = strippedName.split(\"_\");\n if (verb && rest.length > 0 && isVerb(verb)) {\n return [rest.join(\"-\"), verb];\n }\n\n return [\"tools\", \"run\", snakeToKebab(strippedName)];\n}\n\nexport function inferPayloadMode(strippedName: string, inputSchema: JsonSchema): PayloadMode {\n if (strippedName.includes(\"upload\") || strippedName.includes(\"attachment_upload\")) {\n return \"binary-upload\";\n }\n const properties = inputSchema.properties;\n if (!isRecord(properties)) {\n return \"flags\";\n }\n const values = Object.values(properties);\n if (values.length === 0) {\n return \"flags\";\n }\n if (values.every(isScalarSchema)) {\n return \"flags\";\n }\n return \"file-json\";\n}\n\nexport function inferDestructive(strippedName: string, tool: McpToolListItem): boolean {\n if (tool.annotations?.destructiveHint === true) {\n return true;\n }\n return DESTRUCTIVE_PREFIXES.some((prefix) => strippedName.startsWith(prefix));\n}\n\nexport function computeSchemaHash(tool: Omit<GeneratedToolDefinition, \"schemaHash\">): string {\n return createHash(\"sha256\")\n .update(stableStringify({\n name: tool.mcpName,\n description: tool.description,\n inputSchema: tool.inputSchema,\n }))\n .digest(\"hex\")\n .slice(0, 16);\n}\n\nexport function stableStringify(value: unknown): string {\n if (Array.isArray(value)) {\n return `[${value.map(stableStringify).join(\",\")}]`;\n }\n if (isRecord(value)) {\n return `{${Object.keys(value).sort().map((key) => `${JSON.stringify(key)}:${stableStringify(value[key])}`).join(\",\")}}`;\n }\n return JSON.stringify(value);\n}\n\nexport function serializeGeneratedCatalog(tools: GeneratedToolDefinition[]): string {\n return [\n \"import type { GeneratedToolDefinition } from \\\"./types\\\";\",\n \"\",\n \"export const generatedTools = [\",\n ...tools.map((tool) => ` ${JSON.stringify(tool)},`),\n \"] satisfies GeneratedToolDefinition[];\",\n \"\",\n ].join(\"\\n\");\n}\n\nfunction normalizeSchema(schema: JsonSchema): JsonSchema {\n return JSON.parse(stableStringify(schema)) as JsonSchema;\n}\n\nfunction isScalarSchema(value: unknown): boolean {\n if (!isRecord(value)) {\n return false;\n }\n const type = value.type;\n return type === \"string\" || type === \"number\" || type === \"integer\" || type === \"boolean\";\n}\n\nfunction isVerb(value: string): boolean {\n return [\n \"list\",\n \"get\",\n \"create\",\n \"update\",\n \"delete\",\n \"move\",\n \"restore\",\n \"archive\",\n \"unarchive\",\n \"search\",\n ].includes(value);\n}\n\nfunction snakeToKebab(value: string): string {\n return value.replaceAll(\"_\", \"-\");\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { generatedTools as prodTools } from \"./generated.prod\";\nimport { generatedTools as devTools } from \"./generated.dev\";\nimport { generateCatalog } from \"./generator\";\nimport type { GeneratedToolDefinition, McpToolListItem } from \"./types\";\nimport type { AinectoEnv } from \"../config/endpoints\";\nimport type { McpRpcClient } from \"../mcp/rpcClient\";\n\n/** 이 CLI 판을 빌드할 때 받아 둔 스냅샷 — 서버를 못 부를 때의 대체본이다. */\nexport function getGeneratedTools(env: AinectoEnv) {\n return env === \"dev\" ? devTools : prodTools;\n}\n\n/**\n * ★서버의 지금 도구 목록 — 진실원은 서버다. 스냅샷만 보여 주면 서버에 새 문서 유형(html)이 열려도\n * 에이전트는 «CLI 에 없다»고 판단했다(2026-10-10). 유형·도구가 늘 때마다 CLI 를 다시 배포하지 않으려고\n * 실행할 때 받는다. 실패는 호출처가 스냅샷으로 대체하며 이유를 알린다.\n */\nexport async function loadLiveTools(env: AinectoEnv, client: McpRpcClient): Promise<GeneratedToolDefinition[]> {\n return generateCatalog(await client.toolsList() as McpToolListItem[], env);\n}\n","import { createInterface } from \"node:readline\";\nimport type { Readable, Writable } from \"node:stream\";\nimport { McpRpcClient, type JsonRpcRequest } from \"./rpcClient\";\n\nexport interface StdioBridgeOptions {\n input: Readable;\n output: Writable;\n errorOutput: Writable;\n client: McpRpcClient;\n}\n\nexport async function runStdioBridge(options: StdioBridgeOptions): Promise<void> {\n const lines = createInterface({ input: options.input, crlfDelay: Infinity });\n\n for await (const line of lines) {\n if (!line.trim()) {\n continue;\n }\n try {\n const request = parseJsonRpcRequest(line);\n const response = await options.client.sendRaw(request);\n if (response && request.id !== undefined) {\n options.output.write(`${JSON.stringify(response)}\\n`);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n options.output.write(`${JSON.stringify({\n jsonrpc: \"2.0\",\n id: null,\n error: { code: -32603, message },\n })}\\n`);\n }\n }\n}\n\nfunction parseJsonRpcRequest(line: string): JsonRpcRequest {\n const parsed = JSON.parse(line) as unknown;\n if (!isRecord(parsed) || parsed.jsonrpc !== \"2.0\" || typeof parsed.method !== \"string\") {\n throw new Error(\"Invalid JSON-RPC request.\");\n }\n return {\n jsonrpc: \"2.0\",\n id: typeof parsed.id === \"string\" || typeof parsed.id === \"number\" || parsed.id === null ? parsed.id : undefined,\n method: parsed.method,\n params: parsed.params,\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { FileTokenStore } from \"../../core/auth/tokenStore\";\nimport { OAuthClient } from \"../../core/auth/oauth\";\nimport { McpRpcClient } from \"../../core/mcp/rpcClient\";\nimport { runStdioBridge } from \"../../core/mcp/stdioBridge\";\nimport type { HarnessRole } from \"../../core/harness/role\";\nimport type { Readable, Writable } from \"node:stream\";\n\nexport interface ConnectorOptions {\n endpoint: string;\n /** 브리지의 역할 — MCP 설정의 `--role` 인자나 `AINECTO_ROLE` 에서만 온다. 없으면 null. */\n role: HarnessRole | null;\n input: Readable;\n output: Writable;\n errorOutput: Writable;\n}\n\nexport async function runConnector(options: ConnectorOptions): Promise<void> {\n // ★토큰은 서버마다 한 칸이다(설계 0.4.2 §2-4). 역할은 토큰이 아니라 요청 헤더로 실린다 —\n // 브리지의 역할은 시작할 때 인자로 정해지고 세션 동안 바뀌지 않는다.\n const auth = new OAuthClient({ endpoint: options.endpoint, tokenStore: new FileTokenStore() });\n const client = new McpRpcClient({\n endpoint: options.endpoint,\n tokenProvider: auth,\n role: options.role,\n });\n await runStdioBridge({\n input: options.input,\n output: options.output,\n errorOutput: options.errorOutput,\n client,\n });\n}\n","import type { ToolPresentationEnrichment } from \"./types\";\n\nexport const enrichments = [\n {\n mcpName: \"list_projects\",\n outputHint: \"table\",\n tableColumns: [\"uuid\", \"name\", \"projectKey\", \"workspaceUuid\", \"updatedAt\"],\n displayName: \"List projects\",\n examples: [\"ainecto projects list --env dev\"],\n },\n {\n mcpName: \"list_workspaces\",\n outputHint: \"table\",\n tableColumns: [\"uuid\", \"name\", \"updatedAt\"],\n displayName: \"List workspaces\",\n },\n {\n mcpName: \"list_folders\",\n outputHint: \"table\",\n tableColumns: [\"uuid\", \"name\", \"projectUuid\", \"parentFolderUuid\", \"updatedAt\"],\n displayName: \"List folders\",\n },\n {\n mcpName: \"list_documents\",\n outputHint: \"table\",\n tableColumns: [\"uuid\", \"title\", \"type\", \"projectUuid\", \"folderUuid\", \"updatedAt\"],\n displayName: \"List documents\",\n },\n {\n mcpName: \"search_documents\",\n outputHint: \"table\",\n tableColumns: [\"uuid\", \"title\", \"type\", \"projectUuid\", \"updatedAt\"],\n displayName: \"Search documents\",\n },\n {\n mcpName: \"list_attachments\",\n outputHint: \"table\",\n tableColumns: [\"uuid\", \"filename\", \"contentType\", \"sizeBytes\", \"documentUuid\"],\n displayName: \"List attachments\",\n },\n {\n mcpName: \"erd_list_tables\",\n outputHint: \"table\",\n tableColumns: [\"uuid\", \"name\", \"schema_name\", \"display_order\"],\n displayName: \"List ERD tables\",\n },\n {\n mcpName: \"erd_list_refs\",\n outputHint: \"table\",\n tableColumns: [\"uuid\", \"name\", \"from_table_uuid\", \"to_table_uuid\", \"relationship\"],\n displayName: \"List ERD refs\",\n },\n {\n mcpName: \"erd_list_enums\",\n outputHint: \"table\",\n tableColumns: [\"uuid\", \"name\", \"display_order\"],\n displayName: \"List ERD enums\",\n },\n {\n mcpName: \"erd_list_table_groups\",\n outputHint: \"table\",\n tableColumns: [\"uuid\", \"name\", \"display_order\"],\n displayName: \"List ERD table groups\",\n },\n {\n mcpName: \"task_list_tasks\",\n outputHint: \"table\",\n tableColumns: [\"uuid\", \"title\", \"statusUuid\", \"assigneeId\", \"updatedAt\"],\n displayName: \"List tasks\",\n },\n {\n mcpName: \"task_list_statuses\",\n outputHint: \"table\",\n tableColumns: [\"uuid\", \"name\", \"displayOrder\"],\n displayName: \"List task statuses\",\n },\n {\n mcpName: \"enable_shares\",\n aliases: [\"shares enable\"],\n displayName: \"Enable shares\",\n },\n {\n mcpName: \"disable_shares\",\n aliases: [\"shares disable\"],\n displayName: \"Disable shares\",\n },\n] satisfies ToolPresentationEnrichment[];\n","export interface TableOptions {\n columns?: string[];\n}\n\nexport function renderTable(data: unknown, options: TableOptions = {}): string | undefined {\n const rows = extractRows(data);\n if (!rows.length || !rows.every(isRecord)) {\n return undefined;\n }\n\n const columns = options.columns?.length ? options.columns : inferColumns(rows);\n if (!columns.length) {\n return undefined;\n }\n\n const widths = columns.map((column) => Math.max(column.length, ...rows.map((row) => formatCell(row[column]).length)));\n const header = columns.map((column, index) => column.padEnd(widths[index] ?? column.length)).join(\" \");\n const divider = widths.map((width) => \"-\".repeat(width)).join(\" \");\n const body = rows.map((row) => columns.map((column, index) => formatCell(row[column]).padEnd(widths[index] ?? column.length)).join(\" \"));\n\n return [header, divider, ...body].join(\"\\n\");\n}\n\nfunction extractRows(data: unknown): unknown[] {\n if (Array.isArray(data)) {\n return data;\n }\n if (isRecord(data)) {\n for (const key of [\"items\", \"projects\", \"workspaces\", \"folders\", \"documents\", \"tasks\", \"attachments\", \"results\", \"data\"]) {\n const value = data[key];\n if (Array.isArray(value)) {\n return value;\n }\n }\n }\n return [];\n}\n\nfunction inferColumns(rows: Record<string, unknown>[]): string[] {\n const preferred = [\"uuid\", \"id\", \"name\", \"title\", \"status\", \"type\", \"projectUuid\", \"documentUuid\", \"createdAt\", \"updatedAt\"];\n const keys = new Set(rows.flatMap((row) => Object.keys(row)));\n const columns = preferred.filter((key) => keys.has(key));\n if (columns.length > 0) {\n return columns.slice(0, 6);\n }\n return [...keys].slice(0, 6);\n}\n\nfunction formatCell(value: unknown): string {\n if (value === null || value === undefined) {\n return \"\";\n }\n if (typeof value === \"object\") {\n return JSON.stringify(value);\n }\n return String(value);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","export class CliCommandError extends Error {\n constructor(\n readonly code: string,\n message: string,\n readonly details?: unknown,\n ) {\n super(message);\n }\n}\n","import type { GeneratedToolDefinition, JsonSchema } from \"../../core/catalog/types\";\nimport { parsePayloadSource, type ParsedPayload } from \"../../core/input/payloadSource\";\nimport { CliCommandError } from \"./errors\";\n\nexport interface ParsedCommandArgs {\n args: Record<string, unknown>;\n yes: boolean;\n warnings: string[];\n}\n\nexport async function parseGeneratedCommandArgs(\n tool: GeneratedToolDefinition,\n argv: string[],\n stdin: NodeJS.ReadStream,\n): Promise<ParsedCommandArgs> {\n const parsed = parseArgv(argv);\n const payload = await parsePayload(tool, parsed, stdin);\n const args = payloadToArgs(payload.value);\n const properties = getSchemaProperties(tool.inputSchema);\n\n for (const [key, value] of Object.entries(parsed.flags)) {\n if (key === \"yes\") {\n continue;\n }\n const schemaKey = resolveSchemaKey(key, properties);\n if (!schemaKey) {\n throw new CliCommandError(\"UNKNOWN_FLAG\", `Unknown flag --${key} for ${tool.commandPath.join(\" \")}.`, {\n flag: key,\n mcpName: tool.mcpName,\n });\n }\n args[schemaKey] = coerceFlagValue(value, properties[schemaKey], schemaKey);\n }\n\n for (const required of tool.required) {\n if (args[required] === undefined || args[required] === \"\") {\n throw new CliCommandError(\"MISSING_REQUIRED_FLAG\", `Missing required argument \"${required}\" for ${tool.commandPath.join(\" \")}.`, {\n required,\n flag: `--${camelToKebab(required)}`,\n mcpName: tool.mcpName,\n });\n }\n }\n\n return {\n args,\n yes: parsed.yes,\n warnings: payload.warnings,\n };\n}\n\nfunction payloadToArgs(value: unknown): Record<string, unknown> {\n if (value === undefined || value === null) {\n return {};\n }\n if (!isRecord(value)) {\n throw new CliCommandError(\"INVALID_PAYLOAD\", \"Generated command payload must be a JSON object.\", { value });\n }\n return { ...value };\n}\n\ninterface ParsedArgv {\n flags: Record<string, string | boolean>;\n yes: boolean;\n file?: string;\n inline?: string;\n}\n\nfunction parseArgv(argv: string[]): ParsedArgv {\n const flags: Record<string, string | boolean> = {};\n const inline: string[] = [];\n let file: string | undefined;\n let yes = false;\n\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (!arg) {\n continue;\n }\n if (arg === \"--file\" || arg === \"-f\") {\n file = requireValue(arg, argv[++index]);\n continue;\n }\n if (arg === \"--yes\" || arg === \"-y\") {\n yes = true;\n flags.yes = true;\n continue;\n }\n if (arg.startsWith(\"--\")) {\n const withoutPrefix = arg.slice(2);\n const eqIndex = withoutPrefix.indexOf(\"=\");\n if (eqIndex >= 0) {\n const key = withoutPrefix.slice(0, eqIndex);\n flags[key] = withoutPrefix.slice(eqIndex + 1);\n continue;\n }\n const next = argv[index + 1];\n if (!next || next.startsWith(\"--\")) {\n flags[withoutPrefix] = true;\n continue;\n }\n flags[withoutPrefix] = next;\n index += 1;\n continue;\n }\n inline.push(arg);\n }\n\n return {\n flags,\n yes,\n file,\n inline: inline.length > 0 ? inline.join(\" \") : undefined,\n };\n}\n\nasync function parsePayload(\n tool: GeneratedToolDefinition,\n parsed: ParsedArgv,\n stdin: NodeJS.ReadStream,\n): Promise<ParsedPayload> {\n if (tool.payloadMode === \"file-json\" || parsed.file || parsed.inline) {\n return parsePayloadSource({\n file: parsed.file,\n inline: parsed.inline,\n stdin,\n });\n }\n\n return { value: {}, source: \"empty\", warnings: [] };\n}\n\nfunction resolveSchemaKey(flag: string, properties: Record<string, JsonSchema>): string | undefined {\n if (properties[flag]) {\n return flag;\n }\n const normalized = flag.toLowerCase();\n return Object.keys(properties).find((key) => camelToKebab(key) === normalized);\n}\n\nfunction coerceFlagValue(value: string | boolean, schema: JsonSchema | undefined, key: string): unknown {\n const type = schema?.type;\n if (type === \"boolean\") {\n if (typeof value === \"boolean\") {\n return value;\n }\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n throw new CliCommandError(\"INVALID_FLAG_VALUE\", `Flag \"${key}\" must be a boolean.`, { key, value });\n }\n if (type === \"string\") {\n if (typeof value === \"boolean\") {\n throw new CliCommandError(\"FLAG_REQUIRES_VALUE\", `--${camelToKebab(key)} requires a value.`, { key });\n }\n return value;\n }\n if (type === \"integer\") {\n if (typeof value === \"boolean\" || !/^-?\\d+$/.test(value)) {\n const code = typeof value === \"boolean\" ? \"FLAG_REQUIRES_VALUE\" : \"INVALID_FLAG_VALUE\";\n throw new CliCommandError(code, `Flag \"${key}\" must be an integer.`, { key, value });\n }\n return Number.parseInt(value, 10);\n }\n if (type === \"number\") {\n if (typeof value === \"boolean\" || Number.isNaN(Number(value))) {\n const code = typeof value === \"boolean\" ? \"FLAG_REQUIRES_VALUE\" : \"INVALID_FLAG_VALUE\";\n throw new CliCommandError(code, `Flag \"${key}\" must be a number.`, { key, value });\n }\n return Number(value);\n }\n throw new CliCommandError(\"UNSUPPORTED_FLAG_PAYLOAD\", `Flag \"${key}\" is not a scalar field; provide it through --file, stdin, or inline JSON.`, {\n key,\n type,\n });\n}\n\nfunction getSchemaProperties(schema: JsonSchema): Record<string, JsonSchema> {\n const properties = schema.properties;\n if (!isRecord(properties)) {\n return {};\n }\n const result: Record<string, JsonSchema> = {};\n for (const [key, value] of Object.entries(properties)) {\n if (isRecord(value)) {\n result[key] = value;\n }\n }\n return result;\n}\n\nexport function camelToKebab(value: string): string {\n return value.replace(/[A-Z]/g, (char) => `-${char.toLowerCase()}`).toLowerCase();\n}\n\nfunction requireValue(flag: string, value: string | undefined): string {\n if (!value || value.startsWith(\"--\")) {\n throw new CliCommandError(\"FLAG_REQUIRES_VALUE\", `${flag} requires a value.`, { flag });\n }\n return value;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { createInterface } from \"node:readline\";\nimport type { GeneratedToolDefinition } from \"../../core/catalog/types\";\nimport { CliCommandError } from \"./errors\";\n\nexport interface ConfirmationIO {\n stdin: NodeJS.ReadStream;\n stderr: NodeJS.WriteStream;\n}\n\nexport async function confirmDestructiveCommand(options: {\n tool: GeneratedToolDefinition;\n yes: boolean;\n json: boolean;\n io: ConfirmationIO;\n}): Promise<void> {\n if (!options.tool.destructive) {\n return;\n }\n if (options.yes) {\n return;\n }\n if (options.json) {\n throw new CliCommandError(\"CONFIRMATION_REQUIRED\", `Destructive command ${options.tool.commandPath.join(\" \")} requires --yes in --json mode.`, {\n mcpName: options.tool.mcpName,\n });\n }\n\n const answer = await promptConfirmation(options.io, `Run destructive command ${options.tool.commandPath.join(\" \")}? Type \"yes\" to continue: `);\n if (answer.trim().toLowerCase() !== \"yes\") {\n throw new CliCommandError(\"CONFIRMATION_DECLINED\", \"Destructive command was not confirmed.\", {\n mcpName: options.tool.mcpName,\n });\n }\n}\n\nasync function promptConfirmation(io: ConfirmationIO, message: string): Promise<string> {\n io.stderr.write(message);\n const rl = createInterface({ input: io.stdin, terminal: false });\n try {\n for await (const line of rl) {\n return line;\n }\n return \"\";\n } finally {\n rl.close();\n }\n}\n","export const ATTACHMENTS_UPLOAD_COMMAND_PATH = [\"attachments\", \"upload\"] as const;\n\nexport const BESPOKE_COMMAND_PATHS = [\n ATTACHMENTS_UPLOAD_COMMAND_PATH,\n] as const;\n","import type { McpRpcClient } from \"../../core/mcp/rpcClient\";\nimport type { GeneratedToolDefinition, ToolPresentationEnrichment } from \"../../core/catalog/types\";\nimport { enrichments } from \"../../core/catalog/enrichments\";\nimport { getGeneratedTools } from \"../../core/catalog\";\nimport type { AinectoEnv } from \"../../core/config/endpoints\";\nimport { renderSuccess } from \"../../core/output/render\";\nimport { isToolError } from \"../../core/mcp/rpcClient\";\nimport { renderTable } from \"../../core/output/table\";\nimport { parseGeneratedCommandArgs } from \"./flagParser\";\nimport { confirmDestructiveCommand, type ConfirmationIO } from \"./destructiveConfirmation\";\nimport { BESPOKE_COMMAND_PATHS } from \"./bespokeCommands\";\n\nexport interface GeneratedCommandRoute {\n tool: GeneratedToolDefinition;\n matchedPath: string[];\n rest: string[];\n presentation?: ToolPresentationEnrichment;\n rawContractWarning?: string;\n}\n\nexport interface GeneratedCommandExecutionOptions {\n /** 라우팅할 도구 목록 — 스냅샷이거나, 스냅샷에 없는 명령이면 서버의 지금 목록. */\n tools: readonly GeneratedToolDefinition[];\n argv: string[];\n client: McpRpcClient;\n json: boolean;\n io: ConfirmationIO & { stdout: NodeJS.WriteStream };\n}\n\nexport function matchGeneratedCommand(\n tools: readonly GeneratedToolDefinition[],\n argv: string[],\n): GeneratedCommandRoute | undefined {\n const commandTokens = argv.filter((arg) => !arg.startsWith(\"-\"));\n const entries = buildRouteEntries(tools, enrichments);\n const match = entries\n .filter((entry) => isPrefix(entry.path, commandTokens))\n .sort((a, b) => b.path.length - a.path.length)[0];\n\n if (!match) {\n return undefined;\n }\n\n const restStart = findRestStart(argv, match.path);\n return {\n tool: match.tool,\n matchedPath: match.path,\n rest: argv.slice(restStart),\n presentation: match.presentation,\n rawContractWarning: match.tool.payloadMode === \"binary-upload\"\n ? \"This generated command uses the raw MCP argument contract only; local file upload semantics are not implemented here.\"\n : undefined,\n };\n}\n\nexport async function executeGeneratedCommand(options: GeneratedCommandExecutionOptions): Promise<number> {\n const route = matchGeneratedCommand(options.tools, options.argv);\n if (!route) {\n return 2;\n }\n\n const parsed = await parseGeneratedCommandArgs(route.tool, route.rest, options.io.stdin);\n await confirmDestructiveCommand({\n tool: route.tool,\n yes: parsed.yes,\n json: options.json,\n io: options.io,\n });\n\n const result = await options.client.toolsCall(route.tool.mcpName, parsed.args);\n const warnings = [...parsed.warnings, ...(route.rawContractWarning ? [route.rawContractWarning] : [])];\n options.io.stdout.write(renderGeneratedResult(result, {\n json: options.json,\n warnings,\n presentation: route.presentation,\n }));\n // ★도구가 «거부»한 것을 성공으로 보고하지 않는다 — 셸 자동화는 exit 코드를 본다.\n return isToolError(result) ? 1 : 0;\n}\n\nexport function assertNoCommandCollisions(env: AinectoEnv): void {\n const entries = buildRouteEntries(getGeneratedTools(env), enrichments);\n const seen = new Map<string, string>();\n for (const entry of entries) {\n const key = entry.path.join(\" \");\n const existing = seen.get(key);\n if (existing) {\n throw new Error(`Command collision for \"${key}\": ${existing} and ${entry.tool.mcpName}`);\n }\n seen.set(key, entry.tool.mcpName);\n }\n for (const commandPath of BESPOKE_COMMAND_PATHS) {\n const command = commandPath.join(\" \");\n const existing = seen.get(command);\n if (existing) {\n throw new Error(`Bespoke command \"${command}\" collides with ${existing}.`);\n }\n }\n}\n\nfunction renderGeneratedResult(\n result: unknown,\n options: {\n json: boolean;\n warnings: string[];\n presentation?: ToolPresentationEnrichment;\n },\n): string {\n if (!options.json && options.presentation?.outputHint === \"table\") {\n const table = renderTable(result, { columns: options.presentation.tableColumns });\n if (table) {\n const warnings = options.warnings.length ? `${options.warnings.map((warning) => `Warning: ${warning}`).join(\"\\n\")}\\n` : \"\";\n return `${warnings}${table}\\n`;\n }\n }\n return renderSuccess(result, { json: options.json, warnings: options.warnings });\n}\n\nfunction buildRouteEntries(\n tools: readonly GeneratedToolDefinition[],\n presentations: readonly ToolPresentationEnrichment[],\n): Array<{ path: string[]; tool: GeneratedToolDefinition; presentation?: ToolPresentationEnrichment }> {\n const byName = new Map(presentations.map((presentation) => [presentation.mcpName, presentation]));\n const entries: Array<{ path: string[]; tool: GeneratedToolDefinition; presentation?: ToolPresentationEnrichment }> = [];\n for (const tool of tools) {\n const presentation = byName.get(tool.mcpName);\n entries.push({ path: tool.commandPath, tool, presentation });\n for (const alias of presentation?.aliases ?? []) {\n entries.push({ path: alias.split(/\\s+/).filter(Boolean), tool, presentation });\n }\n }\n return entries;\n}\n\nfunction isPrefix(prefix: string[], values: string[]): boolean {\n return prefix.every((value, index) => values[index] === value);\n}\n\nfunction findRestStart(argv: string[], commandPath: string[]): number {\n let matched = 0;\n for (let index = 0; index < argv.length; index += 1) {\n if (!argv[index]?.startsWith(\"-\")) {\n if (argv[index] !== commandPath[matched]) {\n return index;\n }\n matched += 1;\n if (matched === commandPath.length) {\n return index + 1;\n }\n }\n }\n return argv.length;\n}\n","import { readFile, stat } from \"node:fs/promises\";\nimport { basename, extname } from \"node:path\";\nimport { McpRpcClient } from \"../mcp/rpcClient\";\n\nexport interface AttachmentUploadFileInput {\n path: string;\n filename?: string;\n contentType?: string;\n}\n\nexport interface UploadAttachmentsInput {\n documentUuid: string;\n files: AttachmentUploadFileInput[];\n maxBytes?: number;\n ttlSeconds?: number;\n requestToolName?: string;\n commitToolName?: string;\n fetchImpl?: typeof fetch;\n onProgress?: (progress: AttachmentUploadProgress) => void;\n}\n\nexport type AttachmentUploadStage = \"token\" | \"put\" | \"register\" | \"done\";\n\nexport interface AttachmentUploadProgress {\n stage: AttachmentUploadStage;\n path: string;\n filename: string;\n index: number;\n total: number;\n}\n\nexport interface RegisteredAttachmentFile {\n path: string;\n documentUuid: string;\n filename: string;\n storageKey: string;\n contentType: string;\n sizeBytes: number;\n registerResult: unknown;\n}\n\nexport interface UploadAttachmentsResult {\n count: number;\n uploaded: RegisteredAttachmentFile[];\n}\n\nexport class AttachmentUploadError extends Error {\n constructor(\n readonly code: string,\n message: string,\n readonly details?: unknown,\n ) {\n super(message);\n }\n}\n\nexport async function uploadAttachments(\n client: McpRpcClient,\n input: UploadAttachmentsInput,\n): Promise<UploadAttachmentsResult> {\n if (!input.documentUuid.trim()) {\n throw new AttachmentUploadError(\"MISSING_REQUIRED_FLAG\", \"Missing required argument \\\"documentUuid\\\".\", {\n flag: \"--document-uuid\",\n });\n }\n if (input.files.length === 0) {\n throw new AttachmentUploadError(\"MISSING_FILE\", \"Expected at least one file to upload.\");\n }\n\n const fetchImpl = input.fetchImpl ?? fetch;\n const uploaded: RegisteredAttachmentFile[] = [];\n\n for (let index = 0; index < input.files.length; index += 1) {\n const file = input.files[index];\n if (!file) {\n continue;\n }\n uploaded.push(await uploadSingleAttachment(client, file, {\n documentUuid: input.documentUuid,\n maxBytes: input.maxBytes,\n ttlSeconds: input.ttlSeconds,\n requestToolName: input.requestToolName ?? \"mcp__ainecto__request_upload_token\",\n commitToolName: input.commitToolName ?? \"mcp__ainecto__upload_attachments\",\n fetchImpl,\n onProgress: input.onProgress,\n index,\n total: input.files.length,\n }));\n }\n\n return { count: uploaded.length, uploaded };\n}\n\ninterface SingleUploadContext {\n documentUuid: string;\n maxBytes?: number;\n ttlSeconds?: number;\n requestToolName: string;\n commitToolName: string;\n fetchImpl: typeof fetch;\n onProgress?: (progress: AttachmentUploadProgress) => void;\n index: number;\n total: number;\n}\n\ninterface UploadTokenResponse {\n token: string;\n uploadUrl: string;\n storageKey: string;\n}\n\ninterface UploadPutResponse {\n storageKey: string;\n sizeBytes: number;\n contentType: string;\n}\n\nasync function uploadSingleAttachment(\n client: McpRpcClient,\n file: AttachmentUploadFileInput,\n context: SingleUploadContext,\n): Promise<RegisteredAttachmentFile> {\n const metadata = await readFileMetadata(file);\n emitProgress(context, \"token\", file.path, metadata.filename);\n const uploadToken = await requestUploadToken(client, metadata, context);\n\n emitProgress(context, \"put\", file.path, metadata.filename);\n const putResult = await putAttachmentBytes(uploadToken, metadata, context.fetchImpl);\n validatePutResult(uploadToken, metadata, putResult);\n\n const item = {\n documentUuid: context.documentUuid,\n filename: metadata.filename,\n storageKey: uploadToken.storageKey,\n contentType: putResult.contentType,\n sizeBytes: putResult.sizeBytes,\n };\n\n emitProgress(context, \"register\", file.path, metadata.filename);\n const registerResult = await client.toolsCall(context.commitToolName, { items: [item] });\n\n emitProgress(context, \"done\", file.path, metadata.filename);\n return {\n path: file.path,\n documentUuid: context.documentUuid,\n filename: metadata.filename,\n storageKey: uploadToken.storageKey,\n contentType: putResult.contentType,\n sizeBytes: putResult.sizeBytes,\n registerResult,\n };\n}\n\nasync function readFileMetadata(file: AttachmentUploadFileInput): Promise<{\n bytes: Buffer;\n filename: string;\n contentType: string;\n sizeBytes: number;\n}> {\n const stats = await stat(file.path);\n if (!stats.isFile()) {\n throw new AttachmentUploadError(\"INVALID_FILE\", `Attachment path is not a file: ${file.path}`, { path: file.path });\n }\n const bytes = await readFile(file.path);\n return {\n bytes,\n filename: file.filename ?? basename(file.path),\n contentType: file.contentType ?? detectContentType(file.path),\n sizeBytes: bytes.byteLength,\n };\n}\n\nasync function requestUploadToken(\n client: McpRpcClient,\n metadata: { filename: string; contentType: string; sizeBytes: number },\n context: SingleUploadContext,\n): Promise<UploadTokenResponse> {\n const scopeJson = JSON.stringify({\n documentUuid: context.documentUuid,\n filename: metadata.filename,\n contentType: metadata.contentType,\n sizeBytes: metadata.sizeBytes,\n });\n const requestArgs: Record<string, unknown> = {\n purpose: \"attachment.upload\",\n scopeJson,\n };\n if (context.maxBytes !== undefined) {\n requestArgs.maxBytes = context.maxBytes;\n }\n if (context.ttlSeconds !== undefined) {\n requestArgs.ttlSeconds = context.ttlSeconds;\n }\n\n const response = unwrapMcpToolPayload(await client.toolsCall(context.requestToolName, requestArgs));\n if (!isRecord(response)) {\n throw new AttachmentUploadError(\"UPLOAD_TOKEN_PROTOCOL_ERROR\", \"request_upload_token response was not an object.\");\n }\n const token = response.token;\n const uploadUrl = response.uploadUrl;\n const storageKey = response.storageKey;\n if (typeof token !== \"string\" || token.length === 0) {\n throw new AttachmentUploadError(\"UPLOAD_TOKEN_PROTOCOL_ERROR\", \"request_upload_token response did not include token.\");\n }\n if (typeof uploadUrl !== \"string\" || uploadUrl.length === 0) {\n throw new AttachmentUploadError(\"UPLOAD_TOKEN_PROTOCOL_ERROR\", \"request_upload_token response did not include uploadUrl.\");\n }\n if (typeof storageKey !== \"string\" || storageKey.length === 0) {\n throw new AttachmentUploadError(\"UPLOAD_TOKEN_PROTOCOL_ERROR\", \"request_upload_token response did not include storageKey.\");\n }\n return { token, uploadUrl, storageKey };\n}\n\nasync function putAttachmentBytes(\n token: UploadTokenResponse,\n metadata: { bytes: Buffer; contentType: string },\n fetchImpl: typeof fetch,\n): Promise<UploadPutResponse> {\n const maxAttempts = 3;\n let lastRetryableError: unknown;\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\n try {\n const response = await fetchImpl(token.uploadUrl, {\n method: \"PUT\",\n headers: {\n authorization: `Bearer ${token.token}`,\n \"content-type\": metadata.contentType,\n },\n body: new Uint8Array(metadata.bytes),\n });\n if (shouldRetryResponse(response.status) && attempt < maxAttempts) {\n continue;\n }\n if (!response.ok) {\n throw uploadHttpError(response.status);\n }\n return parsePutResponse(await response.text());\n } catch (error) {\n if (error instanceof AttachmentUploadError) {\n throw error;\n }\n lastRetryableError = error;\n if (attempt === maxAttempts) {\n break;\n }\n }\n }\n throw new AttachmentUploadError(\"ATTACHMENT_UPLOAD_FAILED\", \"Attachment upload failed.\", {\n cause: lastRetryableError instanceof Error ? lastRetryableError.message : String(lastRetryableError),\n });\n}\n\nfunction uploadHttpError(status: number): AttachmentUploadError {\n if (status === 409) {\n return new AttachmentUploadError(\"ATTACHMENT_UPLOAD_CONFLICT\", \"Attachment upload failed with HTTP 409 Conflict.\", { status });\n }\n if (status === 401 || status === 403) {\n return new AttachmentUploadError(\"ATTACHMENT_UPLOAD_TOKEN_EXPIRED\", `Attachment upload token was rejected with HTTP ${status}.`, { status });\n }\n return new AttachmentUploadError(\"ATTACHMENT_UPLOAD_HTTP_ERROR\", `Attachment upload failed with HTTP ${status}.`, { status });\n}\n\nfunction shouldRetryResponse(status: number): boolean {\n return status === 429 || status >= 500;\n}\n\nfunction parsePutResponse(text: string): UploadPutResponse {\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n throw new AttachmentUploadError(\"ATTACHMENT_UPLOAD_PROTOCOL_ERROR\", \"Attachment PUT response was not valid JSON.\");\n }\n if (!isRecord(parsed)) {\n throw new AttachmentUploadError(\"ATTACHMENT_UPLOAD_PROTOCOL_ERROR\", \"Attachment PUT response was not an object.\");\n }\n if (typeof parsed.storageKey !== \"string\") {\n throw new AttachmentUploadError(\"ATTACHMENT_UPLOAD_PROTOCOL_ERROR\", \"Attachment PUT response did not include storageKey.\");\n }\n if (typeof parsed.sizeBytes !== \"number\" || !Number.isFinite(parsed.sizeBytes)) {\n throw new AttachmentUploadError(\"ATTACHMENT_UPLOAD_PROTOCOL_ERROR\", \"Attachment PUT response did not include numeric sizeBytes.\");\n }\n if (typeof parsed.contentType !== \"string\") {\n throw new AttachmentUploadError(\"ATTACHMENT_UPLOAD_PROTOCOL_ERROR\", \"Attachment PUT response did not include contentType.\");\n }\n return {\n storageKey: parsed.storageKey,\n sizeBytes: parsed.sizeBytes,\n contentType: parsed.contentType,\n };\n}\n\nfunction validatePutResult(\n token: UploadTokenResponse,\n metadata: { sizeBytes: number },\n putResult: UploadPutResponse,\n): void {\n if (putResult.storageKey !== token.storageKey) {\n throw new AttachmentUploadError(\"ATTACHMENT_UPLOAD_STORAGE_KEY_MISMATCH\", \"Attachment PUT response storageKey did not match the upload token.\", {\n expected: token.storageKey,\n actual: putResult.storageKey,\n });\n }\n if (putResult.sizeBytes !== metadata.sizeBytes) {\n throw new AttachmentUploadError(\"ATTACHMENT_UPLOAD_SIZE_MISMATCH\", \"Attachment PUT response sizeBytes did not match the local file size.\", {\n expected: metadata.sizeBytes,\n actual: putResult.sizeBytes,\n });\n }\n}\n\nfunction unwrapMcpToolPayload(value: unknown): unknown {\n if (!isRecord(value) || !Array.isArray(value.content)) {\n return value;\n }\n const text = value.content\n .map((item) => isRecord(item) && typeof item.text === \"string\" ? item.text : \"\")\n .find((itemText) => itemText.trim().startsWith(\"{\"));\n if (!text) {\n return value;\n }\n try {\n return JSON.parse(text) as unknown;\n } catch {\n return value;\n }\n}\n\nfunction emitProgress(\n context: SingleUploadContext,\n stage: AttachmentUploadStage,\n path: string,\n filename: string,\n): void {\n context.onProgress?.({\n stage,\n path,\n filename,\n index: context.index,\n total: context.total,\n });\n}\n\nfunction detectContentType(path: string): string {\n const extension = extname(path).toLowerCase();\n return MIME_BY_EXTENSION[extension] ?? \"application/octet-stream\";\n}\n\nconst MIME_BY_EXTENSION: Record<string, string> = {\n \".avif\": \"image/avif\",\n \".csv\": \"text/csv\",\n \".gif\": \"image/gif\",\n \".htm\": \"text/html\",\n \".html\": \"text/html\",\n \".jpeg\": \"image/jpeg\",\n \".jpg\": \"image/jpeg\",\n \".json\": \"application/json\",\n \".md\": \"text/markdown\",\n \".pdf\": \"application/pdf\",\n \".png\": \"image/png\",\n \".svg\": \"image/svg+xml\",\n \".txt\": \"text/plain\",\n \".webp\": \"image/webp\",\n \".xls\": \"application/vnd.ms-excel\",\n \".xlsx\": \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n \".zip\": \"application/zip\",\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import type { McpRpcClient } from \"../../core/mcp/rpcClient\";\nimport {\n uploadAttachments,\n type AttachmentUploadProgress,\n type UploadAttachmentsResult,\n} from \"../../core/upload/attachmentUpload\";\nimport { renderSuccess } from \"../../core/output/render\";\nimport { CliCommandError } from \"./errors\";\nimport { ATTACHMENTS_UPLOAD_COMMAND_PATH } from \"./bespokeCommands\";\n\nexport interface AttachmentsUploadCommandOptions {\n argv: string[];\n client: McpRpcClient;\n json: boolean;\n io: {\n stdout: NodeJS.WriteStream;\n stderr: NodeJS.WriteStream;\n };\n}\n\nexport function isAttachmentsUploadCommand(domain: string | undefined, action: string | undefined): boolean {\n return domain === ATTACHMENTS_UPLOAD_COMMAND_PATH[0] && action === ATTACHMENTS_UPLOAD_COMMAND_PATH[1];\n}\n\nexport async function executeAttachmentsUploadCommand(options: AttachmentsUploadCommandOptions): Promise<number> {\n const parsed = parseAttachmentsUploadArgs(options.argv);\n const result = await uploadAttachments(options.client, {\n documentUuid: parsed.documentUuid,\n files: parsed.files.map((path) => ({\n path,\n filename: parsed.filename,\n contentType: parsed.contentType,\n })),\n maxBytes: parsed.maxBytes,\n ttlSeconds: parsed.ttlSeconds,\n onProgress: options.json ? undefined : (progress) => {\n renderProgress(progress, options.io.stderr);\n },\n });\n\n options.io.stdout.write(renderAttachmentUploadResult(result, options.json));\n return 0;\n}\n\ninterface ParsedAttachmentsUploadArgs {\n documentUuid: string;\n files: string[];\n filename?: string;\n contentType?: string;\n maxBytes?: number;\n ttlSeconds?: number;\n}\n\nfunction parseAttachmentsUploadArgs(argv: string[]): ParsedAttachmentsUploadArgs {\n const files: string[] = [];\n let documentUuid: string | undefined;\n let filename: string | undefined;\n let contentType: string | undefined;\n let maxBytes: number | undefined;\n let ttlSeconds: number | undefined;\n let readFilesOnly = false;\n\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (!arg) {\n continue;\n }\n if (readFilesOnly) {\n files.push(arg);\n continue;\n }\n if (arg === \"--\") {\n readFilesOnly = true;\n continue;\n }\n if (arg === \"--document-uuid\" || arg === \"--documentUuid\") {\n documentUuid = requireValue(arg, argv[++index]);\n continue;\n }\n if (arg === \"--filename\" || arg === \"--name\") {\n filename = requireValue(arg, argv[++index]);\n continue;\n }\n if (arg === \"--content-type\" || arg === \"--contentType\") {\n contentType = requireValue(arg, argv[++index]);\n continue;\n }\n if (arg === \"--max-bytes\" || arg === \"--maxBytes\") {\n maxBytes = parsePositiveInteger(arg, requireValue(arg, argv[++index]));\n continue;\n }\n if (arg === \"--ttl-seconds\" || arg === \"--ttlSeconds\") {\n ttlSeconds = parsePositiveInteger(arg, requireValue(arg, argv[++index]));\n continue;\n }\n if (arg.startsWith(\"--\")) {\n throw new CliCommandError(\"UNKNOWN_FLAG\", `Unknown flag ${arg} for attachments upload.`, { flag: arg });\n }\n files.push(arg);\n }\n\n if (!documentUuid) {\n throw new CliCommandError(\"MISSING_REQUIRED_FLAG\", \"Missing required argument \\\"documentUuid\\\" for attachments upload.\", {\n flag: \"--document-uuid\",\n });\n }\n if (files.length === 0) {\n throw new CliCommandError(\"MISSING_FILE\", \"Expected at least one file to upload.\");\n }\n if (filename && files.length !== 1) {\n throw new CliCommandError(\"INVALID_FLAG_VALUE\", \"--filename/--name can only be used with exactly one file.\", {\n flag: \"--filename\",\n files: files.length,\n });\n }\n\n return {\n documentUuid,\n files,\n filename,\n contentType,\n maxBytes,\n ttlSeconds,\n };\n}\n\nfunction parsePositiveInteger(flag: string, value: string): number {\n if (!/^[1-9]\\d*$/.test(value)) {\n throw new CliCommandError(\"INVALID_FLAG_VALUE\", `${flag} must be a positive integer.`, { flag, value });\n }\n return Number.parseInt(value, 10);\n}\n\nfunction requireValue(flag: string, value: string | undefined): string {\n if (!value || value.startsWith(\"--\")) {\n throw new CliCommandError(\"FLAG_REQUIRES_VALUE\", `${flag} requires a value.`, { flag });\n }\n return value;\n}\n\nfunction renderProgress(progress: AttachmentUploadProgress, stderr: NodeJS.WriteStream): void {\n if (progress.stage === \"token\") {\n stderr.write(`Uploading ${progress.filename} (${progress.index + 1}/${progress.total})...\\n`);\n }\n}\n\nfunction renderAttachmentUploadResult(result: UploadAttachmentsResult, json: boolean): string {\n if (json) {\n return renderSuccess(result, { json });\n }\n const lines = [\n `Uploaded ${result.count} attachment${result.count === 1 ? \"\" : \"s\"}.`,\n ...result.uploaded.map((file) => `- ${file.filename} (${file.sizeBytes} bytes)`),\n ];\n return renderSuccess(lines.join(\"\\n\"), { json: false });\n}\n","import { chmod, mkdir, rename, rm, rmdir, stat, writeFile } from \"node:fs/promises\";\nimport { dirname, join, relative, resolve, sep } from \"node:path\";\nimport { McpRpcError, type McpRpcClient } from \"../../core/mcp/rpcClient\";\nimport { isDefaultEndpointFor } from \"../../core/config/endpoints\";\nimport { renderSuccess } from \"../../core/output/render\";\nimport { HARNESS_ROLES, ROLE_ENV_VAR, type HarnessRole } from \"../../core/harness/role\";\nimport {\n initRefusal,\n MANAGED_PATHS,\n planInit,\n planUndo,\n type FileWrite,\n type InitPlan,\n withCreatedDirectories,\n} from \"../../core/harness/initPlan\";\nimport { HARNESS_CONFIG_PATH, HARNESS_DOC_PATH, HARNESS_RECORD_PATH } from \"../../core/harness/harnessDoc\";\nimport { SERVER_NAME } from \"../../core/harness/agentTargets\";\nimport { fetchHarnessDocuments, type HarnessDocuments } from \"../../core/harness/documentFetch\";\nimport { PromptCancelled, type Choice, type Prompter } from \"./prompter\";\nimport {\n assertInsideRepository,\n findGitRoot,\n readIfExists,\n readManagedFile,\n rolesInFiles,\n} from \"../../core/harness/repositoryRole\";\n\n/** 역할이 딱 하나일 때만 그 역할(대화형 기본값). 없거나 어긋나 있으면 기본값이 없다. */\nfunction singleRole(roles: HarnessRole[]): HarnessRole | undefined {\n return roles.length === 1 ? roles[0] : undefined;\n}\n\n/** 역할이 정해진 «뒤»에 만드는 연결. 역할이 토큰 칸과 헤더를 정하므로 역할보다 먼저 만들 수 없다. */\nexport interface InitConnection {\n client: McpRpcClient;\n accessToken?: () => Promise<string | undefined>;\n login?: () => Promise<void>;\n}\n\nexport interface InitCommandOptions {\n argv: string[];\n /** 전역 `--role` / AINECTO_ROLE 에서 온 역할. init 은 이것을 따로 파싱하지 않는다. */\n role?: HarnessRole;\n /**\n * 이미 만든 연결(시험·역할이 미리 정해진 호출). {@link connect} 가 있으면 그쪽이 이긴다.\n */\n client?: McpRpcClient;\n /**\n * ★역할이 정해진 뒤 연결을 만든다(설계 §21-4). 대화형에서는 역할을 «물어서» 정하므로, 바깥 CLI 가\n * 미리 클라이언트를 만들 수 없다. 저장소 역할 추론도 init 안에서 하므로 «역할이 클라이언트보다 먼저\n * 정해진다»(I10)가 이 한 곳에서 지켜진다.\n */\n connect?: (role: HarnessRole) => InitConnection;\n /** 대화형일 때만 있다(판정은 prompter.isInteractive 한 곳). 없으면 묻지 않고 빠진 값을 말하고 멈춘다. */\n prompter?: Prompter;\n endpoint: string;\n /**\n * 문서를 받을 때 쓸 토큰을 «필요할 때» 가져온다. 없으면 패키지 기본값으로 간다.\n *\n * <p>★지연 조회인 이유: {@code --undo} 는 순수한 로컬 작업인데, 예전엔 그마저도 토큰\n * 조회·갱신·저장을 먼저 돌렸다(2026-09-23 독립 재리뷰 S1). 로컬 되돌리기가 네트워크에\n * 의존하면, 서버가 죽은 날 되돌릴 수가 없다.\n */\n accessToken?: () => Promise<string | undefined>;\n /**\n * 이 역할로 브라우저 로그인을 한다(= {@code ainecto auth login} 과 같은 함수). 없으면 init 은 예전처럼\n * 로그인하지 않고 401 을 안내로 바꾼다.\n *\n * <p>★init 은 사람이나 에이전트가 «명시적으로» 친 명령이라 여기서 로그인한다. 브리지({@code ainecto mcp})는\n * 여전히 자동 로그인하지 않는다 — 세션 한가운데서 창이 뜨면 안 된다(설계 §8-4).\n */\n login?: () => Promise<void>;\n /** 시험용 주입. 기본은 전역 fetch. */\n fetchImpl?: typeof fetch;\n env: \"prod\" | \"dev\";\n cliVersion: string;\n cwd: string;\n json: boolean;\n io: { stdout: NodeJS.WriteStream; stderr: NodeJS.WriteStream };\n}\n\n/** 연결까지 갖춘 옵션 — 원격을 부르는 함수들은 이것만 받는다. */\ntype ConnectedOptions = InitCommandOptions & { client: McpRpcClient };\n\ninterface InitArgs {\n projectUuid?: string;\n projectName?: string;\n dryRun: boolean;\n undo: boolean;\n yes: boolean;\n}\n\n/**\n * {@code ainecto init} — 이 저장소를 AiNecto 하네스에 붙인다.\n *\n * ★<b>지금은 비대화형 경로만 있다</b>(설계 §21-1, 1단계). 합격 시나리오는 에이전트가 셸로 이 명령을\n * 치는 것이고 거기엔 사람이 답할 TTY 가 없다. 그래서:\n * <ul>\n * <li><b>빠진 값은 채우지 않고 말하고 멈춘다.</b> 역할을 기본값으로 고르지 않는다 — 사람이 고른 값이\n * {@code --role} 로 와야 한다. 프로젝트가 여럿이면 목록을 보여 주고 «다시 실행하라»고 한다.</li>\n * <li><b>역할이 있으면 로그인까지 한다.</b> 그 역할의 토큰이 없으면 브라우저를 띄우고(사람이 승인)\n * 이어서 진행한다.</li>\n * </ul>\n * ★<b>사람이 터미널에서 치면(대화형) 빠진 역할·프로젝트를 번호로 묻는다</b>(설계 §21-4, 0.4.1).\n * 기본값으로 역할을 고르지 않는다. 질문 중 입력이 끝나면(EOF) 아무것도 쓰지 않고 130 으로 끝난다.\n * 확인 단계·루트 질문은 2단계다(설계 §21-2).\n */\nexport async function executeInitCommand(options: InitCommandOptions): Promise<number> {\n try {\n return await runInit(options);\n } catch (error) {\n if (error instanceof PromptCancelled) {\n options.io.stderr.write(`${error.message}\\n`);\n return 130;\n }\n throw error;\n } finally {\n options.prompter?.close();\n }\n}\n\nasync function runInit(initialOptions: InitCommandOptions): Promise<number> {\n let options = initialOptions;\n const args = parseInitArgs(options.argv);\n const root = resolve(options.cwd);\n // ★하위 폴더에서 치면 멈춘다. 그 자리에 .mcp.json 을 쓰면 에이전트는 루트에서 그것을 못 본다 —\n // 역할이 걸린 줄 알고 걸리지 않는다. undo 도 같은 이유로 루트에서만 한다(기록이 루트에 있다).\n const rootNotes = await repositoryRootNotes(root);\n const files = await readSnapshot(root);\n\n if (args.undo) {\n const plan = planUndo({ files });\n await applyPlan(root, plan, args.dryRun, files, false);\n options.io.stdout.write(renderSuccess(\n {\n action: args.dryRun ? \"undo (dry-run)\" : \"undo\",\n updated: plan.writes.map((write) => write.path),\n removed: plan.deletes,\n notes: [...rootNotes, ...plan.notes],\n },\n { json: options.json },\n ));\n return 0;\n }\n\n // ★<b>원격을 건드리기 «전»에 기록을 본다.</b> 예전엔 이 판정이 계획 안에만 있어서, 프로젝트가\n // 0개인 저장소에서 «원격에 프로젝트를 만든 뒤» 「아무것도 바꾸지 않았다」는 예외를 냈다\n // (9차 1차 리뷰 B7). 로컬 쓰기가 0이라는 것과 부수효과가 0이라는 것은 다른 사실이다.\n // ★묻기 «전»에도 본다 — 다 물어 놓고 거절하지 않는다.\n const refusal = initRefusal(files);\n if (refusal !== undefined) {\n throw new Error(refusal);\n }\n\n // ⚠명시한 --role 이 있으면 저장소 역할을 읽지 않는다 — 설정끼리 어긋난 저장소를 그 --role 이 맞춘다.\n // ★설정끼리 역할이 어긋난 저장소: 대화형이면 «기본값 없이» 묻고, 비대화형이면 사용자에게 물으라며 멈춘다.\n const prompter = options.prompter;\n const role = options.role ?? (prompter\n ? await askRole(prompter, singleRole(rolesInFiles(files).roles))\n : currentRole(files));\n // 설정끼리 어긋나 있으면 «이전 역할»은 하나로 말할 수 없다 — 그때는 변경 알림을 생략한다\n // (명시한 --role 이 둘을 맞추고, 파일별 변화는 계획의 notes 가 말한다).\n const previousRole = (() => {\n try {\n return currentRole(files);\n } catch {\n return undefined;\n }\n })();\n if (!role) {\n // ⚠「하나 고르라」고 말하지 않는다 — 이 문장을 읽는 것은 대개 에이전트이고, 역할은 사용자가 고른다\n // (0.4.1 최종 리뷰 P1, noProjectForRole 과 같은 어조).\n throw new Error(\n \"No role given. Ask the user which role this repository's AI sessions should have \"\n + `(${HARNESS_ROLES.join(\", \")}), then re-run with --role <role>.`,\n );\n }\n\n // 역할이 정해졌으니 이제 그 역할의 연결을 만든다.\n const connected: ConnectedOptions = connectAs(options, role);\n options = connected;\n\n await ensureSignedIn(connected, role, args.dryRun);\n\n const project = await resolveProject(connected, args, files, root, role);\n if (\"choices\" in project) {\n options.io.stdout.write(renderSuccess(\n {\n message: \"More than one project found. Re-run with --project <uuid>.\",\n projects: project.choices,\n },\n { json: options.json },\n ));\n return 1;\n }\n\n const documents: HarnessDocuments = args.dryRun\n ? { versions: {}, fallbacks: {}, unavailableReason: \"skipped in --dry-run\" }\n : await fetchHarnessDocuments({\n endpoint: options.endpoint,\n accessToken: await options.accessToken?.(),\n // 서버가 문서의 클라이언트별 변형 키를 이 이름으로 찾는다.\n client: \"ainecto-cli\",\n fetchImpl: options.fetchImpl,\n });\n\n const plan = planInit({\n role,\n env: options.env,\n projectName: project.name,\n projectUuid: project.uuid,\n endpoint: options.endpoint,\n cliVersion: options.cliVersion,\n files,\n documents,\n });\n if (plan.refusal !== undefined) {\n // ★계획이 「멈춰라」고 하면 멈춘다. 이 판정을 부르는 쪽이 안 보면 그 판정은 «없는» 것이고,\n // 그 경우 읽어 내지 못한 기록을 백업 없이 덮는다(2026-09-27 8차 독립 리뷰 I1).\n // ⚠위에서 이미 물었지만 여기서도 본다 — 계획이 거절을 «돌려주는» 이상 그것을 보지 않는\n // 경로가 생겨선 안 된다. 같은 함수를 쓰므로 두 답이 갈리지 않는다.\n throw new Error(plan.refusal);\n }\n await applyPlan(root, plan, args.dryRun, files);\n if (!args.dryRun && previousRole !== undefined && previousRole !== role) {\n // ★역할이 바뀐 사실을 사람이 보는 자리(에이전트 대화)에 한 줄 남긴다(설계 §13 S2).\n // 셸의 `ainecto` 는 지금부터, 떠 있는 세션의 MCP 도구는 새 세션부터다 — 그 조건까지 같이 말한다.\n options.io.stderr.write(`Role changes from ${previousRole} to ${role}: \\`ainecto\\` commands now, MCP tools from a new session.\\n`);\n }\n\n options.io.stdout.write(renderSuccess(\n {\n action: args.dryRun ? \"init (dry-run)\" : \"init\",\n role,\n project: { uuid: project.uuid, name: project.name },\n endpoint: options.endpoint,\n written: plan.writes.map((write) => `${write.existed ? \"updated\" : \"created\"} ${write.path}`),\n codex: `Codex keeps a single global config, so init does not touch it. Run: ${plan.codexCommand}`,\n codexPerSession: plan.codexProfile,\n codexEnvFallback: `Without a profile, start the session with ${ROLE_ENV_VAR}=${role}.`,\n // ⚠조용히 기본값으로 떨어지지 않는다 — 서버에서 규칙을 고쳐도 안 바뀌는 이유를\n // 사용자가 영영 못 찾게 된다. ★요청 자체의 실패와 «문서별» 되돌림을 둘 다 적는다\n // (2026-09-23 독립 재리뷰 I5: HTTP 200 으로 온 빈 문서가 조용히 패키지 판이 됐다).\n notes: [...rootNotes, ...plan.notes, ...fallbackNotes(documents)],\n // ★「Enforce this on the server too: ainecto auth login …」 줄은 뺐다. init 이 이미 그 역할로\n // 로그인했으므로 참이 아니고, 남아 있으면 에이전트가 따라 쳐서 사람이 한 번 더 승인하게 된다\n // (2026-09-29 독립 리뷰 P1-1).\n // ★재시작 없이 이어간다(2026-09-30 사용자 결정). 셸의 `ainecto` 는 부를 때마다 저장소 역할을 읽어\n // 역할 헤더로 싣는다 — 서버가 요청마다 강제하므로 MCP 연결과 무관하게 이 세션에서 바로 맞다.\n // 재시작은 «그 역할의 MCP 도구»를 더할 뿐인 선택이다.\n next: [\n `Keep working in this session — no restart is needed. \\`ainecto\\` commands run from this repository use the ${role} role at once.`,\n `Read ${HARNESS_DOC_PATH} first, then \\`ainecto tools list\\` shows the role's tools and \\`ainecto tools call <tool> '<json>'\\` calls one.`,\n \"Do not use MCP tools this session started with for this work — they keep the role (or no role) the session started with.\",\n \"Optional, to add the role's MCP tools: start a new session.\",\n `Claude Code: exit and run \\`claude -c\\` in this folder, then approve the \"${SERVER_NAME}\" server from .mcp.json when asked.`,\n `Codex: save the profile above as $CODEX_HOME/${role}.config.toml and start with \\`codex -p ${role}\\`.`,\n role === \"design\"\n // ⚠Design 은 그 변경이 «허용»된다 — 모든 역할에 같은 문장을 내보내면 거짓이 된다.\n ? \"To check the role, change a table through `ainecto` — Design may, and the change lands in AiNecto.\"\n : `To check the role, try changing a table through \\`ainecto\\` — ${role} is told to stop.`,\n `If the new Claude Code session still has no role, run \\`claude mcp get ${SERVER_NAME}\\`: a local-scope \"${SERVER_NAME}\" entry hides .mcp.json (remove it with \\`claude mcp remove ${SERVER_NAME} -s local\\`).`,\n \"Undo everything with: ainecto init --undo\",\n ],\n },\n { json: options.json },\n ));\n return 0;\n}\n\n/** 이 저장소에 이미 걸린 역할. 두 설정이 어긋나 있으면 «고르지 않고» 멈춘다. */\nfunction currentRole(files: ReadonlyMap<string, string | undefined>): HarnessRole | undefined {\n const unique = rolesInFiles(files).roles;\n if (unique.length > 1) {\n throw new Error(\n `Agent configs in this repository disagree about the session role (${unique.join(\", \")}). `\n + \"Ask the user which role this repository's AI sessions should have \"\n + `(${HARNESS_ROLES.join(\", \")}), then re-run with --role <role> to line them up.`,\n );\n }\n return unique[0];\n}\n\n/** 패키지 기본값을 쓴 사실과 그 이유. 없으면 빈 배열. */\nfunction fallbackNotes(documents: HarnessDocuments): string[] {\n const notes: string[] = [];\n if (documents.unavailableReason) {\n notes.push(`Harness rules came from this package, not the server (${documents.unavailableReason}).`);\n }\n for (const [key, reason] of Object.entries(documents.fallbacks)) {\n notes.push(`${key} came from this package, not the server (${reason}).`);\n }\n return notes;\n}\n\n/**\n * ★<b>원격을 부르기 전에 로그인을 확인한다.</b> 그 역할의 토큰이 없으면(만료 + refresh 없음 포함)\n * 브라우저 로그인을 하고 이어서 진행한다(합격 시나리오 4 — 예전엔 401 로 멈추고\n * {@code ainecto auth login} 을 치라고 했다).\n *\n * <p>⚠{@code --dry-run} 은 브라우저를 띄우지 않는다 — 「아무것도 바꾸지 않는다」는 약속에 사용자의\n * 로그인 상태도 든다. 로그인 명령을 알려 주고 멈춘다.\n * <p>토큰은 있는데 서버가 401 을 주는 경우(폐기된 토큰)는 드물어 여기서 다루지 않는다 —\n * {@link callOrExplainSignIn} 이 안내한다. 트리거를 둘로 늘리지 않는다(설계 §8-1).\n */\nasync function ensureSignedIn(\n options: InitCommandOptions,\n role: HarnessRole,\n dryRun: boolean,\n): Promise<void> {\n if (options.login === undefined) {\n return;\n }\n if (await options.accessToken?.()) {\n return;\n }\n if (dryRun) {\n // (dry-run 의 accessToken 은 읽기 전용이다 — 갱신하지 않으므로 만료된 토큰도 여기로 온다.)\n throw new Error(\n `No usable AiNecto sign-in on this machine, and --dry-run neither refreshes it nor opens a browser.\\n\\n`\n + ` ${loginCommand(options)}\\n\\n`\n + \"Then run init again.\",\n );\n }\n await options.login();\n options.io.stderr.write(\"Signed in.\\n\");\n}\n\n/**\n * 저장소 루트 판정. 하위 폴더면 멈추고(던진다), git 저장소가 아니면 그 사실을 note 로 돌려준다.\n *\n * <p>★{@code .git} 은 디렉터리 «또는 파일»이다 — worktree·submodule 은 파일이다. {@code git} 실행\n * 파일에는 기대지 않는다. git 이 아니면 멈추지 않는다: git 을 안 쓰는 사용자가 있고, 그 경우엔\n * 가리킬 «진짜 루트»가 없다(설계 §6-1).\n */\nasync function repositoryRootNotes(cwd: string): Promise<string[]> {\n const gitRoot = await findGitRoot(cwd);\n if (gitRoot === undefined) {\n // (init·undo 둘 다 이 note 를 쓴다 — «설정했다»가 아니라 «어디를 기준으로 삼았나»를 말한다.)\n return [`${cwd} is not inside a git repository, so this folder was used as the repository root.`];\n }\n if (gitRoot !== cwd) {\n throw new Error(\n `This folder is inside the git repository at ${gitRoot}, not at its root. `\n + \"Agents read their MCP config from the repository root, so run init there:\\n\\n\"\n + ` cd ${gitRoot}\\n\\n`\n + \"Nothing was changed.\",\n );\n }\n return [];\n}\n\n/**\n * 역할이 정해진 뒤의 연결. {@code connect} 가 있으면 그것으로 만들고, 없으면 이미 받은 {@code client}.\n * 둘 다 없으면 부르는 쪽의 실수다.\n */\nfunction connectAs(options: InitCommandOptions, role: HarnessRole): ConnectedOptions {\n if (options.connect) {\n const connection = options.connect(role);\n return { ...options, ...connection };\n }\n if (!options.client) {\n throw new Error(\"init needs either a client or a way to connect once the role is known.\");\n }\n return { ...options, client: options.client };\n}\n\nconst ROLE_CHOICES: ReadonlyArray<Choice<HarnessRole>> = [\n { label: \"Design requirements, ERD, boundaries, tasks\", value: \"design\" },\n { label: \"Development product code, following the approved design\", value: \"development\" },\n { label: \"Test test scenarios and test code\", value: \"test\" },\n { label: \"Validation judges the result; changes nothing\", value: \"validation\" },\n];\n\n/**\n * 역할을 묻는다(설계 §6-2). ★기본값이 없다 — 빈 입력은 다시 묻는다. 저장소에 이미 걸린 역할이 있을\n * 때만 그것이 기본값이다(Enter = 유지). 그 값은 사람이 전에 고른 것이지 우리가 고른 것이 아니다.\n */\nasync function askRole(prompter: Prompter, current: HarnessRole | undefined): Promise<HarnessRole> {\n const index = current === undefined ? undefined : ROLE_CHOICES.findIndex((choice) => choice.value === current);\n return prompter.choose(\n current === undefined\n ? \"Which role should AI sessions in this repository have?\"\n : `Which role should AI sessions in this repository have? (now: ${current})`,\n ROLE_CHOICES,\n index,\n );\n}\n\n/**\n * 프로젝트를 묻는다(설계 §6-4). 「새로 만들기」는 Design 이고 dry-run 이 아닐 때만 보인다 — 다른 역할은\n * 서버가 만들기를 거부한다. 0개면: Design 은 이름을 물어 만들고(사람의 선택이 --yes 를 대신한다),\n * 다른 역할은 비대화형과 같은 안내로 멈춘다.\n */\nasync function askProject(\n options: ConnectedOptions,\n args: InitArgs,\n projects: Array<{ uuid: string; name: string }>,\n bound: string | undefined,\n root: string,\n role: HarnessRole,\n prompter: Prompter,\n): Promise<{ uuid: string; name: string }> {\n const canCreate = role === \"design\" && !args.dryRun;\n const askNameAndCreate = async () => {\n const name = await prompter.text(\"New project name\", args.projectName ?? basenameOf(root));\n return createProject(options, name);\n };\n if (projects.length === 0) {\n if (role !== \"design\") {\n throw new Error(noProjectForRole(options, role));\n }\n if (args.dryRun) {\n throw new Error(dryRunCannotCreate(args.projectName ?? basenameOf(root)));\n }\n return askNameAndCreate();\n }\n type ProjectPick = { project: { uuid: string; name: string } } | { create: true };\n const choices: Array<Choice<ProjectPick>> = projects.map((project) => ({\n label: `${project.name} (${project.uuid})`,\n value: { project },\n }));\n if (canCreate) {\n choices.push({ label: \"Create a new project\", value: { create: true } });\n }\n const boundIndex = bound === undefined ? -1 : projects.findIndex((project) => project.uuid === bound);\n const defaultIndex = boundIndex >= 0 ? boundIndex : projects.length === 1 ? 0 : undefined;\n const picked = await prompter.choose(\"Which AiNecto project should this repository use?\", choices, defaultIndex);\n return \"create\" in picked ? askNameAndCreate() : picked.project;\n}\n\n/** 0개 + Design 아님의 안내. 비대화형·대화형이 같은 문장을 쓴다. */\nfunction noProjectForRole(options: Pick<InitCommandOptions, \"endpoint\">, role: HarnessRole): string {\n // ⚠「--role design 으로 다시 치라」고 말하지 않는다. 그 문장은 에이전트를 «역할 전환»으로 이끈다 —\n // 역할은 사용자가 고른 것이다(2026-09-29 코드 리뷰 P1). 사람에게 묻게 하고, 원래 역할로 돌아오게 한다.\n return `No project found in your AiNecto account, and only a Design session can create one. `\n + `Ask the user: create the project at ${new URL(options.endpoint).origin} or in a Design session, `\n + `then run init again with --role ${role}.`;\n}\n\nfunction dryRunCannotCreate(name: string): string {\n // ★dry-run 이 «원격에» 프로젝트를 만들면 그것은 dry-run 이 아니다(2026-09-22 독립 리뷰 I6).\n return `--dry-run cannot continue: there is no project to bind, and creating \"${name}\" `\n + \"would be a real change. Re-run without --dry-run, or pass --project <uuid>.\";\n}\n\ntype ResolvedProject = { uuid: string; name: string } | { choices: Array<{ uuid: string; name: string }> };\n\nasync function resolveProject(\n options: ConnectedOptions,\n args: InitArgs,\n files: ReadonlyMap<string, string | undefined>,\n root: string,\n role: HarnessRole,\n): Promise<ResolvedProject> {\n const projects = await listProjects(options);\n\n if (args.projectUuid) {\n const found = projects.find((project) => project.uuid === args.projectUuid);\n return found ?? { uuid: args.projectUuid, name: args.projectName ?? args.projectUuid };\n }\n\n const bound = boundProjectUuid(files.get(HARNESS_CONFIG_PATH));\n if (options.prompter) {\n return askProject(options, args, projects, bound, root, role, options.prompter);\n }\n if (bound) {\n const found = projects.find((project) => project.uuid === bound);\n if (found) {\n return found;\n }\n }\n\n if (projects.length === 1) {\n return projects[0]!;\n }\n if (projects.length > 1) {\n return { choices: projects };\n }\n\n // 프로젝트가 하나도 없다 — 만들어야 한다.\n // ★만들 수 있는 것은 Design 세션뿐이다(서버 McpRolePolicy: create_projects 는 Design·FULL 만).\n // 예전엔 다른 역할로 --yes 를 주면 서버가 거부하고, 우리는 「Project creation did not return a\n // project uuid.」라는 엉뚱한 말로 끝났다. 원격 쓰기를 부르기 «전에» 사람이 할 일을 말한다.\n if (role !== \"design\") {\n throw new Error(noProjectForRole(options, role));\n }\n // ★쓰기이므로 --yes 없이는 하지 않는다.\n const name = args.projectName ?? basenameOf(root);\n if (!args.yes) {\n throw new Error(\n `No project found in your AiNecto account. Re-run with --yes to create \"${name}\", `\n + \"or --project-name <name> --yes to pick the name.\",\n );\n }\n if (args.dryRun) {\n throw new Error(dryRunCannotCreate(name));\n }\n return createProject(options, name);\n}\n\nasync function listProjects(options: ConnectedOptions): Promise<Array<{ uuid: string; name: string }>> {\n const result = await callOrExplainSignIn(options, () => options.client.toolsCall(\"list_projects\", {}));\n return extractProjects(unwrapToolJson(result));\n}\n\n/**\n * ★<b>401 을 «무엇을 하라»로 바꾼다.</b>\n *\n * <p>토큰이 «없을» 때는 여기까지 오지 않는다 — {@link ensureSignedIn} 이 먼저 로그인한다.\n * 여기 오는 것은 토큰은 있는데 서버가 거절한 경우(폐기 등)와, 로그인 함수를 받지 못한 호출이다.\n * 그때 {@code MCP HTTP request failed with HTTP 401.} 한 줄만 남기면 무엇을 해야 하는지 모른다\n * (2026-09-23 살아 있는 서버로 처음 돌려 보고 발견).\n *\n * <p>⚠401 을 받았다고 «다시» 브라우저를 띄우지는 않는다. 로그인 트리거는 하나로 둔다(설계 §8-1).\n * 브리지({@code ainecto mcp})는 애초에 자동 로그인하지 않는다 — 세션 한가운데서 창이 뜨면 안 된다.\n */\nasync function callOrExplainSignIn<T>(\n options: InitCommandOptions,\n run: () => Promise<T>,\n): Promise<T> {\n try {\n return await run();\n } catch (error) {\n if (!isUnauthorized(error)) {\n throw error;\n }\n throw new Error(\n `Not signed in, so ${options.endpoint} refused the request (HTTP 401).\\n\\n`\n + ` ${loginCommand(options)}\\n\\n`\n + \"Then run init again. Sign-in is one per machine; the role comes from this repository.\",\n );\n }\n}\n\n/**\n * 이 저장소·이 서버에 맞는 로그인 명령 한 줄. ★<b>만드는 곳은 여기 하나다.</b>\n *\n * <p>⚠예전엔 「이 env 의 기본 주소면 인자를 생략」이라고만 하고 그 env 자체도 안 실었다.\n * CLI 의 기본 env 는 prod 라, dev 기본 주소에서 막힌 사람이 그 명령을 그대로 치면 «운영»\n * 슬롯에 로그인하고 같은 자리에서 또 막힌다(2026-09-23 4차 독립 리뷰 S2).\n * 주소든 env 든 <b>하나는 반드시</b> 실린다.\n */\nfunction loginCommand(options: Pick<InitCommandOptions, \"env\" | \"endpoint\">): string {\n const target = isDefaultEndpointFor(options.env, options.endpoint)\n ? (options.env === \"prod\" ? \"\" : ` --env ${options.env}`)\n : ` --endpoint ${options.endpoint}`;\n // 로그인은 서버마다 한 번이다(0.4.2) — 역할을 싣지 않는다.\n return `ainecto auth login${target}`;\n}\n\nfunction isUnauthorized(error: unknown): boolean {\n return error instanceof McpRpcError\n && error.code === \"MCP_HTTP_ERROR\"\n && (error.details as { status?: number } | undefined)?.status === 401;\n}\n\nasync function createProject(options: ConnectedOptions, name: string): Promise<{ uuid: string; name: string }> {\n const result = await callOrExplainSignIn(options, () =>\n options.client.toolsCall(\"create_projects\", { items: [{ name }] }));\n const created = extractProjects(unwrapToolJson(result));\n const first = created[0];\n if (!first) {\n throw new Error(\"Project creation did not return a project uuid.\");\n }\n // ★원격에 생긴 것을 «바로» 알린다. 뒤에서 실패하면 결과 출력이 없어 사용자는 이 프로젝트가\n // 생긴 줄 모른다(설계 §13 S9).\n options.io.stderr.write(`Created project ${first.name} (${first.uuid}).\\n`);\n return first;\n}\n\n/** MCP 도구 응답은 {@code content[0].text} 에 JSON 문자열로 온다. */\nexport function unwrapToolJson(result: unknown): unknown {\n if (!isRecord(result) || !Array.isArray(result.content)) {\n return result;\n }\n const first = result.content.find((item) => isRecord(item) && item.type === \"text\");\n if (!isRecord(first) || typeof first.text !== \"string\") {\n return result;\n }\n try {\n return JSON.parse(first.text);\n } catch {\n return first.text;\n }\n}\n\n/**\n * 응답 모양을 단정하지 않고 «uuid 와 name 을 가진 객체의 배열»을 찾는다.\n * ⚠도구 응답 포맷을 여기 박아 두면 서버가 한 겹 감싸는 순간 조용히 빈 목록이 된다.\n */\nexport function extractProjects(value: unknown): Array<{ uuid: string; name: string }> {\n const candidates: unknown[] = Array.isArray(value)\n ? value\n : isRecord(value)\n ? [\"projects\", \"items\", \"created\", \"data\", \"hits\"].flatMap((key) => {\n const nested = value[key];\n return Array.isArray(nested) ? nested : [];\n })\n : [];\n const projects: Array<{ uuid: string; name: string }> = [];\n for (const candidate of candidates) {\n if (isRecord(candidate) && typeof candidate.uuid === \"string\") {\n projects.push({\n uuid: candidate.uuid,\n name: typeof candidate.name === \"string\" ? candidate.name : candidate.uuid,\n });\n }\n }\n return projects;\n}\n\nfunction boundProjectUuid(config: string | undefined): string | undefined {\n if (!config) {\n return undefined;\n }\n try {\n const parsed = JSON.parse(config) as { project?: { uuid?: unknown } };\n return typeof parsed.project?.uuid === \"string\" ? parsed.project.uuid : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * ★<b>읽기도 경계 검사를 먼저 통과한다.</b> 예전엔 스냅샷을 다 읽은 «뒤에» 경계를 봤다 —\n * 저장소 밖을 가리키는 링크의 내용을 한 번 읽고 나서 거절했다(2026-09-23 독립 재리뷰 I4).\n * 쓰기·삭제만 막으면 되는 게 아니다. 읽는 것도 남의 파일이다.\n */\nasync function readSnapshot(root: string): Promise<Map<string, string | undefined>> {\n const snapshot = new Map<string, string | undefined>();\n for (const path of MANAGED_PATHS) {\n snapshot.set(path, await readManagedFile(root, path));\n }\n return snapshot;\n}\n\n/**\n * 계획을 적용한다.\n *\n * <p>★<b>먼저 전부 검사하고, 그 다음에 쓴다.</b> 예전엔 한 파일씩 쓰다가 중간에 막히면\n * (권한 등) 앞 파일만 바뀐 채로 실패했다(2026-09-22 독립 리뷰 I5). 지금은 경계·링크·\n * 「스냅샷 이후 바뀌었는가」를 먼저 다 보고, 하나라도 걸리면 아무것도 안 쓴다.\n *\n * <p>⚠그래도 «쓰는 도중» 실패는 완전히 못 막는다(디스크 가득 등). 그때 무엇이 쓰였는지는\n * 오류에 적는다 — 조용히 반쪽 상태로 두지 않는다.\n */\nasync function applyPlan(\n root: string,\n plan: InitPlan,\n dryRun: boolean,\n snapshot: FileSnapshotMap,\n recordFirst = true,\n): Promise<void> {\n // ①먼저 «전부» 본다 — 하나라도 못 쓸 상황이면 아무것도 건드리지 않고 멈추는 게 낫다.\n for (const write of plan.writes) {\n await assertInsideRepository(root, write.path);\n await assertUnchangedSinceSnapshot(root, write.path, snapshot);\n }\n for (const path of plan.deletes) {\n await assertInsideRepository(root, path);\n await assertUnchangedSinceSnapshot(root, path, snapshot);\n }\n if (dryRun) {\n return;\n }\n const applied: string[] = [];\n try {\n // ★<b>복구 기록을 먼저 쓴다.</b> 예전엔 관리 기록(config.json)이 «마지막» 쓰기였다.\n // 그래서 중간에 실패하면 이미 바뀐 파일이 있는데 기록이 없어 undo 가 아무것도 못 되돌렸다\n // (2026-09-23 독립 재리뷰 I11). 되돌릴 수 있게 만드는 것이 첫 일이다.\n // ★되돌리기에서는 기록을 건드리는 일이 «작업 전체»의 마지막이다. 4차에서 config 를 쓰기\n // 목록의 뒤로 옮겼지만, 쓰기가 다 끝난 «뒤에» 삭제가 온다. 그래서 삭제가 실패하면 기록은\n // 이미 옛 파일로 돌아가 있고 되돌릴 근거가 없었다(2026-09-23 5차 독립 리뷰 I1).\n const isRecord = (path: string) => !recordFirst && path === HARNESS_RECORD_PATH;\n const recordWrites = plan.writes.filter((write) => isRecord(write.path));\n const recordDeletes = plan.deletes.filter((path) => isRecord(path));\n /**\n * ★<b>우리가 «실제로 만든» 디렉터리.</b> {@code mkdir(recursive)} 는 자기가 만든 가장 위\n * 디렉터리를 돌려주고, 이미 있었으면 undefined 를 준다 — 그게 우리가 알고 싶던 사실\n * 그 자체다. 이 칸의 진실원은 이 변수 하나이고, 계획은 여기에 관여하지 않는다.\n * (직전 실행에서 이어받은 것은 이미 기록에 있으므로 함께 들고 간다.)\n */\n const createdDirectories: string[] = [...(plan.record?.createdDirectories ?? [])];\n const rememberDirectories = (directories: readonly string[]) => {\n for (const directory of directories) {\n if (!createdDirectories.includes(directory)) {\n createdDirectories.push(directory);\n }\n }\n };\n /**\n * 기록의 디렉터리 칸을 «실제로 만든 것»으로 바로잡는다.\n *\n * <p>★성공했을 때만 하면 안 된다 — 중간에 실패해도 그 순간까지의 사실이 기록에 남아야\n * 한다. 예전엔 보정이 성공 경로에만 있어서, 만들기 «전»에 실패한 계획이 그대로 남고\n * 그 뒤 사용자가 만든 디렉터리를 다음 undo 가 지웠다(2026-09-27 6차 독립 리뷰 S1).\n *\n * <p>⚠기록 보정이 실패해도 원래 오류를 덮지 않는다. 같은 내용을 두 번 써도 무해하다.\n */\n const recordActualDirectories = async () => {\n const write = plan.writes.find((w) => w.path === HARNESS_RECORD_PATH);\n if (!recordFirst || !plan.record || !write || !applied.includes(HARNESS_RECORD_PATH)) {\n return;\n }\n await writeManagedFile(root, {\n ...write,\n content: withCreatedDirectories(write.content, createdDirectories),\n });\n };\n /**\n * 보정을 «삼키지 않는다». 다른 오류가 진행 중이면 그 오류를 살리고, 아니면 드러낸다.\n *\n * <p>★예전엔 무조건 삼켰다. 그러면 init 이 종료 0 을 돌려주는데 기록의 디렉터리 칸이\n * 비어 있고, 그 상태의 undo 는 우리가 만든 디렉터리를 남긴다 — 「성공」이 기록 완료를\n * 보증하지 않았다(2026-09-27 7차 독립 리뷰 S1).\n */\n const recordDirectoriesOrExplain = async (failing: boolean) => {\n try {\n await recordActualDirectories();\n } catch (error) {\n if (!failing) {\n throw error;\n }\n }\n };\n const apply = async (writes: readonly FileWrite[], deletes: readonly string[]) => {\n for (const write of writes) {\n // ②그리고 «쓰기 직전에» 다시 본다. ①과 실제 쓰기 사이에 누가 고칠 수 있다 — 그 틈으로\n // 남의 편집이 덮여 나갔다(같은 항목). 검사와 쓰기를 붙여 놓으면 창이 작아진다.\n await assertUnchangedSinceSnapshot(root, write.path, snapshot);\n await writeManagedFile(root, write, rememberDirectories);\n applied.push(write.path);\n }\n for (const path of deletes) {\n await assertUnchangedSinceSnapshot(root, path, snapshot);\n await rm(join(root, path), { force: true });\n applied.push(path);\n }\n };\n\n try {\n await apply(\n orderedWrites(plan.writes.filter((write) => !isRecord(write.path)), recordFirst),\n plan.deletes.filter((path) => !isRecord(path)),\n );\n await recordDirectoriesOrExplain(false);\n // 여기까지 전부 된 다음에만 기록을 줄이거나 지운다.\n await apply(recordWrites, recordDeletes);\n } catch (error) {\n await recordDirectoriesOrExplain(true);\n throw error;\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(\n `${message}\\nAlready applied before this failure: ${applied.join(\", \") || \"(nothing)\"}`,\n );\n }\n // 우리가 «만든» 디렉터리가 비었으면 그것도 치운다.\n // ⛔recursive 로 지우지 않는다 — 사용자가 그 안에 둔 다른 파일까지 날아간다.\n // rmdir 는 «비어 있을 때만» 성공하므로, 비었는지는 파일시스템이 판정한다.\n // ★「비었으면 치운다」였을 때는 init 전부터 있던 빈 .cursor 까지 사라졌다\n // (2026-09-23 4차 독립 리뷰 S3). 비었다는 것과 우리 것이라는 것은 다른 사실이다.\n for (const directory of plan.removableDirectories ?? []) {\n await rmdir(join(root, directory)).catch(() => undefined);\n }\n}\n\n/**\n * 관리 기록을 맨 앞으로 옮긴 쓰기 순서.\n *\n * <p>★기록이 먼저 디스크에 있어야 그 뒤의 실패를 되돌릴 수 있다. 기록에 적힌 지문은\n * «쓰려던 내용»의 것이라, 못 쓴 파일은 지문이 안 맞아 undo 가 「손댔다」로 보고 남긴다 —\n * 안 만든 파일을 지우려 드는 것보다 안전한 쪽이다.\n */\nfunction orderedWrites(writes: readonly FileWrite[], recordFirst: boolean): FileWrite[] {\n const record = writes.filter((write) => write.path === HARNESS_RECORD_PATH);\n const rest = writes.filter((write) => write.path !== HARNESS_RECORD_PATH);\n // ★undo 에서는 «마지막»이다. undo 가 config 에 쓰는 것은 기록을 남기는 일이 아니라\n // 옛 파일로 «되돌리는» 일이라, 먼저 하면 나머지를 되돌릴 근거를 스스로 지운다\n // (2026-09-23 4차 독립 리뷰 I2). 같은 순서 규칙을 두 방향에 그대로 쓰면 안 된다.\n return recordFirst ? [...record, ...rest] : [...rest, ...record];\n}\n\n\n/** 파일을 읽은 뒤 우리가 네트워크를 기다리는 사이에 누가 고쳤으면, 그 변경을 덮지 않는다. */\nasync function assertUnchangedSinceSnapshot(\n root: string,\n relativePath: string,\n snapshot: FileSnapshotMap,\n): Promise<void> {\n if (!snapshot.has(relativePath)) {\n return;\n }\n const now = await readIfExists(join(root, relativePath));\n if (now !== snapshot.get(relativePath)) {\n throw new Error(\n `${relativePath} changed while init was running; nothing was written. Run init again.`,\n );\n }\n}\n\n/**\n * 임시 파일에 쓰고 바꿔 끼운다 — 도중에 죽어도 반쪽짜리 파일이 남지 않는다.\n *\n * <p>★<b>기존 파일의 권한을 그대로 가져간다.</b> rename 은 inode 를 «갈아치우므로», 그냥\n * 만들면 umask 기본값(보통 0644)이 된다. 남의 서버 설정에 환경변수가 들어 있는 0600 파일이\n * init 한 번에 0644 로 넓어졌다(2026-09-23 독립 재리뷰 N1). 내용을 합치는 일이 남의 파일\n * 접근 권한까지 바꾸면 안 된다.\n */\nasync function writeManagedFile(\n root: string,\n write: FileWrite,\n onDirectoriesCreated?: (directories: readonly string[]) => void,\n): Promise<string[]> {\n const absolutePath = join(root, write.path);\n const targetDirectory = dirname(absolutePath);\n const firstCreated = await mkdir(targetDirectory, { recursive: true });\n // ★<b>만든 사실을 «지금» 넘긴다.</b> 예전엔 반환값으로만 줬는데, 그 반환은 rename 뒤에\n // 일어난다 — 그 사이에 쓰기가 실패하면 «우리가 만든 디렉터리»라는 사실이 통째로 사라졌고,\n // 다음 init 의 mkdir 는 이미 있는 디렉터리에 undefined 를 주므로 회복도 못 했다\n // (2026-09-27 7차 독립 리뷰 S1). 만드는 것과 쓰는 것은 다른 일이다.\n const created = createdChain(root, firstCreated, targetDirectory);\n onDirectoriesCreated?.(created);\n const previousMode = await fileMode(absolutePath);\n const tmpPath = `${absolutePath}.${process.pid}.${Date.now()}.tmp`;\n // 임시 파일도 «처음부터» 좁게 만든다 — 넓게 만들었다가 좁히면 그 사이가 창이다.\n await writeFile(tmpPath, write.content, { encoding: \"utf8\", mode: previousMode ?? 0o600 });\n if (previousMode !== undefined) {\n await chmod(tmpPath, previousMode);\n }\n await rename(tmpPath, absolutePath);\n return created;\n}\n\n/**\n * 이번 {@code mkdir} 이 «정말 만든» 디렉터리들 — 저장소 기준 상대 경로, 깊은 것부터.\n *\n * <p>★{@code recursive: true} 는 자기가 만든 «가장 위» 디렉터리 하나만 돌려준다. 그 아래부터\n * 목표 디렉터리까지도 같이 만들어진 것이므로 구간 전체가 우리 것이다. 이미 있었으면\n * undefined 를 주므로 그때는 빈 목록이다 — <b>「있다」와 「우리가 만들었다」가 갈리는 지점</b>.\n */\nexport function createdChain(root: string, firstCreated: string | undefined, targetDirectory: string): string[] {\n if (firstCreated === undefined) {\n return [];\n }\n const stop = resolve(firstCreated);\n const made: string[] = [];\n for (let at = resolve(targetDirectory); ; at = dirname(at)) {\n const asRelative = relative(root, at);\n if (asRelative && !asRelative.startsWith(\"..\")) {\n made.push(asRelative.split(sep).join(\"/\"));\n }\n if (at === stop || dirname(at) === at) {\n break;\n }\n }\n return made;\n}\n\nasync function fileMode(absolutePath: string): Promise<number | undefined> {\n try {\n return (await stat(absolutePath)).mode & 0o7777;\n } catch (error) {\n if (isRecord(error) && error.code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n}\n\ntype FileSnapshotMap = Map<string, string | undefined>;\n\nfunction parseInitArgs(argv: string[]): InitArgs {\n const args: InitArgs = { dryRun: false, undo: false, yes: false };\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (!arg) {\n continue;\n }\n if (arg === \"--project\") {\n args.projectUuid = requireValue(arg, argv[++index]);\n } else if (arg === \"--project-name\") {\n args.projectName = requireValue(arg, argv[++index]);\n } else if (arg === \"--dry-run\") {\n args.dryRun = true;\n } else if (arg === \"--undo\") {\n args.undo = true;\n } else if (arg === \"--yes\" || arg === \"-y\") {\n args.yes = true;\n } else if (arg === \"--json\") {\n // 전역 플래그 — 여기선 무시한다.\n } else {\n throw new Error(`Unknown argument: ${arg}`);\n }\n }\n return args;\n}\n\nfunction requireValue(flag: string, value: string | undefined): string {\n if (!value || value.startsWith(\"--\")) {\n throw new Error(`${flag} requires a value.`);\n }\n return value;\n}\n\nfunction basenameOf(path: string): string {\n const parts = path.split(/[\\\\/]/).filter(Boolean);\n return parts[parts.length - 1] ?? \"ainecto-project\";\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { basename } from \"node:path\";\nimport { isDefaultEndpointFor } from \"../config/endpoints\";\nimport { PACKAGE_NAME } from \"../version\";\nimport { HARNESS_ROLES, type HarnessRole } from \"./role\";\n\n/**\n * 「어느 에이전트의 어느 파일에 무엇을 적는가」.\n *\n * ★<b>MCP 항목은 «하나»만 쓴다.</b> 이것이 「하나의 세션은 하나의 역할」을 강제하는 방식이다 —\n * 네 역할을 동시에 등록해 두면 개발 세션이 설계 서버도 보게 되고, 그 순간 제약은 다시\n * 「규칙을 읽고 지켜라」로 내려앉는다. 역할을 바꾸려면 이 한 항목을 고치고 세션을 다시 연다.\n *\n * ⚠<b>Codex 는 여기 없다.</b> Codex 의 MCP 설정은 {@code $CODEX_HOME/config.toml} 전역이라\n * 프로젝트별 파일이 없다. 프로젝트에서 친 명령이 말없이 전역 설정을 고치면 다른 저장소의\n * 세션까지 역할이 걸린다. ⇒ 우리가 고치지 않고 <b>실행할 명령을 내준다</b>.\n *\n * <p>★<b>Codex 의 세션별 역할은 «프로필»로 한다</b>(2026-09-22 실측, codex 0.153.4).\n * {@code codex -p <name>} 은 {@code $CODEX_HOME/<name>.config.toml} 을 base 위에 얹고,\n * <b>같은 서버 이름이면 프로필 쪽이 base 를 덮어쓴다</b> — 합쳐지지 않는다. 그래서 서버 항목은\n * 여전히 «하나»이고 「한 세션에 한 역할」이 그대로 성립한다.\n * ⚠구식 {@code [profiles.<name>]} 테이블은 이제 «에러로» 거부된다 — 별도 파일이어야 한다.\n * ⛔CODEX_HOME 을 프로젝트별로 바꾸는 길은 auth.json 까지 갈려 로그인을 잃으므로 택하지 않았다.\n */\n\n/** 설정에 쓰는 서버 이름. ⛔env 에 따라 바꾸지 않는다 — 도구 접두사가 흔들리고 --undo 가 못 찾는다. */\nexport const SERVER_NAME = \"ainecto\";\n\nexport interface AgentTarget {\n id: \"claude-code\" | \"cursor\";\n label: string;\n /** 저장소 루트 기준 상대 경로. */\n path: string;\n}\n\nexport const AGENT_TARGETS: readonly AgentTarget[] = [\n { id: \"claude-code\", label: \"Claude Code\", path: \".mcp.json\" },\n { id: \"cursor\", label: \"Cursor\", path: \".cursor/mcp.json\" },\n];\n\nexport interface ServerEntryInput {\n role: HarnessRole;\n /** \"prod\" 면 인자를 안 붙인다 — 기본값을 설정에 박으면 기본이 바뀔 때 거짓이 된다. */\n env?: \"prod\" | \"dev\";\n /**\n * 기본이 아닌 엔드포인트. ⚠<b>이걸 빠뜨리면</b> init 은 이 주소에서 프로젝트를 찾아 적어\n * 놓고, 정작 에이전트는 «기본 주소»에 붙는다 — 문서가 가리키는 곳과 세션이 보는 곳이\n * 달라진다(2026-09-22 독립 리뷰 I7).\n */\n endpoint?: string;\n}\n\nexport interface McpServerEntry {\n command: string;\n args: string[];\n}\n\nexport function buildServerEntry(input: ServerEntryInput): McpServerEntry {\n const args = [\"-y\", PACKAGE_NAME, \"--role\", input.role];\n if (input.env && input.env !== \"prod\") {\n args.push(\"--env\", input.env);\n }\n // ★«이 env 의» 기본 주소일 때만 생략한다. 넓은 기본 판정을 쓰면 dev 주소가 prod 로 해석된다.\n if (input.endpoint && !isDefaultEndpointFor(input.env ?? \"prod\", input.endpoint)) {\n args.push(\"--endpoint\", input.endpoint);\n }\n return { command: \"npx\", args };\n}\n\n/** 설정에 적힌 항목에서 역할을 되읽는다. 설정이 곧 진실원이므로 여기서만 읽는다. */\nexport function readRoleFromEntry(entry: unknown): HarnessRole | undefined {\n if (!isRecord(entry) || !Array.isArray(entry.args)) {\n return undefined;\n }\n const index = entry.args.indexOf(\"--role\");\n const value = index >= 0 ? entry.args[index + 1] : undefined;\n return typeof value === \"string\" && (HARNESS_ROLES as readonly string[]).includes(value)\n ? (value as HarnessRole)\n : undefined;\n}\n\nexport interface MergeResult {\n /** 적어 넣은 결과 JSON 문자열 (끝에 줄바꿈 포함). */\n content: string;\n /** 이 파일에 우리 항목이 이미 있었나 — 보고용. */\n replaced: boolean;\n /**\n * 우리가 «밀어낸» 원래 항목. ★undo 가 이것을 도로 넣는다.\n * 없으면 undefined — 그때는 undo 가 그냥 지운다.\n */\n replacedEntry?: unknown;\n}\n\n/**\n * 기존 설정을 살린 채 우리 항목 하나만 얹는다.\n *\n * ⚠<b>남의 서버 항목을 지우지 않는다.</b> 이 파일은 사용자의 것이고 우리는 한 칸을 빌릴 뿐이다.\n * 파싱이 안 되면 덮어쓰지 말고 던진다 — 읽을 수 없는 파일을 덮으면 사용자의 설정이 사라진다.\n */\n/**\n * 이 파일에 들어 있는 «우리» 서버 항목. 없거나 파일이 JSON 이 아니면 undefined.\n *\n * <p>undo 가 「우리가 쓴 그대로인가」를 보려고 쓴다 — 파일 «전체»가 아니라 우리가 소유한\n * 조각만 견주어야, 남이 다른 항목을 더한 것과 우리 항목을 손댄 것을 구별한다\n * (2026-09-23 독립 재리뷰 I8).\n */\nexport function readServerEntry(existing: string | undefined): unknown {\n if (existing === undefined) {\n return undefined;\n }\n try {\n const parsed = JSON.parse(existing) as { mcpServers?: unknown };\n const servers = parsed?.mcpServers;\n return isRecord(servers) ? servers[SERVER_NAME] : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * 이 항목이 우리 브리지({@code npx -y @ainecto/mcp …} · 전역 설치한 {@code ainecto})인가.\n * {@code --role} 을 싣는 것도 우리 브리지뿐이다.\n */\nexport function isOurBridge(entry: unknown): boolean {\n if (!isRecord(entry)) {\n return false;\n }\n const { command, args } = entry as { command?: unknown; args?: unknown };\n const argList = Array.isArray(args) ? args.filter((arg): arg is string => typeof arg === \"string\") : [];\n const isOurPackage = (arg: string) => arg === PACKAGE_NAME || arg.startsWith(`${PACKAGE_NAME}@`);\n if (argList.some((arg) => isOurPackage(arg) || arg === \"--role\")) {\n return true;\n }\n const bin = typeof command === \"string\" ? basename(command) : \"\";\n return OUR_BINS.includes(bin);\n}\n\n/**\n * 전역 설치한 우리 명령 이름(package.json bin 중 브리지를 띄울 수 있는 것). ⚠{@code mcp} 는 넣지 않는다 —\n * 흔한 이름이라 남의 명령일 수 있고, 우리 브리지로 오인하면 «역할 없는 브리지»로 읽혀 모든 명령이 멈춘다.\n */\nconst OUR_BINS: readonly string[] = [\"ainecto\"];\n\nexport function mergeServerEntry(existing: string | undefined, entry: McpServerEntry): MergeResult {\n const root = parseConfigObject(existing);\n const servers = readServers(root);\n const replaced = Object.prototype.hasOwnProperty.call(servers, SERVER_NAME);\n const replacedEntry = replaced ? servers[SERVER_NAME] : undefined;\n servers[SERVER_NAME] = entry;\n return { content: stringify({ ...root, mcpServers: servers }), replaced, replacedEntry };\n}\n\nexport interface RemoveResult {\n /** 우리 항목을 뺀 결과. 파일을 통째로 지워야 하면 undefined. */\n content?: string;\n removed: boolean;\n /** 우리 항목을 빼고 나니 아무것도 안 남았나. */\n emptied: boolean;\n}\n\n/**\n * 되돌릴 목표를 «감싸서» 받는다.\n *\n * <p>★{@code restoreEntry?: unknown} 과 {@code !== undefined} 조합은 <b>저장된 {@code null} 을\n * 「백업 없음」으로 바꾼다.</b> 사용자가 {@code \"ainecto\": null} 을 적어 두었고 우리가 그것을\n * 백업했다면, 되돌리기는 null 을 도로 넣어야 한다(2026-09-27 7차 독립 리뷰 I5).\n * 「값이 없다」와 「값이 null 이다」는 다른 사실이므로 그 둘을 한 자리에 담지 않는다.\n */\nexport interface RestoreEntry {\n value: unknown;\n}\n\nexport function removeServerEntry(existing: string | undefined, restore?: RestoreEntry): RemoveResult {\n if (existing === undefined) {\n return { removed: false, emptied: false };\n }\n const root = parseConfigObject(existing);\n const servers = readServers(root);\n const removed = Object.prototype.hasOwnProperty.call(servers, SERVER_NAME);\n if (restore !== undefined) {\n // ★우리가 밀어낸 사용자 항목을 도로 넣는다. 지우는 것이 아니라 «되돌리는» 것이다.\n servers[SERVER_NAME] = restore.value;\n return { content: stringify({ ...root, mcpServers: servers }), removed, emptied: false };\n }\n if (removed) {\n delete servers[SERVER_NAME];\n }\n const otherKeys = Object.keys(root).filter((key) => key !== \"mcpServers\");\n const emptied = Object.keys(servers).length === 0 && otherKeys.length === 0;\n return { content: stringify({ ...root, mcpServers: servers }), removed, emptied };\n}\n\n/** Codex 는 전역 설정뿐이라 «우리가 고치지 않는다». 사용자가 칠 명령을 내준다. */\nexport function codexAddCommand(input: ServerEntryInput): string {\n const entry = buildServerEntry(input);\n return `codex mcp add ${SERVER_NAME} -- ${entry.command} ${entry.args.join(\" \")}`;\n}\n\n/**\n * Codex 에서 역할을 세션마다 바꾸는 법. ★프로필 파일이 같은 이름의 서버를 덮어쓰므로\n * 항목은 하나로 유지된다.\n */\nexport function codexProfileSetup(input: ServerEntryInput): string[] {\n const entry = buildServerEntry(input);\n return [\n `Per-session roles in Codex use profiles. Put this in $CODEX_HOME/${input.role}.config.toml:`,\n \"\",\n ` [mcp_servers.${SERVER_NAME}]`,\n ` command = \"${entry.command}\"`,\n ` args = ${JSON.stringify(entry.args)}`,\n \"\",\n `Then start that session with: codex -p ${input.role}`,\n \"A profile entry with the same server name replaces the global one, so the session still sees exactly one.\",\n ];\n}\n\nexport function codexRemoveCommand(): string {\n return `codex mcp remove ${SERVER_NAME}`;\n}\n\n/**\n * {@code mcpServers} 를 읽는다. ⚠<b>모양이 틀리면 «조용히 버리지» 않는다</b> —\n * 배열이나 문자열이 들어 있는 설정을 {@code {}} 로 갈아 끼우면 사용자의 내용이 사라진다\n * (2026-09-22 독립 리뷰 I8). 이미 깨진 설정이어도 원문을 없애는 건 우리 일이 아니다.\n */\nfunction readServers(root: Record<string, unknown>): Record<string, unknown> {\n const servers = root.mcpServers;\n if (servers === undefined) {\n return {};\n }\n if (!isRecord(servers)) {\n throw new Error(\n \"Existing MCP config has an \\\"mcpServers\\\" value that is not an object, so it was left untouched. \"\n + \"Fix it by hand and run init again.\",\n );\n }\n return { ...servers };\n}\n\nfunction parseConfigObject(existing: string | undefined): Record<string, unknown> {\n if (existing === undefined || !existing.trim()) {\n return {};\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(existing);\n } catch (error) {\n throw new Error(\n `Existing MCP config is not valid JSON, so it was left untouched. Fix it by hand and run init again. (${\n error instanceof Error ? error.message : String(error)\n })`,\n );\n }\n if (!isRecord(parsed)) {\n throw new Error(\"Existing MCP config must be a JSON object; it was left untouched.\");\n }\n return parsed;\n}\n\nfunction stringify(value: unknown): string {\n return `${JSON.stringify(value, null, 2)}\\n`;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n","import { AGENT_TARGETS, SERVER_NAME } from \"./agentTargets\";\nimport { ROLE_ENV_VAR } from \"./role\";\n\n/**\n * 저장소에 쓰는 글. ⚠<b>사용자 노출 문자열은 영어</b>로 쓴다 — 이 저장소의 기존 관례이고\n * (help·에러 메시지가 전부 영어) 공개 npm 패키지가 남의 저장소에 써 넣는 파일이다.\n * 주석·설계 메모만 한국어다.\n *\n * ★<b>역할을 여기 적지 않는다.</b> 역할의 진실원은 MCP 서버 설정 한 곳이고, 지금 무엇인지는\n * 서버가 {@code initialize} 안내문으로 말해 준다. 이 글에도 적으면 역할을 바꿀 때마다 두\n * 곳을 맞춰야 하고, 어긋나는 순간 에이전트는 틀린 쪽을 믿는다.\n */\n\nexport const MARKER_BEGIN = \"<!-- ainecto:begin -->\";\nexport const MARKER_END = \"<!-- ainecto:end -->\";\n\ntype MarkerKind = \"begin\" | \"end\";\nconst MARKERS: Record<MarkerKind, string> = { begin: MARKER_BEGIN, end: MARKER_END };\n\n/** 하네스 폴더. */\nexport const HARNESS_DIR = \".ainecto\";\nexport const HARNESS_DOC_PATH = `${HARNESS_DIR}/HARNESS.md`;\nexport const HARNESS_CONFIG_PATH = `${HARNESS_DIR}/config.json`;\n\n/**\n * ★<b>되돌리기 기록의 자리. 이 파일은 «전부 우리 것»이다.</b>\n *\n * <p>예전엔 기록이 {@code config.json} 안에 살았다. 그 파일은 사용자도 칸을 더하고 고치는\n * 파일이라, 한 파일에 주인이 둘이었다 — 그래서 되돌리기가 매번 「이 칸이 누구 것인가」를\n * 판정해야 했고, <b>그 판정이 네 차수 연속 샜다</b>(2026-09-23 4차 I7 → 5차 I2·S3 →\n * 6차 I1·I3 → 2026-09-27 7차 I1·I2·I3).\n *\n * <p>기록을 우리 파일로 내보내면 그 질문 자체가 사라진다:\n * <ul>\n * <li>우리 파일 — 통째로 쓰고 통째로 지운다. 병합도 소유 판정도 없다.</li>\n * <li>남의 파일({@code config.json}·{@code .mcp.json}·{@code AGENTS.md}) — «병합»해서 쓰고,\n * 우리 조각만 되돌린다.</li>\n * </ul>\n * ★<b>그리고 자기 지문의 순환도 같이 사라진다.</b> 「자기 해시를 담은 문서의 해시」를 피하려고\n * 정규형에서 그 칸을 빼던 장치가 필요 없다 — 우리 파일은 지문을 «재지 않는다». 사용자가\n * 고칠 파일이 아니고, 고쳐져 있으면 읽기가 실패해 「기록 없음」으로 안전하게 떨어진다.\n */\nexport const HARNESS_RECORD_PATH = `${HARNESS_DIR}/init-record.json`;\n\nexport interface HarnessDocInput {\n projectName: string;\n projectUuid: string;\n endpoint: string;\n}\n\n/**\n * 저장소에 쓸 문서. ★<b>서버 본문과 패키지 기본값이 «같은 채움 경로»를 쓴다.</b>\n * 두 경로로 갈리면 서버 판만 고쳤을 때 오프라인 사용자에게는 다른 글이 나간다.\n *\n * @param template 서버에서 받은 본문. 없으면 이 패키지의 기본값(= 오프라인 기본값)을 쓴다.\n */\nexport function renderHarnessDoc(input: HarnessDocInput, template?: string): string {\n return fillTemplate(template ?? DEFAULT_HARNESS_DOC, {\n projectName: input.projectName,\n projectUuid: input.projectUuid,\n endpoint: input.endpoint,\n });\n}\n\n/**\n * {{name}} 자리표시자를 채운다.\n *\n * <p>★<b>문법은 서버 레지스트리의 것이다.</b> 예전엔 이 패키지만 {@code {name}} 을 썼는데,\n * 같은 본문을 관리자 검증기가 거절했다 — 저장소를 공유하면서 계약이 둘이었다\n * (2026-09-23 독립 재리뷰 I2).\n */\nexport function fillTemplate(template: string, values: Record<string, string>): string {\n // ★원본을 «한 번만» 훑는다. 값을 하나씩 갈아 끼우면, 먼저 넣은 값 안의 자리표시자 모양\n // 글자가 다음 차례에 또 치환된다 — 프로젝트 이름에 {{endpoint}} 라고 적어 둔 사람의\n // 이름 일부가 실제 주소로 바뀌었다(2026-09-23 4차 독립 리뷰 S4).\n // ⚠모르는 이름은 그대로 둔다 — 지우면 「못 채웠다」를 아무도 못 본다.\n return template.replace(/\\{\\{([a-zA-Z0-9_]+)}}/g, (whole, name: string) =>\n Object.prototype.hasOwnProperty.call(values, name) ? values[name]! : whole);\n}\n\nexport const DOC_KEY = \"HARNESS.DOC\";\nexport const AGENT_NOTE_KEY = \"HARNESS.AGENT_NOTE\";\n\n/** 각 문서가 반드시 담아야 할 변수 이름 — 서버의 REQUIRED_VARIABLES 와 같은 목록이다. */\nconst REQUIRED_VARIABLES: Record<string, string[]> = {\n [DOC_KEY]: [\"projectName\", \"projectUuid\", \"endpoint\"],\n [AGENT_NOTE_KEY]: [\"harnessDocPath\", \"serverName\"],\n};\n\n/**\n * 받은 본문을 저장소에 «써도 되는가». 쓰면 안 되면 그 이유, 괜찮으면 undefined.\n *\n * <p>둘을 본다: ①필수 변수가 원문에 «있는가» — 없으면 채워도 그 값이 안 들어간다.\n * ②AGENT_NOTE 라면 관리 마커가 정확히 한 쌍 있는가 — 없으면 우리 블록을 다시 찾을 수 없어\n * 재실행마다 덧붙고 undo 도 못 걷어낸다.\n */\nexport function documentContractProblem(key: string, body: string): string | undefined {\n for (const name of REQUIRED_VARIABLES[key] ?? []) {\n if (!body.includes(`{{${name}}}`)) {\n return `${key} is missing the required {{${name}}} placeholder`;\n }\n }\n if (key === AGENT_NOTE_KEY) {\n return managedBlockProblem(key, body);\n }\n return undefined;\n}\n\nconst DEFAULT_HARNESS_DOC = `# AiNecto Harness\n\nThis repository is wired to an AiNecto project. The design source of truth lives in AiNecto,\nnot in this repository's files.\n\n- Project: **{{projectName}}** (\\`{{projectUuid}}\\`)\n- MCP endpoint: {{endpoint}}\n\n## One session, one role\n\nA session picks exactly one role and keeps it for the whole session. The role comes from the\nMCP server configuration — not from this file — and it does not change during a session. The\nuser picks the role; an agent applies a new one only when the user asks, and it takes effect in\nthe next session. This is a working guardrail, not a security boundary. The server exposes only\nthe tools that role is allowed to use, so a tool that is out of role is not merely discouraged:\nit is absent.\n\n| Role | Owns | Must not |\n| --- | --- | --- |\n| Design | Requirements, ERD, domain and module boundaries, dependency direction, tasks | Write product or test code |\n| Development | Product code, following the approved design | Change requirements, ERD, architecture, or data ownership |\n| Test | Test scenarios and test code, running them and reading results | Change product code to make a test pass; change the design |\n| Validation | Judging the result against the design and the rules | Change anything; it reports PASS or FAIL with evidence |\n\nEvery role can **read** the whole source of truth. Reading the design is how the other roles\ndo their job. A session that cannot do something reports it in the session, to you.\n\n## When you are blocked\n\nIf the work needs something your role cannot do, **stop and say so**. Do not look for a way\naround it: not by editing files the tools would have written, not by asking for the role to be\nchanged mid-session, not by deferring the decision into the implementation.\n\n The work needs a design change.\n This is a Development Session, so I cannot make it.\n Settle it in a Design Session, then continue here.\n\nValidation reports \\`PASS\\`, or \\`FAIL\\` with the rule violated, where it happened, the evidence,\nand which session should pick it up next.\n\n## Not every change needs four sessions\n\nA small change that fits the design already recorded in AiNecto starts at Development. The rule\nis not \"always run four steps\" — it is that when a step is needed, it does not happen inside\nanother role's session.\n\n## Switching roles\n\nChange the role in the MCP server configuration and start a new session:\n\n${AGENT_TARGETS.map((target) => ` ${target.label.padEnd(12)} ${target.path}`).join(\"\\n\")}\n Codex global config — use a profile: codex -p <role>, or set ${ROLE_ENV_VAR}\n\nOr run \\`ainecto init --role <design|development|test|validation>\\` to rewrite them.\n\n---\nGenerated by \\`ainecto init\\`. Remove everything it wrote with \\`ainecto init --undo\\`.\n`;\n\n/**\n * AGENTS.md / CLAUDE.md 에 넣는 블록. ★<b>짧게 쓴다.</b> 이 파일들은 사용자의 것이고\n * 이미 다른 규칙이 들어 있다. 우리는 한 문단만 빌리고 전문은 우리 파일로 보낸다.\n */\nexport function renderAgentNote(template?: string): string {\n return fillTemplate(template ?? DEFAULT_AGENT_NOTE, {\n harnessDocPath: HARNESS_DOC_PATH,\n serverName: SERVER_NAME,\n });\n}\n\nconst DEFAULT_AGENT_NOTE = `${MARKER_BEGIN}\n## AiNecto Harness\n\nThis repository uses AiNecto as its design source of truth, and each session has one role\n(Design / Development / Test / Validation). Read \\`{{harnessDocPath}}\\` before doing work that\ntouches requirements, the ERD, or architecture.\n\nThe role of this session comes from the \\`{{serverName}}\\` MCP server configuration that\n\\`ainecto init\\` wrote; the server states it in its \\`initialize\\` instructions and exposes only\nthat role's tools. If the work needs something outside the role,\nstop and report which session is required.\n${MARKER_END}`;\n\n/**\n * 이 본문이 <b>통째로 «관리 블록 하나»</b>인가. 아니면 그 이유.\n *\n * <p>★예전엔 「마커가 한 쌍 있나」만 봤다. 그래서 마커 «밖»에 머리말·꼬리말이 달린 본문이\n * 통과했고, 그 바깥 글은 init 때마다 한 번씩 더 붙고 undo 로도 안 걷혔다 — 우리가 걷어내는\n * 범위는 마커 «사이»뿐이기 때문이다(2026-09-23 4차 독립 리뷰 I4).\n *\n * <p>「넣는 범위」와 「빼는 범위」가 다르면 차이만큼 남의 파일에 쌓인다. 그래서 «넣을 것»도\n * 뺄 수 있는 모양이어야 한다: 앞뒤 공백을 빼면 정확히 한 블록.\n */\nexport function managedBlockProblem(key: string, body: string): string | undefined {\n const trimmed = body.trim();\n if (!trimmed.startsWith(MARKER_BEGIN)) {\n return `${key} must begin with ${MARKER_BEGIN} — text outside the block is never removed by --undo`;\n }\n if (!trimmed.endsWith(MARKER_END)) {\n return `${key} must end with ${MARKER_END} — text outside the block is never removed by --undo`;\n }\n const inner = trimmed.slice(MARKER_BEGIN.length, trimmed.length - MARKER_END.length);\n if (inner.includes(MARKER_BEGIN) || inner.includes(MARKER_END)) {\n return `${key} must contain exactly one ${MARKER_BEGIN} and one ${MARKER_END}`;\n }\n // ★<b>수락하는 모양과 «다시 찾을 수 있는» 모양이 같아야 한다.</b> 예전엔 양끝 문자열만 봐서\n // 한 줄짜리 블록이나 앞에 공백이 붙은 마커를 수락했다. 그런데 소유 판정은 「들여쓰기 없이\n // 줄 맨 앞, 그 줄에 마커만」이라 방금 쓴 블록을 못 찾고, 재실행마다 블록이 하나씩 늘었다\n // (2026-09-23 5차 독립 리뷰 I4).\n if (!inner.startsWith(\"\\n\")) {\n return `${key} must put ${MARKER_BEGIN} alone on its own line`;\n }\n if (!inner.endsWith(\"\\n\")) {\n return `${key} must put ${MARKER_END} alone on its own line`;\n }\n // 안에 닫히지 않은 코드펜스가 있으면, 파일에 합친 뒤 종료 마커가 그 펜스 «안»으로 들어간다.\n if (hasUnclosedFence(inner)) {\n return `${key} contains an unclosed code fence — the closing marker would fall inside it`;\n }\n return undefined;\n}\n\n/** 이 글이 코드펜스를 열어 둔 채 끝나는가. */\nfunction hasUnclosedFence(content: string): boolean {\n let open: { char: string; length: number } | undefined;\n for (const line of content.split(\"\\n\")) {\n const fence = fenceOf(line);\n if (!fence) continue;\n if (!open) open = { char: fence.char, length: fence.length };\n else if (fence.char === open.char && fence.length >= open.length && fence.info === \"\") open = undefined;\n }\n return open !== undefined;\n}\n\n/**\n * 저장되는 모양 하나. ★<b>쓰기·교체가 모두 이것을 쓴다.</b>\n *\n * <p>끝 개행은 «블록의 것이 아니라 파일 합성의 것»이다. 예전엔 블록에 딸려온 개행을 남긴 채\n * 합성이 하나를 더 붙여, 같은 입력으로 다시 돌릴 때마다 파일이 1바이트씩 자랐다\n * (605 → 606 → 607, 2026-09-23 5차 독립 리뷰 S2). 변경 없는 재실행은 파일을 안 바꿔야 한다.\n */\nexport function canonicalManagedBlock(block: string): string {\n return block.trim();\n}\n\n/**\n * 블록이 이미 있으면 갈아 끼우고, 없으면 끝에 붙인다. 사용자의 다른 내용은 건드리지 않는다.\n *\n * @throws Error 여는 표식만 있고 닫는 표식이 없을 때. ★<b>붙이면 안 된다</b> —\n * begin 이 둘, end 가 하나가 되어 다음 실행에서 «앞의 begin ~ 새 end» 가 한 덩이로\n * 잡히고 그 사이의 사용자 글이 사라진다(2026-09-22 독립 리뷰 I3).\n */\nexport function upsertMarkerBlock(existing: string | undefined, block: string): string {\n const current = existing ?? \"\";\n assertNoDanglingMarker(current);\n // ★개행의 소유를 한 곳으로 모은다 — 블록은 마커로 끝나고, 뒤의 한 줄은 «파일»의 것이다.\n const normalized = canonicalManagedBlock(block);\n const range = markerRange(current);\n const composed = range\n ? `${current.slice(0, range.start)}${normalized}${current.slice(range.end)}`\n : `${current.trim() ? `${current.replace(/\\s*$/, \"\")}\\n\\n` : \"\"}${normalized}\\n`;\n assertComposedBlockIsOurs(composed, current);\n return composed;\n}\n\n/**\n * ★<b>다시 찾을 수 있을 때만 쓴다.</b> 합성 «결과»를 소유 판정으로 되읽어, 관리 블록이\n * 정확히 하나로 보이는지 확인한다.\n *\n * <p>예전엔 «새 블록 안»만 검사했다. 그런데 소유 판정({@link ownedMarkerIndex})은 <b>파일\n * 문맥</b>을 본다 — 기존 파일이 코드펜스를 열어 둔 채 끝나면 멀쩡한 블록도 그 펜스 «안»으로\n * 들어가 우리 것으로 안 보인다. 그래서 init 마다 블록이 하나씩 늘고 undo 는 아무것도 못\n * 걷어냈다(2026-09-27 6차 독립 리뷰 I4).\n *\n * <p>「넣는 범위 = 빼는 범위」라는 규칙을 <b>블록이 아니라 합성 결과에</b> 적용한 것이다.\n * 검사할 대상은 우리가 만든 글이 아니라 «파일에 들어간 모습»이다.\n */\nfunction assertComposedBlockIsOurs(composed: string, existing: string): void {\n if (ownedMarkerCount(composed, \"begin\") === 1 && ownedMarkerCount(composed, \"end\") === 1) {\n return;\n }\n const reason = hasUnclosedFence(existing)\n ? \"this file ends inside an unclosed code fence, so the block would sit inside it\"\n : \"the block could not be found again once merged into this file\";\n throw new Error(\n `ainecto could not place its block where --undo would find it again — ${reason}. `\n + \"The file was left untouched; fix that and run again.\",\n );\n}\n\n/**\n * 표식이 짝이 안 맞으면 그 파일은 «손대지 않는다».\n *\n * <p>사람이 손으로 잘랐거나 붙여 넣다 만 경우다. 우리가 범위를 추측해서 지우면 남의 글이\n * 날아간다. 고치는 건 사람 몫이고, 우리는 무엇이 문제인지만 말한다.\n *\n * <p>★<b>세는 대상은 «우리 것으로 알아볼 수 있는» 표식뿐이다</b>({@link ownedMarkerIndex}).\n * 인용문·코드펜스·들여쓴 예제 안의 표식은 애초에 우리 것이 아니므로 짝을 세지 않는다 —\n * 예전엔 그런 예제까지 세어서 멀쩡한 파일을 「짝이 안 맞는다」고 거절했다.\n */\nexport function assertNoDanglingMarker(content: string): void {\n const begins = ownedMarkerCount(content, \"begin\");\n const ends = ownedMarkerCount(content, \"end\");\n if (begins !== ends || begins > 1) {\n throw new Error(\n `AiNecto markers are unbalanced (${begins} begin, ${ends} end). The file was left untouched — `\n + `remove the stray ${MARKER_BEGIN} / ${MARKER_END} by hand and run again.`,\n );\n }\n if (begins === 0) {\n return;\n }\n // ★개수만 세면 «end 가 begin 보다 앞선» 한 쌍을 정상으로 본다 — 그러면 새 블록을 덧붙이고\n // 다음 실행부터 중복으로 거절된다(2026-09-23 독립 재리뷰 I3).\n if (ownedMarker(content, \"end\", 0)!.at < ownedMarker(content, \"begin\", 0)!.at) {\n throw new Error(\n `AiNecto markers are out of order (${MARKER_END} appears before ${MARKER_BEGIN}). `\n + \"The file was left untouched — fix the markers by hand and run again.\",\n );\n }\n}\n\nfunction ownedMarkerCount(content: string, kind: MarkerKind): number {\n let count = 0;\n for (let hit = ownedMarker(content, kind, 0); hit !== undefined;\n hit = ownedMarker(content, kind, hit.at + 1)) {\n count += 1;\n }\n return count;\n}\n\ninterface MarkerHit {\n at: number;\n length: number;\n}\n\n/** 이 종류(여는·닫는)의 «우리» 마커 중 {@code from} 뒤에서 가장 앞의 것. */\nfunction ownedMarker(content: string, kind: MarkerKind, from: number): MarkerHit | undefined {\n return hit(ownedMarkerIndex(content, MARKERS[kind], from), MARKERS[kind]);\n}\n\n/** 이 종류의 마커 글자(우리 것인지 묻지 않는다) 중 {@code from} 뒤에서 가장 앞의 것. 증거 수집용. */\nfunction anyMarker(content: string, kind: MarkerKind, from: number): MarkerHit | undefined {\n return hit(content.indexOf(MARKERS[kind], from), MARKERS[kind]);\n}\n\nfunction hit(at: number, marker: string): MarkerHit | undefined {\n return at >= 0 ? { at, length: marker.length } : undefined;\n}\n\n/**\n * 이 위치가 코드펜스 «안»인가.\n *\n * <p>★예전엔 줄 맨 앞의 백틱 세 개를 «세어서» 홀짝으로 판정했다. 그래서 tilde 펜스,\n * 들여쓴 펜스, 그리고 «더 긴 펜스 안에 든 짧은 백틱 줄»을 전부 놓쳤고 — 예제로 적어 둔\n * 마커를 우리 블록으로 오인해 남의 본문을 갈아 끼웠다(2026-09-23 독립 재리뷰 I9).\n *\n * <p>지금은 Markdown 의 실제 규칙을 따른다: 펜스는 백틱 또는 tilde 세 개 이상으로 열리고,\n * 들여쓰기는 세 칸까지, 닫는 펜스는 <b>같은 문자</b>로 <b>연 것보다 짧지 않게</b>, 뒤에 아무것도\n * 없어야 한다. 완전한 파서는 아니지만 판정이 틀리는 쪽은 «안전한 쪽»(손대지 않음)이다.\n */\nfunction isInsideFencedBlock(content: string, index: number): boolean {\n let open: { char: string; length: number } | undefined;\n let offset = 0;\n for (const line of content.split(\"\\n\")) {\n const nextOffset = offset + line.length + 1;\n if (index < nextOffset) {\n // 표식이 이 줄에 있다 — 이 줄 «전»까지의 상태가 답이다.\n return open !== undefined;\n }\n const fence = fenceOf(line);\n if (fence) {\n if (!open) {\n open = { char: fence.char, length: fence.length };\n } else if (fence.char === open.char && fence.length >= open.length && fence.info === \"\") {\n open = undefined;\n }\n }\n offset = nextOffset;\n }\n return open !== undefined;\n}\n\n/** 이 줄이 펜스면 그 모양. 아니면 undefined. */\nfunction fenceOf(line: string): { char: string; length: number; info: string } | undefined {\n const match = /^ {0,3}(`{3,}|~{3,})(.*)$/.exec(line);\n if (!match) {\n return undefined;\n }\n const run = match[1]!;\n const info = match[2]!.trim();\n // 백틱 펜스의 정보 문자열에는 백틱이 못 들어간다(Markdown 규칙).\n if (run.startsWith(\"`\") && info.includes(\"`\")) {\n return undefined;\n }\n return { char: run[0]!, length: run.length, info };\n}\n\nexport interface MarkerRemoval {\n content: string;\n removed: boolean;\n /** 블록을 빼고 나니 빈 파일이 됐나 — 우리가 만든 파일이면 지울 수 있다. */\n emptied: boolean;\n}\n\nexport function removeMarkerBlock(existing: string | undefined): MarkerRemoval {\n const current = existing ?? \"\";\n assertNoDanglingMarker(current);\n const range = markerRange(current);\n if (!range) {\n return { content: current, removed: false, emptied: !current.trim() };\n }\n // ★<b>이어붙는 자리만</b> 손본다. 예전엔 파일 «전체»에 /\\n{3,}/ 를 돌려, 우리가 쓰지도 않은\n // 문단 사이 빈 줄까지 줄여 놓았다(2026-09-22 독립 리뷰 I2). 안 건드린 곳은 안 건드린다.\n //\n // ⚠원래 파일이 «끝 줄바꿈 없이» 끝났다면 그것까지는 되살리지 못한다 — upsert 가 붙일 때\n // 이미 지운 정보다. 그래서 「바이트 원복」이라고 말하지 않는다. 한 줄을 더한다.\n const before = current.slice(0, range.start).replace(/\\n*$/, \"\");\n const after = current.slice(range.end).replace(/^\\n*/, \"\");\n const stripped = before && after\n ? `${before}\\n\\n${after}`\n : before\n ? `${before}\\n`\n : after;\n return { content: stripped.trim() ? stripped : \"\", removed: true, emptied: !stripped.trim() };\n}\n\n/** 관리 블록을 «원래 있던 블록»으로 갈아 끼운다. undo 가 쓴다. */\nexport function replaceMarkerBlockWith(content: string, block: string): string {\n const range = markerRange(content);\n return range ? `${content.slice(0, range.start)}${block}${content.slice(range.end)}` : content;\n}\n\n/**\n * 짝이 맞지 않는 마커 하나. 중첩·잘림도 «설명해야 할 것»이므로 증거에 자리를 차지한다.\n *\n * <p>⛔글자를 바꾸지 않는다. 이미 쓰인 init 기록(0.5.0 포함)의 foreignBlocks 에 이 글자 그대로 들어 있다 —\n * 바꾸면 그 기록의 증거가 새 CLI 의 증거와 안 맞아 되돌리기가 «설명되지 않는 마커»로 멈춘다.\n * (바꿀지는 상수 변경이라 사용자 컨펌 대상 — 2026-10-14 0.6.0 에서 보류.)\n *\n * <p>★<b>여는 것과 닫는 것을 구별한다</b>(3차 리뷰 B2). 하나의 문자열로 뭉쳤더니\n * 「원래 있던 «닫는» 예제」와 「우리 블록에서 남은 «여는» 마커」가 서로 상쇄돼, 증거가 맞는 것처럼\n * 보이고 사용자 원본 백업이 버려졌다. 종류가 다르면 다른 증거다.\n */\nexport const UNPAIRED_BEGIN = \"(unpaired ai-erd begin)\";\nexport const UNPAIRED_END = \"(unpaired ai-erd end)\";\n\n/**\n * ★<b>init «전»에 이 파일에 있던 관리 블록들의 신원.</b> 되돌리기가 「이 파일에 남은 마커를\n * 내 기록으로 «설명할 수 있나»」를 묻는 데 쓰는 증거다.\n *\n * <p>★<b>왜 개수도, 모양 비교도 아닌가</b>(2026-09-27 9차 2차 리뷰 B2·N1). 두 번 틀렸다:\n * <ul>\n * <li>개수는 「예제를 지우고 그 자리에 우리 블록을 옮기기」를 못 본다 — 총수가 그대로다.</li>\n * <li>우리 블록을 «모양»으로 알아보려 하면, 제목 한 줄만 고쳐도·인용문({@code > })으로\n * 옮겨도·마커를 겹쳐도 못 알아보고 그것을 「블록이 없다」로 읽어 백업을 버렸다.\n * 거꾸로 init 전부터 있던 «똑같은» 예제는 우리 블록으로 오인해 정상 되돌리기를 막았다.</li>\n * </ul>\n * ⇒ 판정을 뒤집는다. 우리 블록을 알아보려 하지 않고, <b>기록에 있는 예제를 지워 나간 뒤 남는\n * 것을 «설명되지 않은 것»으로 본다.</b> 모양 비교는 「기록해 둔 예제가 그대로 있나」를 볼 때만\n * 쓰고, 의무 완료는 <b>증거 대조</b>가 정한다.\n *\n * <p>⚠사용자가 «자기 예제»를 고쳐 놓으면 그것도 설명되지 않은 것이 되어 되돌리기가 사람에게\n * 넘어간다. 백업을 지우는 것보다는 그쪽이 맞다 — 우리는 그 둘을 가를 근거를 갖고 있지 않다.\n */\nexport function markerEvidence(content: string | undefined): string[] {\n if (!content) {\n return [];\n }\n // ★<b>우리 블록을 «빼고» 본 파일이 증거다.</b> 소유 범위를 남겨 두면 그 경계를 가로질러 짝이\n // 지어진다 — 원래 «여는 마커만» 적어 둔 예제가 우리 블록의 «닫는 마커»와 한 쌍으로 묶여,\n // init 이 자기가 쓴 블록 때문에 «새로운 남의 증거»를 만들어 냈다(3차 리뷰 N2).\n // 빼고 보면 불변식이 선다: 우리 블록을 더하거나 걷어내도 남의 증거는 그대로다.\n const owned = markerRange(content);\n const rest = owned === undefined\n ? content\n : content.slice(0, owned.start) + content.slice(owned.end);\n const evidence: string[] = [];\n let cursor = 0;\n let begins = 0;\n let ends = 0;\n while (true) {\n const begin = anyMarker(rest, \"begin\", cursor);\n const close = anyMarker(rest, \"end\", cursor);\n if (begin === undefined && close === undefined) {\n break;\n }\n if (begin === undefined || (close !== undefined && close.at < begin.at)) {\n ends += 1; // 여는 것 없이 닫는 것이 먼저 나왔다.\n cursor = close!.at + close!.length;\n continue;\n }\n const pairEnd = anyMarker(rest, \"end\", begin.at + begin.length);\n if (pairEnd === undefined) {\n begins += 1;\n cursor = begin.at + begin.length;\n continue;\n }\n evidence.push(blockShape(rest.slice(begin.at, pairEnd.at + pairEnd.length)));\n cursor = pairEnd.at + pairEnd.length;\n }\n for (let i = 0; i < begins; i += 1) evidence.push(UNPAIRED_BEGIN);\n for (let i = 0; i < ends; i += 1) evidence.push(UNPAIRED_END);\n return evidence;\n}\n\n/** 들여쓰기와 빈 줄을 지운 «모양». 펜스·목록 안으로 옮겨져도 같은 예제로 알아본다. */\nfunction blockShape(block: string): string {\n return block.split(\"\\n\").map((line) => line.trim()).filter((line) => line.length > 0).join(\"\\n\");\n}\n\n/** 파일에 이미 들어 있던 관리 블록 원문. 없으면 undefined. undo 가 이것을 도로 넣는다. */\nexport function existingMarkerBlock(content: string | undefined): string | undefined {\n if (!content) {\n return undefined;\n }\n const range = markerRange(content);\n return range ? content.slice(range.start, range.end) : undefined;\n}\n\n/** 짝이 맞는 것은 {@link assertNoDanglingMarker} 가 이미 보장한다 — 여긴 범위만 잡는다. */\nfunction markerRange(content: string): { start: number; end: number } | undefined {\n const start = ownedMarker(content, \"begin\", 0);\n if (start === undefined) {\n return undefined;\n }\n const endMarker = ownedMarker(content, \"end\", start.at);\n if (endMarker === undefined) {\n return undefined;\n }\n return { start: start.at, end: endMarker.at + endMarker.length };\n}\n\n/**\n * ★<b>판정을 뒤집었다.</b> 「예제인지 알아내서 피한다」가 아니라\n * <b>「우리 것임을 확인할 수 있는 형태만 수락한다」</b>이다.\n *\n * <p>예제를 알아내려던 쪽은 계속 샜다 — tilde 펜스, 들여쓴 펜스, 더 긴 펜스 안의 짧은 줄,\n * 인용문 안의 코드, 네 칸 들여쓴 코드 블록…(2026-09-22 I3 → 2026-09-23 3차 I9 → 4차 I6).\n * Markdown 의 «안에 담는 문맥»은 끝이 없어서, 못 알아낸 하나가 곧 남의 본문을 지운다.\n *\n * <p>그래서 우리가 쓰는 <b>정확한 한 가지 형태</b>만 우리 것으로 본다:\n * 들여쓰기 없이 줄 맨 앞에서 시작하고, 그 줄에 표식 말고는 아무것도 없으며, 코드펜스 밖일 것.\n * ⚠이보다 느슨하게 적힌 우리 블록이 있다면 그것도 «못 알아본다» — 그 경우 덧붙이지도\n * 지우지도 않고 표식이 없는 파일처럼 다룬다. 남의 글을 지우는 쪽보다 낫다.\n */\nfunction ownedMarkerIndex(content: string, marker: string, from: number): number {\n for (let at = content.indexOf(marker, from); at >= 0; at = content.indexOf(marker, at + 1)) {\n const lineStart = content.lastIndexOf(\"\\n\", at - 1) + 1;\n if (lineStart !== at) {\n continue; // 들여썼거나 인용문(\">\") 뒤다 — 우리가 쓰는 형태가 아니다.\n }\n const lineEnd = content.indexOf(\"\\n\", at);\n const rest = (lineEnd < 0 ? content.slice(at) : content.slice(at, lineEnd)).slice(marker.length);\n if (rest.trim() !== \"\") {\n continue; // 같은 줄에 다른 글이 있다.\n }\n if (isInsideFencedBlock(content, at)) {\n continue;\n }\n return at;\n }\n return -1;\n}\n","import { HARNESS_RECORD_PATH } from \"./harnessDoc\";\n\n/**\n * 되돌리기 «기록»의 형식과 그 <b>상태 판정</b>. ★이 파일의 책임은 하나다 —\n * 「디스크에 있는 이것이 우리 기록인가, 그렇다면 온전한가」에 <b>명시적으로</b> 답하는 것.\n *\n * <p>★<b>왜 파일을 따로 두는가.</b> 다섯 차수에 걸쳐 같은 축이 샜고, 마지막 독립 리뷰가 그 이름을\n * 붙였다(2026-09-27 8차): <b>「파일 경로가 그 안의 내용이 유효하다는 증거는 아니다」</b>.\n * 기록을 우리 파일로 내보낸 것(7차)은 「이 칸이 누구 것인가」를 없앴지만, 그다음 질문을 남겼다 —\n * 「이 파일이 우리 것이라는 사실이 그 내용을 신뢰할 근거인가」. 아니다.\n *\n * <p>그때 무슨 일이 일어났나:\n * <ul>\n * <li>{@code kind} 가 다르거나 JSON 이 깨진 파일을 «부재»로 읽고, init 이 백업 없이 덮었다.\n * 읽기를 거절했는데 쓰기는 거절하지 않은 것이다(8차 I1).</li>\n * <li>{@code kind} 만 맞으면 {@code managed} 가 배열이어도, {@code version} 이 999 여도,\n * 지문 칸이 통째로 없어도 «정상 기록»으로 읽혔다. 그리고 그 기록으로 돌린 undo 가\n * <b>사용자가 편집한 문서를 지웠다</b>(8차 I2). 빈 기본값으로 채우는 관용이\n * 불확실성을 «확실»로 바꾼 것이다.</li>\n * </ul>\n * ⛔그래서 여기서는 {@code as unknown as} 로 모양을 «주장»하지 않고, 빈 값으로 «메우지» 않는다.\n * 읽어 낼 수 없으면 읽어 낼 수 없다고 말한다 — 그것이 부르는 쪽이 필요한 정보다.\n */\n\n/** 기록 파일의 신원. 사용자가 같은 이름으로 둔 파일을 실행 근거로 삼지 않는다. */\nexport const RECORD_KIND = \"ainecto/init-record\";\n\n/** 이 판이 읽고 쓰는 형식. 모르는 판은 «손상»이 아니라 «지원하지 않음»이다. */\nexport const RECORD_VERSION = 2;\n\n/**\n * 우리가 «소유한 것»의 값. ★명시적 타입이라 세 가지가 갈린다:\n * 「그 자리에 아무것도 없었다」 · 「JSON 값이었다(null 일 수도 있다)」 · 「글이었다」.\n *\n * <p>예전엔 {@code undefined} 하나로 앞의 둘을 덮었고, 그래서 사용자가 저장해 둔 {@code null} 이\n * «백업 없음»으로 바뀌었다(7차 I5).\n */\nexport type Owned =\n | { at: \"absent\" }\n | { at: \"json\"; value: unknown }\n | { at: \"text\"; text: string };\n\nexport const ABSENT: Owned = { at: \"absent\" };\n\n/** 우리가 그 파일의 «무엇을» 소유하나. 넣는 법과 빼는 법이 여기서 갈린다. */\nexport type OwnedScope =\n /** 파일 본문 전체를 우리가 쓴다(.ainecto/HARNESS.md). */\n | \"whole\"\n /** JSON 안의 MCP 서버 항목 하나(.mcp.json · .cursor/mcp.json). */\n | \"entry\"\n /** Markdown 안의 마커 블록 하나(AGENTS.md · CLAUDE.md). */\n | \"block\"\n /** JSON 안의 «칸 몇 개»(.ainecto/config.json). 나머지 칸은 사용자 것이다. */\n | \"fields\";\n\n/**\n * 한 파일에 대한 복구 계약. ★<b>한 파일의 사실이 한 곳에 모인다.</b>\n *\n * <p>예전 기록은 경로를 키로 한 «평행한 map 아홉 개»였다({@code created}·{@code replacedEntries}·\n * {@code blockAdded}·{@code replacedBlocks}·{@code originals}·{@code lastWritten}·\n * {@code lastWrittenFragment}·{@code lastWrittenBody}·{@code foreignMarkers}). 그래서 지금까지\n * 나온 결함이 거의 전부 <b>「한 map 은 X 라 하고 다른 map 은 Y 라 한다」</b>였고, 고칠 때마다\n * 그중 «한 map»만 고쳤다. 한 항목으로 묶으면 그 어긋남이 생길 자리가 없다.\n */\nexport interface FileContract {\n scope: OwnedScope;\n /** 우리가 이 파일을 «만들었나». 지워도 되는 것은 이것뿐이다. */\n createdByUs: boolean;\n /** 되돌릴 «목표» — 우리가 밀어낸 것. {@code absent} 면 「우리가 더했다」는 뜻이다. */\n original: Owned;\n /** 우리가 «실제로 쓴» 것. 「지금 값이 아직 우리 것인가」의 유일한 근거다. */\n written: Owned;\n /**\n * 우리가 쓴 «파일 전체»의 지문. 파일을 지워도 되는지 판정할 때만 쓴다.\n *\n * <p>⚠없으면 «모른다»는 뜻이고, 모를 때는 지우지 않는다. 예전엔 지문이 없으면\n * {@code changedSinceOurWrite} 가 false 를 돌려줘서 「안 바뀌었다」로 읽혔고, 그 판정이\n * 사용자 문서 삭제의 근거가 됐다(8차 I2).\n */\n fileFingerprint?: string;\n /** {@code scope===\"fields\"} 전용 — 우리가 쓴 칸의 값. 칸 단위 대조의 근거다. */\n writtenFields?: Record<string, unknown>;\n /**\n * {@code scope===\"fields\"} 전용 — 우리가 덮기 «전»에 그 칸에 있던 것. 칸마다 따로 든다.\n *\n * <p>★파일 전체를 원본으로 들면 두 가지를 못 한다(8차 I4·I6):\n * <ul>\n * <li>재init 에서 사용자가 고친 칸을 «새 기준»으로 삼기 — 파일 단위로는 어느 칸이 바뀐\n * 것인지 말할 수 없다.</li>\n * <li>원래 «빈 객체»였던 config 를 빈 객체로 되돌리기 — 파일 부재와 빈 객체가 같은\n * 결과로 뭉쳤고, 그래서 프로젝트 연결이 남았다.</li>\n * </ul>\n * ⚠「파일이 아예 없었다」는 {@link #createdByUs} 가 말한다. 이 칸은 «있던 파일 안의 칸»만 다룬다.\n */\n originalFields?: Record<string, Owned>;\n /**\n * {@code scope===\"block\"} 전용 — init «전»에 이 파일에 있던 관리 블록들의 «신원».\n * {@code markerEvidence} 가 만든 목록이고, 짝이 안 맞는 마커는 그 자리에 표시가 하나 들어간다.\n *\n * <p>★<b>개수에서 목록으로 두 번 옮겨 왔다</b>(8차 I5 → 9차 B2·N1):\n * <ul>\n * <li>Boolean 하나로는 「원래 예제가 있다」와 「우리 블록이 옮겨져 남았다」를 못 갈랐다.</li>\n * <li>개수로는 「예제를 지우고 그 자리에 우리 블록을 옮기기」를 못 봤다 — 총수가 그대로다.</li>\n * <li>우리 블록을 «모양»으로 알아보려 하면 제목 한 줄 편집·인용문 이동·중첩에 뚫렸고,\n * 반대로 init 전부터 있던 똑같은 예제를 우리 것으로 오인해 정상 되돌리기를 막았다.</li>\n * </ul>\n * ⇒ 우리 블록을 알아보려 하지 않는다. <b>이 목록으로 설명되지 않는 마커가 파일에 있으면</b>\n * 되돌리기를 완료로 만들지 않고 백업을 지킨다.\n */\n foreignBlocks?: string[];\n}\n\nexport interface InitRecord {\n version: number;\n /** 경로 → 그 파일에 대한 계약. */\n files: Record<string, FileContract>;\n /** 우리가 «실제로 만든» 디렉터리. 적용이 mkdir 결과로 채운다. */\n createdDirectories: string[];\n}\n\nexport function emptyRecord(): InitRecord {\n return { version: RECORD_VERSION, files: {}, createdDirectories: [] };\n}\n\n/**\n * 디스크에 있는 것의 «상태». ★부르는 쪽이 넷을 구별해서 다뤄야 한다 —\n * 특히 {@code corrupt}·{@code legacy} 는 「없음」이 아니다. 덮으면 안 된다.\n */\nexport type RecordState =\n | { state: \"absent\" }\n | { state: \"valid\"; record: InitRecord }\n | { state: \"corrupt\"; reason: string }\n | { state: \"legacy\"; reason: string };\n\n/**\n * ★<b>단일 로더.</b> 기록을 읽는 곳은 여기 하나다.\n *\n * <p>⛔관용을 베풀지 않는다. 한 칸이라도 계약을 벗어나면 «손상»이다 — 그 기록으로 파일을 지우는\n * 것이 되돌리기가 하는 일이고, 판단 재료가 반쯤 맞는 상태로 그 일을 해선 안 된다.\n */\nexport function readRecord(content: string | undefined): RecordState {\n if (content === undefined) {\n return { state: \"absent\" };\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(content);\n } catch {\n return { state: \"corrupt\", reason: `${HARNESS_RECORD_PATH} is not valid JSON` };\n }\n if (!isObject(parsed)) {\n return { state: \"corrupt\", reason: `${HARNESS_RECORD_PATH} is not a JSON object` };\n }\n if (parsed.kind !== RECORD_KIND) {\n return {\n state: \"corrupt\",\n reason: `${HARNESS_RECORD_PATH} exists but is not an AiNecto init record (kind=`\n + `${JSON.stringify(parsed.kind)})`,\n };\n }\n if (parsed.version !== RECORD_VERSION) {\n // ★모르는 판은 손상이 아니다 — 다른 판의 CLI 가 쓴 «온전한» 기록일 수 있다.\n // 그 기록의 뜻을 우리가 추측해선 안 되고, 덮어서도 안 된다.\n return {\n state: \"legacy\",\n reason: `${HARNESS_RECORD_PATH} was written by another version of this CLI `\n + `(record version ${JSON.stringify(parsed.version)}, this CLI reads ${RECORD_VERSION})`,\n };\n }\n const files = parsed.files;\n if (!isObject(files)) {\n return { state: \"corrupt\", reason: `${HARNESS_RECORD_PATH} has no \"files\" object` };\n }\n const out: Record<string, FileContract> = {};\n for (const [path, raw] of Object.entries(files)) {\n const read = readContract(raw);\n if (\"problem\" in read) {\n return {\n state: \"corrupt\",\n reason: `${HARNESS_RECORD_PATH} has an unusable entry for ${path} — it ${read.problem}`,\n };\n }\n out[path] = read.contract;\n }\n const directories = parsed.createdDirectories;\n if (directories !== undefined && !isStringArray(directories)) {\n return { state: \"corrupt\", reason: `${HARNESS_RECORD_PATH} has a malformed createdDirectories` };\n }\n return {\n state: \"valid\",\n record: {\n version: RECORD_VERSION,\n files: out,\n createdDirectories: directories === undefined ? [] : [...directories],\n },\n };\n}\n\n/** 기록 파일의 저장 모양. ★지문을 담지 않는다 — 자기 해시를 담은 문서의 해시라는 순환이 생긴다. */\nexport function serializeRecord(record: InitRecord): string {\n return `${JSON.stringify({\n kind: RECORD_KIND,\n version: RECORD_VERSION,\n files: record.files,\n createdDirectories: record.createdDirectories,\n }, null, 2)}\\n`;\n}\n\n/**\n * 한 항목을 읽는다. ★읽어 내지 못하면 «무엇이 어긋났나»를 함께 돌려준다 —\n * 사용자가 손대야 할 파일이라 「읽을 수 없다」만으로는 고칠 수 없다.\n */\ntype ContractRead = { contract: FileContract } | { problem: string };\n\nfunction readContract(raw: unknown): ContractRead {\n if (!isObject(raw)) {\n return { problem: \"is not a JSON object\" };\n }\n const scope = raw.scope;\n if (scope !== \"whole\" && scope !== \"entry\" && scope !== \"block\" && scope !== \"fields\") {\n return { problem: `has an unknown scope (${JSON.stringify(raw.scope)})` };\n }\n if (typeof raw.createdByUs !== \"boolean\") {\n return { problem: \"does not say whether ainecto created the file\" };\n }\n const original = readOwned(raw.original);\n const written = readOwned(raw.written);\n if (original === undefined) {\n return { problem: \"has no readable record of what was there before\" };\n }\n if (written === undefined) {\n return { problem: \"has no readable record of what ainecto wrote\" };\n }\n if (raw.fileFingerprint !== undefined && typeof raw.fileFingerprint !== \"string\") {\n return { problem: \"has a malformed fileFingerprint\" };\n }\n if (raw.writtenFields !== undefined && !isObject(raw.writtenFields)) {\n return { problem: \"has a malformed writtenFields\" };\n }\n let originalFields: Record<string, Owned> | undefined;\n if (raw.originalFields !== undefined) {\n if (!isObject(raw.originalFields)) {\n return { problem: \"has a malformed originalFields\" };\n }\n originalFields = {};\n for (const [field, value] of Object.entries(raw.originalFields)) {\n const owned = readOwned(value);\n if (owned === undefined) {\n return { problem: `has no readable original for the field ${field}` };\n }\n originalFields[field] = owned;\n }\n }\n if (raw.foreignBlocks !== undefined && !isStringArray(raw.foreignBlocks)) {\n return { problem: \"has a malformed foreignBlocks\" };\n }\n if (scope === \"block\" && raw.foreignBlocks === undefined) {\n // ★블록 계약은 「이 파일에 원래 무엇이 있었나」 없이는 완료를 판정할 수 없다. 없으면 없다고 한다.\n return { problem: 'owns a marker block but does not say what marker blocks were already in the file' };\n }\n if (scope === \"fields\") {\n const problem = fieldsContractProblem({\n written,\n writtenFields: isObject(raw.writtenFields) ? raw.writtenFields : undefined,\n originalFields,\n });\n if (problem !== undefined) {\n return { problem };\n }\n }\n const contract: FileContract = {\n scope, createdByUs: raw.createdByUs, original, written,\n };\n if (typeof raw.fileFingerprint === \"string\") contract.fileFingerprint = raw.fileFingerprint;\n if (isObject(raw.writtenFields)) contract.writtenFields = { ...raw.writtenFields };\n if (originalFields !== undefined) contract.originalFields = originalFields;\n if (isStringArray(raw.foreignBlocks)) contract.foreignBlocks = [...raw.foreignBlocks];\n return { contract };\n}\n\n/**\n * {@code scope===\"fields\"} 계약이 «스스로 어긋나지» 않았나. ★로더와 계획이 <b>같은 이 함수</b>를\n * 쓴다 — 두 곳에 두면 「한쪽은 괜찮다 하고 다른 쪽은 아니라 한다」가 또 생긴다.\n *\n * <p>★<b>칸이 «있는지»에서 멈추면 반쯤 맞는 기록으로 파일을 고친다</b>(9차 B1). 세 번 뚫렸다:\n * <ul>\n * <li>{@code writtenFields.endpoint} 하나만 지운 기록을 유효로 읽었고, 되돌리기는 그 칸을\n * 「사용자가 고쳤다」로 읽어 우리 값을 남긴 뒤 <b>사용자 원본이 든 기록까지</b> 지웠다.</li>\n * <li>두 map 에서 «동시에» 지우면 그것도 유효였다 — 칸 집합끼리만 맞춰 봤기 때문이다.\n * 그래서 우리가 쓴 본문에 있는 «우리 칸»이 기록에 적혀 있는지도 본다(2차 리뷰 B1).</li>\n * <li>★원본을 {@code {at:\"text\"}} 로 바꿔 두면 유효로 읽혔고, 되돌리기는 «되돌릴 수 없는\n * 모양»을 부재로 취급해 그 칸을 지웠다 — config 가 {@code {}} 가 되고 기록이 사라졌다.\n * fields 의 원본은 {@code absent} 또는 {@code json} 뿐이다(2차 리뷰 B1).</li>\n * </ul>\n *\n * @param ownedFields 부르는 쪽이 아는 «우리 칸» 이름. 계획은 넘기고(그래서 양쪽 방향을 다 본다),\n * 로더는 넘기지 않는다 — 어느 칸이 우리 것인지는 형식 층의 지식이 아니다.\n */\nexport function fieldsContractProblem(\n contract: {\n written: Owned;\n writtenFields?: Record<string, unknown>;\n originalFields?: Record<string, Owned>;\n },\n ownedFields?: readonly string[],\n): string | undefined {\n const { written, writtenFields, originalFields } = contract;\n if (writtenFields === undefined) {\n return \"owns only some fields of the file but does not say which ones it wrote (writtenFields)\";\n }\n if (originalFields === undefined) {\n return \"owns only some fields of the file but does not say what was in them before (originalFields)\";\n }\n const writtenKeys = Object.keys(writtenFields).sort();\n const originalKeys = Object.keys(originalFields).sort();\n if (writtenKeys.length !== originalKeys.length\n || writtenKeys.some((key, at) => key !== originalKeys[at])) {\n return `lists different fields as written (${writtenKeys.join(\", \") || \"none\"}) and as `\n + `backed up (${originalKeys.join(\", \") || \"none\"})`;\n }\n for (const key of writtenKeys) {\n // ★되돌리기가 할 수 있는 일은 「그 값을 도로 넣기」와 「그 칸을 빼기」뿐이다. 그 둘이 아닌\n // 모양을 들고 있으면 그것은 판정 자료가 아니라 손상이다.\n const original = originalFields[key]!;\n if (original.at !== \"absent\" && original.at !== \"json\") {\n return `records the original of ${key} as ${original.at}, which is not something --undo `\n + \"can put back into a JSON field\";\n }\n }\n if (written.at !== \"text\") {\n return \"owns only some fields of the file but does not hold the file text it wrote\";\n }\n let body: unknown;\n try {\n body = JSON.parse(written.text);\n } catch {\n return \"holds a written file body that is not valid JSON\";\n }\n if (!isObject(body)) {\n return \"holds a written file body that is not a JSON object\";\n }\n for (const key of writtenKeys) {\n if (!Object.prototype.hasOwnProperty.call(body, key)) {\n return `says it wrote ${key}, but that field is not in the file body it recorded`;\n }\n if (stableStringify(body[key]) !== stableStringify(writtenFields[key])) {\n return `records a different value for ${key} than the file body it wrote`;\n }\n }\n if (ownedFields !== undefined) {\n // ★반대 방향. 우리가 쓴 본문에 «우리 칸»이 있는데 기록이 그 칸을 말하지 않으면, 그 칸에 대한\n // 판정 자료가 없다는 뜻이다 — 두 map 에서 동시에 지운 기록이 그래서 유효로 읽혔다.\n for (const key of ownedFields) {\n if (Object.prototype.hasOwnProperty.call(body, key)\n && !Object.prototype.hasOwnProperty.call(writtenFields, key)) {\n return `wrote ${key} into the file but does not record what it put there`;\n }\n }\n }\n return undefined;\n}\n\nfunction readOwned(raw: unknown): Owned | undefined {\n if (!isObject(raw)) {\n return undefined;\n }\n if (raw.at === \"absent\") {\n return ABSENT;\n }\n if (raw.at === \"json\") {\n // ⚠value 는 «없어도» 되는 칸이 아니다 — 키가 있어야 한다. null 이 값이기 때문이다.\n return Object.prototype.hasOwnProperty.call(raw, \"value\")\n ? { at: \"json\", value: raw.value }\n : undefined;\n }\n if (raw.at === \"text\") {\n return typeof raw.text === \"string\" ? { at: \"text\", text: raw.text } : undefined;\n }\n return undefined;\n}\n\n/**\n * 객체 칸의 «순서»를 지운 JSON.\n *\n * <p>★{@code JSON.parse}→{@code stringify} 는 공백은 정규화하지만 칸 순서는 그대로 둔다.\n * 그래서 사람이 편집기로 열었다 저장만 해도 「사용자가 고쳤다」로 잡혔다(4차 독립 리뷰 S1).\n *\n * <p>★<b>여기 한 벌만 둔다.</b> 기록의 «상호 일치» 판정과 계획의 «값이 바뀌었나» 판정이 다른\n * 정규형을 쓰면 「한 쪽은 같다고 하고 다른 쪽은 다르다고 한다」가 또 생긴다 — 그것이 다섯 차수를\n * 관통한 실패의 이름이었다.\n *\n * <p>⚠배열 순서는 유지한다 — 거기선 순서가 곧 내용이다(MCP 인자 목록 등).\n */\nexport function stableStringify(value: unknown): string {\n if (Array.isArray(value)) {\n return `[${value.map(stableStringify).join(\",\")}]`;\n }\n if (value && typeof value === \"object\") {\n const entries = Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0));\n return `{${entries.map(([key, item]) => `${JSON.stringify(key)}:${stableStringify(item)}`).join(\",\")}}`;\n }\n return JSON.stringify(value) ?? \"null\";\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((entry) => typeof entry === \"string\");\n}\n","import {\n AGENT_TARGETS,\n readServerEntry,\n buildServerEntry,\n codexAddCommand,\n codexProfileSetup,\n codexRemoveCommand,\n mergeServerEntry,\n readRoleFromEntry,\n removeServerEntry,\n SERVER_NAME,\n} from \"./agentTargets\";\nimport {\n existingMarkerBlock,\n markerEvidence,\n HARNESS_CONFIG_PATH,\n HARNESS_DOC_PATH,\n HARNESS_RECORD_PATH,\n removeMarkerBlock,\n replaceMarkerBlockWith,\n renderAgentNote,\n renderHarnessDoc,\n upsertMarkerBlock,\n} from \"./harnessDoc\";\nimport {\n ABSENT,\n emptyRecord,\n fieldsContractProblem,\n readRecord,\n serializeRecord,\n stableStringify,\n type FileContract,\n type InitRecord,\n type Owned,\n type RecordState,\n} from \"./initRecord\";\nimport { createHash } from \"node:crypto\";\nimport { readConfigRole } from \"./repositoryRole\";\nimport { ROLE_ENV_VAR, type HarnessRole } from \"./role\";\n\n/**\n * init 이 «무엇을 쓸지»를 순수하게 계산한다. 파일을 읽지도 쓰지도 않는다.\n *\n * ★<b>계획과 적용을 가른 이유.</b> 이 명령은 남의 저장소에 파일을 쓴다 — 가장 위험한 종류의\n * 일이다. 계산이 순수하면 「어떤 상태에서 무엇을 쓰는가」를 전부 시험으로 고정할 수 있고,\n * {@code --dry-run} 이 «진짜로 일어날 일»을 그대로 보여 준다(따로 만든 미리보기가 아니다).\n *\n * <p>★★<b>2026-09-27, 여덟 차례의 독립 리뷰 뒤에 경계를 셋으로 나눴다.</b> 다섯 차수 동안 같은\n * 축이 계속 샜고, 마지막 리뷰가 그 이유에 이름을 붙였다 — 기록이 «경로를 키로 한 평행한 map\n * 아홉 개»여서 나온 결함이 거의 전부 「한 map 은 X 라 하고 다른 map 은 Y 라 한다」였다.\n * 고칠 때마다 나는 그중 <b>한 map</b>을 고쳤다.\n * <ol>\n * <li>{@code initRecord.ts} — 기록의 «형식과 상태». 부재·유효·손상·구판을 명시적으로 돌려준다.</li>\n * <li><b>이 파일</b> — «파일별 복구 계약». 한 파일의 사실이 한 항목에 모이고,\n * 완료·보존·미해결이 {@link Outcome} 타입으로 갈린다.</li>\n * <li>{@code initCommand.applyPlan} — 적용과 기록 저장. 실제 변경과 mkdir 결과를 한 경계에서 모은다.</li>\n * </ol>\n */\n\n/** 규칙 블록을 넣을 지침 파일. 없으면 만드는 것과 있을 때만 고치는 것을 구분한다. */\nconst NOTE_TARGETS = [\n { path: \"AGENTS.md\", createIfMissing: true },\n { path: \"CLAUDE.md\", createIfMissing: false },\n] as const;\n\nexport const MANAGED_PATHS: readonly string[] = [\n ...AGENT_TARGETS.map((target) => target.path),\n ...NOTE_TARGETS.map((target) => target.path),\n HARNESS_DOC_PATH,\n HARNESS_CONFIG_PATH,\n HARNESS_RECORD_PATH,\n];\n\n/** 경로 → 현재 내용. 값이 {@code undefined} 면 «파일 없음». */\nexport type FileSnapshot = ReadonlyMap<string, string | undefined>;\n\nexport interface FileWrite {\n path: string;\n content: string;\n existed: boolean;\n}\n\nexport interface InitPlan {\n writes: FileWrite[];\n deletes: string[];\n /** 사용자가 직접 칠 명령 — 우리가 전역 설정을 고치지 않는다. */\n codexCommand: string;\n /** Codex 에서 세션마다 역할을 바꾸는 법(프로필). 되돌리기 계획에는 없다. */\n codexProfile?: string[];\n notes: string[];\n /** init 계획이 남기는 기록. {@code .ainecto/init-record.json} 에 저장된다. */\n record?: InitRecord;\n /**\n * ★<b>아무것도 하지 말아야 하는 이유.</b> 있으면 부르는 쪽이 멈추고 이 문장을 보여 준다.\n *\n * <p>기록을 읽어 내지 못했을 때 그냥 진행하면 그 파일에 든 «남의 원본 백업»을 백업 없이\n * 덮는다 — 읽기를 거절했는데 쓰기는 거절하지 않은 것이다(2026-09-27 8차 독립 리뷰 I1).\n */\n refusal?: string;\n /**\n * 되돌리기가 «치워도 되는» 디렉터리 — 우리가 만든 것뿐이다.\n *\n * <p>★비었다는 것과 우리 것이라는 것은 다른 사실이다(4차 독립 리뷰 S3).\n */\n removableDirectories?: string[];\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 소유한 값 다루기\n// ─────────────────────────────────────────────────────────────────────────────\n\n/** JSON 값을 {@link Owned} 로. {@code present} 가 false 면 «그 자리에 없다»는 뜻이다. */\nfunction ownedJson(value: unknown, present: boolean): Owned {\n return present ? { at: \"json\", value } : ABSENT;\n}\n\nfunction ownedText(text: string | undefined): Owned {\n return text === undefined ? ABSENT : { at: \"text\", text };\n}\n\n/**\n * 두 소유값이 같은가. ★<b>JSON 타입을 보존한다.</b>\n *\n * <p>예전엔 문자열은 원문 그대로, 객체는 JSON 문자열로 해시해서 <b>객체와 「그 객체의 JSON 을\n * 담은 문자열」이 같은 지문</b>이 됐고, 타입이 다른데도 「원본 복구 완료」로 판정하며 객체\n * 백업을 지웠다(7차 독립 리뷰 I5). 정규화는 «칸 순서와 공백»만 지우는 일이다.\n */\nfunction sameOwned(left: Owned, right: Owned): boolean {\n if (left.at !== right.at) {\n return false;\n }\n if (left.at === \"absent\") {\n return true;\n }\n if (left.at === \"text\" && right.at === \"text\") {\n return left.text === right.text;\n }\n return left.at === \"json\" && right.at === \"json\"\n && stableStringify(left.value) === stableStringify(right.value);\n}\n\n/** 내용 지문. 암호학적 용도가 아니라 «바뀌었나»만 본다. */\nexport function contentFingerprint(content: string): string {\n return createHash(\"sha256\").update(content).digest(\"hex\");\n}\n\nfunction serialize(body: unknown): string {\n return `${JSON.stringify(body, null, 2)}\\n`;\n}\n\n/** 이 경로의 내용 지문. JSON 파일은 칸 순서를 지운 정규형으로 잰다. */\nfunction fingerprintFor(path: string, content: string): string {\n if (!path.endsWith(\".json\")) {\n return contentFingerprint(content);\n }\n try {\n return contentFingerprint(stableStringify(JSON.parse(content)));\n } catch {\n return contentFingerprint(content);\n }\n}\n\nfunction parseJsonObject(content: string): Record<string, unknown> | undefined {\n try {\n const parsed = JSON.parse(content) as unknown;\n return parsed && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : undefined;\n } catch {\n return undefined;\n }\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// config 의 «우리 칸»\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface ConfigBodyValues {\n projectUuid: string;\n projectName: string;\n endpoint: string;\n cliVersion: string;\n versions: Record<string, string>;\n}\n\n/** init 이 config 에 쓰는 내용. ★적는 칸의 진실원이 여기 하나다. */\nfunction configBodyOf(values: ConfigBodyValues): Record<string, unknown> {\n return {\n version: 1,\n project: { uuid: values.projectUuid, name: values.projectName },\n endpoint: values.endpoint,\n generatedBy: values.cliVersion,\n promptVersions: values.versions,\n };\n}\n\n/**\n * config 에서 «우리 것»인 칸. ★여기 없는 칸은 <b>사용자가 적은 것</b>이고 되돌리기가 손대지 않는다.\n *\n * <p>목록을 {@link configBodyOf} 에서 «뽑아낸다» — 손으로 베끼면 칸이 늘 때 잊는다.\n * 같은 자리를 이미 한 번 틀렸다(4차 독립 리뷰 I3).\n *\n * <p>★{@code managed} 는 이 목록에 «없다». 기록이 자기 파일로 나갔기 때문이다 — 사용자가\n * config 에 {@code managed} 라는 칸을 적어 두어도 그것은 사용자 것이다(7차 독립 리뷰 I2).\n */\nconst OUR_CONFIG_FIELDS: readonly string[] = Object.keys(configBodyOf({\n projectUuid: \"\", projectName: \"\", endpoint: \"\", cliVersion: \"\", versions: {},\n}));\n\nconst hasField = (object: Record<string, unknown>, field: string) =>\n Object.prototype.hasOwnProperty.call(object, field);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 계획 — init\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface PlanInitInput {\n role: HarnessRole;\n env?: \"prod\" | \"dev\";\n projectName: string;\n projectUuid: string;\n endpoint: string;\n cliVersion: string;\n files: FileSnapshot;\n /** 직전 실행의 기록 «상태». ★유효하지 않으면 init 이 멈춘다 — 덮으면 백업이 사라진다. */\n previous?: RecordState;\n /** 서버에서 받은 문서 본문. 없으면 패키지 기본값(= 오프라인 기본값)을 쓴다. */\n documents?: { doc?: string; agentNote?: string; versions?: Record<string, string> };\n}\n\n/**\n * ★<b>기록 때문에 멈춰야 하나 — «파일만» 보고 답한다.</b>\n *\n * <p>계획을 세우는 것보다 «앞»에 이 질문이 있어야 한다. 예전엔 이 판정이 {@code planInit} 안에만\n * 있었고, 부르는 쪽은 그 전에 프로젝트를 해결했다 — 프로젝트가 0개면 <b>원격에 프로젝트를 만든\n * 뒤에</b> 「아무것도 바꾸지 않았다」는 예외를 냈다(9차 1차 리뷰 B7). 로컬 쓰기가 0이어도\n * 부수효과가 0인 것은 아니다. 그래서 순수 함수로 빼서 원격 호출 전에 물을 수 있게 한다.\n *\n * <p>⚠{@code planInit} 도 이 함수를 쓴다 — 두 곳에 같은 판단을 두면 어긋난다.\n */\nexport function initRefusal(files: FileSnapshot, previous?: RecordState): string | undefined {\n const state = previous ?? readRecord(files.get(HARNESS_RECORD_PATH));\n if (state.state === \"corrupt\" || state.state === \"legacy\") {\n // ★읽어 내지 못한 기록을 덮으면 그 안의 «남의 원본 백업»이 사라진다. 읽기를 거절했으면\n // 쓰기도 거절해야 한다(8차 독립 리뷰 I1).\n return `${state.reason}. Nothing was changed — move that file aside (or restore it) and run again.`;\n }\n const carried = state.state === \"valid\" ? state.record : emptyRecord();\n for (const [path, contract] of Object.entries(carried.files)) {\n if (contract.scope !== \"fields\") {\n continue;\n }\n // ★<b>검증 «전» 기록으로 파일을 고치지 않는다.</b> 같은 완전성 검사가 되돌리기에만 있었고,\n // 재init 은 그 기록을 그대로 실행해 «현재 값»을 새 원본으로 적어 버렸다(3차 리뷰 F1).\n // ⛔로더에 도메인 지식을 넣는 대신, 도메인을 아는 이 경계에서 두 진입점이 같은 검사를 한다.\n const problem = fieldsContractProblem(contract, OUR_CONFIG_FIELDS);\n if (problem !== undefined) {\n return `${HARNESS_RECORD_PATH}'s record for ${path} ${problem}. Nothing was changed — `\n + \"restore that file (or move it aside) and run again.\";\n }\n }\n return undefined;\n}\n\nexport function planInit(input: PlanInitInput): InitPlan {\n const previous = input.previous ?? readRecord(input.files.get(HARNESS_RECORD_PATH));\n const refusal = initRefusal(input.files, previous);\n if (refusal !== undefined) {\n return {\n writes: [], deletes: [], notes: [],\n codexCommand: codexAddCommand({ role: input.role, env: input.env, endpoint: input.endpoint }),\n refusal,\n };\n }\n\n const carriedRecord = previous.state === \"valid\" ? previous.record : emptyRecord();\n\n const entry = buildServerEntry({ role: input.role, env: input.env, endpoint: input.endpoint });\n const writes: FileWrite[] = [];\n const notes: string[] = [];\n const record: InitRecord = {\n version: carriedRecord.version,\n files: { ...carriedRecord.files },\n createdDirectories: [...carriedRecord.createdDirectories],\n };\n\n /**\n * ★<b>이어받은 계약이 아직 참인가.</b> 기록은 «지난 실행의 주장»이고 그 사이에 파일이 바뀔 수\n * 있다. 지금 값이 우리가 쓴 것도 아니고 되돌릴 목표도 아니면 그 백업은 낡은 것이다 —\n * 지금 값이 사용자의 것이므로 그것이 새 기준이 되어야 한다(6차 I3 → 8차 I4).\n */\n const priorOf = (path: string, current: Owned): FileContract | undefined => {\n const prior = record.files[path];\n if (prior === undefined) {\n return undefined;\n }\n if (sameOwned(prior.written, current) || sameOwned(prior.original, current)) {\n return prior;\n }\n delete record.files[path];\n notes.push(`${path}: it changed outside ainecto, so the older backup was dropped and this is the new baseline.`);\n return undefined;\n };\n\n // ── MCP 설정 파일들 — 우리가 «항목 하나»를 소유한다 ──────────────────────────\n for (const target of AGENT_TARGETS) {\n const existing = input.files.get(target.path);\n const currentEntry = existing === undefined ? undefined : readServerEntry(existing);\n const prior = priorOf(target.path, ownedJson(currentEntry, currentEntry !== undefined));\n const merged = mergeServerEntry(existing, entry);\n if (existing === merged.content) {\n continue;\n }\n const before = previousRole(target.path, existing);\n if (merged.replaced && before && before !== input.role) {\n notes.push(`${target.path}: role ${before} → ${input.role}`);\n }\n const original = prior?.original ?? ownedJson(merged.replacedEntry, merged.replaced);\n if (prior === undefined && original.at !== \"absent\") {\n notes.push(`${target.path}: your existing \"${SERVER_NAME}\" entry was saved and will be restored by --undo`);\n }\n record.files[target.path] = {\n scope: \"entry\",\n createdByUs: prior?.createdByUs ?? existing === undefined,\n original,\n written: ownedJson(readServerEntry(merged.content), true),\n fileFingerprint: fingerprintFor(target.path, merged.content),\n };\n writes.push({ path: target.path, content: merged.content, existed: existing !== undefined });\n }\n\n // ── HARNESS.md — 우리가 «파일 전체»를 소유한다 ────────────────────────────────\n const existingDoc = input.files.get(HARNESS_DOC_PATH);\n const priorDoc = priorOf(HARNESS_DOC_PATH, ownedText(existingDoc));\n const docContent = renderHarnessDoc({\n projectName: input.projectName,\n projectUuid: input.projectUuid,\n endpoint: input.endpoint,\n }, input.documents?.doc);\n const docOriginal = priorDoc?.original ?? ownedText(existingDoc);\n if (priorDoc === undefined && docOriginal.at !== \"absent\") {\n notes.push(`${HARNESS_DOC_PATH} already existed; its original was saved and --undo will restore it.`);\n }\n record.files[HARNESS_DOC_PATH] = {\n scope: \"whole\",\n createdByUs: priorDoc?.createdByUs ?? existingDoc === undefined,\n original: docOriginal,\n written: ownedText(docContent),\n fileFingerprint: fingerprintFor(HARNESS_DOC_PATH, docContent),\n };\n if (docContent !== existingDoc) {\n writes.push({ path: HARNESS_DOC_PATH, content: docContent, existed: existingDoc !== undefined });\n }\n\n // ── AGENTS.md / CLAUDE.md — 우리가 «블록 하나»를 소유한다 ─────────────────────\n const note = renderAgentNote(input.documents?.agentNote);\n for (const target of NOTE_TARGETS) {\n const existing = input.files.get(target.path);\n if (existing === undefined && !target.createIfMissing) {\n notes.push(`${target.path} not found — skipped; AGENTS.md already reaches this agent.`);\n continue;\n }\n const blockNow = existing === undefined ? undefined : existingMarkerBlock(existing);\n const carried = record.files[target.path];\n // ⚠아래 판정은 «새 기준을 만들기 전에» 온다. 정상 위치에 블록이 있을 때만 검사하면,\n // 그 블록을 고치고 사본을 옆에 둔 파일이 가드를 건너뛰었다(3차 리뷰 B2).\n let content: string;\n try {\n content = upsertMarkerBlock(existing, note);\n } catch (error) {\n // ★우리 블록을 «다시 찾을 수 있게» 넣을 수 없는 파일이다 — 그 파일만 건너뛰고 나머지\n // init 은 계속한다. ⛔이때 기록은 «한 글자도» 건드리지 않는다: 새 기준도 못 세웠는데\n // 옛 백업을 버리면 양쪽 다 잃는다(7차 독립 리뷰 I4).\n notes.push(`${target.path}: ${error instanceof Error ? error.message : String(error)}`);\n continue;\n }\n if (carried?.scope === \"block\" && unexplainedMarkers(existing, carried) > 0) {\n // ★<b>이 파일의 마커를 기록으로 설명할 수 없다.</b> 우리 블록이 옮겨졌거나 한 벌 더\n // 있을 수 있다는 뜻이다(펜스·인용문 안, 제목만 고친 것, 정상 블록 옆의 사본 포함).\n // 그대로 진행하면 계약을 버려(priorOf) 사용자 원본 백업이 사라지고 파일에는 우리 블록이\n // 둘이 된다 — 그 상태의 undo 는 «새로 더한 것만» 걷어내고 완료로 처리했다(9차 B2).\n // ⇒ 이 파일은 손대지 않고 기록도 그대로 둔다. 자리를 되돌리는 것은 사람 몫이다.\n notes.push(\n `${target.path}: this file has an ainecto marker block that is not where ainecto can find `\n + \"it again (inside a code fence, a quote, or edited). Left untouched and the earlier \"\n + \"backup kept — move that block back to the top level, or remove it, then run again.\",\n );\n continue;\n }\n // ★<b>블록을 «못 찾는다»는 사실은 백업을 버릴 근거가 아니다</b>(3차 리뷰 B2). 마커가\n // 변형·삭제돼 우리 블록이 검출되지 않으면 예전엔 계약을 버려 사용자 원본이 사라졌다.\n // 새 기준은 «정상 위치에 사용자 것이 들어와 있을 때»만 세운다 — 그때만 되돌릴 목표가 바뀐다.\n const prior = blockNow === undefined ? carried : priorOf(target.path, ownedText(blockNow));\n if (content === existing) {\n continue;\n }\n const original = prior?.original ?? ownedText(blockNow);\n if (prior === undefined && original.at !== \"absent\") {\n notes.push(`${target.path}: an existing ainecto block was saved and will be restored by --undo`);\n }\n record.files[target.path] = {\n scope: \"block\",\n createdByUs: prior?.createdByUs ?? existing === undefined,\n original,\n written: ownedText(existingMarkerBlock(content)),\n fileFingerprint: fingerprintFor(target.path, content),\n // init «전»에 이 파일에 있던 관리 블록들의 신원. 되돌리기가 「남은 마커를 설명할 수 있나」를\n // 이것으로 묻는다. ★재init 은 이어받는다 — 다시 재면 우리가 쓴 블록이 «원래 있던 것»이 된다.\n // ★{@code carried} 를 먼저 본다 — {@code priorOf} 가 새 기준을 세웠다는 것이 「남의 예제\n // 목록을 다시 모아도 된다」는 허가가 아니다. 다시 모으면 «우리가 옮겨 둔 사본»이\n // 「원래 있던 예제」로 등록되고, 그다음 되돌리기가 그것을 남긴 채 끝났다(3차 리뷰 B2).\n foreignBlocks: carried?.foreignBlocks ?? prior?.foreignBlocks ?? markerEvidence(existing),\n };\n writes.push({ path: target.path, content, existed: existing !== undefined });\n }\n\n // ── config.json — 우리가 «칸 몇 개»를 소유한다. 나머지는 사용자 것이다 ────────\n const existingConfig = input.files.get(HARNESS_CONFIG_PATH);\n const ourFields = configBodyOf({\n projectUuid: input.projectUuid,\n projectName: input.projectName,\n endpoint: input.endpoint,\n cliVersion: input.cliVersion,\n // ★어느 판의 규칙으로 썼나. 이게 없으면 「무엇이 적혀 있었나」를 나중에 못 되짚는다.\n versions: input.documents?.versions ?? {},\n });\n const theirConfig = existingConfig === undefined ? undefined : parseJsonObject(existingConfig);\n if (existingConfig !== undefined && theirConfig === undefined) {\n // JSON 객체가 아닌 파일은 병합할 수 없다 — 손대지 않는다. ⛔이미 있던 계약도 지우지 않는다:\n // 그 안에 아직 못 되돌린 원본이 있을 수 있다(8차 독립 리뷰 I3).\n notes.push(`${HARNESS_CONFIG_PATH} is not a JSON object — left untouched.`);\n } else {\n const priorConfig = record.files[HARNESS_CONFIG_PATH];\n const originalFields: Record<string, Owned> = {};\n for (const field of OUR_CONFIG_FIELDS) {\n const presentNow = theirConfig !== undefined && hasField(theirConfig, field);\n const currentValue = presentNow ? theirConfig![field] : undefined;\n const priorOriginal = priorConfig?.originalFields?.[field];\n const priorWritten = priorConfig?.writtenFields;\n // ★재init: 사용자가 우리 칸을 고쳤으면 «그 값»이 새 원본이다. 옛 원본을 이어받으면\n // 되돌리기가 두 판 전 값을 복원하며 사용자 편집을 잃는다(8차 독립 리뷰 I4).\n const untouchedByUser = priorWritten !== undefined && hasField(priorWritten, field)\n && stableStringify(currentValue) === stableStringify(priorWritten[field]);\n const next = untouchedByUser && priorOriginal !== undefined\n ? priorOriginal\n : ownedJson(currentValue, presentNow);\n originalFields[field] = next;\n if (priorOriginal !== undefined && !sameOwned(next, priorOriginal)) {\n notes.push(`${HARNESS_CONFIG_PATH}: you changed ${field} — ainecto now treats your value as the one to put back.`);\n }\n }\n const mergedConfig = serialize({ ...(theirConfig ?? {}), ...ourFields });\n record.files[HARNESS_CONFIG_PATH] = {\n scope: \"fields\",\n createdByUs: priorConfig?.createdByUs ?? existingConfig === undefined,\n original: ABSENT,\n written: ownedText(mergedConfig),\n fileFingerprint: fingerprintFor(HARNESS_CONFIG_PATH, mergedConfig),\n writtenFields: { ...ourFields },\n originalFields,\n };\n if (mergedConfig !== existingConfig) {\n writes.push({\n path: HARNESS_CONFIG_PATH,\n content: mergedConfig,\n existed: existingConfig !== undefined,\n });\n }\n }\n\n // ── 기록 — 우리 파일. 통째로 쓰고 통째로 지운다 ───────────────────────────────\n const existingRecord = input.files.get(HARNESS_RECORD_PATH);\n const recordContent = serializeRecord(record);\n // ★변경 없는 재실행은 아무 파일도 안 바꿔야 한다(5차 독립 리뷰 S2). ⚠그렇다고 「쓸 것이\n // 없다」가 「새로 알게 된 사실도 없다」를 뜻해선 안 된다 — mkdir 결과는 적용이 따로 저장한다\n // (8차 독립 리뷰 S1).\n if (recordContent !== existingRecord) {\n writes.push({\n path: HARNESS_RECORD_PATH,\n content: recordContent,\n existed: existingRecord !== undefined,\n });\n }\n\n return {\n writes,\n deletes: [],\n codexCommand: codexAddCommand({ role: input.role, env: input.env, endpoint: input.endpoint }),\n codexProfile: codexProfileSetup({ role: input.role, env: input.env, endpoint: input.endpoint }),\n notes,\n record,\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 계획 — undo\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * 한 파일에 대한 처리 «결과». ★완료·보존·미해결을 타입으로 가른다.\n *\n * <p>예전엔 셋이 같은 코드 경로로 흘렀고, 그래서 「손대지 않음」이 「복구 완료」와 같은 결과가\n * 됐다 — 판단 재료가 없어 아무것도 못 한 파일의 백업까지 지웠다(8차 독립 리뷰 I3).\n */\ntype Outcome =\n /** 목표에 도달했다 — 기록에서 지운다. */\n | { kind: \"done\"; note?: string }\n /** 되돌렸다 — 파일을 쓰고 기록에서 지운다. */\n | { kind: \"write\"; content: string; note?: string }\n /** 되돌렸다 — 파일을 지우고 기록에서 지운다. */\n | { kind: \"delete\"; note?: string }\n /** 이제 사용자 것이다 — 파일은 그대로 두고 기록에서 지운다. */\n | { kind: \"keep\"; note: string }\n /** 아직 못 했다 — ★기록을 «지키고» 이유를 말한다. */\n | { kind: \"unresolved\"; note: string };\n\nexport interface PlanUndoInput {\n files: FileSnapshot;\n /** 기록 «상태». 없으면 스냅샷에서 읽는다. */\n record?: RecordState;\n}\n\n/**\n * ★<b>우리가 쓴 것만 되돌린다.</b> 남의 서버 항목, 사용자가 표식 밖에 적은 글은 그대로 둔다.\n * 파일을 지우는 것은 «우리가 만든 파일»뿐이다.\n */\nexport function planUndo(input: PlanUndoInput): InitPlan {\n const state = input.record ?? readRecord(input.files.get(HARNESS_RECORD_PATH));\n const writes: FileWrite[] = [];\n const deletes: string[] = [];\n const notes: string[] = [];\n const tail = () => {\n notes.push(`Codex keeps its own global config — remove it with: ${codexRemoveCommand()}`);\n notes.push(`If you set ${ROLE_ENV_VAR} anywhere, unset it too.`);\n };\n\n if (state.state === \"absent\") {\n // ★기록이 없으면 «아무것도» 되돌리지 않는다. 예전엔 이름이 우리 것이면 지웠는데,\n // init 을 한 적도 없는 저장소의 사용자 항목까지 지웠다(독립 재리뷰 I2).\n notes.push(`No record of a previous init in ${HARNESS_RECORD_PATH} — no local file was changed.`);\n tail();\n return { writes, deletes, codexCommand: codexRemoveCommand(), notes };\n }\n if (state.state !== \"valid\") {\n // ⛔손상·구판 기록으로 파일을 «지우지» 않는다. 그 안에 아직 못 되돌린 원본이 있을 수 있고,\n // 우리는 그것을 읽어 내지 못했다(8차 독립 리뷰 I1·S2).\n notes.push(\n `${state.reason}. Nothing was changed — that file is kept because it may hold backups `\n + \"--undo still needs. Restore it, or finish the undo with the CLI version that wrote it.\",\n );\n tail();\n return { writes, deletes, codexCommand: codexRemoveCommand(), notes };\n }\n\n const record = state.record;\n /** 남은 의무. ★끝난 항목만 지운다 — 못 한 것은 남는다. */\n const remaining: Record<string, FileContract> = { ...record.files };\n\n for (const [path, contract] of Object.entries(record.files)) {\n const outcome = undoOne(path, contract, input.files.get(path));\n if (outcome.kind !== \"unresolved\" && outcome.kind !== \"keep\" && outcome.note !== undefined) {\n notes.push(outcome.note);\n } else if (outcome.kind === \"unresolved\" || outcome.kind === \"keep\") {\n notes.push(outcome.note);\n }\n if (outcome.kind === \"unresolved\") {\n continue; // 기록을 지킨다.\n }\n delete remaining[path];\n if (outcome.kind === \"write\") {\n writes.push({ path, content: outcome.content, existed: true });\n } else if (outcome.kind === \"delete\") {\n deletes.push(path);\n }\n }\n\n tail();\n\n // ★기록 파일은 «전부 우리 것»이다 — 남은 의무가 있으면 줄여서 다시 쓰고, 없으면 지운다.\n // 「이 칸이 누구 것인가」를 판정할 일이 없다.\n if (input.files.get(HARNESS_RECORD_PATH) !== undefined) {\n if (Object.keys(remaining).length > 0) {\n const reduced: InitRecord = { ...record, files: remaining };\n writes.push({ path: HARNESS_RECORD_PATH, content: serializeRecord(reduced), existed: true });\n notes.push(\n `${HARNESS_RECORD_PATH}: kept, with the finished items removed — it still holds the backups `\n + \"--undo needs. Run --undo again once the items above are resolved.\",\n );\n } else {\n deletes.push(HARNESS_RECORD_PATH);\n }\n }\n\n // ★비었다고 다 치우지 않는다 — 우리가 만든 것만. 그 목록은 적용이 mkdir 결과로 적어 둔다.\n const removableDirectories = parentsOf(deletes)\n .filter((directory) => record.createdDirectories.includes(directory));\n\n return { writes, deletes, codexCommand: codexRemoveCommand(), notes, removableDirectories };\n}\n\n/**\n * ★<b>이 파일에 남은 관리 블록을 기록으로 «설명할 수 있나».</b> 설명되지 않는 것이 하나라도\n * 있으면 우리 블록이 어딘가에 있을 수 있다는 뜻이고, 그러면 의무를 완료로 만들지 않는다.\n *\n * <p>★<b>판정을 뒤집은 자리다</b>(9차 2차 리뷰 B2·N1). 「우리 블록을 알아본다」로 짜면 제목 한 줄\n * 편집·인용문 이동·마커 중첩에 전부 뚫리고, 거꾸로 init 전부터 있던 «똑같은» 예제를 우리 것으로\n * 오인해 정상 되돌리기를 막는다. 그래서 알아보려 하지 않고 <b>기록해 둔 예제를 지워 나간 뒤\n * 남는 것</b>을 센다. 모양 비교는 「적어 둔 예제가 그대로 있나」에만 쓴다.\n */\nfunction unexplainedMarkers(existing: string | undefined, contract: FileContract): number {\n const recorded = [...(contract.foreignBlocks ?? [])];\n let unexplained = 0;\n for (const print of markerEvidence(existing)) {\n const at = recorded.indexOf(print);\n if (at >= 0) {\n recorded.splice(at, 1); // init 전에 있던 그 블록이다 — 우리 일이 아니다.\n } else {\n unexplained += 1;\n }\n }\n return unexplained;\n}\n\n/** 이 파일 하나를 어떻게 할까. ★{@link Outcome} 하나만 돌려준다 — 부수효과 없음. */\nfunction undoOne(path: string, contract: FileContract, existing: string | undefined): Outcome {\n if (existing === undefined) {\n if (contract.original.at !== \"absent\" || contract.scope === \"fields\") {\n // 백업을 든 파일이 사라졌다. 「없으니 건너뛴다」로 기록을 지우면 그 원본은 영영\n // 사라진다 — 사용자가 파일을 되살릴 수도 있다(5차 독립 리뷰 I2).\n return {\n kind: \"unresolved\",\n note: `${path} is gone, so what was there before init could not be put back — `\n + \"the backup is kept. Restore the file and run --undo again.\",\n };\n }\n return { kind: \"done\" };\n }\n switch (contract.scope) {\n case \"entry\": return undoEntry(path, contract, existing);\n case \"block\": return undoBlock(path, contract, existing);\n case \"fields\": return undoFields(path, contract, existing);\n case \"whole\": return undoWhole(path, contract, existing);\n }\n}\n\nfunction undoEntry(path: string, contract: FileContract, existing: string): Outcome {\n const current = readServerEntry(existing);\n const currentOwned = ownedJson(current, current !== undefined);\n if (sameOwned(currentOwned, contract.original)) {\n return {\n kind: \"done\",\n note: contract.original.at === \"absent\"\n ? `${path}: the \"${SERVER_NAME}\" entry ainecto added is already gone.`\n : `${path}: your original \"${SERVER_NAME}\" entry is already back in place.`,\n };\n }\n // ★안내대로 지운 사람에게 같은 안내를 반복하지 않는다 — 남은 일은 원본을 도로 넣는 것이고\n // 그 경로가 바로 아래에 있다(7차 독립 리뷰 S2).\n const goneButWeHoldTheOriginal = current === undefined && contract.original.at !== \"absent\";\n if (!goneButWeHoldTheOriginal && !sameOwned(currentOwned, contract.written)) {\n return {\n kind: \"unresolved\",\n note: `${path}: the \"${SERVER_NAME}\" entry was edited after init — left in place. `\n + \"Remove it by hand if you meant to, then run --undo again.\",\n };\n }\n const restore = contract.original.at === \"json\" ? { value: contract.original.value } : undefined;\n const result = removeServerEntry(existing, restore);\n if (result.emptied && contract.createdByUs) {\n return { kind: \"delete\" };\n }\n if (result.content !== undefined && result.content !== existing) {\n return {\n kind: \"write\",\n content: result.content,\n note: restore === undefined ? undefined : `${path}: restored your original \"${SERVER_NAME}\" entry.`,\n };\n }\n return { kind: \"done\" };\n}\n\nfunction undoBlock(path: string, contract: FileContract, existing: string): Outcome {\n const current = existingMarkerBlock(existing);\n const currentOwned = ownedText(current);\n // ★<b>「예제가 있다」와 「우리 블록이 옮겨져 남았다」를 개수로 가른다.</b> Boolean 하나로는\n // 둘을 표현할 수 없었고, 예제가 있는 파일에서는 우리 블록이 남아 있어도 완료로 읽혔다\n // (8차 독립 리뷰 I5).\n // ★기록으로 설명되지 않는 마커가 있으면, 정상 위치의 블록을 걷어내는 것으로 의무가 끝나지\n // 않는다 — 우리 블록이 그 자리에 있을 수 있다. 개수도 모양도 아니라 «증거 대조»다(9차 2차 B2).\n if (unexplainedMarkers(existing, contract) > 0) {\n return {\n kind: \"unresolved\",\n note: `${path}: this file has an ainecto marker block that --undo cannot account for `\n + \"(inside a code fence, a quote, or edited). Remove it by hand, then run --undo again.\",\n };\n }\n if (sameOwned(currentOwned, contract.original)) {\n return {\n kind: \"done\",\n note: contract.original.at === \"absent\"\n ? `${path}: the ainecto block is already gone.`\n : `${path}: the ainecto block that was there before is already back in place.`,\n };\n }\n if (current === undefined && contract.original.at === \"text\") {\n // ★안내대로 지웠다 — 원본 블록을 도로 넣는다. 예전엔 여기서도 「손으로 지우고 다시\n // 실행하라」를 반복해, 이미 지운 사람에게 실행되지 않는 경로를 요구했다(8차 S3).\n const body = existing.trim()\n ? `${existing.replace(/\\s*$/, \"\")}\\n\\n${contract.original.text}\\n`\n : `${contract.original.text}\\n`;\n return { kind: \"write\", content: body, note: `${path}: restored the ainecto block that was there before.` };\n }\n if (!sameOwned(currentOwned, contract.written)) {\n return {\n kind: \"unresolved\",\n note: `${path}: the ainecto block was edited after init — left in place. `\n + \"Remove the block by hand if you meant to, then run --undo again.\",\n };\n }\n let result: { content: string; removed: boolean; emptied: boolean };\n try {\n result = contract.original.at === \"text\"\n ? { content: replaceMarkerBlockWith(existing, contract.original.text), removed: true, emptied: false }\n : removeMarkerBlock(existing);\n } catch (error) {\n return { kind: \"unresolved\", note: `${path}: ${error instanceof Error ? error.message : String(error)}` };\n }\n if (!result.removed) {\n return {\n kind: \"unresolved\",\n note: `${path}: the ainecto block could not be removed — it is still in the file. `\n + \"Remove it by hand, then run --undo again.\",\n };\n }\n if (result.emptied && contract.createdByUs) {\n return { kind: \"delete\" };\n }\n return {\n kind: \"write\",\n content: result.content,\n note: contract.original.at === \"text\"\n ? `${path}: restored the ainecto block that was there before.`\n : undefined,\n };\n}\n\nfunction undoWhole(path: string, contract: FileContract, existing: string): Outcome {\n if (sameOwned(ownedText(existing), contract.original)) {\n // 사용자가 손으로 원본을 되돌려 놨다 — 목표에 이미 도달했다(6차 독립 리뷰 I2).\n return { kind: \"done\", note: `${path} is already the file that existed before init.` };\n }\n if (!sameOwned(ownedText(existing), contract.written)) {\n if (contract.original.at === \"text\") {\n return {\n kind: \"unresolved\",\n note: `${path} was edited after init — left in place instead of restoring the pre-init file. `\n + \"The backup is kept; run --undo again once you have resolved it.\",\n };\n }\n // 우리가 만든 파일을 사용자가 고쳤다 — 이제 사용자 것이다.\n return { kind: \"keep\", note: `${path} was edited after init — left in place instead of deleting it.` };\n }\n if (contract.original.at === \"text\") {\n return {\n kind: \"write\",\n content: contract.original.text,\n note: `${path}: restored the file that existed before init.`,\n };\n }\n return contract.createdByUs ? { kind: \"delete\" } : { kind: \"done\" };\n}\n\nfunction undoFields(path: string, contract: FileContract, existing: string): Outcome {\n const parsed = parseJsonObject(existing);\n if (parsed === undefined) {\n // ★「손대지 않음」은 «복구 완료»가 아니다. 판단 재료가 없으면 백업을 지킨다(8차 I3).\n return {\n kind: \"unresolved\",\n note: `${path} is not a JSON object any more, so ainecto could not take its fields back out — `\n + \"the backup is kept. Fix the file and run --undo again.\",\n };\n }\n // ★<b>로더와 «같은» 검증을 여기서도 한다.</b> 그리고 여기서는 부르는 쪽이 아는 것을 하나 더\n // 넘긴다 — 어느 칸이 우리 것인지. 그래서 「우리가 쓴 칸인데 기록에 없다」까지 걸린다.\n // ⛔빈 map 으로 메우면 모든 칸이 「우리 것이 아니다」로 읽혀 파일은 그대로 두고 백업만\n // 지운다. 판정 자료가 반쯤 맞으면 그것으로 파일을 고치지 않는다(9차 B1 · 2차 리뷰 B1).\n const contractProblem = fieldsContractProblem(contract, OUR_CONFIG_FIELDS);\n if (contractProblem !== undefined) {\n return {\n kind: \"unresolved\",\n note: `${path}: ainecto's record of the fields it wrote ${contractProblem}, so its fields `\n + \"were left in place — the backup is kept. Restore that record, or remove the fields by hand.\",\n };\n }\n const written = contract.writtenFields!;\n const originals = contract.originalFields!;\n const next: Record<string, unknown> = {};\n const kept: string[] = [];\n for (const [field, value] of Object.entries(parsed)) {\n if (!OUR_CONFIG_FIELDS.includes(field)) {\n next[field] = value; // 사용자 칸 — 손대지 않는다.\n continue;\n }\n if (!hasField(written, field)) {\n // ★우리 칸 이름인데 기록이 그 칸을 말하지 않는다 — 판정 자료가 없다. 「사용자가 고쳤다」도\n // 「우리 것이 아니다」도 근거가 없으므로 완료로 바꾸지 않는다(9차 B1).\n return {\n kind: \"unresolved\",\n note: `${path}: ainecto has no record of what it wrote for ${field}, so its fields were `\n + \"left in place — the backup is kept. Restore that record, or remove the field by hand.\",\n };\n }\n const stillOurs = stableStringify(value) === stableStringify(written[field]);\n if (!stillOurs) {\n // ★이름이 우리 것이어도 «값»은 사용자가 고쳤다. 되돌리기가 그것을 덮지 않는다(7차 I2).\n next[field] = value;\n kept.push(field);\n continue;\n }\n const original = originals[field];\n // ★되돌릴 «목표»를 모르면 지우지 않는다. 예전엔 json 이 아닌 모든 것을 「우리가 더한 칸」으로\n // 묶어 지웠고, 원본이 {at:\"text\"} 로 바뀐 기록 하나가 config 를 «비웠다»(2차 리뷰 B1).\n // 위 검증이 이미 막지만, 이 판단을 그 검증에만 맡기지 않는다 — 여기가 파일을 고치는 자리다.\n if (original === undefined || (original.at !== \"json\" && original.at !== \"absent\")) {\n return {\n kind: \"unresolved\",\n note: `${path}: ainecto cannot tell what was in ${field} before it wrote there, so the `\n + \"file was left as it is — the backup is kept. Remove the field by hand if you meant to.\",\n };\n }\n if (original.at === \"json\") {\n next[field] = original.value; // 원래 있던 칸 → 원본 값으로.\n }\n // ⚠original 이 absent 면 우리가 «더한» 칸이므로 넣지 않는다 = 지운다.\n // ★사용자가 우리 칸을 «지웠으면» 그 칸은 위 루프에 아예 안 들어온다 — 그래서 되살아나지\n // 않는다. 예전엔 뒤에 보충 루프가 있어 삭제를 무조건 되돌렸다(8차 독립 리뷰 I4).\n }\n const note = kept.length === 0 ? undefined\n : `${path}: you changed ${kept.join(\", \")} after init — left as you set it instead of `\n + \"putting the pre-init value back.\";\n if (Object.keys(next).length === 0 && contract.createdByUs) {\n return { kind: \"delete\", note };\n }\n // ★파일이 원래 «빈 객체»였으면 빈 객체를 되돌린다 — 부재와 구별한다(8차 독립 리뷰 I6).\n const body = serialize(next);\n return body === existing\n ? { kind: \"done\", note }\n : {\n kind: \"write\",\n content: body,\n note: note ?? `${path}: removed what ainecto wrote and kept the rest.`,\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 적용이 쓰는 것\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * 기록의 {@code createdDirectories} 를 «실제로 만든 것»으로 갈아 끼운다.\n *\n * <p>★자기 지문을 다시 계산하는 장치가 없다 — 기록이 우리 파일이라 지문을 재지 않기 때문이다.\n * 같은 순환 함정을 세 번 «요령»으로 막은 뒤(4차 I7 · 5차 S3 · 6차) 순환이 생기는 구조를\n * 없애는 쪽이 답이었다.\n */\nexport function withCreatedDirectories(current: string, directories: readonly string[]): string {\n const state = readRecord(current);\n if (state.state !== \"valid\") {\n return current;\n }\n return serializeRecord({ ...state.record, createdDirectories: [...directories] });\n}\n\nexport { readRecord, serializeRecord, emptyRecord } from \"./initRecord\";\nexport type { InitRecord, RecordState, FileContract, Owned } from \"./initRecord\";\n\n/** 이 경로들의 «저장소 안» 부모 디렉터리. 깊은 것부터 — .a/b 를 치워야 .a 가 비워진다. */\nfunction parentsOf(paths: readonly string[]): string[] {\n const directories = new Set<string>();\n for (const path of paths) {\n const parent = path.includes(\"/\") ? path.slice(0, path.lastIndexOf(\"/\")) : \"\";\n if (parent) {\n directories.add(parent);\n }\n }\n return [...directories].sort((left, right) => right.length - left.length);\n}\n\n/** 이 설정 파일에 걸린 역할 — 읽는 규칙은 {@link readConfigRole} 한 곳이다. */\nfunction previousRole(path: string, existing: string | undefined): HarnessRole | undefined {\n const read = readConfigRole(path, existing);\n return read.kind === \"role\" ? read.role : undefined;\n}\n","import { lstat, readFile, realpath } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, resolve, sep } from \"node:path\";\nimport { AGENT_TARGETS, isOurBridge, readRoleFromEntry, SERVER_NAME } from \"./agentTargets\";\nimport { HARNESS_ROLES, type HarnessRole } from \"./role\";\n\n/**\n * ★저장소 역할의 SSOT (설계 0.4.2 §2-1).\n *\n * <p>역할이 «저장된 곳»은 하나다 — init 이 쓴 {@code .mcp.json}·{@code .cursor/mcp.json} 의 {@code ainecto}\n * 항목의 {@code --role}. 에이전트가 실제로 읽는 값이 그것이므로 다른 곳\n * ({@code .ainecto/config.json} 등)에\n * 두 번째 기록을 두지 않는다. init 의 역할 추론과 셸 CLI 의 역할 결정이 모두 이 모듈을 지난다.\n */\n\n/** 명령이 찾은 저장소 역할. */\nexport type RepositoryRole =\n | { kind: \"none\" }\n | { kind: \"role\"; role: HarnessRole; dir: string }\n | { kind: \"conflict\"; dir: string; reason: string };\n\n/** 파일 스냅샷에서 읽은 역할과, 역할을 «읽어 낼 수 없었던» 이유들. */\nexport interface RolesInFiles {\n /** 중복 없는 역할. 둘 이상이면 설정끼리 어긋난 것이다. */\n roles: HarnessRole[];\n /** 읽기 문제(우리 브리지인데 --role 이 없거나 모르는 값, `ainecto` 가 든 깨진 JSON). */\n problems: string[];\n /** 어느 파일이든 우리 브리지 항목(또는 읽기 문제)이 있었나 — 이 폴더가 «init 된 폴더»인가. */\n found: boolean;\n}\n\n/** 설정 파일 하나에서 읽은 것. */\nexport type ConfigRole =\n | { kind: \"absent\" }\n | { kind: \"role\"; role: HarnessRole }\n | { kind: \"problem\"; reason: string };\n\n/**\n * ★설정 파일 «하나»에서 우리 브리지의 역할을 읽는 유일한 함수. init 의 역할 변경 알림(initPlan)과\n * 저장소 역할 판정이 모두 이것을 쓴다.\n *\n * <p>멈출 이유는 좁게 둔다(0.4.2 리뷰 P1-3) — 사람의 설정을 잘못 읽어 모든 명령을 막으면 안 된다.\n * <ul>\n * <li>{@code ainecto} 항목이 «우리 브리지»가 아니면(mcp-remote·url 방식 등) 역할 없음이다.</li>\n * <li>JSON 이 깨졌어도 원문에 그 이름이 없으면 우리와 무관한 파일이다 — 건너뛴다.</li>\n * <li>우리 브리지인데 {@code --role} 이 없거나 모르는 값이면 멈춘다 — 역할을 모르는 채로 «제한 없음»으로\n * 가지 않는다.</li>\n * </ul>\n */\nexport function readConfigRole(path: string, content: string | undefined): ConfigRole {\n if (content === undefined || !content.trim()) {\n return { kind: \"absent\" };\n }\n let servers: Record<string, unknown>;\n try {\n const parsed = JSON.parse(content) as { mcpServers?: unknown } | null;\n const raw = parsed?.mcpServers;\n servers = typeof raw === \"object\" && raw !== null && !Array.isArray(raw) ? raw as Record<string, unknown> : {};\n } catch {\n return content.includes(SERVER_NAME)\n ? { kind: \"problem\", reason: `${path} is not valid JSON` }\n : { kind: \"absent\" };\n }\n const entry = servers[SERVER_NAME];\n if (!isOurBridge(entry)) {\n return { kind: \"absent\" };\n }\n const role = readRoleFromEntry(entry);\n if (role === undefined) {\n return { kind: \"problem\", reason: `${path} has the \"${SERVER_NAME}\" bridge without a valid --role` };\n }\n return { kind: \"role\", role };\n}\n\n/**\n * 스냅샷(경로 → 내용)에서 역할을 읽는다. 순수 함수.\n *\n * <p>init 은 {@code roles} 만 본다(자기가 그 파일을 다시 쓰므로 문제를 고칠 수 있다). 셸 명령은\n * {@code problems} 가 있으면 멈춘다.\n */\nexport function rolesInFiles(files: ReadonlyMap<string, string | undefined>): RolesInFiles {\n const roles: HarnessRole[] = [];\n const problems: string[] = [];\n for (const target of AGENT_TARGETS) {\n const read = readConfigRole(target.path, files.get(target.path));\n if (read.kind === \"problem\") {\n problems.push(read.reason);\n } else if (read.kind === \"role\" && !roles.includes(read.role)) {\n roles.push(read.role);\n }\n }\n return { roles, problems, found: roles.length > 0 || problems.length > 0 };\n}\n\n/**\n * 셸 명령의 저장소 역할. ★cwd 에서 위로, 우리 브리지 항목이 있는 «첫 폴더»에서 멈춘다\n * (리뷰 P1-a — 중첩 저장소는 가까운 쪽, git 아닌 하위 폴더·worktree 도 같은 규칙).\n *\n * <p>⚠홈 폴더 자체는 보지 않는다. {@code ~/.cursor/mcp.json} 은 Cursor 의 «전역» 설정이다(실측: 역할 없는\n * 우리 항목이 있었다). ★비교는 «실제 경로»로 한다 — macOS 의 {@code /var} 와 {@code /private/var}\n * 처럼 링크로 갈라진 같은 폴더를 문자열로 비교하면 홈을 못 알아본다(0.4.2 리뷰 P1-1). Windows 는 대소문자를\n * 가리지 않는다.\n *\n * <p>설정 파일이 폴더 «안»을 가리키는 링크면 그대로 읽는다({@code .cursor/mcp.json → ../.mcp.json}). 폴더\n * «밖»을 가리키면 멈춘다.\n */\nexport async function findRepositoryRole(cwd: string, home: string = homedir()): Promise<RepositoryRole> {\n const stopAt = await realOrResolved(home);\n for (let dir = await realOrResolved(cwd); ; dir = dirname(dir)) {\n if (samePath(dir, stopAt)) {\n return { kind: \"none\" };\n }\n const files = new Map<string, string | undefined>();\n let readProblem: string | undefined;\n for (const target of AGENT_TARGETS) {\n try {\n files.set(target.path, await readConfigInside(dir, target.path));\n } catch (error) {\n readProblem = error instanceof Error ? error.message : String(error);\n }\n }\n if (readProblem !== undefined) {\n return { kind: \"conflict\", dir, reason: readProblem };\n }\n const result = rolesInFiles(files);\n if (result.found) {\n if (result.problems.length > 0) {\n return { kind: \"conflict\", dir, reason: result.problems.join(\"; \") };\n }\n if (result.roles.length > 1) {\n return {\n kind: \"conflict\",\n dir,\n reason: `agent configs disagree about the session role (${result.roles.join(\", \")})`,\n };\n }\n return { kind: \"role\", role: result.roles[0]!, dir };\n }\n if (dirname(dir) === dir) {\n return { kind: \"none\" };\n }\n }\n}\n\n/**\n * 멈출 때 쓰는 문장. ★막다른 길이 되지 않게 한다(0.4.2 리뷰 P2): init 은 git 저장소의 루트에서만 돈다.\n * 그 폴더가 git 저장소의 «하위 폴더»면 init 으로는 그 폴더의 설정을 고칠 수 없으므로, 사용자에게 그 파일을\n * 어떻게 둘지 물으라고 말한다.\n */\nexport async function askTheUserToFixRole(dir: string, reason: string): Promise<string> {\n const gitRoot = await findGitRoot(dir);\n const roles = HARNESS_ROLES.join(\", \");\n if (gitRoot !== undefined && !samePath(await realOrResolved(gitRoot), await realOrResolved(dir))) {\n return `Cannot tell this folder's AI session role: ${reason} (in ${dir}, inside the git repository at ${gitRoot}). `\n + \"Ask the user how that AiNecto setting should look — `ainecto init` only sets up a repository root \"\n + `(${gitRoot}).`;\n }\n return `Cannot tell this repository's AI session role: ${reason} (in ${dir}). `\n + `Ask the user which role this repository's AI sessions should have (${roles}), `\n + `then run \\`ainecto init --role <role>\\` in ${dir}.`;\n}\n\nasync function realOrResolved(path: string): Promise<string> {\n try {\n return await realpath(path);\n } catch {\n return resolve(path);\n }\n}\n\nfunction samePath(left: string, right: string): boolean {\n return process.platform === \"win32\" ? left.toLowerCase() === right.toLowerCase() : left === right;\n}\n\n/**\n * 역할을 읽으려고 설정 파일을 연다. 링크면 따라가되, 그 실제 경로가 이 폴더 «안»일 때만 읽는다.\n * (init 의 {@link readManagedFile} 은 쓰기를 위한 문이라 링크를 아예 거절한다 — 역할 읽기에는 너무 좁다.)\n */\nasync function readConfigInside(dir: string, path: string): Promise<string | undefined> {\n let real: string;\n try {\n real = await realpath(join(dir, path));\n } catch (error) {\n if (isNodeError(error, \"ENOENT\") || isNodeError(error, \"ENOTDIR\")) {\n return undefined;\n }\n throw error;\n }\n const realDir = await realOrResolved(dir);\n if (!samePath(real, realDir) && !real.startsWith(realDir + sep)\n && !(process.platform === \"win32\" && real.toLowerCase().startsWith((realDir + sep).toLowerCase()))) {\n throw new Error(`${path} points outside ${dir} (${real})`);\n }\n return readFile(real, \"utf8\");\n}\n\n/** cwd 에서 위로 올라가며 {@code .git} 이 있는 첫 디렉터리. 없으면 undefined. */\nexport async function findGitRoot(cwd: string): Promise<string | undefined> {\n for (let at = resolve(cwd); ; at = dirname(at)) {\n try {\n await lstat(join(at, \".git\"));\n return at;\n } catch {\n // 없다(또는 볼 수 없다) — 한 칸 위로.\n }\n if (dirname(at) === at) {\n return undefined;\n }\n }\n}\n\n/**\n * ★<b>저장소 안의 파일을 읽는 유일한 문.</b> 경계 검사가 읽기 «앞»에 붙어 있다.\n *\n * <p>예전엔 스냅샷만 검사를 했고, 나중에 붙인 역할 추론이 파일을 바로 읽었다. 그래서 저장소 밖을\n * 가리키는 설정 파일을 <b>한 번 읽고 나서</b> 거절했다(2026-09-23 4차 독립 리뷰 I5). 검사와 읽기가\n * 갈라지면, 새로 생긴 경로마다 검사를 잊는다.\n */\nexport async function readManagedFile(root: string, path: string): Promise<string | undefined> {\n await assertInsideRepository(root, path);\n return readIfExists(join(root, path));\n}\n\nexport async function readIfExists(absolutePath: string): Promise<string | undefined> {\n try {\n return await readFile(absolutePath, \"utf8\");\n } catch (error) {\n if (isNodeError(error, \"ENOENT\")) {\n return undefined;\n }\n throw error;\n }\n}\n\n/**\n * ★이 경로가 정말 저장소 «안»인가.\n *\n * <p>{@code join(root, path)} 는 이름을 이어 붙일 뿐이고, {@code readFile}/{@code writeFile}\n * 은 심볼릭 링크를 따라간다. {@code .ainecto → /somewhere/else} 인 저장소에서 undo 를 돌리면\n * 남의 디렉터리 파일이 지워졌다(2026-09-22 독립 리뷰 I4). 실제 경로로 풀어서 경계를 본다.\n */\nexport async function assertInsideRepository(root: string, relativePath: string): Promise<void> {\n const absolutePath = join(root, relativePath);\n const realRoot = await realpath(root);\n let realParent: string;\n try {\n realParent = await realpath(dirname(absolutePath));\n } catch (error) {\n if (isNodeError(error, \"ENOENT\")) {\n return; // 아직 없는 디렉터리는 우리가 만든다 — 링크일 수 없다.\n }\n throw error;\n }\n if (realParent !== realRoot && !realParent.startsWith(realRoot + sep)) {\n throw new Error(\n `${relativePath} resolves outside the repository (${realParent}); refusing to touch it.`,\n );\n }\n try {\n if ((await lstat(absolutePath)).isSymbolicLink()) {\n throw new Error(`${relativePath} is a symbolic link; refusing to write through it.`);\n }\n } catch (error) {\n if (!isNodeError(error, \"ENOENT\")) {\n throw error;\n }\n }\n}\n\nfunction isNodeError(error: unknown, code: string): boolean {\n return typeof error === \"object\" && error !== null && (error as { code?: unknown }).code === code;\n}\n","import { assertTrustedEndpointUrl } from \"../config/endpoints\";\nimport { documentContractProblem } from \"./harnessDoc\";\n\n/**\n * 저장소에 쓸 하네스 문서를 서버에서 받아 온다.\n *\n * <p>★<b>이것이 「규칙을 고치려면 npm 퍼블리시」를 끊는 지점이다.</b> 예전엔 본문이 패키지\n * 안에 박혀 있어서, 한 줄 고치려면 CLI 를 배포하고 모든 사용자가 init 을 다시 쳐야 했다.\n *\n * <p>⚠<b>못 받으면 «기본값을 썼다»고 적는다.</b> 조용히 패키지 사본으로 떨어지면, 서버에서\n * 규칙을 고쳐도 안 바뀌는 이유를 사용자가 영영 못 찾는다 — 오늘 여러 번 만난 모양이다.\n *\n * <p>MCP 엔드포인트 아래({@code <endpoint>/harness/documents})에 둔 이유: MCP 토큰은 REST\n * ({@code /api/v1/...})에서 거절되고, 도구로 내면 모든 세션의 도구 목록이 한 칸 늘어난다.\n */\nexport interface HarnessDocuments {\n doc?: string;\n agentNote?: string;\n /** 어느 판을 받았나. 못 받았으면 undefined. */\n versions: Record<string, string>;\n /** 못 받은 이유 — 요청 자체가 실패했을 때. 받았으면 undefined. */\n unavailableReason?: string;\n /**\n * ★<b>문서별로 패키지 기본값을 쓴 이유.</b> 서버가 HTTP 200 으로 «빈 문서»를 주거나\n * 계약을 안 지킨 본문을 줘도 예전엔 조용히 패키지 사본으로 떨어졌다 — 사용자는 자기가\n * 서버 판을 받았다고 믿는다(2026-09-23 독립 재리뷰 I5).\n */\n fallbacks: Record<string, string>;\n}\n\nexport interface FetchHarnessDocumentsInput {\n endpoint: string;\n accessToken?: string;\n client?: string;\n fetchImpl?: typeof fetch;\n}\n\nexport const DOC_KEY = \"HARNESS.DOC\";\nexport const AGENT_NOTE_KEY = \"HARNESS.AGENT_NOTE\";\n\nexport async function fetchHarnessDocuments(\n input: FetchHarnessDocumentsInput,\n): Promise<HarnessDocuments> {\n const url = new URL(`${input.endpoint.replace(/\\/$/, \"\")}/harness/documents`);\n assertTrustedEndpointUrl(url, \"harness documents URL\");\n if (input.client) {\n url.searchParams.set(\"client\", input.client);\n }\n const fetchImpl = input.fetchImpl ?? fetch;\n try {\n const response = await fetchImpl(url.toString(), {\n headers: {\n accept: \"application/json\",\n ...(input.accessToken ? { authorization: `Bearer ${input.accessToken}` } : {}),\n },\n });\n if (!response.ok) {\n return { versions: {}, fallbacks: {}, unavailableReason: `server answered HTTP ${response.status}` };\n }\n const payload = (await response.json()) as {\n documents?: Record<string, { body?: unknown; version?: unknown; reason?: unknown }>;\n };\n const documents = payload.documents ?? {};\n const versions: Record<string, string> = {};\n const fallbacks: Record<string, string> = {};\n const bodies: Record<string, string | undefined> = {};\n for (const key of [DOC_KEY, AGENT_NOTE_KEY]) {\n const entry = documents[key];\n const problem = usableBodyProblem(key, entry);\n if (problem) {\n // 서버가 이유를 말해 줬으면 그것을 쓰고, 아니면 우리가 본 것을 쓴다.\n fallbacks[key] = typeof entry?.reason === \"string\" && entry.reason ? entry.reason : problem;\n continue;\n }\n bodies[key] = entry!.body as string;\n if (typeof entry?.version === \"string\") {\n versions[key] = entry.version;\n }\n }\n return { doc: bodies[DOC_KEY], agentNote: bodies[AGENT_NOTE_KEY], versions, fallbacks };\n } catch (error) {\n return {\n versions: {},\n fallbacks: {},\n unavailableReason: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * 이 응답 조각을 저장소에 «써도 되는가». 쓰면 안 되는 이유가 있으면 그 이유를 돌려준다.\n *\n * <p>★서버가 200 을 줬다는 것은 «전송이 됐다»는 뜻이지 «쓸 수 있는 글»이라는 뜻이 아니다.\n * 예전엔 본문이 비어 있지만 않으면 그대로 파일에 썼다 — 변수가 빠진 DOC 이나 관리 마커가\n * 없는 AGENT_NOTE 가 사용자 저장소에 들어갔고, 마커가 없으면 재실행마다 덧붙고 undo 도\n * 못 걷어낸다(2026-09-23 독립 재리뷰 I1).\n */\nfunction usableBodyProblem(key: string, entry: { body?: unknown } | undefined): string | undefined {\n if (typeof entry?.body !== \"string\" || !entry.body.trim()) {\n return `server returned no body for ${key}`;\n }\n return documentContractProblem(key, entry.body);\n}\n","import { createInterface, type Interface } from \"node:readline\";\n\n/**\n * 사람에게 묻는 창구. init 은 이 인터페이스만 알고, 시험은 답을 주입한다(설계 §7).\n *\n * <p>★번호로만 고른다. 화살표 메뉴(raw 모드)를 쓰지 않는 이유: raw 모드에서는 readline 이 Ctrl+C 를\n * 가로채 «멈추지 않는다». cooked 모드면 Ctrl+C 는 OS 가 보내는 SIGINT 로 그대로 끝난다(설계 §4-2).\n */\nexport interface Prompter {\n /** 번호로 하나를 고르게 한다. {@code defaultIndex} 가 없으면 빈 입력은 다시 묻는다. */\n choose<T>(question: string, choices: ReadonlyArray<Choice<T>>, defaultIndex?: number): Promise<T>;\n /** 글 한 줄. 빈 입력이면 기본값. */\n text(question: string, defaultValue: string): Promise<string>;\n close(): void;\n}\n\nexport interface Choice<T> {\n label: string;\n value: T;\n}\n\n/** 질문 중에 입력이 끝났다(EOF, Ctrl+D). init 은 저장소 파일을 쓰지 않고 130 으로 끝낸다. */\nexport class PromptCancelled extends Error {\n constructor() {\n // ★«아무것도 안 썼다»가 아니다 — 질문 전에 끝낸 로그인은 토큰 저장소에 남는다(0.4.1 최종 리뷰 P2).\n super(\"Cancelled — no repository files were written. A sign-in you already completed stays saved.\");\n this.name = \"PromptCancelled\";\n }\n}\n\n/**\n * ★에이전트·CI 가 실행했다는 표지 — TTY 여도 묻지 않는다. <b>확인된 것만</b> 둔다(추측 금지).\n *\n * <p>일부 에이전트는 명령을 pty 에서 돌려 stdin·stdout 이 TTY 로 보인다(설계 §5 «알려진 한계»). 그러면\n * 첫 질문에서 명령이 멈추고, 더 나쁘게는 에이전트가 답을 «쳐서» 역할을 고를 수 있다. 그 길을 닫는다.\n * <ul>\n * <li>{@code CLAUDECODE} — Claude Code 의 셸 도구 환경에 있다(2026-09-29 이 세션의 Bash 도구에서 실측).</li>\n * <li>{@code CI} — CI 의 관례적 표지.</li>\n * <li>{@code GEMINI_CLI} — Gemini CLI 문서: run_shell_command 는 하위 프로세스에 {@code GEMINI_CLI=1} 을 둔다\n * (docs/tools/shell.md).</li>\n * <li>{@code CODEX_SANDBOX} — Codex 가 샌드박스로 돌리는 명령에 둔다({@code codex sandbox -- env} 로 실측,\n * codex-cli 0.153.4). ⚠샌드박스 없이(권한 상승·full access) 돌린 명령에 둔다는 표지는 확인하지 못했다.</li>\n * <li>{@code CURSOR_AGENT} — Cursor 문서(cursor.com/docs/agent/terminal): 에이전트 터미널 감지용.</li>\n * </ul>\n */\nexport const AGENT_ENV_MARKERS = [\"CLAUDECODE\", \"CI\", \"GEMINI_CLI\", \"CODEX_SANDBOX\", \"CURSOR_AGENT\"] as const;\n\n/** 이 환경에 에이전트·CI 표지가 있는가. 빈 값·\"0\"·\"false\" 는 없는 것으로 본다. */\nexport function agentEnvironment(env: NodeJS.ProcessEnv = process.env): string | undefined {\n return AGENT_ENV_MARKERS.find((name) => {\n const value = env[name]?.trim().toLowerCase();\n return value !== undefined && value !== \"\" && value !== \"0\" && value !== \"false\";\n });\n}\n\n/**\n * ★대화형 판정의 유일한 자리(설계 §5): stdin·stdout 이 둘 다 TTY 이고 {@code --json} 이 아니며,\n * 에이전트·CI 표지({@link AGENT_ENV_MARKERS})가 없을 때만. 아니면 묻지 않고, 빠진 값을 말하고 멈춘다.\n */\nexport function isInteractive(\n io: { stdin?: { isTTY?: boolean }; stdout?: { isTTY?: boolean } },\n json: boolean,\n env: NodeJS.ProcessEnv = process.env,\n): boolean {\n return io.stdin?.isTTY === true && io.stdout?.isTTY === true && !json && agentEnvironment(env) === undefined;\n}\n\n/**\n * readline 으로 묻는다. ★init 한 번에 인터페이스 «하나», 줄 반복자 «하나»다 — 질문마다 새로 만들면\n * 파이프 입력에서 첫 인터페이스가 다음 줄들까지 버퍼로 먹고 닫혀 두 번째 질문이 답을 잃는다(설계 §7).\n * 질문은 stderr 에 쓴다 — stdout 은 결과 전용이다.\n */\nexport function createReadlinePrompter(io: { stdin: NodeJS.ReadableStream; stderr: NodeJS.WritableStream }): Prompter {\n let rl: Interface | undefined;\n let lines: AsyncIterator<string> | undefined;\n\n const readLine = async (prompt: string): Promise<string> => {\n io.stderr.write(prompt);\n if (!rl) {\n rl = createInterface({ input: io.stdin, terminal: false });\n lines = rl[Symbol.asyncIterator]();\n }\n const next = await lines!.next();\n if (next.done) {\n io.stderr.write(\"\\n\");\n throw new PromptCancelled();\n }\n return next.value;\n };\n\n return {\n choose: <T>(question: string, choices: ReadonlyArray<Choice<T>>, defaultIndex?: number) =>\n chooseWith(readLine, (text) => io.stderr.write(text), question, choices, defaultIndex),\n text: async (question, defaultValue) => {\n const answer = (await readLine(`${question} [${defaultValue}]: `)).trim();\n return answer || defaultValue;\n },\n close: () => {\n rl?.close();\n },\n };\n}\n\n/**\n * 번호 선택의 규칙 — 입력을 어떻게 읽든 같다. {@code defaultIndex} 는 0부터.\n * 빈 입력: 기본값이 있으면 그것, 없으면 다시 묻는다. 범위 밖·숫자 아님: 다시 묻는다.\n */\nexport async function chooseWith<T>(\n readLine: (prompt: string) => Promise<string>,\n write: (text: string) => void,\n question: string,\n choices: ReadonlyArray<Choice<T>>,\n defaultIndex?: number,\n): Promise<T> {\n if (choices.length === 0) {\n throw new Error(`Nothing to choose for: ${question}`);\n }\n write(`${question}\\n`);\n choices.forEach((choice, index) => write(` [${index + 1}] ${choice.label}\\n`));\n const hint = defaultIndex === undefined ? \"\" : ` [${defaultIndex + 1}]`;\n for (;;) {\n const answer = (await readLine(`Enter a number (1-${choices.length})${hint}: `)).trim();\n if (answer === \"\" && defaultIndex !== undefined) {\n return choices[defaultIndex]!.value;\n }\n const picked = /^\\d+$/.test(answer) ? Number(answer) : NaN;\n if (picked >= 1 && picked <= choices.length) {\n return choices[picked - 1]!.value;\n }\n write(answer === \"\"\n ? \"Please choose one — there is no default here.\\n\"\n : `\"${answer}\" is not one of the numbers above.\\n`);\n }\n}\n","import { FileTokenStore } from \"../../core/auth/tokenStore\";\nimport { OAuthClient } from \"../../core/auth/oauth\";\nimport { resolveEndpoint, assertEnv, type AinectoEnv } from \"../../core/config/endpoints\";\nimport { parsePayloadSource } from \"../../core/input/payloadSource\";\nimport { McpRpcClient, isToolError } from \"../../core/mcp/rpcClient\";\nimport { renderError, renderSuccess } from \"../../core/output/render\";\nimport { getGeneratedTools, loadLiveTools } from \"../../core/catalog\";\nimport type { GeneratedToolDefinition } from \"../../core/catalog/types\";\nimport { runConnector } from \"../mcp/connector\";\nimport { executeGeneratedCommand, matchGeneratedCommand } from \"./generatedCommandRouter\";\nimport { executeAttachmentsUploadCommand, isAttachmentsUploadCommand } from \"./attachmentsUploadCommand\";\nimport { executeInitCommand } from \"./initCommand\";\nimport { createReadlinePrompter, isInteractive } from \"./prompter\";\nimport { CLI_VERSION, PACKAGE_NAME } from \"../../core/version\";\nimport { assertRole, resolveRole, ROLE_ENV_VAR, type HarnessRole, type ResolvedRole } from \"../../core/harness/role\";\nimport { askTheUserToFixRole, findRepositoryRole } from \"../../core/harness/repositoryRole\";\n\nexport interface CliIO {\n stdout: NodeJS.WriteStream;\n stderr: NodeJS.WriteStream;\n stdin: NodeJS.ReadStream;\n}\n\nexport async function runAinectoCli(argv: string[], io: CliIO): Promise<number> {\n let parsed: GlobalArgs = { json: argv.includes(\"--json\"), help: false, version: false, positionals: [] };\n try {\n parsed = parseGlobalArgs(argv);\n // ★에이전트는 설치 직후 버전부터 확인한다 — «Unknown command»로 답하면 도움말까지 못 간다(2026-09-29, Codex).\n if (parsed.version || parsed.positionals[0] === \"version\") {\n io.stdout.write(renderSuccess({ version: CLI_VERSION }, { json: parsed.json }));\n return 0;\n }\n if (parsed.help || parsed.positionals.length === 0) {\n io.stdout.write(helpText());\n return 0;\n }\n\n const resolved = resolveEndpoint({ env: parsed.env, endpoint: parsed.endpoint });\n // 플래그·환경변수로 «명시한» 역할. ★auth 는 이것을 읽지 않는다 — 잘못된 AINECTO_ROLE 이 로그인을\n // 막지 않게(0.4.2 리뷰 P2). 저장소 역할과의 판정은 아래 한 곳에서 한다.\n const explicitRole = () => resolveRole({ role: parsed.role });\n const tokenStore = new FileTokenStore();\n /**\n * 인증·RPC 클라이언트. ★토큰은 서버마다 한 칸이고(역할 없음), 역할은 RPC 헤더로만 실린다\n * (설계 0.4.2 §2-3·§2-4). init 은 역할을 «물어서» 정할 수 있으므로 역할이 정해진 뒤 이것을 부른다.\n */\n const connect = (role: HarnessRole | null) => {\n const auth = new OAuthClient({\n endpoint: resolved.endpoint,\n tokenStore,\n // ★init --dry-run 은 토큰을 갱신하지도 않는다 — 「아무것도 바꾸지 않는다」에 로그인 상태도 든다.\n // (init 의 플래그는 positional 로 흘러온다.)\n readOnly: parsed.positionals[0] === \"init\" && parsed.positionals.includes(\"--dry-run\"),\n // ★URL 을 «브라우저를 열기 전에» 알린다. stdout 은 결과 전용이라 stderr 에 쓴다.\n // --json 이면 JSON 한 줄이다(설계 §21-3 (가)). 로그인이 역할과 무관해져 role 칸은 없다(0.4.2 §2-5).\n onAuthorizeUrl: (url) => {\n io.stderr.write(parsed.json\n ? `${JSON.stringify({ event: \"login_url\", url })}\\n`\n : `Opening your browser to sign in to AiNecto. If it does not open, visit:\\n ${url}\\n`);\n },\n });\n const client = new McpRpcClient({ endpoint: resolved.endpoint, tokenProvider: auth, role });\n return { auth, client };\n };\n const [domain, action, ...rest] = parsed.positionals;\n\n if (domain === \"mcp\") {\n await runConnector({\n endpoint: resolved.endpoint,\n // 브리지의 역할은 인자·환경변수에서만 온다 — bin/mcp.ts 와 같은 규칙. 저장소를 적용하지 않는다.\n role: explicitRole().role ?? null,\n input: io.stdin,\n output: io.stdout,\n errorOutput: io.stderr,\n });\n return 0;\n }\n\n if (domain === \"init\") {\n // ⚠init 의 플래그(--role 등)는 전역 파서가 positional 로 흘려보낸다. 그대로 넘긴다.\n return await executeInitCommand({\n argv: parsed.positionals.slice(1),\n role: explicitRole().role,\n connect: (role) => {\n const { auth, client } = connect(role);\n return {\n client,\n // 문서는 인증 후에 받는다 — 토큰이 없으면 패키지 기본값으로 가고, 그 사실을 보고한다.\n // ★«필요할 때» 가져온다. --undo 는 로컬 작업이라 토큰을 건드릴 이유가 없다(S1) — undo 는\n // connect 자체를 부르지 않는다.\n // ★갱신 실패는 «토큰 없음»(→ 로그인)이지만, AINECTO_TOKEN 을 못 쓰는 주소라는 거절은 삼키지 않는다 —\n // 삼키면 그 설정 오류가 브라우저 로그인으로 둔갑한다.\n accessToken: async () => {\n try {\n return await auth.getAccessToken();\n } catch (error) {\n if (process.env.AINECTO_TOKEN) {\n throw error;\n }\n return undefined;\n }\n },\n // 로그인한다 — `ainecto auth login` 과 같은 함수다. 서버마다 한 번이다(0.4.2).\n login: async () => {\n await auth.login();\n },\n };\n },\n // ★대화형일 때만 묻는다(판정은 isInteractive 한 곳). 에이전트·CI 는 TTY 가 아니다.\n prompter: isInteractive(io, parsed.json) ? createReadlinePrompter(io) : undefined,\n endpoint: resolved.endpoint,\n env: resolved.env,\n cliVersion: `${PACKAGE_NAME} ${CLI_VERSION}`,\n cwd: process.cwd(),\n json: parsed.json,\n io,\n });\n }\n\n if (domain === \"auth\") {\n // 로그인은 서버마다 한 번이다 — 역할과 무관하다. 옛 문서를 따라 친 --role 은 알리고 넘어간다.\n if (parsed.role !== undefined) {\n io.stderr.write(\"Sign-in is one per machine; --role is not used by auth.\\n\");\n }\n // ★await 를 빼면 이 try 가 실패를 «못 본다» — 거부 사유가 renderError 를 지나치고\n // 날것의 스택 트레이스로 나간다(2026-09-23 실물 실행에서 발견).\n return await handleAuth(action, connect(null).auth, resolved.endpoint, parsed.json, io);\n }\n\n const env = parsed.env ?? \"prod\";\n // ★카탈로그는 서버의 지금 목록이다. 역할 판정이 실패해도(깨진 저장소) 막지 않고 스냅샷으로 답한다\n // (0.4.2 리뷰 P2 — 깨진 저장소 안에서도 카탈로그를 볼 수 있다).\n if (domain === \"tools\" && action === \"catalog\") {\n return await printCatalog(parsed, io, resolved.endpoint, async () => {\n const explicit = explicitRole();\n return connect(await commandRole(explicit, process.cwd())).client;\n });\n }\n // 스냅샷에 없는 명령은 서버의 지금 목록에서 찾는다 — 서버에 새로 열린 도구를 CLI 재배포 없이 쓴다.\n // ★역할 없이 묻는다: 모르는 명령은 «역할을 못 읽음»이 아니라 «모르는 명령»으로 답해야 한다(0.4.2 리뷰 P2).\n // 역할은 아래 실제 호출에 실리고, 강제는 서버가 한다.\n let routeTools: readonly GeneratedToolDefinition[] = getGeneratedTools(env);\n let remote = isAttachmentsUploadCommand(domain, action)\n || (domain === \"tools\" && (action === \"list\" || action === \"call\"))\n || matchGeneratedCommand(routeTools, parsed.positionals) !== undefined;\n if (!remote) {\n const live = await loadLiveTools(env, connect(null).client).catch(() => undefined);\n if (live && matchGeneratedCommand(live, parsed.positionals)) {\n routeTools = live;\n remote = true;\n }\n }\n if (!remote) {\n throw new Error(domain === \"tools\"\n ? \"Expected tools list, tools call <mcpName>, or tools catalog.\"\n : `Unknown command \"${domain}\".`);\n }\n\n // ★여기부터 원격을 부르는 명령은 «저장소 역할»로 간다(설계 0.4.2 §2-2). mcp·init·auth 는 위에서\n // 끝났다 — 역할이 어긋난 저장소 안에서도 로그인·브리지·init 은 막히지 않는다.\n const explicit = explicitRole();\n const { client } = connect(await commandRole(explicit, process.cwd()));\n\n if (isAttachmentsUploadCommand(domain, action)) {\n return await executeAttachmentsUploadCommand({\n argv: rest,\n client,\n json: parsed.json,\n io,\n });\n }\n\n const generatedResult = await executeGeneratedCommand({\n tools: routeTools,\n argv: parsed.positionals,\n client,\n json: parsed.json,\n io,\n });\n if (generatedResult !== 2) {\n return generatedResult;\n }\n\n if (domain === \"tools\") {\n // ★위와 같은 이유로 await 가 필요하다. 이쪽이 실제로 스택을 뱉고 있었다.\n return await handleTools(action, rest, parsed, client, io);\n }\n\n throw new Error(`Unknown command \"${domain}\".`);\n } catch (error) {\n io.stderr.write(renderError(error, { json: parsed.json }));\n return 1;\n }\n}\n\n/**\n * ★셸 명령의 역할 — 한 곳(설계 0.4.2 §2-2).\n *\n * <p>저장소(cwd 에서 위로, 우리 브리지 항목이 있는 첫 폴더)에 역할 R 이 있으면 R 로 간다. 명시한 역할이 R 과\n * 다르면 거절한다 — 역할을 바꾸는 길은 `ainecto init --role` 하나이고 사용자가 고른다. 저장소를 못\n * 읽으면(어긋남·읽기 문제) 멈추고 사용자에게 물으라고 한다 — 모르는 채로 «제한 없음»으로 가지 않는다.\n * 저장소 밖이면 명시한 역할(없으면 역할 없음 = 제한 없음, 현행).\n */\nexport async function commandRole(explicit: ResolvedRole, cwd: string): Promise<HarnessRole | null> {\n const explicitRole = explicit.role ?? null;\n const found = await findRepositoryRole(cwd);\n if (found.kind === \"conflict\") {\n throw new Error(await askTheUserToFixRole(found.dir, found.reason));\n }\n if (found.kind === \"none\") {\n return explicitRole;\n }\n if (explicitRole !== null && explicitRole !== found.role) {\n const given = explicit.source === \"env\" ? `${ROLE_ENV_VAR}=${explicitRole}` : `--role ${explicitRole}`;\n throw new Error(\n `This repository's AI sessions have the role ${found.role} (set in ${found.dir}). `\n + `${given} does not match — the role changes only with \\`ainecto init --role <role>\\`, after asking the user.`,\n );\n }\n return found.role;\n}\n\nasync function handleAuth(\n action: string | undefined,\n auth: OAuthClient,\n endpoint: string,\n json: boolean,\n io: CliIO,\n): Promise<number> {\n if (action === \"login\") {\n await auth.login();\n io.stdout.write(renderSuccess({ ...await nextStep(), endpoint, authenticated: true }, { json }));\n return 0;\n }\n if (action === \"status\") {\n const token = await auth.getAccessToken();\n io.stdout.write(renderSuccess({ ...await nextStep(), endpoint, authenticated: Boolean(token) }, { json }));\n return 0;\n }\n if (action === \"logout\") {\n await auth.logout();\n io.stdout.write(renderSuccess({ endpoint, authenticated: false }, { json }));\n return 0;\n }\n throw new Error(\"Expected auth login, auth status, or auth logout.\");\n}\n\n/**\n * `tools catalog` — ★서버의 지금 목록을 먼저 보여 준다. 스냅샷만 보여 주면 서버에 열린 새 문서 유형(html)을\n * 에이전트가 «CLI 에 없다»고 읽었다(2026-10-10). 못 받으면(로그인 전·오프라인·깨진 저장소) 스냅샷으로\n * 답하되 «낡았을 수 있다»와 그 이유를 같이 싣는다 — 조용히 대체하지 않는다.\n */\nasync function printCatalog(\n parsed: GlobalArgs,\n io: CliIO,\n endpoint: string,\n liveClient: () => Promise<McpRpcClient>,\n): Promise<number> {\n const catalogEnv = parsed.env ?? \"prod\";\n try {\n const tools = await loadLiveTools(catalogEnv, await liveClient());\n io.stdout.write(renderSuccess(tools, { json: parsed.json }));\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n io.stdout.write(renderSuccess(getGeneratedTools(catalogEnv), {\n json: parsed.json,\n warnings: [`Could not read the live tool list from ${endpoint} (${reason}). `\n + `Showing the ${catalogEnv} catalog checked in when this CLI version was built — a snapshot of that `\n + \"server's tools/list that may miss newer document types and tools. Run `ainecto auth login`, then retry.\"],\n }));\n }\n return 0;\n}\n\nasync function handleTools(\n action: string | undefined,\n rest: string[],\n parsed: GlobalArgs,\n client: McpRpcClient,\n io: CliIO,\n): Promise<number> {\n if (action === \"list\") {\n const tools = await client.toolsList();\n io.stdout.write(renderSuccess(tools, { json: parsed.json }));\n return 0;\n }\n\n if (action === \"call\") {\n const toolName = rest[0];\n if (!toolName) {\n throw new Error(\"Expected MCP tool name after tools call.\");\n }\n const toolArgs = rest.slice(1);\n const payloadOptions = parsePayloadArgs(toolArgs);\n const payload = await parsePayloadSource({\n file: payloadOptions.file,\n inline: payloadOptions.inline,\n stdin: io.stdin,\n });\n const result = await client.toolsCall(toolName, payload.value);\n io.stdout.write(renderSuccess(result, { json: parsed.json, warnings: payload.warnings }));\n // 거부 문구는 그대로 보여 주되, 종료 코드로는 «실패»라고 말한다.\n return isToolError(result) ? 1 : 0;\n }\n\n throw new Error(\"Expected tools list, tools call <mcpName>, or tools catalog.\");\n}\n\ninterface GlobalArgs {\n env?: AinectoEnv;\n endpoint?: string;\n role?: HarnessRole;\n json: boolean;\n help: boolean;\n version: boolean;\n positionals: string[];\n}\n\nfunction parseGlobalArgs(argv: string[]): GlobalArgs {\n const result: GlobalArgs = { json: false, help: false, version: false, positionals: [] };\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (!arg) {\n continue;\n }\n if (arg === \"--env\") {\n result.env = assertEnv(requireValue(arg, argv[++index]));\n } else if (arg === \"--endpoint\") {\n result.endpoint = requireValue(arg, argv[++index]);\n } else if (arg === \"--role\") {\n // ★전역 플래그다. 브리지·도구 호출·로그인·init 이 모두 같은 역할을 본다.\n result.role = assertRole(requireValue(arg, argv[++index]));\n } else if (arg === \"--json\") {\n result.json = true;\n } else if (arg === \"--help\" || arg === \"-h\") {\n result.help = true;\n } else if (arg === \"--version\" || arg === \"-v\" || arg === \"-V\") {\n result.version = true;\n } else {\n result.positionals.push(arg);\n }\n }\n return result;\n}\n\nfunction parsePayloadArgs(argv: string[]): { file?: string; inline?: string } {\n const result: { file?: string; inline?: string } = {};\n const inline: string[] = [];\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index];\n if (!arg) {\n continue;\n }\n if (arg === \"--file\" || arg === \"-f\") {\n result.file = requireValue(arg, argv[++index]);\n } else {\n inline.push(arg);\n }\n }\n if (inline.length > 0) {\n result.inline = inline.join(\" \");\n }\n return result;\n}\n\nfunction requireValue(flag: string, value: string | undefined): string {\n if (!value || value.startsWith(\"--\")) {\n throw new Error(`${flag} requires a value.`);\n }\n return value;\n}\n\n/**\n * ★로그인은 설치의 끝이 아니다. 에이전트가 `auth status --json` 의 authenticated:true 를 보고 «설치 완료»로\n * 닫은 실측(2026-09-29, Codex)이 있다. 이 저장소에 역할이 없으면 결과에 다음 단계를 싣는다 — --json 에도.\n */\nasync function nextStep(): Promise<{ setup?: \"incomplete\"; next?: string }> {\n const found = await findRepositoryRole(process.cwd());\n return found.kind === \"none\" ? { setup: \"incomplete\", next: NEXT_STEP_INIT } : {};\n}\n\n/** 설치·로그인 뒤 «다음에 할 일». 도움말과 auth 결과가 같은 문장을 쓴다. */\n// ★«참고»로 읽히면 넘긴다 — Codex 가 `next` 를 받고도 «업데이트 완료»만 말했다(2026-09-30 실측).\n// 그래서 «사용자가 설치·업데이트·로그인만 부탁했어도 지금 알려라»를 지시문으로 적는다.\nconst NEXT_STEP_INIT = [\n \"AiNecto setup is not finished until `npx -y ainecto@latest init` runs in the repository.\",\n \"AI agents: tell the user this now, even if they only asked to install, update, or sign in. Then ask\",\n \"which role this repository's AI sessions should have — Design, Development, Test, or Validation —\",\n \"never pick one yourself, and run `npx -y ainecto@latest init --role <role>` from the repository root.\",\n \"In a terminal: `npx -y ainecto@latest init` asks for the role and the project.\",\n].join(\"\\n\");\n\nfunction helpText(): string {\n return [\n \"AiNecto CLI\",\n \"\",\n NEXT_STEP_INIT,\n \"\",\n \"Usage:\",\n \" ainecto auth login|status|logout [--env prod|dev] [--json] (one sign-in per machine)\",\n \" ainecto tools list [--env prod|dev] [--endpoint URL] [--json]\",\n \" ainecto tools call <mcpName> [-f payload.json|@-] [inline-json] [--json]\",\n \" ainecto attachments upload --document-uuid <uuid> <file...> [--json]\",\n \" ainecto <generated-command> [flags] [-f payload.json] [--yes] [--json]\",\n \" ainecto mcp [--env prod|dev] [--endpoint URL] [--role design|development|test|validation]\",\n \"\",\n \"Harness:\",\n \" ainecto init [--role <design|development|test|validation>] [--project <uuid>] [--dry-run]\",\n \" In a terminal, asks for the role and project when they are not given.\",\n \" ainecto init --undo\",\n \"\",\n ].join(\"\\n\");\n}\n","#!/usr/bin/env node\nimport { runAinectoCli } from \"../adapters/cli/ainectoCli\";\n\nconst exitCode = await runAinectoCli(process.argv.slice(2), {\n stdin: process.stdin,\n stdout: process.stdout,\n stderr: process.stderr,\n});\n\nprocess.exitCode = exitCode;\n"],"mappings":"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","names":["createHash","createHash","resolve","readFile","isRecord","generatedTools","createHash","isRecord","isRecord","generatedTools","isRecord","isRecord","isRecord","createInterface","createInterface","readFile","stat","isRecord","requireValue","chmod","mkdir","rename","rm","stat","writeFile","dirname","join","resolve","sep","basename","isRecord","basename","hit","stableStringify","createHash","readFile","homedir","dirname","join","homedir","dirname","join","isNodeError","readFile","stableStringify","createHash","DOC_KEY","AGENT_NOTE_KEY","createInterface","resolve","plan","previousRole","isRecord","rm","join","dirname","mkdir","writeFile","chmod","rename","sep","stat","requireValue","client","explicit","requireValue"]}
|