@siteoshq/cli 1.6.0 → 1.8.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 +40 -1
- package/dist/cli.js +691 -181
- package/dist/cli.js.map +1 -1
- package/package.json +20 -21
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/services/cookie-verification.ts","../src/health-check.ts","../src/projects/project-context.ts","../src/siteos-service-grant.ts","../src/siteos-auth-api.ts","../src/siteos-auth-state.ts","../src/siteos-config.ts","../src/auth/adapters/siteos-service-grant-provider.ts","../src/core/adapters/node-project-binding-store.ts","../src/core/ports/project-binding-store.ts","../src/core/adapters/node-json-document-store.ts","../src/core/adapters/node-repository-root.ts","../src/projects/project-api.ts","../src/forms/project-reference.ts","../src/pulse/config.ts","../src/pulse/errors.ts","../src/search/project-reference.ts","../src/auth-command.ts","../src/core/command-registry.ts","../src/core/command-result.ts","../src/forms-command.ts","../src/siteos-forms-api.ts","../src/siteos-forms-credential.ts","../src/environment-slug.ts","../src/package-metadata.ts","../src/pulse-command.ts","../src/core/errors.ts","../src/pulse/api-client.ts","../src/pulse/binding-migration.ts","../src/pulse/constants.ts","../src/pulse/bundle.ts","../src/pulse/project-files.ts","../src/pulse/init.ts","../src/pulse/sync.ts","../src/pulse/interactive/discovery.ts","../src/pulse/interactive/playwright-config.ts","../src/pulse/sync-plan.ts","../src/pulse/test-imports.ts","../src/pulse/interactive/prompt.ts","../src/pulse/interactive/sync.ts","../src/pulse/playwright.ts","../src/pulse/package-manager.ts","../src/pulse/validate.ts","../src/search-command.ts","../src/siteos-search-api.ts","../src/siteos-search-credential.ts","../src/projects/project-command.ts","../src/services/service-command.ts","../src/services/seo-command.ts","../src/services/seo-performance-command.ts","../src/cli.ts"],"sourcesContent":["import { z } from \"zod\";\nimport type { Browser, Page } from \"playwright\";\n\nconst Names = z.object({\n exact: z.array(z.string()),\n prefixes: z.array(z.string()),\n});\nconst Service = z.object({\n key: z.string(),\n purposeKey: z.string(),\n lifecycle: z\n .object({\n scriptOrigins: z.array(z.string()),\n iframeOrigins: z.array(z.string()),\n pixelOrigins: z.array(z.string()),\n firstPartyCookies: Names,\n localStorage: Names,\n })\n .optional(),\n});\nconst Envelope = z.object({\n publicKey: z.string(),\n revision: z.number(),\n ruleKey: z.string(),\n profileKey: z.string(),\n trustedSignals: z\n .object({\n region: z\n .object({\n countryCode: z.string().nullable(),\n subdivisionCode: z.string().nullable(),\n })\n .optional(),\n })\n .optional(),\n config: z.object({\n services: z.array(Service),\n categories: z.array(z.object({ key: z.string(), required: z.boolean() })),\n integrations: z.object({ googleConsentMode: z.string() }),\n }),\n});\nconst State = z.object({\n runtimeVersion: z.string(),\n preview: z.boolean(),\n resolved: z\n .object({\n publicKey: z.string(),\n revision: z.number(),\n ruleKey: z.string(),\n profileKey: z.string(),\n })\n .nullable(),\n consent: z.object({\n categories: z.array(z.string()),\n decision: z.string(),\n globalPrivacyControl: z.boolean(),\n privacyChoices: z.object({\n saleOrShareOptOut: z.boolean(),\n targetedAdvertisingOptOut: z.boolean(),\n }),\n }),\n services: z.array(\n z.object({\n key: z.string(),\n allowed: z.boolean(),\n footprintPresent: z.boolean(),\n }),\n ),\n});\nexport const VerificationInstallation = z.object({\n publicKey: z.string(),\n currentPublishedRevision: z.number().int().positive(),\n delivery: z.object({\n runtimeUrl: z.string().url(),\n configUrl: z.string().url(),\n analyticsUrl: z.string().url().nullable(),\n receiptsUrl: z.string().url(),\n handshakeUrl: z.string().url(),\n }),\n});\ntype Installation = z.infer<typeof VerificationInstallation>;\ntype Issue = { code: string; scenario: string; detail: string };\ntype RequestEvidence = { origin: string; type: string; scenario: string };\ntype Observation = {\n scenario: string;\n state: z.infer<typeof State>;\n cookies: string[];\n localStorage: string[];\n};\n\nexport function verificationTarget(\n websiteUrl: string,\n candidate?: string,\n): string {\n const website = new URL(websiteUrl);\n const target = new URL(candidate ?? websiteUrl, website);\n if (\n target.origin !== website.origin ||\n target.username ||\n target.password ||\n target.hash ||\n ![\"https:\", \"http:\"].includes(target.protocol)\n )\n throw new Error(\n \"Verify a URL on the selected Project environment's origin, without credentials or fragments.\",\n );\n return target.toString();\n}\nfunction matchesName(\n value: string,\n names: z.infer<typeof Names> | undefined,\n): boolean {\n return Boolean(\n names &&\n (names.exact.includes(value) ||\n names.prefixes.some((prefix) => value.startsWith(prefix))),\n );\n}\n\nexport function assessCookieObservations(input: {\n envelope: z.infer<typeof Envelope>;\n observations: Observation[];\n requests: RequestEvidence[];\n firstPartyOrigin: string;\n deliveryOrigins: string[];\n}) {\n const issues: Issue[] = [];\n const unknownOrigins = new Set<string>();\n const unknownStorage = new Set<string>();\n const services = input.envelope.config.services;\n for (const request of input.requests) {\n const matches = services.filter(\n (service) =>\n service.lifecycle &&\n [\n ...service.lifecycle.scriptOrigins,\n ...service.lifecycle.iframeOrigins,\n ...service.lifecycle.pixelOrigins,\n ].some((url) => new URL(url).origin === request.origin),\n );\n const state = input.observations.find(\n (item) => item.scenario === request.scenario,\n )?.state;\n if (matches.length) {\n const allowed = matches.some(\n (service) =>\n state?.services.find((item) => item.key === service.key)?.allowed,\n );\n const advancedGoogle =\n input.envelope.config.integrations.googleConsentMode === \"advanced\" &&\n matches.every((service) =>\n [\"google-analytics\", \"google-ads\"].includes(service.key),\n );\n if (!allowed && !advancedGoogle)\n issues.push({\n code: \"request_without_permission\",\n scenario: request.scenario,\n detail: request.origin,\n });\n } else if (\n request.origin !== input.firstPartyOrigin &&\n !input.deliveryOrigins.includes(request.origin)\n )\n unknownOrigins.add(request.origin);\n }\n for (const observation of input.observations) {\n for (const service of services) {\n const allowed = observation.state.services.find(\n (item) => item.key === service.key,\n )?.allowed;\n const stored =\n observation.cookies.some((name) =>\n matchesName(name, service.lifecycle?.firstPartyCookies),\n ) ||\n observation.localStorage.some((name) =>\n matchesName(name, service.lifecycle?.localStorage),\n );\n if (!allowed && stored)\n issues.push({\n code: \"storage_without_permission\",\n scenario: observation.scenario,\n detail: service.key,\n });\n }\n for (const name of observation.cookies) {\n if (\n name !== \"siteos_consent\" &&\n !services.some((service) =>\n matchesName(name, service.lifecycle?.firstPartyCookies),\n )\n )\n unknownStorage.add(`cookie:${name}`);\n }\n for (const name of observation.localStorage) {\n if (\n !name.startsWith(\"siteos-cookie:\") &&\n !services.some((service) =>\n matchesName(name, service.lifecycle?.localStorage),\n )\n )\n unknownStorage.add(`localStorage:${name}`);\n }\n }\n return {\n issues,\n unknownOrigins: [...unknownOrigins].sort(),\n unknownStorage: [...unknownStorage].sort(),\n };\n}\n\n/** Runs only in an isolated local browser. No authenticated browser state or raw payloads are exported. */\nexport async function verifyCookieWebsite(input: {\n installation: Installation;\n url: string;\n browserName: \"chromium\" | \"webkit\";\n launch?: () => Promise<Browser>;\n}) {\n const startedAt = new Date().toISOString();\n const issues: Issue[] = [];\n const requests: RequestEvidence[] = [];\n const observations: Observation[] = [];\n let envelope: z.infer<typeof Envelope> | null = null;\n let scenario = \"first-visit\";\n let overflow = false;\n const installation = input.installation;\n const browser = await (\n input.launch ??\n (async () => {\n const playwright = await import(\"playwright\");\n try {\n return await playwright[input.browserName].launch({ headless: true });\n } catch {\n throw new Error(\n `The ${input.browserName} browser is unavailable. Run npx playwright@1.61.1 install ${input.browserName}, then retry.`,\n );\n }\n })\n )();\n const readState = async (page: Page) =>\n State.parse(\n await page.evaluate(() =>\n (\n window as unknown as { SiteOSCookie: { getDebugState(): unknown } }\n ).SiteOSCookie.getDebugState(),\n ),\n );\n const waitForRuntime = async (page: Page) => {\n await page.waitForFunction(\n () =>\n Boolean(\n (\n window as unknown as {\n SiteOSCookie?: { getDebugState(): { resolved: unknown } };\n }\n ).SiteOSCookie?.getDebugState().resolved,\n ),\n undefined,\n { timeout: 15_000 },\n );\n };\n try {\n for (const gpc of [false, true]) {\n const context = await browser.newContext({\n serviceWorkers: \"block\",\n ...(gpc ? { extraHTTPHeaders: { \"Sec-GPC\": \"1\" } } : {}),\n });\n if (gpc)\n await context.addInitScript(() =>\n Object.defineProperty(navigator, \"globalPrivacyControl\", {\n get: () => true,\n }),\n );\n const page = await context.newPage();\n page.setDefaultTimeout(15_000);\n page.setDefaultNavigationTimeout(25_000);\n const pending = new Set<Promise<void>>();\n page.on(\"request\", (request) => {\n if (!/^https?:/u.test(request.url())) return;\n if (requests.length >= 2000) {\n overflow = true;\n return;\n }\n requests.push({\n origin: new URL(request.url()).origin,\n type: request.resourceType(),\n scenario,\n });\n });\n page.on(\"response\", (response) => {\n const expectedUrl = new URL(installation.delivery.configUrl);\n const responseUrl = new URL(response.url());\n if (\n responseUrl.origin !== expectedUrl.origin ||\n responseUrl.pathname !== expectedUrl.pathname\n )\n return;\n const responseScenario = scenario;\n const reading = (async () => {\n let timeout: ReturnType<typeof setTimeout> | undefined;\n try {\n const raw = await Promise.race([\n response.body(),\n new Promise<never>((_, reject) => {\n timeout = setTimeout(() => reject(new Error(\"timeout\")), 5000);\n }),\n ]);\n if (raw.byteLength > 512 * 1024) throw new Error(\"size\");\n const parsed = Envelope.parse(JSON.parse(raw.toString()));\n if (\n parsed.publicKey !== installation.publicKey ||\n parsed.revision !== installation.currentPublishedRevision\n )\n throw new Error(\"revision\");\n envelope = parsed;\n } catch {\n issues.push({\n code: \"configuration_mismatch\",\n scenario: responseScenario,\n detail:\n \"Configuration is unavailable, invalid, or differs from the published revision.\",\n });\n } finally {\n clearTimeout(timeout);\n }\n })();\n pending.add(reading);\n void reading.finally(() => pending.delete(reading));\n });\n scenario = gpc ? \"gpc-first-visit\" : \"first-visit\";\n try {\n await page.goto(input.url, { waitUntil: \"domcontentloaded\" });\n if (new URL(page.url()).origin !== new URL(input.url).origin)\n throw new Error(\"The website redirected to another origin.\");\n await waitForRuntime(page);\n await Promise.all([...pending]);\n const capture = async () => {\n // Fixed observation window: do not equate network-idle with complete tracking inventory.\n await page.waitForTimeout(1500);\n if (new URL(page.url()).origin !== new URL(input.url).origin)\n throw new Error(\"The website navigated to another origin.\");\n await waitForRuntime(page);\n const state = await readState(page);\n if (\n state.preview ||\n state.resolved?.publicKey !== installation.publicKey ||\n state.resolved?.revision !== installation.currentPublishedRevision\n )\n issues.push({\n code: \"runtime_mismatch\",\n scenario,\n detail:\n \"The loaded runtime is a preview or uses another publication.\",\n });\n if (Number(state.runtimeVersion.split(\".\")[0]) < 11)\n issues.push({\n code: \"runtime_outdated\",\n scenario,\n detail: state.runtimeVersion,\n });\n observations.push({\n scenario,\n state,\n cookies: [\n ...new Set(\n (await context.cookies()).map((cookie) => cookie.name),\n ),\n ].sort(),\n localStorage: await page.evaluate(() =>\n Object.keys(localStorage).sort(),\n ),\n });\n };\n await capture();\n if (gpc) {\n const state = observations.at(-1)!.state;\n if (\n !state.consent.globalPrivacyControl ||\n !state.consent.privacyChoices.saleOrShareOptOut ||\n !state.consent.privacyChoices.targetedAdvertisingOptOut\n )\n issues.push({\n code: \"gpc_not_applied\",\n scenario,\n detail: \"GPC must be visible and both privacy opt-outs applied.\",\n });\n } else {\n for (const action of [\n \"reject\",\n \"accept\",\n \"granular\",\n \"withdraw\",\n ] as const) {\n scenario = action;\n try {\n await page.evaluate(async (choice) => {\n const api = (\n window as unknown as {\n SiteOSCookie: {\n rejectAll(): Promise<void>;\n acceptAll(): Promise<void>;\n updateConsent(keys: string[]): Promise<void>;\n getConsent(): { categories: string[] };\n };\n }\n ).SiteOSCookie;\n if (choice === \"accept\") await api.acceptAll();\n else if (choice === \"granular\")\n await api.updateConsent(\n api\n .getConsent()\n .categories.filter((key) => key !== \"necessary\")\n .slice(0, 1),\n );\n else await api.rejectAll();\n }, action);\n } catch (error) {\n if (\n !(error instanceof Error) ||\n !/Execution context was destroyed/u.test(error.message)\n )\n throw error;\n }\n await capture();\n const state = observations.at(-1)!.state;\n if (\n (action === \"reject\" || action === \"withdraw\") &&\n state.consent.categories.some((key) => key !== \"necessary\")\n )\n issues.push({\n code: \"refusal_not_applied\",\n scenario,\n detail: \"Optional categories remain granted.\",\n });\n }\n scenario = \"returning-after-refusal\";\n await page.reload({ waitUntil: \"domcontentloaded\" });\n await capture();\n if (\n observations\n .at(-1)!\n .state.consent.categories.some((key) => key !== \"necessary\")\n )\n issues.push({\n code: \"refusal_not_persisted\",\n scenario,\n detail: \"Refusal was not preserved across reload.\",\n });\n }\n } catch {\n issues.push({\n code: \"scenario_incomplete\",\n scenario,\n detail:\n \"The page or Cookie runtime did not complete this scenario within the time limit.\",\n });\n } finally {\n await context.close();\n await Promise.all([...pending]);\n }\n }\n } finally {\n await browser.close();\n }\n const assessment = envelope\n ? assessCookieObservations({\n envelope,\n observations,\n requests,\n firstPartyOrigin: new URL(input.url).origin,\n deliveryOrigins: Object.values(installation.delivery)\n .filter((url): url is string => typeof url === \"string\")\n .map((url) => new URL(url).origin),\n })\n : { issues: [], unknownOrigins: [], unknownStorage: [] };\n issues.push(...assessment.issues);\n if (!envelope)\n issues.push({\n code: \"configuration_not_observed\",\n scenario: \"all\",\n detail: \"No matching public configuration response was observed.\",\n });\n if (overflow)\n issues.push({\n code: \"request_limit\",\n scenario: \"all\",\n detail: \"The request limit was reached; this run is incomplete.\",\n });\n const config = envelope as z.infer<typeof Envelope> | null;\n const status = issues.length\n ? \"failed\"\n : assessment.unknownOrigins.length ||\n assessment.unknownStorage.length ||\n config?.config.integrations.googleConsentMode === \"advanced\"\n ? \"needs-review\"\n : \"passed\";\n return {\n schemaVersion: 1,\n status,\n startedAt,\n completedAt: new Date().toISOString(),\n expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(),\n target: {\n origin: new URL(input.url).origin,\n path: new URL(input.url).pathname,\n },\n browser: input.browserName,\n publicKey: installation.publicKey,\n revision: installation.currentPublishedRevision,\n region: config?.trustedSignals?.region ?? null,\n issues: [\n ...new Map(\n issues.map((issue) => [JSON.stringify(issue), issue]),\n ).values(),\n ],\n unknownOrigins: assessment.unknownOrigins,\n unknownStorage: assessment.unknownStorage,\n observations,\n requestCounts: [\n ...new Set(requests.map((item) => `${item.scenario} ${item.origin}`)),\n ].map((key) => ({\n scenario: key.split(\" \")[0],\n origin: key.split(\" \")[1],\n count: requests.filter(\n (item) => `${item.scenario} ${item.origin}` === key,\n ).length,\n })),\n limits: [\n \"One route, fresh local browser, 1.5-second observation per scenario, at most 2000 requests.\",\n \"Consent actions use the public runtime API. Visual, keyboard and GTM Tag Assistant acceptance remain separate.\",\n \"Unknown origins/storage need classification. First-party or server-side tracking and delayed/interaction-only resources require a source audit.\",\n \"Geography is this browser's actual Edge location. Use regions resolve for simulations; do not spoof production geography.\",\n \"No cookie values, request query strings, bodies, credentials or visitor identifiers are included. A pass covers only the observed scope, not legal compliance.\",\n ],\n };\n}\n","import path from \"node:path\";\nimport { readLocalCommonProject } from \"./projects/project-context.js\";\nimport type { ProjectBindingStore } from \"./core/ports/project-binding-store.js\";\n\nimport {\n findRepositoryRoot,\n RepositoryRootError,\n} from \"./core/adapters/node-repository-root.js\";\nimport {\n FORMS_PROJECT_REFERENCE_RELATIVE_PATH,\n inspectFormsProjectReference,\n} from \"./forms/project-reference.js\";\nimport { CONFIG_FILE, loadChecksConfigSnapshot } from \"./pulse/config.js\";\nimport {\n inspectSearchProjectReference,\n SEARCH_PROJECT_REFERENCE_RELATIVE_PATH,\n} from \"./search/project-reference.js\";\nimport { resolveSiteOSConfigHome } from \"./siteos-config.js\";\n\ntype ProductProjectDiagnostic =\n | { path: string; slug: string; status: \"configured\"; version: number }\n | { error?: string; path: string; status: \"invalid\" | \"missing\" };\n\nexport type HealthCheckResult = {\n checks: {\n configHome: { path: string; status: \"ok\" };\n project:\n | { status: \"selected\"; id: string; slug: string }\n | { status: \"missing\" | \"invalid\" };\n productProjects: {\n forms: ProductProjectDiagnostic;\n pulse: ProductProjectDiagnostic;\n search: ProductProjectDiagnostic;\n };\n repository: { rootDir?: string; status: \"missing\" | \"ok\" };\n };\n package: { binary: \"siteos\"; name: string; version: string };\n status: \"needs-setup\" | \"ok\";\n message: string;\n};\n\ntype HealthCheckOptions = {\n projectBindingStore?: ProjectBindingStore;\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n homeDir?: string;\n packageMetadata?: { name: string; version: string };\n};\n\nexport async function createHealthCheckResult(\n options: HealthCheckOptions = {},\n): Promise<HealthCheckResult> {\n const packageMetadata = options.packageMetadata ?? {\n name: \"@siteoshq/cli\",\n version: \"0.0.0-development\",\n };\n const cwd = options.cwd ?? process.cwd();\n const configHome = resolveSiteOSConfigHome({\n env: options.env ?? process.env,\n homeDir: options.homeDir,\n });\n const repositoryRoot = await optionalRepositoryRoot(cwd);\n const productProjects = repositoryRoot\n ? await inspectProductProjects(repositoryRoot)\n : missingProductProjects(cwd);\n let project: HealthCheckResult[\"checks\"][\"project\"] = { status: \"missing\" };\n if (repositoryRoot) {\n try {\n const common = await readLocalCommonProject({\n ...options,\n cwd: repositoryRoot,\n });\n if (common)\n project = {\n status: \"selected\",\n id: common.binding.project.id,\n slug: common.binding.project.slug,\n };\n } catch {\n project = { status: \"invalid\" };\n }\n }\n const configured =\n project.status === \"selected\" ||\n Object.values(productProjects).some(\n (project) => project.status === \"configured\",\n );\n\n return {\n checks: {\n configHome: { path: configHome, status: \"ok\" },\n productProjects,\n project,\n repository: repositoryRoot\n ? { rootDir: repositoryRoot, status: \"ok\" }\n : { status: \"missing\" },\n },\n package: {\n binary: \"siteos\",\n name: packageMetadata.name,\n version: packageMetadata.version,\n },\n status: repositoryRoot && configured ? \"ok\" : \"needs-setup\",\n message: \"SiteOS CLI local health check completed.\",\n };\n}\n\nasync function optionalRepositoryRoot(cwd: string): Promise<string | null> {\n try {\n return await findRepositoryRoot(cwd);\n } catch (error) {\n if (\n error instanceof RepositoryRootError &&\n error.code === \"REPOSITORY_ROOT_REQUIRED\"\n ) {\n return null;\n }\n throw error;\n }\n}\n\nasync function inspectProductProjects(repositoryRoot: string) {\n const [forms, pulse, search] = await Promise.all([\n inspectReference(\n \"forms\",\n path.join(repositoryRoot, FORMS_PROJECT_REFERENCE_RELATIVE_PATH),\n () => inspectFormsProjectReference(repositoryRoot),\n ),\n inspectPulse(repositoryRoot),\n inspectReference(\n \"search\",\n path.join(repositoryRoot, SEARCH_PROJECT_REFERENCE_RELATIVE_PATH),\n () => inspectSearchProjectReference(repositoryRoot),\n ),\n ]);\n return { forms, pulse, search };\n}\n\nasync function inspectReference(\n service: \"forms\" | \"search\",\n referencePath: string,\n inspect: () => Promise<\n | { reference: { project: { slug: string }; version: 1 }; status: \"loaded\" }\n | { status: \"missing\" }\n >,\n): Promise<ProductProjectDiagnostic> {\n try {\n const state = await inspect();\n return state.status === \"loaded\"\n ? {\n path: referencePath,\n slug: state.reference.project.slug,\n status: \"configured\",\n version: state.reference.version,\n }\n : { path: referencePath, status: \"missing\" };\n } catch (error) {\n return {\n error:\n error instanceof Error && \"code\" in error\n ? String(error.code)\n : `${service.toUpperCase()}_PROJECT_REFERENCE_INVALID`,\n path: referencePath,\n status: \"invalid\",\n };\n }\n}\n\nasync function inspectPulse(\n repositoryRoot: string,\n): Promise<ProductProjectDiagnostic> {\n const configPath = path.join(repositoryRoot, CONFIG_FILE);\n try {\n const snapshot = await loadChecksConfigSnapshot(repositoryRoot);\n return {\n path: configPath,\n slug: snapshot.config.project.slug,\n status: \"configured\",\n version: snapshot.fileConfig.version,\n };\n } catch (error) {\n if (\n error instanceof Error &&\n \"code\" in error &&\n error.code === \"CONFIG_NOT_FOUND\"\n ) {\n return { path: configPath, status: \"missing\" };\n }\n return {\n error:\n error instanceof Error && \"code\" in error\n ? String(error.code)\n : \"CONFIG_INVALID\",\n path: configPath,\n status: \"invalid\",\n };\n }\n}\n\nfunction missingProductProjects(cwd: string) {\n const root = path.resolve(cwd);\n return {\n forms: {\n path: path.join(root, FORMS_PROJECT_REFERENCE_RELATIVE_PATH),\n status: \"missing\" as const,\n },\n pulse: { path: path.join(root, CONFIG_FILE), status: \"missing\" as const },\n search: {\n path: path.join(root, SEARCH_PROJECT_REFERENCE_RELATIVE_PATH),\n status: \"missing\" as const,\n },\n };\n}\n","import path from \"node:path\";\nimport { createSiteOSServiceGrantProvider } from \"../auth/adapters/siteos-service-grant-provider.js\";\nimport type { ServiceGrantProvider } from \"../auth/application/service-grant-provider.js\";\nimport { NodeProjectBindingStore } from \"../core/adapters/node-project-binding-store.js\";\nimport {\n findRepositoryRoot,\n RepositoryRootError,\n} from \"../core/adapters/node-repository-root.js\";\nimport type { ProjectBindingStore } from \"../core/ports/project-binding-store.js\";\nimport {\n SiteOSAuthApiError,\n type SiteOSAuthFetchLike,\n} from \"../siteos-auth-api.js\";\nimport { resolveSiteOSConfigHome } from \"../siteos-config.js\";\nimport { createProjectApi, type ProjectService } from \"./project-api.js\";\n\nexport type ProjectCommandOptions = {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n homeDir?: string;\n fetchImpl?: SiteOSAuthFetchLike;\n projectBindingStore?: ProjectBindingStore;\n serviceGrantProvider?: ServiceGrantProvider;\n};\nexport function commonProjectRuntime(options: ProjectCommandOptions) {\n const store =\n options.projectBindingStore ??\n new NodeProjectBindingStore(\n path.join(resolveSiteOSConfigHome(options), \"project-bindings.json\"),\n );\n const grants =\n options.serviceGrantProvider ?? createSiteOSServiceGrantProvider(options);\n return { store, grants, api: createProjectApi({ ...options, grants }) };\n}\nexport async function readLocalCommonProject(options: ProjectCommandOptions) {\n const runtime = commonProjectRuntime(options);\n const rootDir = await findRepositoryRoot(options.cwd ?? process.cwd());\n const locator = {\n apiOrigin: runtime.api.origin,\n repositoryRoot: rootDir,\n service: \"project\" as const,\n };\n const binding = await runtime.store.read(locator);\n if (!binding || binding.service !== \"project\") return null;\n return { ...runtime, rootDir, binding, locator };\n}\nexport async function readCommonProject(\n options: ProjectCommandOptions,\n environmentSlug?: string,\n) {\n const local = await readLocalCommonProject(options);\n if (!local) return null;\n const { api, binding } = local;\n const selectedSlug =\n environmentSlug ?? binding.environmentSlug ?? \"production\";\n const overview = await api.get(binding.project.id, selectedSlug);\n if (overview.project.organizationId !== binding.organizationId)\n throw new SiteOSAuthApiError({\n code: \"PROJECT_ORGANIZATION_MISMATCH\",\n message:\n \"Select this repository’s Project in the active organization with `siteos project use`.\",\n });\n const environment = overview.project.environments.find(\n (item) => item.slug === selectedSlug,\n );\n if (!environment)\n throw new SiteOSAuthApiError({\n code: \"PROJECT_ENVIRONMENT_NOT_FOUND\",\n message:\n \"Select an available environment with `siteos project environment use <slug>`.\",\n });\n return { ...local, overview, environment };\n}\nexport async function commonServiceContext(\n options: ProjectCommandOptions,\n service: ProjectService,\n environmentSlug?: string,\n) {\n const context = await readCommonProject(options, environmentSlug);\n if (!context) return null;\n const attachment = context.overview.services.find(\n (item) => item.service === service,\n )?.attachment;\n if (!attachment)\n throw new SiteOSAuthApiError({\n code: \"PROJECT_SERVICE_NOT_CONFIGURED\",\n message: `Set up ${service} for this Project with \\`siteos project connect ${service}\\`.`,\n });\n const binding = attachment.environments.find(\n (item) => item.environmentId === context.environment.id,\n );\n if ([\"pulse\", \"cookie\", \"seo\"].includes(service) && !binding)\n throw new SiteOSAuthApiError({\n code: \"PROJECT_ENVIRONMENT_NOT_CONFIGURED\",\n message: `Set up ${service} in ${context.environment.name} with \\`siteos project connect ${service}\\`.`,\n });\n return {\n ...context,\n resourceId: [\"pulse\", \"cookie\", \"seo\"].includes(service)\n ? binding!.resourceId\n : attachment.resourceId,\n environmentBinding: binding,\n };\n}\n\nexport async function commonEnvironmentArguments(\n options: ProjectCommandOptions,\n service: \"forms\" | \"search\",\n args: string[],\n) {\n if (service === \"forms\" && args[0] === \"definition\" && args[1] === \"check\")\n return args;\n const local = await readLocalCommonProject(options).catch((cause) => {\n if (\n cause instanceof RepositoryRootError &&\n cause.code === \"REPOSITORY_ROOT_REQUIRED\"\n )\n return null;\n throw cause;\n });\n if (!local) return args;\n if (args[0] === \"environment\" && args[1] !== \"list\")\n throw new Error(\n \"Manage shared environments with `siteos project environment` or Project settings.\",\n );\n if ([\"project\", \"environment\", \"submit\"].includes(args[0] ?? \"\")) return args;\n const normalized = args.flatMap((arg) =>\n arg.startsWith(\"--environment=\")\n ? [\"--environment\", arg.slice(\"--environment=\".length)]\n : [arg],\n );\n if (normalized.filter((arg) => arg === \"--environment\").length > 1)\n return args;\n const index = normalized.indexOf(\"--environment\");\n const slug = index >= 0 ? normalized[index + 1] : undefined;\n if (index >= 0 && (!slug || slug.startsWith(\"--\"))) return args;\n const context = await commonServiceContext(options, service, slug);\n const binding = context?.environmentBinding;\n if (!context || !binding?.slug)\n throw new Error(\n `Connect the ${service} environment in Project settings before running this command.`,\n );\n const result = [...normalized];\n if (index >= 0) result[index + 1] = binding.slug;\n else result.push(\"--environment\", binding.slug);\n return result;\n}\n","import os from \"node:os\";\n\nimport {\n createSiteOSAuthApiClient,\n isDefinitiveInvalidSession,\n resolveSiteOSAuthBaseUrl,\n siteOSServiceGrantRequestSchema,\n SiteOSAuthApiError,\n type SiteOSAuthFetchLike,\n type SiteOSServiceGrantResponse,\n} from \"./siteos-auth-api.js\";\nimport {\n loadSiteOSAuthState,\n writeSiteOSAuthState,\n} from \"./siteos-auth-state.js\";\nimport { resolveSiteOSConfigHome } from \"./siteos-config.js\";\n\nexport async function acquireSiteOSServiceGrant(options: {\n audience: unknown;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: SiteOSAuthFetchLike;\n homeDir?: string;\n scopes: unknown;\n}): Promise<SiteOSServiceGrantResponse> {\n const configHome = resolveSiteOSConfigHome({\n env: options.env,\n homeDir: options.homeDir ?? os.homedir(),\n });\n const loaded = await loadSiteOSAuthState({ configHome });\n\n if (loaded.status === \"missing\") {\n throw new SiteOSAuthApiError({\n code: \"AUTH_SESSION_REQUIRED\",\n message: \"Authenticate the SiteOS CLI first.\",\n });\n }\n const session = loaded.state.session;\n if (!session) {\n throw new SiteOSAuthApiError({\n code: \"AUTH_SESSION_REQUIRED\",\n message: \"Authenticate the SiteOS CLI first.\",\n });\n }\n if (session.metadata.status !== \"authenticated\") {\n await writeSiteOSAuthState({\n configHome,\n state: { ...loaded.state, session: undefined },\n });\n throw new SiteOSAuthApiError({\n code: \"SESSION_INVALID\",\n message: \"The CLI session is not valid.\",\n status: 401,\n });\n }\n if (!session.selectedOrganization) {\n throw new SiteOSAuthApiError({\n code: \"AUTH_ORGANIZATION_REQUIRED\",\n message: \"Select a SiteOS Organization first.\",\n });\n }\n if (!options.fetchImpl) {\n throw new SiteOSAuthApiError({\n code: \"AUTH_UNAVAILABLE\",\n message: \"SiteOS Auth access is unavailable in this runtime.\",\n });\n }\n\n const grantRequest = siteOSServiceGrantRequestSchema.safeParse({\n organizationId: session.selectedOrganization.id,\n audience: options.audience,\n scopes: options.scopes,\n });\n if (!grantRequest.success) {\n throw new SiteOSAuthApiError({\n code: \"GRANT_INPUT_INVALID\",\n message: \"The service grant request is invalid.\",\n });\n }\n\n try {\n return await createSiteOSAuthApiClient({\n apiBaseUrl: resolveSiteOSAuthBaseUrl(options.env),\n fetchImpl: options.fetchImpl,\n }).serviceGrant({\n ...grantRequest.data,\n sessionCredential: session.credential,\n });\n } catch (error) {\n if (isDefinitiveInvalidSession(error)) {\n await writeSiteOSAuthState({\n configHome,\n state: { ...loaded.state, session: undefined },\n });\n }\n throw error;\n }\n}\n","import { z } from \"zod\";\n\nexport const DEFAULT_SITEOS_AUTH_BASE_URL = \"https://app.siteos.sh\";\nexport const SITEOS_AUTH_BASE_URL_ENV = \"SITEOS_AUTH_BASE_URL\";\n\nexport type SiteOSAuthFetchLike = (\n input: string,\n init?: {\n body?: string;\n headers?: Record<string, string>;\n method?: string;\n signal?: AbortSignal;\n },\n) => Promise<{\n json: () => Promise<unknown>;\n ok: boolean;\n status: number;\n}>;\n\nexport const siteOSCliSessionStatusSchema = z\n .object({\n contractVersion: z.literal(1),\n status: z.enum([\"authenticated\", \"expired\", \"revoked\"]),\n user: z\n .object({\n id: z.string().trim().min(1).max(255),\n email: z.string().trim().email(),\n })\n .strict(),\n organization: z\n .object({\n id: z.string().trim().min(1).max(255),\n displayName: z.string().trim().min(1).max(255),\n })\n .strict()\n .nullable(),\n expiresAt: z.number().int().positive(),\n })\n .strict();\n\nexport const siteOSCliOrganizationSchema = z\n .object({\n id: z.string().trim().min(1).max(255),\n displayName: z.string().trim().min(1).max(255),\n membershipRole: z.enum([\"owner\", \"admin\", \"member\"]),\n })\n .strict();\n\nconst organizationCreatedResponseSchema = z\n .object({\n contractVersion: z.literal(1),\n status: z.literal(\"created\"),\n organization: siteOSCliOrganizationSchema\n .extend({\n displayName: z\n .string()\n .transform((value) => value.trim())\n .refine((value) => {\n const visibleLength = Array.from(value).length;\n return visibleLength >= 2 && visibleLength <= 80;\n }),\n membershipRole: z.literal(\"owner\"),\n })\n .strict(),\n })\n .strict();\n\nexport const siteOSServiceAudienceSchema = z.enum([\n \"siteos-projects\",\n \"siteos-trace\",\n \"siteos-integrations\",\n \"siteos-cookie\",\n \"siteos-forms\",\n \"siteos-pulse\",\n \"siteos-search\",\n \"siteos-seo\",\n]);\n\nexport const siteOSServiceScopeSchema = z\n .string()\n .min(1)\n .max(160)\n .regex(/^[a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*){2,}$/);\n\nconst scopeNamespaceByAudience = {\n \"siteos-projects\": \"projects\",\n \"siteos-trace\": \"trace\",\n \"siteos-integrations\": \"integrations\",\n \"siteos-cookie\": \"cookie\",\n \"siteos-forms\": \"forms\",\n \"siteos-pulse\": \"pulse\",\n \"siteos-search\": \"search\",\n \"siteos-seo\": \"seo\",\n} as const;\n\nfunction matchingServiceScopes<\n T extends {\n audience: z.infer<typeof siteOSServiceAudienceSchema>;\n scopes: string[];\n },\n>(value: T, context: z.RefinementCtx): void {\n const prefix = `${scopeNamespaceByAudience[value.audience]}:`;\n if (new Set(value.scopes).size !== value.scopes.length) {\n context.addIssue({\n code: \"custom\",\n message: \"Service scopes must be unique.\",\n path: [\"scopes\"],\n });\n }\n for (const [index, scope] of value.scopes.entries()) {\n if (!scope.startsWith(prefix)) {\n context.addIssue({\n code: \"custom\",\n message: \"Service scope namespace must match the audience.\",\n path: [\"scopes\", index],\n });\n }\n }\n}\n\nexport const siteOSServiceGrantRequestSchema = z\n .object({\n organizationId: z.string().trim().min(1).max(255),\n audience: siteOSServiceAudienceSchema,\n scopes: z.array(siteOSServiceScopeSchema).min(1).max(64),\n })\n .strict()\n .superRefine(matchingServiceScopes);\n\nconst serviceGrantResponseSchema = z\n .object({\n contractVersion: z.literal(1),\n accessToken: z.string().min(16).max(16_384),\n tokenType: z.literal(\"Bearer\"),\n grant: z\n .object({\n id: z.string().trim().min(1).max(255),\n organizationId: z.string().trim().min(1).max(255),\n audience: siteOSServiceAudienceSchema,\n scopes: z.array(siteOSServiceScopeSchema).min(1).max(64),\n expiresAt: z.number().int().positive(),\n })\n .strict()\n .superRefine(matchingServiceScopes),\n })\n .strict();\n\nconst projectIdentityAssertionResponseSchema = z\n .object({\n contractVersion: z.literal(1),\n accessToken: z.string().min(1).max(16_384),\n tokenType: z.literal(\"Bearer\"),\n expiresAt: z.number().int().positive(),\n })\n .strict();\n\nconst organizationsResponseSchema = z\n .object({\n contractVersion: z.literal(1),\n organizations: z.array(siteOSCliOrganizationSchema),\n })\n .strict();\n\nconst startResponseSchema = z\n .object({\n requestId: z.string().trim().min(1).max(255),\n status: z.literal(\"verification_required\"),\n channel: z.literal(\"email\"),\n expiresInSeconds: z.number().int().positive(),\n })\n .strict();\n\nconst completeResponseSchema = z\n .object({\n session: siteOSCliSessionStatusSchema,\n sessionCredential: z.string().trim().min(16).max(4096),\n })\n .strict();\n\nconst errorResponseSchema = z\n .object({\n error: z\n .object({\n code: z.string().trim().min(1).max(80),\n message: z.string().trim().min(1).max(240),\n })\n .strict(),\n })\n .strict();\n\nexport type SiteOSCliSessionStatus = z.infer<\n typeof siteOSCliSessionStatusSchema\n>;\nexport type SiteOSAuthStartResponse = z.infer<typeof startResponseSchema>;\nexport type SiteOSAuthCompleteResponse = z.infer<typeof completeResponseSchema>;\nexport type SiteOSCliOrganization = z.infer<typeof siteOSCliOrganizationSchema>;\nexport type SiteOSAuthOrganizationsResponse = z.infer<\n typeof organizationsResponseSchema\n>;\nexport type SiteOSAuthOrganizationCreatedResponse = z.infer<\n typeof organizationCreatedResponseSchema\n>;\nexport type SiteOSServiceGrantRequest = z.infer<\n typeof siteOSServiceGrantRequestSchema\n>;\nexport type SiteOSServiceGrantResponse = z.infer<\n typeof serviceGrantResponseSchema\n>;\nexport type SiteOSProjectIdentityAssertionResponse = z.infer<\n typeof projectIdentityAssertionResponseSchema\n>;\n\nconst safeMessages: Record<string, string> = {\n BAD_REQUEST: \"The Auth request is invalid.\",\n GRANT_DENIED: \"The service grant request was denied.\",\n INTERNAL_SERVER_ERROR: \"The Auth service could not complete the request.\",\n INVALID_INPUT: \"The authorization input is invalid.\",\n ASSERTION_DENIED: \"The Project identity assertion request was denied.\",\n RATE_LIMITED: \"Too many Auth requests. Try again shortly.\",\n SESSION_INVALID: \"The CLI session is not valid.\",\n UNAUTHORIZED: \"The CLI session is not valid.\",\n VERIFICATION_DENIED: \"The authorization request could not be verified.\",\n};\n\nexport class SiteOSAuthApiError extends Error {\n readonly code: string;\n readonly status?: number;\n\n constructor(options: { code: string; message: string; status?: number }) {\n super(options.message);\n this.name = \"SiteOSAuthApiError\";\n this.code = options.code;\n this.status = options.status;\n }\n}\n\nexport function resolveSiteOSAuthBaseUrl(\n env: NodeJS.ProcessEnv = process.env,\n): string {\n const rawUrl =\n env[SITEOS_AUTH_BASE_URL_ENV]?.trim() || DEFAULT_SITEOS_AUTH_BASE_URL;\n\n try {\n const url = new URL(rawUrl);\n if (\n ![\"http:\", \"https:\"].includes(url.protocol) ||\n url.username ||\n url.password\n ) {\n throw new Error(\"unsupported Auth URL\");\n }\n return url.origin;\n } catch {\n throw new SiteOSAuthApiError({\n code: \"INVALID_AUTH_BASE_URL\",\n message: \"The SiteOS Auth URL is invalid.\",\n });\n }\n}\n\nexport function isDefinitiveInvalidSession(\n error: unknown,\n): error is SiteOSAuthApiError {\n return (\n error instanceof SiteOSAuthApiError &&\n error.status === 401 &&\n [\"SESSION_INVALID\", \"UNAUTHORIZED\"].includes(error.code)\n );\n}\n\nexport function createSiteOSAuthApiClient(options: {\n apiBaseUrl: string;\n fetchImpl: SiteOSAuthFetchLike;\n}) {\n return {\n start(input: {\n email: string;\n installationIdHash: string;\n pkceChallenge: string;\n }): Promise<SiteOSAuthStartResponse> {\n return requestJson({\n ...options,\n body: input,\n method: \"POST\",\n path: \"/api/cli/v1/authorization-requests\",\n responseSchema: startResponseSchema,\n });\n },\n complete(input: {\n pkceVerifier: string;\n requestId: string;\n token: string;\n }): Promise<SiteOSAuthCompleteResponse> {\n return requestJson({\n ...options,\n body: {\n pkceVerifier: input.pkceVerifier,\n token: input.token,\n },\n method: \"POST\",\n path: `/api/cli/v1/authorization-requests/${encodeURIComponent(input.requestId)}/complete`,\n responseSchema: completeResponseSchema,\n });\n },\n status(input: {\n sessionCredential: string;\n }): Promise<SiteOSCliSessionStatus> {\n return requestJson({\n ...options,\n method: \"GET\",\n path: \"/api/cli/v1/session\",\n responseSchema: siteOSCliSessionStatusSchema,\n sessionCredential: input.sessionCredential,\n });\n },\n organizations(input: {\n sessionCredential: string;\n }): Promise<SiteOSAuthOrganizationsResponse> {\n return requestJson({\n ...options,\n method: \"GET\",\n path: \"/api/cli/v1/organizations\",\n responseSchema: organizationsResponseSchema,\n sessionCredential: input.sessionCredential,\n });\n },\n createOrganization(input: {\n displayName: string;\n sessionCredential: string;\n }): Promise<SiteOSAuthOrganizationCreatedResponse> {\n return requestJson({\n ...options,\n body: { displayName: input.displayName },\n method: \"POST\",\n path: \"/api/cli/v1/organizations\",\n responseSchema: organizationCreatedResponseSchema,\n sessionCredential: input.sessionCredential,\n });\n },\n serviceGrant(\n input: SiteOSServiceGrantRequest & { sessionCredential: string },\n ): Promise<SiteOSServiceGrantResponse> {\n return requestJson({\n ...options,\n body: {\n organizationId: input.organizationId,\n audience: input.audience,\n scopes: input.scopes,\n },\n method: \"POST\",\n path: \"/api/cli/v1/service-grants\",\n responseSchema: serviceGrantResponseSchema,\n sessionCredential: input.sessionCredential,\n });\n },\n projectIdentityAssertion(input: {\n organizationId: string;\n sessionCredential: string;\n }): Promise<SiteOSProjectIdentityAssertionResponse> {\n return requestJson({\n ...options,\n body: { organizationId: input.organizationId },\n method: \"POST\",\n path: \"/api/cli/v1/project-identity-assertions\",\n responseSchema: projectIdentityAssertionResponseSchema,\n sessionCredential: input.sessionCredential,\n });\n },\n revoke(input: {\n sessionCredential: string;\n }): Promise<SiteOSCliSessionStatus> {\n return requestJson({\n ...options,\n method: \"DELETE\",\n path: \"/api/cli/v1/session\",\n responseSchema: siteOSCliSessionStatusSchema,\n sessionCredential: input.sessionCredential,\n });\n },\n };\n}\n\nasync function requestJson<T>(options: {\n apiBaseUrl: string;\n body?: unknown;\n fetchImpl: SiteOSAuthFetchLike;\n method: \"DELETE\" | \"GET\" | \"POST\";\n path: string;\n responseSchema: z.ZodType<T>;\n sessionCredential?: string;\n}): Promise<T> {\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n };\n let body: string | undefined;\n\n if (options.body !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n body = JSON.stringify(options.body);\n }\n if (options.sessionCredential) {\n headers.Authorization = `Bearer ${options.sessionCredential}`;\n }\n\n let response: Awaited<ReturnType<SiteOSAuthFetchLike>>;\n try {\n response = await options.fetchImpl(\n `${options.apiBaseUrl.replace(/\\/+$/, \"\")}${options.path}`,\n {\n body,\n headers,\n method: options.method,\n },\n );\n } catch {\n throw new SiteOSAuthApiError({\n code: \"AUTH_REQUEST_FAILED\",\n message: \"The SiteOS Auth request failed.\",\n });\n }\n\n const payload = await response.json().catch(() => undefined);\n if (!response.ok) {\n const parsedError = errorResponseSchema.safeParse(payload);\n if (parsedError.success) {\n const code = parsedError.data.error.code;\n throw new SiteOSAuthApiError({\n code,\n message: safeMessages[code] ?? \"The SiteOS Auth request failed.\",\n status: response.status,\n });\n }\n throw new SiteOSAuthApiError({\n code: \"AUTH_UNEXPECTED_RESPONSE\",\n message: \"The SiteOS Auth service returned an unexpected response.\",\n status: response.status,\n });\n }\n\n const parsedResponse = options.responseSchema.safeParse(payload);\n if (!parsedResponse.success) {\n throw new SiteOSAuthApiError({\n code: \"AUTH_INVALID_RESPONSE\",\n message: \"The SiteOS Auth service returned an invalid response.\",\n status: response.status,\n });\n }\n return parsedResponse.data;\n}\n","import {\n chmod,\n lstat,\n mkdir,\n readFile,\n rename,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\n\nimport { z } from \"zod\";\n\nimport {\n siteOSCliSessionStatusSchema,\n type SiteOSCliSessionStatus,\n} from \"./siteos-auth-api.js\";\n\nexport const SITEOS_AUTH_STATE_FILE_NAME = \"auth.json\";\nexport const SITEOS_AUTH_STATE_VERSION = 2 as const;\n\nconst selectedOrganizationSchema = z\n .object({\n id: z.string().trim().min(1).max(255),\n })\n .strict();\n\nconst legacySiteOSAuthStateSchema = z\n .object({\n version: z.literal(1),\n installationId: z.string().trim().min(16).max(255),\n pending: z\n .object({\n requestId: z.string().trim().min(1).max(255),\n pkceVerifier: z.string().regex(/^[A-Za-z0-9_-]{43,128}$/),\n expiresAt: z.number().int().positive(),\n })\n .strict()\n .optional(),\n session: z\n .object({\n credential: z.string().trim().min(16).max(4096),\n metadata: z\n .object({\n contractVersion: z.literal(1),\n status: z.enum([\"authenticated\", \"expired\", \"revoked\"]),\n user: z\n .object({\n id: z.string().trim().min(1).max(255),\n email: z.string().trim().email(),\n })\n .strict(),\n organization: z\n .object({\n id: z.string().trim().min(1).max(255),\n slug: z\n .string()\n .min(1)\n .max(80)\n .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),\n })\n .strict()\n .nullable(),\n expiresAt: z.number().int().positive(),\n })\n .strict(),\n selectedOrganization: z\n .object({\n id: z.string().trim().min(1).max(255),\n slug: z\n .string()\n .min(1)\n .max(80)\n .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),\n })\n .strict()\n .optional(),\n })\n .strict()\n .optional(),\n })\n .strict();\n\nconst siteOSAuthStateSchema = z\n .object({\n version: z.literal(SITEOS_AUTH_STATE_VERSION),\n installationId: z.string().trim().min(16).max(255),\n pending: z\n .object({\n requestId: z.string().trim().min(1).max(255),\n pkceVerifier: z.string().regex(/^[A-Za-z0-9_-]{43,128}$/),\n expiresAt: z.number().int().positive(),\n })\n .strict()\n .optional(),\n session: z\n .object({\n credential: z.string().trim().min(16).max(4096),\n metadata: siteOSCliSessionStatusSchema,\n selectedOrganization: selectedOrganizationSchema.optional(),\n })\n .strict()\n .optional(),\n })\n .strict();\n\nexport type SiteOSAuthState = {\n installationId: string;\n pending?: {\n requestId: string;\n pkceVerifier: string;\n expiresAt: number;\n };\n session?: {\n credential: string;\n metadata: SiteOSCliSessionStatus;\n selectedOrganization?: SiteOSSelectedOrganization;\n };\n version: typeof SITEOS_AUTH_STATE_VERSION;\n};\n\nexport type SiteOSSelectedOrganization = z.infer<\n typeof selectedOrganizationSchema\n>;\n\nexport class SiteOSAuthStateError extends Error {\n readonly code: \"AUTH_STATE_INVALID\" | \"AUTH_STATE_UNAVAILABLE\";\n\n constructor(\n code: \"AUTH_STATE_INVALID\" | \"AUTH_STATE_UNAVAILABLE\",\n message: string,\n ) {\n super(message);\n this.name = \"SiteOSAuthStateError\";\n this.code = code;\n }\n}\n\nexport async function loadSiteOSAuthState(options: {\n configHome: string;\n}): Promise<\n { state: SiteOSAuthState; status: \"loaded\" } | { status: \"missing\" }\n> {\n const statePath = path.join(options.configHome, SITEOS_AUTH_STATE_FILE_NAME);\n const stats = await lstat(statePath).catch((error: unknown) => {\n if (isNodeErrorCode(error, \"ENOENT\")) return undefined;\n throw new SiteOSAuthStateError(\n \"AUTH_STATE_UNAVAILABLE\",\n \"SiteOS Auth state could not be read.\",\n );\n });\n if (!stats) return { status: \"missing\" };\n if (!stats.isFile()) {\n throw new SiteOSAuthStateError(\n \"AUTH_STATE_INVALID\",\n \"SiteOS Auth state is invalid.\",\n );\n }\n\n await Promise.all([\n chmod(options.configHome, 0o700),\n chmod(statePath, 0o600),\n ]).catch(() => {\n throw new SiteOSAuthStateError(\n \"AUTH_STATE_UNAVAILABLE\",\n \"SiteOS Auth state could not be read.\",\n );\n });\n\n const rawState = await readFile(statePath, \"utf-8\").catch(() => {\n throw new SiteOSAuthStateError(\n \"AUTH_STATE_UNAVAILABLE\",\n \"SiteOS Auth state could not be read.\",\n );\n });\n let parsedJson: unknown;\n try {\n parsedJson = JSON.parse(rawState);\n } catch {\n throw new SiteOSAuthStateError(\n \"AUTH_STATE_INVALID\",\n \"SiteOS Auth state is invalid.\",\n );\n }\n const parsedState = siteOSAuthStateSchema.safeParse(parsedJson);\n if (parsedState.success) {\n return {\n state: parsedState.data,\n status: \"loaded\",\n };\n }\n\n const legacyState = legacySiteOSAuthStateSchema.safeParse(parsedJson);\n if (!legacyState.success) {\n throw new SiteOSAuthStateError(\n \"AUTH_STATE_INVALID\",\n \"SiteOS Auth state is invalid.\",\n );\n }\n\n const legacySession = legacyState.data.session;\n const selectedOrganizationId =\n legacySession?.selectedOrganization?.id ??\n legacySession?.metadata.organization?.id;\n const migratedState: SiteOSAuthState = {\n installationId: legacyState.data.installationId,\n pending: legacyState.data.pending,\n session: legacySession\n ? {\n credential: legacySession.credential,\n metadata: {\n ...legacySession.metadata,\n organization: null,\n },\n selectedOrganization: selectedOrganizationId\n ? { id: selectedOrganizationId }\n : undefined,\n }\n : undefined,\n version: SITEOS_AUTH_STATE_VERSION,\n };\n await writeSiteOSAuthState({\n configHome: options.configHome,\n state: migratedState,\n });\n return {\n state: migratedState,\n status: \"loaded\",\n };\n}\n\nexport async function writeSiteOSAuthState(options: {\n configHome: string;\n state: SiteOSAuthState;\n}): Promise<void> {\n const parsedState = siteOSAuthStateSchema.safeParse(options.state);\n if (!parsedState.success) {\n throw new SiteOSAuthStateError(\n \"AUTH_STATE_INVALID\",\n \"SiteOS Auth state is invalid.\",\n );\n }\n\n const statePath = path.join(options.configHome, SITEOS_AUTH_STATE_FILE_NAME);\n const temporaryPath = path.join(\n options.configHome,\n `.${SITEOS_AUTH_STATE_FILE_NAME}.${process.pid}.${randomUUID()}.tmp`,\n );\n\n try {\n await mkdir(options.configHome, { mode: 0o700, recursive: true });\n await chmod(options.configHome, 0o700);\n await writeFile(\n temporaryPath,\n `${JSON.stringify(parsedState.data, null, 2)}\\n`,\n {\n encoding: \"utf-8\",\n flag: \"wx\",\n mode: 0o600,\n },\n );\n await chmod(temporaryPath, 0o600);\n await rename(temporaryPath, statePath);\n await chmod(statePath, 0o600);\n } catch (error) {\n if (error instanceof SiteOSAuthStateError) throw error;\n throw new SiteOSAuthStateError(\n \"AUTH_STATE_UNAVAILABLE\",\n \"SiteOS Auth state could not be saved.\",\n );\n } finally {\n await rm(temporaryPath, { force: true }).catch(() => undefined);\n }\n}\n\nfunction isNodeErrorCode(error: unknown, code: string): boolean {\n return (\n error instanceof Error &&\n \"code\" in error &&\n (error as NodeJS.ErrnoException).code === code\n );\n}\n","import os from \"node:os\";\nimport path from \"node:path\";\n\nexport const SITEOS_HOME_ENV = \"SITEOS_HOME\";\n\nexport function resolveSiteOSConfigHome(\n options: { env?: NodeJS.ProcessEnv; homeDir?: string } = {},\n): string {\n const configuredHome = options.env?.[SITEOS_HOME_ENV]?.trim();\n return configuredHome\n ? path.resolve(configuredHome)\n : path.join(options.homeDir ?? os.homedir(), \".siteos\");\n}\n","import type { SiteOSAuthFetchLike } from \"../../siteos-auth-api.js\";\nimport { acquireSiteOSServiceGrant } from \"../../siteos-service-grant.js\";\nimport type {\n ServiceGrantProvider,\n ServiceGrantRequest,\n} from \"../application/service-grant-provider.js\";\n\nexport function createSiteOSServiceGrantProvider(options: {\n env?: NodeJS.ProcessEnv;\n fetchImpl?: SiteOSAuthFetchLike;\n homeDir?: string;\n}): ServiceGrantProvider {\n return {\n async acquire(request: ServiceGrantRequest) {\n return acquireSiteOSServiceGrant({\n ...options,\n audience: request.audience,\n scopes: request.scopes,\n });\n },\n };\n}\n","import { createHash } from \"node:crypto\";\nimport { realpath } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { z } from \"zod\";\n\nimport type {\n ProductProjectBinding,\n ProductProjectBindingLocator,\n ProjectBindingStore,\n} from \"../ports/project-binding-store.js\";\nimport { PROJECT_BINDING_SERVICES } from \"../ports/project-binding-store.js\";\nimport type {\n JsonDocumentCodec,\n JsonDocumentSnapshot,\n JsonDocumentStore,\n} from \"../ports/json-document-store.js\";\nimport {\n JsonDocumentStoreError,\n NodeJsonDocumentStore,\n} from \"./node-json-document-store.js\";\n\nconst projectBindingSchema = z\n .object({\n service: z.enum(PROJECT_BINDING_SERVICES),\n apiOrigin: z\n .string()\n .url()\n .refine((value) => new URL(value).origin === value),\n repositoryRoot: z.string().refine(path.isAbsolute),\n organizationId: z.string().trim().min(1).max(255),\n environmentSlug: z\n .string()\n .regex(/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/)\n .max(30)\n .optional(),\n project: z\n .object({\n id: z.string().trim().min(1).max(255),\n slug: z\n .string()\n .trim()\n .min(1)\n .max(255)\n .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),\n })\n .strict(),\n })\n .strict();\n\nconst projectBindingsSchema = z\n .object({\n version: z.literal(1),\n bindings: z.record(projectBindingSchema),\n })\n .strict()\n .superRefine((document, context) => {\n for (const [key, binding] of Object.entries(document.bindings)) {\n if (key !== projectBindingKey(binding)) {\n context.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Project binding key does not match its contents.\",\n path: [\"bindings\", key],\n });\n }\n }\n });\n\ntype ProjectBindingsDocument = z.infer<typeof projectBindingsSchema>;\n\nconst projectBindingsCodec: JsonDocumentCodec<ProjectBindingsDocument> = {\n decode(input) {\n return { migrated: false, value: projectBindingsSchema.parse(input) };\n },\n encode(value) {\n return projectBindingsSchema.parse(value);\n },\n};\n\nexport type ProjectBindingStoreErrorCode =\n | \"PROJECT_BINDINGS_CONFLICT\"\n | \"PROJECT_BINDINGS_INVALID\"\n | \"PROJECT_BINDINGS_UNAVAILABLE\";\n\nexport class ProjectBindingStoreError extends Error {\n readonly code: ProjectBindingStoreErrorCode;\n\n constructor(code: ProjectBindingStoreErrorCode, message: string) {\n super(message);\n this.name = \"ProjectBindingStoreError\";\n this.code = code;\n }\n}\n\nexport class NodeProjectBindingStore implements ProjectBindingStore {\n constructor(\n private readonly filePath: string,\n private readonly documents: JsonDocumentStore = new NodeJsonDocumentStore(),\n ) {}\n\n async read(\n locator: ProductProjectBindingLocator,\n ): Promise<ProductProjectBinding | null> {\n try {\n const normalized = await normalizeLocator(locator);\n const snapshot = await this.readDocument();\n if (snapshot.status === \"missing\") return null;\n return snapshot.value.bindings[projectBindingKey(normalized)] ?? null;\n } catch (error) {\n throw mapStoreError(error);\n }\n }\n\n async write(binding: ProductProjectBinding): Promise<ProductProjectBinding> {\n try {\n const normalized = projectBindingSchema.parse({\n ...binding,\n ...(await normalizeLocator(binding)),\n });\n const snapshot = await this.readDocument();\n const document =\n snapshot.status === \"loaded\" ? snapshot.value : emptyDocument();\n document.bindings[projectBindingKey(normalized)] = normalized;\n await this.documents.write({\n codec: projectBindingsCodec,\n expectedChecksum:\n snapshot.status === \"loaded\" ? snapshot.checksum : null,\n filePath: this.filePath,\n security: \"private\",\n value: document,\n });\n return normalized;\n } catch (error) {\n throw mapStoreError(error);\n }\n }\n\n async remove(locator: ProductProjectBindingLocator): Promise<boolean> {\n try {\n const normalized = await normalizeLocator(locator);\n const snapshot = await this.readDocument();\n if (snapshot.status === \"missing\") return false;\n const key = projectBindingKey(normalized);\n if (!snapshot.value.bindings[key]) return false;\n delete snapshot.value.bindings[key];\n await this.documents.write({\n codec: projectBindingsCodec,\n expectedChecksum: snapshot.checksum,\n filePath: this.filePath,\n security: \"private\",\n value: snapshot.value,\n });\n return true;\n } catch (error) {\n throw mapStoreError(error);\n }\n }\n\n private readDocument(): Promise<\n JsonDocumentSnapshot<ProjectBindingsDocument>\n > {\n return this.documents.read({\n codec: projectBindingsCodec,\n filePath: this.filePath,\n security: \"private\",\n });\n }\n}\n\nexport function projectBindingKey(\n locator: ProductProjectBindingLocator,\n): string {\n return createHash(\"sha256\")\n .update(\n `${locator.apiOrigin}\\0${locator.repositoryRoot}\\0${locator.service}`,\n )\n .digest(\"hex\");\n}\n\nasync function normalizeLocator(\n locator: ProductProjectBindingLocator,\n): Promise<ProductProjectBindingLocator> {\n return {\n apiOrigin: normalizeApiOrigin(locator.apiOrigin),\n repositoryRoot: await realpath(path.resolve(locator.repositoryRoot)),\n service: locator.service,\n };\n}\n\nfunction normalizeApiOrigin(value: string): string {\n let url: URL;\n try {\n url = new URL(value);\n } catch {\n throw new ProjectBindingStoreError(\n \"PROJECT_BINDINGS_INVALID\",\n \"The product Project binding is invalid.\",\n );\n }\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n throw new ProjectBindingStoreError(\n \"PROJECT_BINDINGS_INVALID\",\n \"The product Project binding is invalid.\",\n );\n }\n return url.origin;\n}\n\nfunction emptyDocument(): ProjectBindingsDocument {\n return { version: 1, bindings: {} };\n}\n\nfunction mapStoreError(error: unknown): ProjectBindingStoreError {\n if (error instanceof ProjectBindingStoreError) return error;\n if (error instanceof z.ZodError) {\n return new ProjectBindingStoreError(\n \"PROJECT_BINDINGS_INVALID\",\n \"Product Project bindings are invalid.\",\n );\n }\n if (error instanceof JsonDocumentStoreError) {\n if (error.code === \"JSON_DOCUMENT_CONFLICT\") {\n return new ProjectBindingStoreError(\n \"PROJECT_BINDINGS_CONFLICT\",\n \"Product Project bindings changed before they could be saved.\",\n );\n }\n if (\n error.code === \"JSON_DOCUMENT_INVALID\" ||\n error.code === \"JSON_DOCUMENT_UNSAFE\"\n ) {\n return new ProjectBindingStoreError(\n \"PROJECT_BINDINGS_INVALID\",\n \"Product Project bindings are invalid.\",\n );\n }\n }\n return new ProjectBindingStoreError(\n \"PROJECT_BINDINGS_UNAVAILABLE\",\n \"Product Project bindings could not be accessed.\",\n );\n}\n","export const PRODUCT_SERVICES = [\"pulse\", \"forms\", \"search\"] as const;\n\nexport type ProductService = (typeof PRODUCT_SERVICES)[number];\nexport const PROJECT_BINDING_SERVICES = [\n \"project\",\n ...PRODUCT_SERVICES,\n] as const;\nexport type ProjectBindingService = (typeof PROJECT_BINDING_SERVICES)[number];\n\nexport type ProductProjectBindingLocator = {\n apiOrigin: string;\n repositoryRoot: string;\n service: ProjectBindingService;\n};\n\nexport type ProductProjectBinding = ProductProjectBindingLocator & {\n environmentSlug?: string;\n organizationId: string;\n project: {\n id: string;\n slug: string;\n };\n};\n\nexport interface ProjectBindingStore {\n read(\n locator: ProductProjectBindingLocator,\n ): Promise<ProductProjectBinding | null>;\n remove(locator: ProductProjectBindingLocator): Promise<boolean>;\n write(binding: ProductProjectBinding): Promise<ProductProjectBinding>;\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport {\n chmod,\n lstat,\n mkdir,\n readFile,\n rename,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type {\n JsonDocumentSecurity,\n JsonDocumentSnapshot,\n JsonDocumentStore,\n ReadJsonDocumentInput,\n WriteJsonDocumentInput,\n} from \"../ports/json-document-store.js\";\n\nexport type JsonDocumentStoreErrorCode =\n | \"JSON_DOCUMENT_CONFLICT\"\n | \"JSON_DOCUMENT_INVALID\"\n | \"JSON_DOCUMENT_UNAVAILABLE\"\n | \"JSON_DOCUMENT_UNSAFE\";\n\nexport class JsonDocumentStoreError extends Error {\n readonly code: JsonDocumentStoreErrorCode;\n\n constructor(code: JsonDocumentStoreErrorCode, message: string) {\n super(message);\n this.name = \"JsonDocumentStoreError\";\n this.code = code;\n }\n}\n\nexport class NodeJsonDocumentStore implements JsonDocumentStore {\n async read<T>(\n input: ReadJsonDocumentInput<T>,\n ): Promise<JsonDocumentSnapshot<T>> {\n const fileStats = await safeLstat(input.filePath);\n if (!fileStats) return { status: \"missing\" };\n if (fileStats.isSymbolicLink() || !fileStats.isFile())\n throw unsafeDocument();\n\n const directory = path.dirname(input.filePath);\n await assertDirectory(directory);\n await repairPermissions(input.filePath, directory, input.security);\n\n const source = await readFile(input.filePath, \"utf8\").catch(() => {\n throw unavailableDocument();\n });\n let parsed: unknown;\n try {\n parsed = JSON.parse(source);\n } catch {\n throw invalidDocument();\n }\n\n try {\n const decoded = input.codec.decode(parsed);\n return {\n checksum: checksum(source),\n migrated: decoded.migrated,\n source,\n status: \"loaded\",\n value: decoded.value,\n };\n } catch (error) {\n if (error instanceof JsonDocumentStoreError) throw error;\n throw invalidDocument();\n }\n }\n\n async write<T>(\n input: WriteJsonDocumentInput<T>,\n ): Promise<{ checksum: string }> {\n let source: string;\n try {\n source = `${JSON.stringify(input.codec.encode(input.value), null, 2)}\\n`;\n } catch {\n throw invalidDocument();\n }\n\n const directory = path.dirname(input.filePath);\n await ensureDirectory(directory, input.security);\n const existing = await safeLstat(input.filePath);\n if (existing && (existing.isSymbolicLink() || !existing.isFile()))\n throw unsafeDocument();\n\n const temporaryPath = path.join(\n directory,\n `.${path.basename(input.filePath)}.${process.pid}.${randomUUID()}.tmp`,\n );\n const fileMode = input.security === \"private\" ? 0o600 : 0o644;\n\n try {\n await writeFile(temporaryPath, source, {\n encoding: \"utf8\",\n flag: \"wx\",\n mode: fileMode,\n });\n await chmod(temporaryPath, fileMode);\n await assertExpectedChecksum(input.filePath, input.expectedChecksum);\n await rename(temporaryPath, input.filePath);\n await chmod(input.filePath, fileMode);\n return { checksum: checksum(source) };\n } catch (error) {\n if (error instanceof JsonDocumentStoreError) throw error;\n throw unavailableDocument();\n } finally {\n await rm(temporaryPath, { force: true }).catch(() => undefined);\n }\n }\n}\n\nasync function ensureDirectory(\n directory: string,\n security: JsonDocumentSecurity,\n): Promise<void> {\n const mode = security === \"private\" ? 0o700 : 0o755;\n await mkdir(directory, { mode, recursive: true }).catch(() => {\n throw unavailableDocument();\n });\n await assertDirectory(directory);\n await chmod(directory, mode).catch(() => {\n throw unavailableDocument();\n });\n}\n\nasync function assertDirectory(directory: string): Promise<void> {\n const stats = await safeLstat(directory);\n if (!stats || stats.isSymbolicLink() || !stats.isDirectory())\n throw unsafeDocument();\n}\n\nasync function repairPermissions(\n filePath: string,\n directory: string,\n security: JsonDocumentSecurity,\n): Promise<void> {\n if (security !== \"private\") return;\n await Promise.all([chmod(directory, 0o700), chmod(filePath, 0o600)]).catch(\n () => {\n throw unavailableDocument();\n },\n );\n}\n\nasync function assertExpectedChecksum(\n filePath: string,\n expectedChecksum: string | null | undefined,\n): Promise<void> {\n if (expectedChecksum === undefined) return;\n const stats = await safeLstat(filePath);\n if (!stats) {\n if (expectedChecksum === null) return;\n throw conflictDocument();\n }\n if (stats.isSymbolicLink() || !stats.isFile()) throw unsafeDocument();\n if (expectedChecksum === null) throw conflictDocument();\n const currentSource = await readFile(filePath, \"utf8\").catch(() => {\n throw unavailableDocument();\n });\n if (checksum(currentSource) !== expectedChecksum) throw conflictDocument();\n}\n\nasync function safeLstat(candidate: string) {\n return lstat(candidate).catch((error: unknown) => {\n if (isNodeErrorCode(error, \"ENOENT\") || isNodeErrorCode(error, \"ENOTDIR\"))\n return undefined;\n throw unavailableDocument();\n });\n}\n\nfunction checksum(source: string): string {\n return createHash(\"sha256\").update(source).digest(\"hex\");\n}\n\nfunction conflictDocument(): JsonDocumentStoreError {\n return new JsonDocumentStoreError(\n \"JSON_DOCUMENT_CONFLICT\",\n \"The JSON document changed before it could be replaced.\",\n );\n}\n\nfunction invalidDocument(): JsonDocumentStoreError {\n return new JsonDocumentStoreError(\n \"JSON_DOCUMENT_INVALID\",\n \"The JSON document is invalid.\",\n );\n}\n\nfunction unavailableDocument(): JsonDocumentStoreError {\n return new JsonDocumentStoreError(\n \"JSON_DOCUMENT_UNAVAILABLE\",\n \"The JSON document could not be accessed.\",\n );\n}\n\nfunction unsafeDocument(): JsonDocumentStoreError {\n return new JsonDocumentStoreError(\n \"JSON_DOCUMENT_UNSAFE\",\n \"The JSON document path is not safe.\",\n );\n}\n\nfunction isNodeErrorCode(error: unknown, code: string): boolean {\n return (\n error instanceof Error &&\n \"code\" in error &&\n (error as NodeJS.ErrnoException).code === code\n );\n}\n","import { lstat, realpath } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport type RepositoryRootErrorCode =\n | \"REPOSITORY_ROOT_INVALID\"\n | \"REPOSITORY_ROOT_REQUIRED\"\n | \"REPOSITORY_ROOT_UNAVAILABLE\";\n\nexport class RepositoryRootError extends Error {\n readonly code: RepositoryRootErrorCode;\n\n constructor(code: RepositoryRootErrorCode, message: string) {\n super(message);\n this.name = \"RepositoryRootError\";\n this.code = code;\n }\n}\n\nexport async function findRepositoryRoot(startDir: string): Promise<string> {\n let current: string;\n try {\n current = await realpath(path.resolve(startDir));\n } catch {\n throw unavailableRoot();\n }\n\n await assertDirectory(current);\n while (true) {\n const marker = await safeLstat(path.join(current, \".git\"));\n if (marker) {\n if (\n marker.isSymbolicLink() ||\n (!marker.isDirectory() && !marker.isFile())\n ) {\n throw new RepositoryRootError(\n \"REPOSITORY_ROOT_INVALID\",\n \"The repository root is not safe for product Project state.\",\n );\n }\n return current;\n }\n\n const parent = path.dirname(current);\n if (parent === current) {\n throw new RepositoryRootError(\n \"REPOSITORY_ROOT_REQUIRED\",\n \"Run this command inside a repository before selecting a product Project.\",\n );\n }\n current = parent;\n }\n}\n\nasync function assertDirectory(candidate: string): Promise<void> {\n const stats = await safeLstat(candidate);\n if (!stats || stats.isSymbolicLink() || !stats.isDirectory()) {\n throw new RepositoryRootError(\n \"REPOSITORY_ROOT_INVALID\",\n \"The repository root is not safe for product Project state.\",\n );\n }\n}\n\nasync function safeLstat(candidate: string) {\n return lstat(candidate).catch((error: unknown) => {\n if (isNodeErrorCode(error, \"ENOENT\") || isNodeErrorCode(error, \"ENOTDIR\"))\n return undefined;\n throw unavailableRoot();\n });\n}\n\nfunction unavailableRoot(): RepositoryRootError {\n return new RepositoryRootError(\n \"REPOSITORY_ROOT_UNAVAILABLE\",\n \"The repository root could not be accessed.\",\n );\n}\n\nfunction isNodeErrorCode(error: unknown, code: string): boolean {\n return (\n error instanceof Error &&\n \"code\" in error &&\n (error as NodeJS.ErrnoException).code === code\n );\n}\n","import { z } from \"zod\";\nimport {\n SiteOSAuthApiError,\n resolveSiteOSAuthBaseUrl,\n type SiteOSAuthFetchLike,\n} from \"../siteos-auth-api.js\";\nimport type { ServiceGrantProvider } from \"../auth/application/service-grant-provider.js\";\n\nexport const PROJECT_SERVICES = [\n \"pulse\",\n \"cookie\",\n \"forms\",\n \"search\",\n \"trace\",\n \"seo\",\n] as const;\nexport type ProjectService = (typeof PROJECT_SERVICES)[number];\nconst ProjectSchema = z.object({\n id: z.string().min(1),\n organizationId: z.string().min(1),\n name: z.string(),\n slug: z.string(),\n domains: z.array(z.string()),\n environments: z.array(\n z.object({\n id: z.string(),\n name: z.string(),\n slug: z.string(),\n url: z.string().nullable().optional(),\n }),\n ),\n createdAt: z.string(),\n updatedAt: z.string(),\n});\nconst OverviewSchema = z.object({\n project: ProjectSchema,\n services: z.array(\n z.object({\n service: z.enum(PROJECT_SERVICES),\n attachment: z\n .object({\n resourceId: z.string(),\n projectId: z.string(),\n service: z.enum(PROJECT_SERVICES),\n createdAt: z.string(),\n environments: z.array(\n z.object({\n environmentId: z.string(),\n resourceId: z.string(),\n slug: z.string().optional(),\n }),\n ),\n })\n .nullable(),\n observation: z\n .object({\n state: z.enum([\n \"setup_required\",\n \"configured\",\n \"waiting\",\n \"active\",\n \"attention\",\n \"unavailable\",\n ]),\n summary: z.string(),\n observedAt: z.string().nullable(),\n })\n .nullable(),\n }),\n ),\n});\nexport type CommonProject = z.infer<typeof ProjectSchema>;\nexport type CommonProjectOverview = z.infer<typeof OverviewSchema>;\n\nexport function createProjectApi(input: {\n env?: NodeJS.ProcessEnv;\n fetchImpl?: SiteOSAuthFetchLike;\n grants: ServiceGrantProvider;\n}) {\n const origin = resolveSiteOSAuthBaseUrl(input.env);\n async function request<T>(\n path: string,\n schema: z.ZodType<T>,\n body?: unknown,\n method?: \"PATCH\",\n ) {\n const scope =\n body === undefined\n ? \"projects:workspace:read\"\n : \"projects:workspace:write\";\n const grant = await input.grants.acquire({\n audience: \"siteos-projects\",\n scopes: [scope],\n });\n if (\n grant.grant.audience !== \"siteos-projects\" ||\n !grant.grant.scopes.includes(scope)\n )\n throw invalidResponse();\n if (!input.fetchImpl)\n throw new SiteOSAuthApiError({\n code: \"AUTH_UNAVAILABLE\",\n message: \"SiteOS API access is unavailable.\",\n });\n const response = await input.fetchImpl(\n `${origin}/api/projects/v1/projects${path}`,\n {\n method: method ?? (body === undefined ? \"GET\" : \"POST\"),\n headers: {\n Authorization: `Bearer ${grant.accessToken}`,\n Accept: \"application/json\",\n ...(body === undefined ? {} : { \"Content-Type\": \"application/json\" }),\n },\n ...(body === undefined ? {} : { body: JSON.stringify(body) }),\n signal: AbortSignal.timeout(30_000),\n },\n );\n const value = await response.json();\n if (!response.ok) {\n const error = z\n .object({\n error: z.object({ code: z.string(), message: z.string().max(500) }),\n })\n .safeParse(value);\n throw new SiteOSAuthApiError({\n code: error.success ? error.data.error.code : \"PROJECT_REQUEST_FAILED\",\n message: error.success\n ? error.data.error.message\n : \"The Project request failed.\",\n status: response.status,\n });\n }\n const parsed = schema.safeParse(value);\n if (!parsed.success) throw invalidResponse();\n return { value: parsed.data, organizationId: grant.grant.organizationId };\n }\n function checkOrganization(project: CommonProject, organizationId: string) {\n if (project.organizationId !== organizationId) throw invalidResponse();\n }\n return {\n origin,\n async update(\n id: string,\n details: {\n name: string;\n slug: string;\n domains: string[];\n websiteUrl?: string | null;\n },\n ) {\n const { value, organizationId } = await request(\n `/${encodeURIComponent(id)}`,\n z.object({ project: ProjectSchema }),\n details,\n \"PATCH\",\n );\n checkOrganization(value.project, organizationId);\n if (value.project.id !== id) throw invalidResponse();\n return value.project;\n },\n async updateEnvironment(\n id: string,\n environmentId: string,\n details: { name: string; url: string | null },\n ) {\n const { value, organizationId } = await request(\n `/${encodeURIComponent(id)}/environments/${encodeURIComponent(environmentId)}`,\n z.object({ project: ProjectSchema }),\n details,\n \"PATCH\",\n );\n checkOrganization(value.project, organizationId);\n if (value.project.id !== id) throw invalidResponse();\n return value.project;\n },\n async list() {\n const { value, organizationId } = await request(\n \"\",\n z.object({ projects: z.array(ProjectSchema) }),\n );\n value.projects.forEach((project) =>\n checkOrganization(project, organizationId),\n );\n return value.projects;\n },\n async get(id: string, environmentSlug?: string) {\n const { value, organizationId } = await request(\n `/${encodeURIComponent(id)}${environmentSlug ? `?env=${encodeURIComponent(environmentSlug)}` : \"\"}`,\n OverviewSchema,\n );\n checkOrganization(value.project, organizationId);\n if (\n value.project.id !== id ||\n value.services.some(\n (service) =>\n service.attachment &&\n (service.attachment.projectId !== id ||\n service.attachment.service !== service.service),\n )\n )\n throw invalidResponse();\n return value;\n },\n async create(details: {\n name: string;\n slug: string;\n domains: string[];\n websiteUrl?: string;\n }) {\n const { value, organizationId } = await request(\n \"\",\n z.object({ project: ProjectSchema }),\n details,\n );\n checkOrganization(value.project, organizationId);\n return value.project;\n },\n async connect(\n id: string,\n service: ProjectService,\n resourceId?: string,\n environmentSlug?: string,\n ) {\n await request(\n `/${encodeURIComponent(id)}/services/${service}${environmentSlug ? `?env=${encodeURIComponent(environmentSlug)}` : \"\"}`,\n z.object({\n attachment: z.object({\n resourceId: z.string(),\n projectId: z.literal(id),\n service: z.literal(service),\n }),\n }),\n resourceId ? { resourceId } : { create: true },\n );\n return this.get(id, environmentSlug);\n },\n async createEnvironment(\n id: string,\n details: { name: string; slug: string; url?: string },\n ) {\n const { value, organizationId } = await request(\n `/${encodeURIComponent(id)}/environments`,\n z.object({ project: ProjectSchema }),\n details,\n );\n checkOrganization(value.project, organizationId);\n if (value.project.id !== id) throw invalidResponse();\n return value.project;\n },\n async availableEnvironments(id: string, service: ProjectService) {\n return (\n await request(\n `/${encodeURIComponent(id)}/services/${service}/environments`,\n z.object({\n environments: z.array(\n z.object({ id: z.string(), name: z.string(), slug: z.string() }),\n ),\n }),\n )\n ).value.environments;\n },\n async connectEnvironment(\n id: string,\n service: ProjectService,\n environmentId: string,\n resourceId?: string,\n ) {\n await request(\n `/${encodeURIComponent(id)}/services/${service}/environments/${encodeURIComponent(environmentId)}`,\n z.object({\n attachment: z.object({\n projectId: z.literal(id),\n service: z.literal(service),\n }),\n }),\n resourceId ? { resourceId } : { create: true },\n );\n return this.get(id);\n },\n };\n}\nfunction invalidResponse() {\n return new SiteOSAuthApiError({\n code: \"AUTH_INVALID_RESPONSE\",\n message: \"SiteOS returned an invalid Project response.\",\n });\n}\n","import path from \"node:path\";\n\nimport { z } from \"zod\";\n\nimport {\n findRepositoryRoot,\n RepositoryRootError,\n} from \"../core/adapters/node-repository-root.js\";\nimport {\n JsonDocumentStoreError,\n NodeJsonDocumentStore,\n} from \"../core/adapters/node-json-document-store.js\";\nimport type {\n JsonDocumentCodec,\n JsonDocumentStore,\n} from \"../core/ports/json-document-store.js\";\n\nexport const FORMS_PROJECT_REFERENCE_RELATIVE_PATH = path.join(\n \".siteos\",\n \"forms\",\n \"project.json\",\n);\n\nconst formsProjectReferenceSchema = z\n .object({\n version: z.literal(1),\n service: z.literal(\"forms\"),\n project: z\n .object({\n name: z.string().trim().min(1).max(255),\n slug: z\n .string()\n .trim()\n .min(1)\n .max(80)\n .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),\n })\n .strict(),\n })\n .strict();\n\nexport type FormsProjectReference = z.infer<typeof formsProjectReferenceSchema>;\n\nconst codec: JsonDocumentCodec<FormsProjectReference> = {\n decode(input) {\n return { migrated: false, value: formsProjectReferenceSchema.parse(input) };\n },\n encode(value) {\n return formsProjectReferenceSchema.parse(value);\n },\n};\n\nexport type FormsProjectReferenceState =\n | {\n checksum: string;\n reference: FormsProjectReference;\n rootDir: string;\n status: \"loaded\";\n }\n | { rootDir: string; status: \"missing\" };\n\nexport type FormsProjectReferenceErrorCode =\n | \"FORMS_PROJECT_REFERENCE_CONFLICT\"\n | \"FORMS_PROJECT_REFERENCE_INVALID\"\n | \"FORMS_PROJECT_REFERENCE_REQUIRED\"\n | \"FORMS_PROJECT_REFERENCE_UNAVAILABLE\";\n\nexport class FormsProjectReferenceError extends Error {\n readonly code: FormsProjectReferenceErrorCode;\n\n constructor(code: FormsProjectReferenceErrorCode, message: string) {\n super(message);\n this.name = \"FormsProjectReferenceError\";\n this.code = code;\n }\n}\n\nexport async function inspectFormsProjectReference(\n startDir: string,\n documents: JsonDocumentStore = new NodeJsonDocumentStore(),\n): Promise<FormsProjectReferenceState> {\n try {\n const rootDir = await findRepositoryRoot(startDir);\n const snapshot = await documents.read({\n codec,\n filePath: path.join(rootDir, FORMS_PROJECT_REFERENCE_RELATIVE_PATH),\n security: \"tracked\",\n });\n if (snapshot.status === \"missing\") return { rootDir, status: \"missing\" };\n return {\n checksum: snapshot.checksum,\n reference: snapshot.value,\n rootDir,\n status: \"loaded\",\n };\n } catch (error) {\n throw mapReferenceError(error);\n }\n}\n\nexport async function writeFormsProjectReference(options: {\n documents?: JsonDocumentStore;\n expectedChecksum?: string | null;\n project: { name: string; slug: string };\n rootDir: string;\n}): Promise<FormsProjectReference> {\n const reference = formsProjectReferenceSchema.parse({\n version: 1,\n service: \"forms\",\n project: options.project,\n });\n try {\n await (options.documents ?? new NodeJsonDocumentStore()).write({\n codec,\n expectedChecksum: options.expectedChecksum,\n filePath: path.join(\n await findRepositoryRoot(options.rootDir),\n FORMS_PROJECT_REFERENCE_RELATIVE_PATH,\n ),\n security: \"tracked\",\n value: reference,\n });\n return reference;\n } catch (error) {\n throw mapReferenceError(error);\n }\n}\n\nfunction mapReferenceError(error: unknown): FormsProjectReferenceError {\n if (error instanceof FormsProjectReferenceError) return error;\n if (error instanceof RepositoryRootError) throw error;\n if (error instanceof JsonDocumentStoreError) {\n if (error.code === \"JSON_DOCUMENT_CONFLICT\") {\n return new FormsProjectReferenceError(\n \"FORMS_PROJECT_REFERENCE_CONFLICT\",\n \"The Forms Project reference changed before it could be saved.\",\n );\n }\n if (\n error.code === \"JSON_DOCUMENT_INVALID\" ||\n error.code === \"JSON_DOCUMENT_UNSAFE\"\n ) {\n return new FormsProjectReferenceError(\n \"FORMS_PROJECT_REFERENCE_INVALID\",\n \"The Forms Project reference is invalid.\",\n );\n }\n }\n if (error instanceof z.ZodError) {\n return new FormsProjectReferenceError(\n \"FORMS_PROJECT_REFERENCE_INVALID\",\n \"The Forms Project reference is invalid.\",\n );\n }\n return new FormsProjectReferenceError(\n \"FORMS_PROJECT_REFERENCE_UNAVAILABLE\",\n \"The Forms Project reference could not be accessed.\",\n );\n}\n","import { createHash, randomBytes } from \"node:crypto\";\nimport { readFile, rename, unlink, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { z } from \"zod\";\n\nimport { CliError } from \"./errors.js\";\n\nexport const CONFIG_FILE = \"siteos.config.json\";\n\nfunction isSafeRelativePath(value: string): boolean {\n if (!value || path.isAbsolute(value) || value.startsWith(\"!\")) return false;\n return !value.split(/[\\\\/]/).includes(\"..\");\n}\n\nconst safeRelativePath = z\n .string()\n .trim()\n .min(1)\n .refine(\n isSafeRelativePath,\n \"Use a relative path without '..' or negated glob patterns.\",\n );\n\nconst slug = z\n .string()\n .trim()\n .min(1)\n .max(80)\n .regex(\n /^[a-z0-9]+(?:-[a-z0-9]+)*$/,\n \"Use lowercase letters, numbers, and hyphens.\",\n );\n\nconst displayName = z.string().trim().min(1).max(120);\n\nconst httpUrl = z\n .string()\n .url()\n .refine((value) => [\"http:\", \"https:\"].includes(new URL(value).protocol), {\n message: \"Use an HTTP or HTTPS URL.\",\n });\n\nconst legacySchedule = z\n .object({\n enabled: z.boolean().default(true),\n cadenceSeconds: z.number().int().min(60).max(2_592_000).default(300),\n })\n .default({ enabled: true, cadenceSeconds: 300 });\n\nexport const ChecksConfigV1Schema = z.object({\n version: z.literal(1),\n project: slug,\n suite: slug.default(\"smoke\"),\n testsDir: safeRelativePath.default(\"tests/checks\"),\n playwrightConfig: safeRelativePath.optional(),\n include: z.array(safeRelativePath).min(1).max(100),\n baseUrl: httpUrl.optional(),\n schedule: legacySchedule,\n apiUrl: httpUrl.optional(),\n});\n\nconst ScheduledConfigSchema = z.object({\n mode: z.literal(\"scheduled\"),\n cadenceSeconds: z.number().int().min(60).max(2_592_000).default(300),\n});\n\nconst ManualConfigSchema = z.object({ mode: z.literal(\"manual\") });\n\nexport const CheckConfigSchema = z.object({\n slug,\n name: displayName,\n include: z.array(safeRelativePath).min(1).max(100),\n active: z.boolean().default(true),\n schedule: z\n .discriminatedUnion(\"mode\", [ScheduledConfigSchema, ManualConfigSchema])\n .default({ mode: \"scheduled\", cadenceSeconds: 300 }),\n});\n\nexport const ChecksConfigV2Schema = z\n .object({\n version: z.literal(2),\n project: z.object({\n slug,\n name: displayName,\n baseUrl: httpUrl.optional(),\n monitoringEnabled: z.boolean().default(true),\n }),\n testsDir: safeRelativePath.default(\"tests/siteos\"),\n playwrightConfig: safeRelativePath.optional(),\n bundle: z\n .object({ include: z.array(safeRelativePath).max(500).default([]) })\n .strict()\n .optional(),\n checks: z.array(CheckConfigSchema).min(1).max(100),\n apiUrl: httpUrl.optional(),\n })\n .superRefine((config, context) => {\n const slugs = new Set<string>();\n for (const [index, check] of config.checks.entries()) {\n if (slugs.has(check.slug)) {\n context.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"checks\", index, \"slug\"],\n message: `Duplicate Check slug: ${check.slug}`,\n });\n }\n slugs.add(check.slug);\n }\n });\n\nexport const ChecksConfigSchema = z.union([\n ChecksConfigV1Schema,\n ChecksConfigV2Schema,\n]);\n\nexport type ChecksConfigV1 = z.infer<typeof ChecksConfigV1Schema>;\nexport type ChecksConfig = z.infer<typeof ChecksConfigV2Schema>;\nexport type ChecksConfigFile = z.infer<typeof ChecksConfigSchema>;\n\nexport type ChecksConfigSnapshot = {\n configFile: string;\n source: string;\n checksum: string;\n fileConfig: ChecksConfigFile;\n config: ChecksConfig;\n migrationRequired: boolean;\n};\n\nfunction sourceChecksum(source: string): string {\n return createHash(\"sha256\").update(source).digest(\"hex\");\n}\n\nfunction titleFromSlug(value: string): string {\n return value\n .split(\"-\")\n .filter(Boolean)\n .map((part) => `${part.charAt(0).toUpperCase()}${part.slice(1)}`)\n .join(\" \");\n}\n\nexport function normalizeChecksConfig(config: ChecksConfigFile): ChecksConfig {\n if (config.version === 2) return config;\n\n return ChecksConfigV2Schema.parse({\n version: 2,\n project: {\n slug: config.project,\n name: titleFromSlug(config.project),\n baseUrl: config.baseUrl,\n monitoringEnabled: true,\n },\n testsDir: config.testsDir,\n playwrightConfig: config.playwrightConfig,\n checks: [\n {\n slug: config.suite,\n name: titleFromSlug(config.suite),\n include: config.include,\n active: true,\n schedule: config.schedule.enabled\n ? {\n mode: \"scheduled\",\n cadenceSeconds: config.schedule.cadenceSeconds,\n }\n : { mode: \"manual\" },\n },\n ],\n apiUrl: config.apiUrl,\n });\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await readFile(filePath);\n return true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return false;\n throw error;\n }\n}\n\nexport async function findChecksConfigFile(\n projectRoot: string,\n): Promise<string | null> {\n return (await fileExists(path.join(projectRoot, CONFIG_FILE)))\n ? CONFIG_FILE\n : null;\n}\n\nexport async function loadChecksConfigFile(\n projectRoot: string,\n): Promise<ChecksConfigFile> {\n return (await loadChecksConfigSnapshot(projectRoot)).fileConfig;\n}\n\nexport async function loadChecksConfigSnapshot(\n projectRoot: string,\n): Promise<ChecksConfigSnapshot> {\n const configFile = await findChecksConfigFile(projectRoot);\n if (!configFile) {\n throw new CliError(\n \"CONFIG_NOT_FOUND\",\n `${CONFIG_FILE} was not found in ${projectRoot}.`,\n {\n hint: \"Run `siteos pulse init` from the project root.\",\n },\n );\n }\n const configPath = path.join(projectRoot, configFile);\n let source: string;\n try {\n source = await readFile(configPath, \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new CliError(\n \"CONFIG_NOT_FOUND\",\n `${configFile} was not found in ${projectRoot}.`,\n {\n hint: \"Run `siteos pulse init` from the project root.\",\n },\n );\n }\n throw error;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(source);\n } catch {\n throw new CliError(\n \"CONFIG_INVALID_JSON\",\n `${configFile} is not valid JSON.`,\n );\n }\n\n const result = ChecksConfigSchema.safeParse(parsed);\n if (!result.success) {\n const details = result.error.issues\n .map((issue) => `${issue.path.join(\".\") || \"config\"}: ${issue.message}`)\n .join(\"; \");\n throw new CliError(\n \"CONFIG_INVALID\",\n `${configFile} is invalid: ${details}`,\n );\n }\n const fileConfig = result.data;\n return {\n configFile,\n source,\n checksum: sourceChecksum(source),\n fileConfig,\n config: normalizeChecksConfig(fileConfig),\n migrationRequired: fileConfig.version === 1,\n };\n}\n\nexport async function loadChecksConfig(\n projectRoot: string,\n): Promise<ChecksConfig> {\n return normalizeChecksConfig(await loadChecksConfigFile(projectRoot));\n}\n\nexport async function saveChecksConfig(\n projectRoot: string,\n config: ChecksConfig,\n options: { expectedChecksum?: string } = {},\n): Promise<void> {\n const configFile = (await findChecksConfigFile(projectRoot)) ?? CONFIG_FILE;\n const configPath = path.join(projectRoot, configFile);\n const temporaryPath = path.join(\n projectRoot,\n `.${configFile}.${process.pid}.${randomBytes(6).toString(\"hex\")}`,\n );\n try {\n await writeFile(\n temporaryPath,\n `${JSON.stringify(ChecksConfigV2Schema.parse(config), null, 2)}\\n`,\n {\n encoding: \"utf8\",\n flag: \"wx\",\n },\n );\n if (options.expectedChecksum) {\n const currentSource = await readFile(configPath, \"utf8\").catch(\n (error: unknown) => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n },\n );\n if (\n currentSource === null ||\n sourceChecksum(currentSource) !== options.expectedChecksum\n ) {\n throw new CliError(\n \"CONFIG_CHANGED\",\n `${configFile} changed while synchronization was being reviewed.`,\n {\n hint: \"Run `siteos pulse sync` again and review the latest configuration.\",\n },\n );\n }\n }\n await rename(temporaryPath, configPath);\n } catch (error) {\n await unlink(temporaryPath).catch(() => undefined);\n throw error;\n }\n}\n\nexport async function reconcileProjectSlug(\n projectRoot: string,\n projectSlug: string,\n options: { expectedChecksum?: string } = {},\n): Promise<ChecksConfigSnapshot> {\n const snapshot = await loadChecksConfigSnapshot(projectRoot);\n const config = ChecksConfigV2Schema.parse({\n ...snapshot.config,\n project: { ...snapshot.config.project, slug: projectSlug },\n });\n if (\n config.project.slug !== snapshot.config.project.slug ||\n snapshot.migrationRequired\n ) {\n await saveChecksConfig(projectRoot, config, {\n expectedChecksum: options.expectedChecksum ?? snapshot.checksum,\n });\n }\n return loadChecksConfigSnapshot(projectRoot);\n}\n\nexport function projectSlug(value: string): string {\n const normalized = value\n .trim()\n .toLowerCase()\n .replace(/^@[^/]+\\//, \"\")\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/(^-|-$)/g, \"\")\n .slice(0, 80);\n return normalized || \"siteos-pulse-project\";\n}\n\nexport function projectDisplayName(value: string): string {\n const withoutScope = value.trim().replace(/^@[^/]+\\//, \"\");\n const words = withoutScope\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .split(/[^A-Za-z0-9]+/)\n .filter(Boolean);\n const name = words\n .map((word) => `${word.charAt(0).toUpperCase()}${word.slice(1)}`)\n .join(\" \");\n return name.slice(0, 120) || \"SiteOS Pulse Project\";\n}\n","export class CliError extends Error {\n readonly code: string;\n readonly exitCode: number;\n readonly hint?: string;\n\n constructor(\n code: string,\n message: string,\n options?: { exitCode?: number; hint?: string },\n ) {\n super(message);\n this.name = \"CliError\";\n this.code = code;\n this.exitCode = options?.exitCode ?? 1;\n this.hint = options?.hint;\n }\n}\n\nexport function normalizeCliError(error: unknown): CliError {\n if (error instanceof CliError) return error;\n if (error instanceof Error) {\n return new CliError(\"UNEXPECTED_ERROR\", error.message, {\n hint: \"Run the command again with a valid SiteOS Pulse project configuration.\",\n });\n }\n return new CliError(\"UNEXPECTED_ERROR\", \"An unexpected error occurred.\");\n}\n","import path from \"node:path\";\n\nimport { z } from \"zod\";\n\nimport {\n findRepositoryRoot,\n RepositoryRootError,\n} from \"../core/adapters/node-repository-root.js\";\nimport {\n JsonDocumentStoreError,\n NodeJsonDocumentStore,\n} from \"../core/adapters/node-json-document-store.js\";\nimport type {\n JsonDocumentCodec,\n JsonDocumentStore,\n} from \"../core/ports/json-document-store.js\";\n\nexport const SEARCH_PROJECT_REFERENCE_RELATIVE_PATH = path.join(\n \".siteos\",\n \"search\",\n \"project.json\",\n);\n\nconst searchProjectReferenceSchema = z\n .object({\n version: z.literal(1),\n service: z.literal(\"search\"),\n project: z\n .object({\n name: z.string().trim().min(1).max(255),\n slug: z\n .string()\n .trim()\n .min(1)\n .max(120)\n .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),\n })\n .strict(),\n })\n .strict();\n\nexport type SearchProjectReference = z.infer<\n typeof searchProjectReferenceSchema\n>;\n\nconst codec: JsonDocumentCodec<SearchProjectReference> = {\n decode(input) {\n return {\n migrated: false,\n value: searchProjectReferenceSchema.parse(input),\n };\n },\n encode(value) {\n return searchProjectReferenceSchema.parse(value);\n },\n};\n\nexport type SearchProjectReferenceState =\n | {\n checksum: string;\n reference: SearchProjectReference;\n rootDir: string;\n status: \"loaded\";\n }\n | { rootDir: string; status: \"missing\" };\n\nexport type SearchProjectReferenceErrorCode =\n | \"SEARCH_PROJECT_REFERENCE_CONFLICT\"\n | \"SEARCH_PROJECT_REFERENCE_INVALID\"\n | \"SEARCH_PROJECT_REFERENCE_REQUIRED\"\n | \"SEARCH_PROJECT_REFERENCE_UNAVAILABLE\";\n\nexport class SearchProjectReferenceError extends Error {\n readonly code: SearchProjectReferenceErrorCode;\n\n constructor(code: SearchProjectReferenceErrorCode, message: string) {\n super(message);\n this.name = \"SearchProjectReferenceError\";\n this.code = code;\n }\n}\n\nexport async function inspectSearchProjectReference(\n startDir: string,\n documents: JsonDocumentStore = new NodeJsonDocumentStore(),\n): Promise<SearchProjectReferenceState> {\n try {\n const rootDir = await findRepositoryRoot(startDir);\n const snapshot = await documents.read({\n codec,\n filePath: path.join(rootDir, SEARCH_PROJECT_REFERENCE_RELATIVE_PATH),\n security: \"tracked\",\n });\n if (snapshot.status === \"missing\") return { rootDir, status: \"missing\" };\n return {\n checksum: snapshot.checksum,\n reference: snapshot.value,\n rootDir,\n status: \"loaded\",\n };\n } catch (error) {\n throw mapReferenceError(error);\n }\n}\n\nexport async function writeSearchProjectReference(options: {\n documents?: JsonDocumentStore;\n expectedChecksum?: string | null;\n project: { name: string; slug: string };\n rootDir: string;\n}): Promise<SearchProjectReference> {\n const reference = searchProjectReferenceSchema.parse({\n version: 1,\n service: \"search\",\n project: options.project,\n });\n try {\n await (options.documents ?? new NodeJsonDocumentStore()).write({\n codec,\n expectedChecksum: options.expectedChecksum,\n filePath: path.join(\n await findRepositoryRoot(options.rootDir),\n SEARCH_PROJECT_REFERENCE_RELATIVE_PATH,\n ),\n security: \"tracked\",\n value: reference,\n });\n return reference;\n } catch (error) {\n throw mapReferenceError(error);\n }\n}\n\nfunction mapReferenceError(error: unknown): SearchProjectReferenceError {\n if (error instanceof SearchProjectReferenceError) return error;\n if (error instanceof RepositoryRootError) throw error;\n if (error instanceof JsonDocumentStoreError) {\n if (error.code === \"JSON_DOCUMENT_CONFLICT\") {\n return new SearchProjectReferenceError(\n \"SEARCH_PROJECT_REFERENCE_CONFLICT\",\n \"The Search Project reference changed before it could be saved.\",\n );\n }\n if (\n error.code === \"JSON_DOCUMENT_INVALID\" ||\n error.code === \"JSON_DOCUMENT_UNSAFE\"\n ) {\n return new SearchProjectReferenceError(\n \"SEARCH_PROJECT_REFERENCE_INVALID\",\n \"The Search Project reference is invalid.\",\n );\n }\n }\n if (error instanceof z.ZodError) {\n return new SearchProjectReferenceError(\n \"SEARCH_PROJECT_REFERENCE_INVALID\",\n \"The Search Project reference is invalid.\",\n );\n }\n return new SearchProjectReferenceError(\n \"SEARCH_PROJECT_REFERENCE_UNAVAILABLE\",\n \"The Search Project reference could not be accessed.\",\n );\n}\n","import { createHash, randomBytes } from \"node:crypto\";\nimport os from \"node:os\";\n\nimport { z } from \"zod\";\n\nimport {\n createSiteOSAuthApiClient,\n isDefinitiveInvalidSession,\n resolveSiteOSAuthBaseUrl,\n SiteOSAuthApiError,\n type SiteOSAuthFetchLike,\n type SiteOSAuthOrganizationsResponse,\n type SiteOSCliOrganization,\n type SiteOSCliSessionStatus,\n} from \"./siteos-auth-api.js\";\nimport {\n loadSiteOSAuthState,\n SITEOS_AUTH_STATE_VERSION,\n SiteOSAuthStateError,\n type SiteOSSelectedOrganization,\n type SiteOSAuthState,\n writeSiteOSAuthState,\n} from \"./siteos-auth-state.js\";\nimport { resolveSiteOSConfigHome } from \"./siteos-config.js\";\n\nconst HELP_FLAGS = new Set([\"--help\", \"-h\"]);\nconst organizationDisplayNameSchema = z\n .string()\n .transform((value) => value.trim())\n .refine((value) => {\n const visibleLength = Array.from(value).length;\n return visibleLength >= 2 && visibleLength <= 80;\n });\n\nexport const AUTH_HELP = `Usage:\n siteos auth start --email <email> [--json]\n siteos auth complete --token <token> [--json]\n siteos auth status [--json]\n siteos auth organizations [--json]\n siteos auth organizations create --display-name <display-name> [--json]\n siteos auth select --organization <organization-id> [--json]\n siteos auth logout [--json]\n\nAuthenticate the SiteOS CLI with a user-level session.`;\n\nexport type AuthCommandResult = {\n exitCode: number;\n stderr?: string;\n stdout?: string;\n};\n\nexport async function runAuthCommand(options: {\n args: string[];\n env?: NodeJS.ProcessEnv;\n fetchImpl?: SiteOSAuthFetchLike;\n generateInstallationId?: () => string;\n generatePkceVerifier?: () => string;\n homeDir?: string;\n now?: () => Date;\n}): Promise<AuthCommandResult> {\n if (\n options.args.length === 0 ||\n options.args.some((arg) => HELP_FLAGS.has(arg))\n ) {\n return { exitCode: 0, stdout: AUTH_HELP };\n }\n\n const subcommand = options.args[0];\n const args = options.args.slice(1);\n const configHome = resolveSiteOSConfigHome({\n env: options.env,\n homeDir: options.homeDir ?? os.homedir(),\n });\n const now = options.now ?? (() => new Date());\n\n if (subcommand === \"start\") {\n const parsed = parseValueCommand(args, \"--email\");\n if (!parsed.ok) return usageError(parsed.error, parsed.json);\n const email = z.string().trim().email().safeParse(parsed.value);\n if (!email.success) return usageError(\"--email is invalid.\", parsed.json);\n return runStart({\n ...options,\n configHome,\n email: email.data,\n json: parsed.json,\n now,\n });\n }\n\n if (subcommand === \"complete\") {\n const parsed = parseValueCommand(args, \"--token\");\n if (!parsed.ok) return usageError(parsed.error, parsed.json);\n const token = z\n .string()\n .trim()\n .regex(/^[A-Za-z0-9_-]{16}$/)\n .safeParse(parsed.value);\n if (!token.success) return usageError(\"--token is invalid.\", parsed.json);\n return runComplete({\n ...options,\n configHome,\n json: parsed.json,\n token: token.data,\n });\n }\n\n if (subcommand === \"select\") {\n const parsed = parseValueCommand(args, \"--organization\");\n if (!parsed.ok) return usageError(parsed.error, parsed.json);\n return runSelectOrganization({\n ...options,\n configHome,\n json: parsed.json,\n organization: parsed.value,\n });\n }\n\n if (subcommand === \"organizations\" && args[0] === \"create\") {\n const parsed = parseValueCommand(args.slice(1), \"--display-name\");\n if (!parsed.ok) return usageError(parsed.error, parsed.json);\n const displayName = organizationDisplayNameSchema.safeParse(parsed.value);\n if (!displayName.success) {\n return usageError(\"--display-name is invalid.\", parsed.json);\n }\n return runCreateOrganization({\n ...options,\n configHome,\n displayName: displayName.data,\n json: parsed.json,\n });\n }\n\n if (\n subcommand === \"status\" ||\n subcommand === \"organizations\" ||\n subcommand === \"logout\"\n ) {\n const parsed = parseJsonOnly(args);\n if (!parsed.ok) return usageError(parsed.error, parsed.json);\n if (subcommand === \"status\") {\n return runStatus({ ...options, configHome, json: parsed.json });\n }\n if (subcommand === \"organizations\") {\n return runOrganizations({ ...options, configHome, json: parsed.json });\n }\n return runLogout({ ...options, configHome, json: parsed.json });\n }\n\n return usageError(\"Unknown SiteOS Auth command.\", args.includes(\"--json\"));\n}\n\nasync function runStart(options: {\n configHome: string;\n email: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: SiteOSAuthFetchLike;\n generateInstallationId?: () => string;\n generatePkceVerifier?: () => string;\n json: boolean;\n now: () => Date;\n}): Promise<AuthCommandResult> {\n try {\n const loaded = await loadSiteOSAuthState({\n configHome: options.configHome,\n });\n const installationId =\n loaded.status === \"loaded\"\n ? loaded.state.installationId\n : (options.generateInstallationId ?? generateOpaqueValue)();\n const pkceVerifier =\n options.generatePkceVerifier?.() ?? generateOpaqueValue();\n const client = createClient(options);\n const response = await client.start({\n email: options.email,\n installationIdHash: sha256Base64Url(installationId),\n pkceChallenge: sha256Base64Url(pkceVerifier),\n });\n const state: SiteOSAuthState = {\n ...(loaded.status === \"loaded\" ? loaded.state : {}),\n installationId,\n pending: {\n requestId: response.requestId,\n pkceVerifier,\n expiresAt:\n Math.floor(options.now().getTime() / 1_000) +\n response.expiresInSeconds,\n },\n version: SITEOS_AUTH_STATE_VERSION,\n };\n await writeSiteOSAuthState({ configHome: options.configHome, state });\n\n const safe = {\n status: response.status,\n channel: response.channel,\n expiresInSeconds: response.expiresInSeconds,\n };\n return {\n exitCode: 0,\n stdout: options.json\n ? JSON.stringify(safe, null, 2)\n : \"SiteOS sign-in email sent. Run the completion command from the email.\",\n };\n } catch (error) {\n return formatError(error, options.json);\n }\n}\n\nasync function runComplete(options: {\n configHome: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: SiteOSAuthFetchLike;\n json: boolean;\n token: string;\n}): Promise<AuthCommandResult> {\n try {\n const loaded = await loadSiteOSAuthState({\n configHome: options.configHome,\n });\n if (loaded.status === \"missing\" || !loaded.state.pending) {\n return commandError(\n \"AUTH_REQUEST_MISSING\",\n \"No pending SiteOS authorization request was found.\",\n options.json,\n );\n }\n const response = await createClient(options).complete({\n pkceVerifier: loaded.state.pending.pkceVerifier,\n requestId: loaded.state.pending.requestId,\n token: options.token,\n });\n if (response.session.status !== \"authenticated\") {\n throw new SiteOSAuthApiError({\n code: \"AUTH_INVALID_RESPONSE\",\n message: \"The SiteOS Auth service returned an invalid response.\",\n });\n }\n await writeSiteOSAuthState({\n configHome: options.configHome,\n state: {\n installationId: loaded.state.installationId,\n session: {\n credential: response.sessionCredential,\n metadata: response.session,\n selectedOrganization: response.session.organization\n ? { id: response.session.organization.id }\n : undefined,\n },\n version: SITEOS_AUTH_STATE_VERSION,\n },\n });\n return sessionResult(response.session, options.json, \"authenticated\");\n } catch (error) {\n return formatError(error, options.json);\n }\n}\n\nasync function runStatus(options: {\n configHome: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: SiteOSAuthFetchLike;\n json: boolean;\n}): Promise<AuthCommandResult> {\n try {\n const loaded = await loadSiteOSAuthState({\n configHome: options.configHome,\n });\n if (loaded.status === \"missing\" || !loaded.state.session) {\n return signedOutResult(options.json);\n }\n try {\n const client = createClient(options);\n const session = await client.status({\n sessionCredential: loaded.state.session.credential,\n });\n if (session.status !== \"authenticated\") {\n await writeSiteOSAuthState({\n configHome: options.configHome,\n state: { ...loaded.state, session: undefined },\n });\n } else {\n const organizations = await client.organizations({\n sessionCredential: loaded.state.session.credential,\n });\n const selectedOrganization = reconcileSelectedOrganization(\n session.organization\n ? { id: session.organization.id }\n : loaded.state.session.selectedOrganization,\n organizations.organizations,\n );\n const selectedOrganizationDetails = selectedOrganization\n ? organizations.organizations.find(\n (organization) => organization.id === selectedOrganization.id,\n )\n : undefined;\n await writeSiteOSAuthState({\n configHome: options.configHome,\n state: {\n ...loaded.state,\n session: {\n ...loaded.state.session,\n metadata: session,\n selectedOrganization,\n },\n },\n });\n return sessionResult(\n {\n ...session,\n organization: selectedOrganizationDetails\n ? sessionOrganization(selectedOrganizationDetails)\n : null,\n },\n options.json,\n session.status,\n );\n }\n return sessionResult(session, options.json, session.status);\n } catch (error) {\n if (!isDefinitiveInvalidSession(error)) throw error;\n await writeSiteOSAuthState({\n configHome: options.configHome,\n state: { ...loaded.state, session: undefined },\n });\n return signedOutResult(options.json);\n }\n } catch (error) {\n return formatError(error, options.json);\n }\n}\n\nasync function runOrganizations(options: {\n configHome: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: SiteOSAuthFetchLike;\n json: boolean;\n}): Promise<AuthCommandResult> {\n try {\n const context = await loadOrganizationContext(options);\n const selectedOrganization = reconcileSelectedOrganization(\n context.loaded.state.session.selectedOrganization,\n context.response.organizations,\n );\n const selectedOrganizationDetails = selectedOrganization\n ? context.response.organizations.find(\n (organization) => organization.id === selectedOrganization.id,\n )\n : undefined;\n await writeSiteOSAuthState({\n configHome: options.configHome,\n state: {\n ...context.loaded.state,\n session: {\n ...context.loaded.state.session,\n selectedOrganization,\n },\n },\n });\n return organizationsResult(\n context.response,\n selectedOrganizationDetails ?? null,\n options.json,\n );\n } catch (error) {\n return formatError(error, options.json);\n }\n}\n\nasync function runCreateOrganization(options: {\n configHome: string;\n displayName: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: SiteOSAuthFetchLike;\n json: boolean;\n}): Promise<AuthCommandResult> {\n try {\n const loaded = await loadSiteOSAuthState({\n configHome: options.configHome,\n });\n if (loaded.status === \"missing\" || !loaded.state.session) {\n throw new SiteOSAuthApiError({\n code: \"AUTH_SESSION_REQUIRED\",\n message: \"Authenticate the SiteOS CLI first.\",\n });\n }\n const response = await createClient(options).createOrganization({\n displayName: options.displayName,\n sessionCredential: loaded.state.session.credential,\n });\n await writeSiteOSAuthState({\n configHome: options.configHome,\n state: {\n ...loaded.state,\n session: {\n ...loaded.state.session,\n selectedOrganization: { id: response.organization.id },\n },\n },\n });\n return createdOrganizationResult(response.organization, options.json);\n } catch (error) {\n return formatError(error, options.json);\n }\n}\n\nasync function runSelectOrganization(options: {\n configHome: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: SiteOSAuthFetchLike;\n json: boolean;\n organization: string;\n}): Promise<AuthCommandResult> {\n try {\n const context = await loadOrganizationContext(options);\n const exactId = context.response.organizations.find(\n (organization) => organization.id === options.organization,\n );\n const selected = exactId;\n if (!selected) {\n return commandError(\n \"ORGANIZATION_NOT_FOUND\",\n \"The requested SiteOS Organization is not available.\",\n options.json,\n );\n }\n const selectedOrganization = { id: selected.id };\n await writeSiteOSAuthState({\n configHome: options.configHome,\n state: {\n ...context.loaded.state,\n session: {\n ...context.loaded.state.session,\n selectedOrganization,\n },\n },\n });\n return selectedOrganizationResult(selected, options.json);\n } catch (error) {\n return formatError(error, options.json);\n }\n}\n\nasync function loadOrganizationContext(options: {\n configHome: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: SiteOSAuthFetchLike;\n}): Promise<{\n loaded: {\n status: \"loaded\";\n state: SiteOSAuthState & {\n session: NonNullable<SiteOSAuthState[\"session\"]>;\n };\n };\n response: SiteOSAuthOrganizationsResponse;\n}> {\n const loaded = await loadSiteOSAuthState({ configHome: options.configHome });\n if (loaded.status === \"missing\" || !loaded.state.session) {\n throw new SiteOSAuthApiError({\n code: \"AUTH_SESSION_REQUIRED\",\n message: \"Authenticate the SiteOS CLI first.\",\n });\n }\n const authenticated = {\n status: \"loaded\" as const,\n state: { ...loaded.state, session: loaded.state.session },\n };\n try {\n const response = await createClient(options).organizations({\n sessionCredential: authenticated.state.session.credential,\n });\n return { loaded: authenticated, response };\n } catch (error) {\n if (isDefinitiveInvalidSession(error)) {\n await writeSiteOSAuthState({\n configHome: options.configHome,\n state: { ...loaded.state, session: undefined },\n });\n }\n throw error;\n }\n}\n\nfunction reconcileSelectedOrganization(\n current: SiteOSSelectedOrganization | undefined,\n organizations: SiteOSCliOrganization[],\n): SiteOSSelectedOrganization | undefined {\n if (organizations.length === 1) {\n return { id: organizations[0].id };\n }\n if (!current) return undefined;\n const currentMembership = organizations.find(\n (organization) => organization.id === current.id,\n );\n return currentMembership ? { id: currentMembership.id } : undefined;\n}\n\nfunction organizationsResult(\n response: SiteOSAuthOrganizationsResponse,\n selectedOrganization: SiteOSCliOrganization | null,\n json: boolean,\n): AuthCommandResult {\n if (json) {\n return {\n exitCode: 0,\n stdout: JSON.stringify(\n {\n ...response,\n selectedOrganization: selectedOrganization\n ? sessionOrganization(selectedOrganization)\n : null,\n },\n null,\n 2,\n ),\n };\n }\n if (response.organizations.length === 0) {\n return { exitCode: 0, stdout: \"No SiteOS Organizations are available.\" };\n }\n return {\n exitCode: 0,\n stdout: [\n \"SiteOS Organizations:\",\n ...response.organizations.map((organization) => {\n const marker = selectedOrganization?.id === organization.id ? \"*\" : \"-\";\n return `${marker} ${organization.displayName} (${organization.id}) — ${organization.membershipRole}`;\n }),\n ].join(\"\\n\"),\n };\n}\n\nfunction selectedOrganizationResult(\n organization: SiteOSCliOrganization,\n json: boolean,\n): AuthCommandResult {\n return {\n exitCode: 0,\n stdout: json\n ? JSON.stringify(\n { contractVersion: 1, status: \"selected\", organization },\n null,\n 2,\n )\n : `Selected SiteOS Organization: ${organization.displayName} (${organization.id}).`,\n };\n}\n\nfunction createdOrganizationResult(\n organization: SiteOSCliOrganization,\n json: boolean,\n): AuthCommandResult {\n return {\n exitCode: 0,\n stdout: json\n ? JSON.stringify(\n { contractVersion: 1, status: \"created\", organization },\n null,\n 2,\n )\n : `Created SiteOS Organization: ${organization.displayName} (${organization.id}).`,\n };\n}\n\nfunction sessionOrganization(organization: SiteOSCliOrganization): {\n displayName: string;\n id: string;\n} {\n return { id: organization.id, displayName: organization.displayName };\n}\n\nasync function runLogout(options: {\n configHome: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: SiteOSAuthFetchLike;\n json: boolean;\n}): Promise<AuthCommandResult> {\n try {\n const loaded = await loadSiteOSAuthState({\n configHome: options.configHome,\n });\n if (loaded.status === \"missing\") return signedOutResult(options.json);\n\n const withoutPending = { ...loaded.state, pending: undefined };\n if (!loaded.state.session) {\n await writeSiteOSAuthState({\n configHome: options.configHome,\n state: withoutPending,\n });\n return signedOutResult(options.json);\n }\n try {\n await createClient(options).revoke({\n sessionCredential: loaded.state.session.credential,\n });\n } catch (error) {\n if (!isDefinitiveInvalidSession(error)) {\n await writeSiteOSAuthState({\n configHome: options.configHome,\n state: withoutPending,\n });\n throw error;\n }\n }\n await writeSiteOSAuthState({\n configHome: options.configHome,\n state: { ...withoutPending, session: undefined },\n });\n return signedOutResult(options.json);\n } catch (error) {\n return formatError(error, options.json);\n }\n}\n\nfunction createClient(options: {\n env?: NodeJS.ProcessEnv;\n fetchImpl?: SiteOSAuthFetchLike;\n}) {\n if (!options.fetchImpl) {\n throw new SiteOSAuthApiError({\n code: \"AUTH_UNAVAILABLE\",\n message: \"SiteOS Auth access is unavailable in this runtime.\",\n });\n }\n return createSiteOSAuthApiClient({\n apiBaseUrl: resolveSiteOSAuthBaseUrl(options.env),\n fetchImpl: options.fetchImpl,\n });\n}\n\nfunction generateOpaqueValue(): string {\n return randomBytes(32).toString(\"base64url\");\n}\n\nexport function sha256Base64Url(value: string): string {\n return createHash(\"sha256\").update(value, \"utf-8\").digest(\"base64url\");\n}\n\nfunction sessionResult(\n session: SiteOSCliSessionStatus,\n json: boolean,\n status: SiteOSCliSessionStatus[\"status\"],\n): AuthCommandResult {\n if (json) {\n return { exitCode: 0, stdout: JSON.stringify(session, null, 2) };\n }\n if (status === \"expired\") {\n return { exitCode: 0, stdout: \"SiteOS CLI session is expired.\" };\n }\n if (status === \"revoked\") {\n return { exitCode: 0, stdout: \"SiteOS CLI session is revoked.\" };\n }\n return {\n exitCode: 0,\n stdout: [\n \"SiteOS CLI is authenticated.\",\n `User: ${session.user.email}`,\n session.organization\n ? `Organization: ${session.organization.displayName} (${session.organization.id})`\n : \"Organization: not selected\",\n `Expires: ${new Date(session.expiresAt * 1_000).toISOString()}`,\n ].join(\"\\n\"),\n };\n}\n\nfunction signedOutResult(json: boolean): AuthCommandResult {\n return {\n exitCode: 0,\n stdout: json\n ? JSON.stringify({ status: \"signed_out\" }, null, 2)\n : \"SiteOS CLI is signed out.\",\n };\n}\n\nfunction formatError(error: unknown, json: boolean): AuthCommandResult {\n if (error instanceof SiteOSAuthApiError) {\n return commandError(error.code, error.message, json);\n }\n if (error instanceof SiteOSAuthStateError) {\n return commandError(error.code, error.message, json);\n }\n return commandError(\n \"AUTH_COMMAND_FAILED\",\n \"The SiteOS Auth command failed.\",\n json,\n );\n}\n\nfunction commandError(\n code: string,\n message: string,\n json: boolean,\n): AuthCommandResult {\n return {\n exitCode: 1,\n stderr: json\n ? JSON.stringify({ error: { code, message } }, null, 2)\n : `SiteOS Auth error: ${message}`,\n };\n}\n\nfunction usageError(message: string, json: boolean): AuthCommandResult {\n return commandError(\"AUTH_USAGE_ERROR\", message, json);\n}\n\nfunction parseValueCommand(\n args: string[],\n valueFlag: \"--display-name\" | \"--email\" | \"--organization\" | \"--token\",\n):\n | { json: boolean; ok: true; value: string }\n | { error: string; json: boolean; ok: false } {\n let json = false;\n let value: string | undefined;\n\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index];\n if (arg === \"--json\") {\n if (json) return { error: \"--json may be used once.\", json, ok: false };\n json = true;\n continue;\n }\n if (arg === valueFlag) {\n const next = args[index + 1];\n if (value !== undefined) {\n return { error: `${valueFlag} may be used once.`, json, ok: false };\n }\n if (!next || next.startsWith(\"--\")) {\n return { error: `${valueFlag} requires a value.`, json, ok: false };\n }\n value = next;\n index += 1;\n continue;\n }\n return { error: `Unexpected argument: ${arg}`, json, ok: false };\n }\n if (!value) {\n return { error: `${valueFlag} is required.`, json, ok: false };\n }\n return { json, ok: true, value };\n}\n\nfunction parseJsonOnly(\n args: string[],\n): { json: boolean; ok: true } | { error: string; json: boolean; ok: false } {\n if (args.length === 0) return { json: false, ok: true };\n if (args.length === 1 && args[0] === \"--json\") {\n return { json: true, ok: true };\n }\n return {\n error: `Unexpected argument: ${args[0]}`,\n json: args.includes(\"--json\"),\n ok: false,\n };\n}\n","import type { CommandResult } from \"./command-result.js\";\n\nexport type CommandHandler = (\n args: string[],\n) => CommandResult | Promise<CommandResult>;\nexport type CommandRegistry = ReadonlyMap<string, CommandHandler>;\n\nexport function createCommandRegistry(\n handlers: Readonly<Record<string, CommandHandler>>,\n): CommandRegistry {\n return new Map(Object.entries(handlers));\n}\n\nexport async function dispatchCommand(\n registry: CommandRegistry,\n command: string,\n args: string[],\n): Promise<CommandResult | null> {\n const handler = registry.get(command);\n return handler ? handler(args) : null;\n}\n","export const CLI_EXIT_CODE = {\n success: 0,\n internal: 1,\n usage: 2,\n authorization: 3,\n conflict: 4,\n unavailable: 5,\n} as const;\n\nexport type CliExitCode = (typeof CLI_EXIT_CODE)[keyof typeof CLI_EXIT_CODE];\n\nexport type CommandResult = {\n exitCode: CliExitCode;\n stderr?: string;\n stdout?: string;\n};\n\nexport function normalizeCommandResult(result: {\n exitCode: number;\n stderr?: string;\n stdout?: string;\n}): CommandResult {\n return {\n ...result,\n exitCode: isCliExitCode(result.exitCode)\n ? result.exitCode\n : CLI_EXIT_CODE.internal,\n };\n}\n\nfunction isCliExitCode(value: number): value is CliExitCode {\n return Object.values(CLI_EXIT_CODE).some((exitCode) => exitCode === value);\n}\n","import {\n commonServiceContext,\n commonEnvironmentArguments,\n readLocalCommonProject,\n} from \"./projects/project-context.js\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { z } from \"zod\";\nimport { Ajv } from \"ajv\";\nimport addFormats from \"ajv-formats\";\n\nimport { createSiteOSServiceGrantProvider } from \"./auth/adapters/siteos-service-grant-provider.js\";\nimport type { ServiceGrantProvider } from \"./auth/application/service-grant-provider.js\";\nimport {\n NodeProjectBindingStore,\n ProjectBindingStoreError,\n} from \"./core/adapters/node-project-binding-store.js\";\nimport { RepositoryRootError } from \"./core/adapters/node-repository-root.js\";\nimport type { ProjectBindingStore } from \"./core/ports/project-binding-store.js\";\nimport {\n FormsProjectReferenceError,\n inspectFormsProjectReference,\n writeFormsProjectReference,\n} from \"./forms/project-reference.js\";\nimport { resolveSiteOSConfigHome } from \"./siteos-config.js\";\nimport {\n createSiteOSFormsApiClient,\n resolveSiteOSFormsBaseUrl,\n SiteOSFormsApiError,\n type SiteOSFormsProject,\n formsSubmissionStatusSchema,\n} from \"./siteos-forms-api.js\";\nimport { SiteOSAuthApiError } from \"./siteos-auth-api.js\";\nimport {\n prepareSiteOSFormsCredentialInstallation,\n SITEOS_FORMS_SUBMISSION_CREDENTIAL_ENV,\n SITEOS_FORMS_DEPLOYMENT_KEY_ENV,\n SiteOSFormsCredentialStorageError,\n type SiteOSFormsCredentialInstallation,\n} from \"./siteos-forms-credential.js\";\nimport { isValidEnvironmentSlug } from \"./environment-slug.js\";\nimport type { FetchLike } from \"./siteos-search-api.js\";\n\nconst HELP_FLAGS = new Set([\"--help\", \"-h\"]);\nconst JSON_FLAG = \"--json\";\nconst INPUT_FLAG = \"--input\";\nconst MANIFEST_FLAG = \"--manifest\";\nconst ENVIRONMENT_FLAG = \"--environment\";\nconst INSTALL_FLAG = \"--install\";\nconst NAME_FLAG = \"--name\";\nconst SLUG_FLAG = \"--slug\";\nconst CREDENTIAL_FLAG = \"--credential\";\nconst REPLACE_FLAG = \"--replace\";\n\nexport { SITEOS_FORMS_SUBMISSION_CREDENTIAL_ENV } from \"./siteos-forms-credential.js\";\n\nconst normalizedFieldOptionSchema = z.object({\n label: z.string().trim().min(1).max(255),\n value: z.string().trim().min(1).max(255),\n});\n\nconst normalizedFieldSchema = z\n .object({\n key: z.string().trim().min(1).max(255),\n kind: z.string().trim().min(1).max(64).optional(),\n label: z.string().trim().min(1).max(255).optional(),\n displayRole: z.enum([\"primary\", \"secondary\"]).optional(),\n multiple: z.boolean().optional(),\n options: z.array(normalizedFieldOptionSchema).max(500).optional(),\n })\n .strict();\n\nconst definitionSyncInputSchema = z\n .object({\n formKey: z.string().trim().min(1).max(255),\n name: z.string().trim().min(1).max(255),\n normalizedFieldsJson: z.array(normalizedFieldSchema).min(1).max(500),\n schemaJson: z.record(z.unknown()),\n sourceExportId: z.string().trim().min(1).max(255).optional(),\n sourcePagePath: z.string().trim().min(1).max(2048).optional(),\n })\n .strict()\n .superRefine((definition, context) => {\n const ajv = new Ajv({\n allErrors: true,\n removeAdditional: false,\n strict: true,\n });\n addFormats.default(ajv);\n try {\n ajv.compile(definition.schemaJson);\n } catch {\n context.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n \"schemaJson must be an executable JSON Schema supported by SiteOS Forms.\",\n path: [\"schemaJson\"],\n });\n }\n const fields = definition.normalizedFieldsJson;\n\n const duplicateKeys = fields\n .map((field) => field.key)\n .filter((key, index, keys) => keys.indexOf(key) !== index);\n for (const key of new Set(duplicateKeys)) {\n context.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Field key \"${key}\" is registered more than once.`,\n path: [\"normalizedFieldsJson\"],\n });\n }\n\n const primaryFields = fields.filter(\n (field) => field.displayRole === \"primary\",\n );\n if (primaryFields.length !== 1) {\n context.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Exactly one managed field must use the primary display role.\",\n path: [\"normalizedFieldsJson\"],\n });\n }\n\n const schemaProperties = definition.schemaJson.properties;\n if (!isRecord(schemaProperties)) {\n context.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"schemaJson.properties must define the managed form fields.\",\n path: [\"schemaJson\", \"properties\"],\n });\n return;\n }\n\n const metadataKeys = new Set(fields.map((field) => field.key));\n for (const key of Object.keys(schemaProperties)) {\n if (!metadataKeys.has(key)) {\n context.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Schema field \"${key}\" is missing managed field metadata.`,\n path: [\"normalizedFieldsJson\"],\n });\n }\n }\n\n for (const [index, field] of fields.entries()) {\n if (!Object.prototype.hasOwnProperty.call(schemaProperties, field.key)) {\n context.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Managed field \"${field.key}\" is missing from schemaJson.properties.`,\n path: [\"normalizedFieldsJson\", index, \"key\"],\n });\n }\n }\n\n const primaryField = primaryFields[0];\n const requiredFields = definition.schemaJson.required;\n if (\n primaryField &&\n (!Array.isArray(requiredFields) ||\n !requiredFields.includes(primaryField.key))\n ) {\n context.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Primary display field \"${primaryField.key}\" must be required by schemaJson.`,\n path: [\"schemaJson\", \"required\"],\n });\n }\n });\n\nconst definitionManifestSchema = z.object({\n version: z.literal(1),\n forms: z.array(z.string().trim().min(1)).min(1),\n});\n\nconst submitInputSchema = z\n .object({\n formKey: z.string().trim().min(1),\n idempotencyKey: z.string().trim().min(1),\n ipAddress: z.string().trim().min(1).optional(),\n payload: z.record(z.unknown()),\n sourceUrl: z.string().trim().min(1).optional(),\n userAgent: z.string().trim().min(1).optional(),\n })\n .passthrough();\n\nconst environmentNameSchema = z\n .string()\n .transform((value) => value.trim())\n .refine((value) => value.length >= 1 && value.length <= 255);\n\nconst projectSlugSchema = z\n .string()\n .trim()\n .min(1)\n .max(120)\n .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/);\n\nexport const FORMS_HELP = `Usage:\n siteos forms project list [--json]\n siteos forms project create --slug <slug> --name <name> [--json]\n siteos forms project use <slug> [--replace] [--json]\n siteos forms project status [--json]\n siteos forms environment list [--json]\n siteos forms environment create --slug <slug> --name <name> [--json]\n siteos forms definition sync --environment <slug> --input <path> [--json]\n siteos forms definition sync --environment <slug> --manifest <path> [--json]\n siteos forms definition list --environment <slug> [--status <active|inactive|all>] [--json]\n siteos forms definition read --environment <slug> --form <form-id> [--json]\n siteos forms definition archive --environment <slug> --form <form-id> --expected-revision <revision> [--json]\n siteos forms definition restore --environment <slug> --form <form-id> --expected-revision <revision> [--json]\n siteos forms definition delete --environment <slug> --form <form-id> [--apply --confirm <form-key> --expected-revision <revision> --expected-submissions <count>] [--json]\n siteos forms definition check --input <path> [--json]\n siteos forms definition check --manifest <path> [--json]\n siteos forms credential list --environment <slug> [--json]\n siteos forms credential issue --environment <slug> --install [--name <name>] [--json]\n siteos forms credential rotate --environment <slug> --install [--name <name>] [--json]\n siteos forms credential revoke --environment <slug> --credential <credential-id> [--json]\n siteos forms credentials issue --environment <slug> [--name <name>] [--json]\n siteos forms submissions list --environment <slug> --form <form-id> [--query <text>] [--status <status>] [--from <ISO>] [--to <ISO>] [--limit <1-100>] [--cursor <cursor>] [--json]\n siteos forms submissions read --environment <slug> --form <form-id> --submission <id> [--json]\n siteos forms submissions status --environment <slug> --form <form-id> --submission <id> --status <new|read|archived|spam> --expected-status <status> [--json]\n siteos forms deploy --manifest <path> [--json]\n siteos forms deployment-key issue --environment <slug> --install [--name <name>] [--json]\n siteos forms deployment-key list --environment <slug> [--json]\n siteos forms deployment-key revoke --environment <slug> --credential <id> [--json]\n siteos forms submit --input <path> [--json]\n\nManage SiteOS Forms Environments, definitions, credentials, and submission smoke tests.`;\n\nexport type FormsCommandResult = {\n exitCode: number;\n stderr?: string;\n stdout?: string;\n};\n\ntype FlagValue = boolean | string;\n\ntype ParsedFlags =\n | {\n flags: Map<string, FlagValue>;\n ok: true;\n positionals: string[];\n }\n | {\n error: string;\n ok: false;\n };\n\ntype SubmissionFormsContext =\n | {\n commonProjectId?: string;\n apiBaseUrl: string;\n ok: true;\n organization: {\n id?: string;\n name?: string;\n slug?: string;\n };\n project: {\n id?: string;\n name?: string;\n slug?: string;\n };\n credential: string;\n }\n | {\n error: FormsCommandResult;\n ok: false;\n };\n\ntype FormsManagementScope = \"forms:credential:manage\" | \"forms:workspace:write\";\n\ntype FormsManagementContext = {\n commonProjectId?: string;\n apiBaseUrl: string;\n client: ReturnType<typeof createSiteOSFormsApiClient>;\n grant: string;\n ok: true;\n organization: { id: string };\n project: { id: string; name: string; slug: string };\n rootDir: string;\n};\n\ntype FormDefinition = z.infer<typeof definitionSyncInputSchema>;\n\ntype LoadedFormDefinition = {\n path: string;\n value: FormDefinition;\n};\n\ntype DefinitionSource =\n | {\n path: string;\n type: \"input\";\n }\n | {\n path: string;\n type: \"manifest\";\n };\n\nexport async function runFormsCommand(options: {\n args: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n prepareCredentialInstallation?: typeof prepareSiteOSFormsCredentialInstallation;\n projectBindingStore?: ProjectBindingStore;\n serviceGrantProvider?: ServiceGrantProvider;\n}): Promise<FormsCommandResult> {\n let args = options.args;\n\n if (args.length === 0 || args.some((arg) => HELP_FLAGS.has(arg))) {\n return {\n exitCode: 0,\n stdout: FORMS_HELP,\n };\n }\n\n if (args[0] === \"deploy\")\n return runDeployment({ ...options, args: args.slice(1) });\n\n if (args[0] !== \"submit\" && args[0] !== \"project\") {\n try {\n args = await commonEnvironmentArguments(options, \"forms\", args);\n } catch (error) {\n return {\n exitCode: 1,\n stderr:\n error instanceof Error\n ? error.message\n : \"Environment could not be selected.\",\n };\n }\n }\n\n if (args[0] === \"submissions\")\n return runSubmissionsCommand({ ...options, args: args.slice(1) });\n\n if (args[0] === \"definition\") {\n return runDefinitionCommand({\n ...options,\n args: args.slice(1),\n });\n }\n\n if (args[0] === \"environment\") {\n return runEnvironmentCommand({\n ...options,\n args: args.slice(1),\n });\n }\n\n if (args[0] === \"project\") {\n return runProjectCommand({\n ...options,\n args: args.slice(1),\n });\n }\n\n if (args[0] === \"submit\") {\n return runSubmit({\n ...options,\n args: args.slice(1),\n });\n }\n\n if (args[0] === \"deployment-key\") {\n return runCredentialCommand({\n ...options,\n args: args.slice(1),\n deployment: true,\n });\n }\n\n if (args[0] === \"credential\") {\n return runCredentialCommand({\n ...options,\n args: args.slice(1),\n });\n }\n\n if (args[0] === \"credentials\" && args[1] === \"issue\") {\n const compatibilityArgs = args.slice(2);\n return runCredentialCommand({\n ...options,\n args: [\n \"issue\",\n ...compatibilityArgs,\n ...(compatibilityArgs.includes(INSTALL_FLAG) ? [] : [INSTALL_FLAG]),\n ],\n });\n }\n\n return usageError(\"Unknown SiteOS forms command.\");\n}\n\nasync function runSubmissionsCommand(\n options: Parameters<typeof runFormsCommand>[0],\n): Promise<FormsCommandResult> {\n const action = options.args[0];\n if (!action || ![\"list\", \"read\", \"status\"].includes(action))\n return usageError(\"Unknown Forms submissions command.\");\n const parsed = parseFlags(options.args.slice(1), {\n allowed: new Set([\n \"--environment\",\n \"--form\",\n \"--json\",\n ...(action === \"list\"\n ? [\"--query\", \"--status\", \"--from\", \"--to\", \"--limit\", \"--cursor\"]\n : [\n \"--submission\",\n ...(action === \"status\" ? [\"--status\", \"--expected-status\"] : []),\n ]),\n ]),\n boolean: new Set([\"--json\"]),\n rejectDuplicates: true,\n });\n if (!parsed.ok) return usageError(parsed.error);\n if (parsed.positionals.length)\n return usageError(\"Unexpected positional arguments.\");\n const value = (key: string) => readStringFlag(parsed.flags, `--${key}`);\n const environmentSlug = value(\"environment\");\n const formId = value(\"form\");\n const submissionId = value(\"submission\");\n if (\n !environmentSlug ||\n !isValidEnvironmentSlug(environmentSlug) ||\n !formId ||\n formId.length > 255\n )\n return usageError(\"Provide a valid --environment and --form.\");\n if (action !== \"list\" && (!submissionId || submissionId.length > 255))\n return usageError(\"Provide --submission.\");\n const status = formsSubmissionStatusSchema.safeParse(value(\"status\"));\n const expected = formsSubmissionStatusSchema.safeParse(\n value(\"expected-status\"),\n );\n if (\n (value(\"status\") && !status.success) ||\n (action === \"status\" && (!status.success || !expected.success))\n )\n return usageError(\n \"Use new, read, archived or spam for --status and --expected-status.\",\n );\n const filters = new URLSearchParams();\n for (const key of [\"query\", \"status\", \"from\", \"to\", \"limit\", \"cursor\"]) {\n const item = value(key);\n if (item) filters.set(key, item);\n }\n const limit = Number(value(\"limit\") ?? 50);\n if (!Number.isInteger(limit) || limit < 1 || limit > 100)\n return usageError(\"--limit must be between 1 and 100.\");\n if (\n (value(\"query\")?.length ?? 0) > 200 ||\n (value(\"cursor\")?.length ?? 0) > 2048\n )\n return usageError(\"The query or cursor is too long.\");\n for (const key of [\"from\", \"to\"])\n if (\n value(key) &&\n !z.string().datetime({ offset: true }).safeParse(value(key)).success\n )\n return usageError(\n `--${key} must be an ISO timestamp including a timezone.`,\n );\n if (\n value(\"from\") &&\n value(\"to\") &&\n Date.parse(value(\"from\")!) >= Date.parse(value(\"to\")!)\n )\n return usageError(\"--from must be earlier than --to (exclusive).\");\n const context = await loadFormsManagementContext(\n options,\n \"forms:workspace:write\",\n );\n if (!context.ok) return context.error;\n try {\n const { environments } = await context.client.listEnvironments({\n grant: context.grant,\n projectId: context.project.id,\n });\n requireEnvironmentProjectConvergence(environments, context.project.id);\n const environment = environments.find(\n (item) => item.slug === environmentSlug,\n );\n if (!environment)\n return usageError(\n \"The selected Forms Environment does not exist. Run forms environment list.\",\n );\n const input = {\n grant: context.grant,\n environmentId: environment.id,\n formId,\n };\n const response =\n action === \"list\"\n ? await context.client.listSubmissions({ ...input, filters })\n : action === \"read\"\n ? await context.client.readSubmission({\n ...input,\n submissionId: submissionId!,\n })\n : await context.client.updateSubmissionStatus({\n ...input,\n submissionId: submissionId!,\n status: status.data!,\n expectedStatus: expected.data!,\n });\n // Structured output preserves all answers and continuation cursors in either mode.\n return { exitCode: 0, stdout: stringifySafeJson(response) };\n } catch (error) {\n return formatApiError(error);\n }\n}\n\nasync function runProjectCommand(options: {\n args: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n projectBindingStore?: ProjectBindingStore;\n serviceGrantProvider?: ServiceGrantProvider;\n}): Promise<FormsCommandResult> {\n const action = options.args[0];\n if (!action || ![\"create\", \"list\", \"status\", \"use\"].includes(action)) {\n return usageError(\"Unknown SiteOS forms project command.\");\n }\n const parsed = parseProjectFlags(action, options.args.slice(1));\n if (!parsed.ok) return parsed.error;\n if (!options.fetchImpl) {\n return formatApiError(\n new SiteOSFormsApiError({\n code: \"FORMS_UNAVAILABLE\",\n message: \"SiteOS Forms access is unavailable in this runtime.\",\n }),\n );\n }\n\n try {\n const apiBaseUrl = resolveSiteOSFormsBaseUrl(options.env);\n const grant = await serviceGrantProvider(options).acquire({\n audience: \"siteos-forms\",\n scopes: [\"forms:workspace:write\"],\n });\n requireGrant(grant, \"forms:workspace:write\");\n const client = createSiteOSFormsApiClient({\n apiBaseUrl,\n fetchImpl: options.fetchImpl,\n });\n\n if (action === \"list\") {\n const response = await client.listProjects({ grant: grant.accessToken });\n requireProjectOrganization(response.projects, grant.grant.organizationId);\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson(response)\n : formatProjectListOutput(response.projects),\n };\n }\n\n if (action === \"create\") {\n const response = await client.createProject({\n grant: grant.accessToken,\n name: parsed.name!,\n slug: parsed.slug!,\n });\n requireProjectOrganization(\n [response.project],\n grant.grant.organizationId,\n );\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson(response)\n : [\n \"SiteOS Forms Project created.\",\n `Project: ${response.project.slug}`,\n `Name: ${response.project.name}`,\n \"Run `siteos forms project use \" +\n response.project.slug +\n \"` to select it for this repository.\",\n ].join(\"\\n\"),\n };\n }\n\n const reference = await inspectFormsProjectReference(\n options.cwd ?? process.cwd(),\n );\n const store = projectBindingStore(options);\n const locator = {\n apiOrigin: apiBaseUrl,\n repositoryRoot: reference.rootDir,\n service: \"forms\" as const,\n };\n\n if (action === \"use\") {\n const response = await client.listProjects({ grant: grant.accessToken });\n requireProjectOrganization(response.projects, grant.grant.organizationId);\n const matches = response.projects.filter(\n (project) => project.slug === parsed.slug,\n );\n if (matches.length !== 1) {\n throw new SiteOSFormsApiError({\n code: matches.length === 0 ? \"PROJECT_NOT_FOUND\" : \"INVALID_RESPONSE\",\n message:\n matches.length === 0\n ? \"The Forms Project was not found.\"\n : \"SiteOS Forms returned an invalid response.\",\n status: matches.length === 0 ? 404 : undefined,\n });\n }\n const project = matches[0]!;\n if (\n reference.status === \"loaded\" &&\n reference.reference.project.slug !== project.slug &&\n !parsed.replace\n ) {\n throw new FormsProjectReferenceError(\n \"FORMS_PROJECT_REFERENCE_CONFLICT\",\n \"A different Forms Project is already selected. Use --replace to replace it.\",\n );\n }\n\n const previousBinding = await store.read(locator);\n await store.write({\n ...locator,\n organizationId: grant.grant.organizationId,\n project: { id: project.id, slug: project.slug },\n });\n try {\n await writeFormsProjectReference({\n expectedChecksum:\n reference.status === \"loaded\" ? reference.checksum : null,\n project: { name: project.name, slug: project.slug },\n rootDir: reference.rootDir,\n });\n } catch (error) {\n if (previousBinding) await store.write(previousBinding);\n else await store.remove(locator);\n throw error;\n }\n\n const output = {\n apiOrigin: apiBaseUrl,\n organizationId: grant.grant.organizationId,\n project,\n referencePath: path.join(\n reference.rootDir,\n \".siteos\",\n \"forms\",\n \"project.json\",\n ),\n };\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson(output)\n : [\n \"SiteOS Forms Project selected.\",\n `Project: ${project.slug}`,\n `Reference: ${output.referencePath}`,\n ].join(\"\\n\"),\n };\n }\n\n if (reference.status === \"missing\") {\n throw new FormsProjectReferenceError(\n \"FORMS_PROJECT_REFERENCE_REQUIRED\",\n \"Select a Forms Project for this repository first.\",\n );\n }\n const binding = await store.read(locator);\n if (!binding) {\n throw new FormsProjectReferenceError(\n \"FORMS_PROJECT_REFERENCE_REQUIRED\",\n \"Select a Forms Project for this repository first.\",\n );\n }\n if (\n binding.organizationId !== grant.grant.organizationId ||\n binding.project.slug !== reference.reference.project.slug\n ) {\n throw new FormsProjectReferenceError(\n \"FORMS_PROJECT_REFERENCE_INVALID\",\n \"The Forms Project reference and private binding do not match.\",\n );\n }\n const projects = await client.listProjects({ grant: grant.accessToken });\n requireProjectOrganization(projects.projects, grant.grant.organizationId);\n const project = projects.projects.find(\n (candidate) => candidate.id === binding.project.id,\n );\n if (!project || project.slug !== binding.project.slug) {\n throw new SiteOSFormsApiError({\n code: \"PROJECT_NOT_FOUND\",\n message: \"The Forms Project was not found.\",\n status: 404,\n });\n }\n const output = {\n apiOrigin: apiBaseUrl,\n connected: true,\n organizationId: binding.organizationId,\n project,\n repositoryRoot: reference.rootDir,\n };\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson(output)\n : [\n \"SiteOS Forms Project connection is valid.\",\n `Project: ${project.slug}`,\n `Organization: ${binding.organizationId}`,\n `API: ${apiBaseUrl}`,\n ].join(\"\\n\"),\n };\n } catch (error) {\n return formatProjectError(error);\n }\n}\n\nasync function runEnvironmentCommand(options: {\n args: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n projectBindingStore?: ProjectBindingStore;\n serviceGrantProvider?: ServiceGrantProvider;\n}): Promise<FormsCommandResult> {\n const action = options.args[0];\n if (!action || ![\"create\", \"list\"].includes(action)) {\n return usageError(\"Unknown SiteOS forms environment command.\");\n }\n\n const parsed = parseEnvironmentFlags(action, options.args.slice(1));\n if (!parsed.ok) return parsed.error;\n const context = await loadFormsManagementContext(\n options,\n \"forms:workspace:write\",\n );\n if (!context.ok) return context.error;\n\n try {\n if (action === \"list\") {\n const response = await context.client.listEnvironments({\n grant: context.grant,\n projectId: context.project.id,\n });\n requireEnvironmentProjectConvergence(\n response.environments,\n context.project.id,\n );\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson(response)\n : formatEnvironmentListOutput(response.environments),\n };\n }\n\n const response = await context.client.createEnvironment({\n grant: context.grant,\n name: parsed.name!,\n projectId: context.project.id,\n slug: parsed.slug!,\n });\n requireEnvironmentProjectConvergence(\n [response.environment],\n context.project.id,\n );\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson(response)\n : [\n \"SiteOS Forms Environment created.\",\n `Environment: ${response.environment.slug}`,\n `Name: ${response.environment.name}`,\n `Project: ${response.environment.projectId}`,\n ].join(\"\\n\"),\n };\n } catch (error) {\n return formatApiError(error);\n }\n}\n\nasync function runCredentialCommand(options: {\n deployment?: boolean;\n args: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n prepareCredentialInstallation?: typeof prepareSiteOSFormsCredentialInstallation;\n projectBindingStore?: ProjectBindingStore;\n serviceGrantProvider?: ServiceGrantProvider;\n}): Promise<FormsCommandResult> {\n const action = options.args[0];\n if (!action || ![\"issue\", \"list\", \"revoke\", \"rotate\"].includes(action)) {\n return usageError(\"Unknown SiteOS forms credential command.\");\n }\n if (options.deployment && action === \"rotate\")\n return usageError(\n \"Issue a new deployment key, update the release secret, then revoke the old key.\",\n );\n const variable = options.deployment\n ? SITEOS_FORMS_DEPLOYMENT_KEY_ENV\n : SITEOS_FORMS_SUBMISSION_CREDENTIAL_ENV;\n const parsed = parseCredentialFlags(action, options.args.slice(1));\n if (!parsed.ok) return parsed.error;\n\n const context = await loadCredentialManagementContext({\n ...options,\n install: parsed.install,\n });\n if (!context.ok) return context.error;\n\n try {\n if (action === \"list\") {\n const response = await context.client.listCredentials({\n environmentSlug: parsed.environmentSlug,\n grant: context.grant,\n projectId: context.project.id,\n });\n const output = {\n credentials: response.tokens,\n environment: parsed.environmentSlug,\n };\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson(output)\n : formatCredentialListOutput(output),\n };\n }\n\n if (action === \"revoke\") {\n const credential = await context.client.revokeCredential({\n credentialId: parsed.credentialId!,\n environmentSlug: parsed.environmentSlug,\n grant: context.grant,\n projectId: context.project.id,\n });\n const output = {\n credential,\n environment: parsed.environmentSlug,\n revoked: true,\n };\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson(output)\n : `SiteOS Forms credential revoked.\\nCredential: ${credential.id}\\nEnvironment: ${parsed.environmentSlug}`,\n };\n }\n\n const previousCredentials =\n action === \"rotate\"\n ? (\n await context.client.listCredentials({\n environmentSlug: parsed.environmentSlug,\n grant: context.grant,\n projectId: context.project.id,\n })\n ).tokens.filter((credential) => credential.status === \"active\")\n : [];\n const exchange = await context.client.issueCredential({\n environmentSlug: parsed.environmentSlug,\n grant: context.grant,\n name: parsed.name,\n projectId: context.project.id,\n });\n await context.installation!.install(exchange.token);\n if (action === \"rotate\") {\n await Promise.all(\n previousCredentials.map((credential) =>\n context.client.revokeCredential({\n credentialId: credential.id,\n environmentSlug: parsed.environmentSlug,\n grant: context.grant,\n projectId: context.project.id,\n }),\n ),\n );\n }\n const { token: _token, ...credential } = exchange;\n const output = {\n credential,\n environment: parsed.environmentSlug,\n installed: {\n variable,\n },\n operation: action === \"issue\" ? \"issued\" : \"rotated\",\n };\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson(output)\n : [\n `SiteOS Forms credential ${output.operation} and installed.`,\n `Credential: ${credential.id}`,\n `Environment: ${parsed.environmentSlug}`,\n `Variable: ${variable}`,\n ].join(\"\\n\"),\n };\n } catch (error) {\n return formatCredentialError(error);\n }\n}\n\nasync function loadCredentialManagementContext(options: {\n deployment?: boolean;\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n install: boolean;\n prepareCredentialInstallation?: typeof prepareSiteOSFormsCredentialInstallation;\n projectBindingStore?: ProjectBindingStore;\n serviceGrantProvider?: ServiceGrantProvider;\n}): Promise<\n | {\n client: ReturnType<typeof createSiteOSFormsApiClient>;\n grant: string;\n installation?: SiteOSFormsCredentialInstallation;\n ok: true;\n project: { id: string; name: string; slug: string };\n }\n | { error: FormsCommandResult; ok: false }\n> {\n try {\n const local = await readLocalCommonProject(options);\n const rootDir =\n local?.rootDir ??\n (await requireFormsProjectReference(options.cwd ?? process.cwd()))\n .rootDir;\n const installation = options.install\n ? await (\n options.prepareCredentialInstallation ??\n prepareSiteOSFormsCredentialInstallation\n )({\n projectRoot: rootDir,\n ...(options.deployment ? { deployment: true } : {}),\n })\n : undefined;\n const context = await loadFormsManagementContext(\n options,\n \"forms:credential:manage\",\n );\n if (!context.ok) return context;\n return {\n client: options.deployment\n ? createSiteOSFormsApiClient({\n apiBaseUrl: context.apiBaseUrl,\n fetchImpl: options.fetchImpl ?? fetch,\n deploymentKeys: true,\n })\n : context.client,\n grant: context.grant,\n ...(installation ? { installation } : {}),\n ok: true,\n project: context.project,\n };\n } catch (error) {\n return { error: formatCredentialError(error), ok: false };\n }\n}\n\nasync function loadFormsManagementContext(\n options: {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n projectBindingStore?: ProjectBindingStore;\n serviceGrantProvider?: ServiceGrantProvider;\n },\n scope: FormsManagementScope,\n): Promise<FormsManagementContext | { error: FormsCommandResult; ok: false }> {\n try {\n const common = await commonServiceContext(options, \"forms\");\n if (common) {\n if (!options.fetchImpl)\n throw new SiteOSAuthApiError({\n code: \"AUTH_UNAVAILABLE\",\n message: \"SiteOS API access is unavailable.\",\n });\n const grant = await serviceGrantProvider(options).acquire({\n audience: \"siteos-forms\",\n scopes: [scope],\n });\n requireGrant(grant, scope);\n if (grant.grant.organizationId !== common.overview.project.organizationId)\n throw new SiteOSAuthApiError({\n code: \"PROJECT_ORGANIZATION_MISMATCH\",\n message:\n \"The Project and service grant belong to different organizations.\",\n });\n return {\n commonProjectId: common.overview.project.id,\n apiBaseUrl: common.api.origin,\n client: createSiteOSFormsApiClient({\n apiBaseUrl: common.api.origin,\n fetchImpl: options.fetchImpl,\n }),\n grant: grant.accessToken,\n ok: true,\n organization: { id: common.overview.project.organizationId },\n project: {\n id: common.resourceId,\n name: common.overview.project.name,\n slug: common.overview.project.slug,\n },\n rootDir: common.rootDir,\n };\n }\n\n const reference = await requireFormsProjectReference(\n options.cwd ?? process.cwd(),\n );\n if (!options.fetchImpl) {\n throw new SiteOSFormsApiError({\n code: \"FORMS_UNAVAILABLE\",\n message: \"SiteOS Forms access is unavailable in this runtime.\",\n });\n }\n const apiBaseUrl = resolveSiteOSFormsBaseUrl(options.env);\n\n const binding = await projectBindingStore(options).read({\n apiOrigin: apiBaseUrl,\n repositoryRoot: reference.rootDir,\n service: \"forms\",\n });\n if (!binding) {\n throw new FormsProjectReferenceError(\n \"FORMS_PROJECT_REFERENCE_REQUIRED\",\n \"Select a Forms Project for this repository first.\",\n );\n }\n\n const grant = await serviceGrantProvider(options).acquire({\n audience: \"siteos-forms\",\n scopes: [scope],\n });\n if (\n grant.grant.audience !== \"siteos-forms\" ||\n grant.grant.scopes.length !== 1 ||\n grant.grant.scopes[0] !== scope\n ) {\n throw new SiteOSAuthApiError({\n code: \"AUTH_INVALID_RESPONSE\",\n message: \"The SiteOS Auth service returned an invalid response.\",\n });\n }\n\n if (\n grant.grant.organizationId !== binding.organizationId ||\n binding.project.slug !== reference.reference.project.slug\n ) {\n throw new SiteOSAuthApiError({\n code: \"AUTH_INVALID_RESPONSE\",\n message:\n \"The selected Forms Project does not match this Auth Organization.\",\n });\n }\n return {\n apiBaseUrl,\n client: createSiteOSFormsApiClient({\n apiBaseUrl,\n fetchImpl: options.fetchImpl,\n }),\n grant: grant.accessToken,\n ok: true,\n organization: { id: binding.organizationId },\n project: {\n id: binding.project.id,\n name: reference.reference.project.name,\n slug: binding.project.slug,\n },\n rootDir: reference.rootDir,\n };\n } catch (error) {\n return { error: formatManagementContextError(error), ok: false };\n }\n}\n\nasync function requireFormsProjectReference(\n cwd: string,\n): Promise<\n Extract<\n Awaited<ReturnType<typeof inspectFormsProjectReference>>,\n { status: \"loaded\" }\n >\n> {\n const reference = await inspectFormsProjectReference(cwd);\n if (reference.status === \"missing\") {\n throw new FormsProjectReferenceError(\n \"FORMS_PROJECT_REFERENCE_REQUIRED\",\n \"Select a Forms Project for this repository first.\",\n );\n }\n return reference;\n}\n\nasync function runDefinitionCommand(options: {\n args: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n projectBindingStore?: ProjectBindingStore;\n serviceGrantProvider?: ServiceGrantProvider;\n}): Promise<FormsCommandResult> {\n if (\n [\"list\", \"read\", \"archive\", \"restore\", \"delete\"].includes(\n options.args[0] ?? \"\",\n )\n )\n return runDefinitionLifecycle(options);\n if (options.args[0] === \"sync\") {\n return runDefinitionSync({\n ...options,\n args: options.args.slice(1),\n });\n }\n\n if (options.args[0] === \"check\") {\n return runDefinitionCheck({\n ...options,\n args: options.args.slice(1),\n });\n }\n\n return usageError(\"Unknown SiteOS forms definition command.\");\n}\n\nasync function runDefinitionLifecycle(\n options: Parameters<typeof runFormsCommand>[0],\n): Promise<FormsCommandResult> {\n const action = options.args[0]!;\n const parsed = parseFlags(options.args.slice(1), {\n allowed: new Set([\n \"--environment\",\n \"--json\",\n ...(action === \"list\" ? [\"--status\"] : [\"--form\"]),\n ...([\"archive\", \"restore\", \"delete\"].includes(action)\n ? [\"--expected-revision\"]\n : []),\n ...(action === \"delete\"\n ? [\"--apply\", \"--confirm\", \"--expected-submissions\"]\n : []),\n ]),\n boolean: new Set([\"--json\", \"--apply\"]),\n rejectDuplicates: true,\n });\n if (!parsed.ok) return usageError(parsed.error);\n if (parsed.positionals.length)\n return usageError(\"Unexpected positional arguments.\");\n const value = (key: string) => readStringFlag(parsed.flags, `--${key}`);\n const environmentSlug = value(\"environment\");\n const formId = value(\"form\");\n if (\n !environmentSlug ||\n !isValidEnvironmentSlug(environmentSlug) ||\n (action !== \"list\" && (!formId || formId.length > 255))\n )\n return usageError(\"Provide a valid --environment and --form.\");\n const status = value(\"status\") ?? \"active\";\n if (![\"active\", \"inactive\", \"all\"].includes(status))\n return usageError(\"Use active, inactive or all for --status.\");\n const apply = parsed.flags.get(\"--apply\") === true;\n const revision = Number(value(\"expected-revision\"));\n const count = Number(value(\"expected-submissions\"));\n const confirmKey = value(\"confirm\");\n if (\n (action === \"archive\" || action === \"restore\" || apply) &&\n (!Number.isSafeInteger(revision) || revision < 1)\n )\n return usageError(\n \"Read the form first, then provide its --expected-revision.\",\n );\n if (\n apply &&\n (!confirmKey ||\n confirmKey.length > 255 ||\n !Number.isSafeInteger(count) ||\n count < 0)\n )\n return usageError(\n \"Deletion requires --confirm with the exact form key and --expected-submissions from the preview.\",\n );\n if (\n action === \"delete\" &&\n !apply &&\n [\"confirm\", \"expected-revision\", \"expected-submissions\"].some(\n (key) => value(key) !== undefined,\n )\n )\n return usageError(\n \"Delete is a read-only preview. Add --apply with all confirmation values to delete.\",\n );\n const context = await loadFormsManagementContext(\n options,\n \"forms:workspace:write\",\n );\n if (!context.ok) return context.error;\n try {\n const { environments } = await context.client.listEnvironments({\n grant: context.grant,\n projectId: context.project.id,\n });\n requireEnvironmentProjectConvergence(environments, context.project.id);\n const environment = environments.find(\n (item) => item.slug === environmentSlug,\n );\n if (!environment)\n return usageError(\n \"The selected Forms Environment does not exist. Run forms environment list.\",\n );\n const input = {\n grant: context.grant,\n environmentId: environment.id,\n formId: formId ?? \"\",\n };\n if (action === \"list\")\n return {\n exitCode: 0,\n stdout: stringifySafeJson(\n await context.client.listDefinitions({\n ...input,\n status: status as \"active\" | \"inactive\" | \"all\",\n }),\n ),\n };\n if (action === \"read\" || (action === \"delete\" && !apply)) {\n const preview = await context.client.readDefinition(input);\n if (\n preview.project.id !== context.project.id ||\n preview.environment.id !== environment.id ||\n preview.definition.id !== formId ||\n preview.definition.environmentId !== environment.id\n )\n throw new SiteOSFormsApiError({\n code: \"INVALID_RESPONSE\",\n message:\n \"The form does not match the selected Project and Environment.\",\n });\n return {\n exitCode: 0,\n stdout: stringifySafeJson(\n action === \"read\"\n ? preview\n : {\n ...preview,\n action: \"delete\",\n applied: false,\n warning:\n \"Permanently removes this form, all versions and all submitted answers. This cannot be undone. The form key remains reserved.\",\n confirmation: {\n confirmKey: preview.definition.formKey,\n expectedRevision: preview.revision,\n expectedSubmissionCount: preview.definition.submissionCount,\n },\n },\n ),\n };\n }\n const response = await context.client.changeDefinition({\n ...input,\n change:\n action === \"delete\"\n ? {\n action,\n confirmKey: confirmKey!,\n expectedRevision: revision,\n expectedSubmissionCount: count,\n }\n : {\n action: action as \"archive\" | \"restore\",\n expectedRevision: revision,\n },\n });\n return {\n exitCode: 0,\n stdout: stringifySafeJson({ ...response, action, applied: true }),\n };\n } catch (error) {\n return formatApiError(error);\n }\n}\n\nasync function runDefinitionSync(options: {\n args: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n projectBindingStore?: ProjectBindingStore;\n serviceGrantProvider?: ServiceGrantProvider;\n}): Promise<FormsCommandResult> {\n const parsed = parseDefinitionSourceFlags(options.args, {\n environmentRequired: true,\n usage:\n \"Usage: siteos forms definition sync --environment <slug> (--input <path> | --manifest <path>) [--json]\",\n });\n if (!parsed.ok) {\n return parsed.error;\n }\n\n const loaded = await loadFormDefinitions({\n cwd: options.cwd,\n source: parsed.source,\n });\n if (!loaded.ok) {\n return loaded.error;\n }\n\n const json = parsed.json;\n return runWithFormsManagementClient(\n options,\n \"forms:workspace:write\",\n async ({ client, context }) => {\n const definitions = [];\n for (const definition of loaded.definitions) {\n const response = await client.syncDefinition({\n body: definition.value,\n environmentSlug: parsed.environmentSlug!,\n grant: context.grant,\n projectId: context.project.id,\n });\n definitions.push({\n definition: response,\n formKey:\n readOutputString(response.formKey) ?? definition.value.formKey,\n path: definition.path,\n ui: createFormsUiOutput({\n context,\n }),\n });\n }\n\n const output =\n parsed.source.type === \"input\"\n ? {\n ...definitions[0],\n project: context.project,\n }\n : {\n definitions,\n manifest: parsed.source.path,\n project: context.project,\n };\n\n return {\n exitCode: 0,\n stdout: json\n ? stringifySafeJson(output)\n : formatDefinitionSyncOutput(definitions),\n };\n },\n );\n}\n\nasync function runDefinitionCheck(options: {\n args: string[];\n cwd?: string;\n}): Promise<FormsCommandResult> {\n const parsed = parseDefinitionSourceFlags(options.args, {\n usage:\n \"Usage: siteos forms definition check (--input <path> | --manifest <path>) [--json]\",\n });\n if (!parsed.ok) return parsed.error;\n\n const loaded = await loadFormDefinitions({\n cwd: options.cwd,\n source: parsed.source,\n });\n if (!loaded.ok) return loaded.error;\n\n const output = {\n count: loaded.definitions.length,\n forms: loaded.definitions.map((definition) => ({\n formKey: definition.value.formKey,\n path: definition.path,\n })),\n success: true,\n };\n\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson(output)\n : [\n \"SiteOS form definitions are valid.\",\n `Forms: ${output.count}`,\n ...output.forms.map((form) => `- ${form.formKey}: ${form.path}`),\n ].join(\"\\n\"),\n };\n}\n\nasync function runSubmit(options: {\n args: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n projectBindingStore?: ProjectBindingStore;\n}): Promise<FormsCommandResult> {\n const parsed = parseInputFlags(options.args, {\n usage: \"Usage: siteos forms submit --input <path> [--json]\",\n });\n if (!parsed.ok) {\n return parsed.error;\n }\n\n const input = await readInputFile({\n cwd: options.cwd,\n inputPath: parsed.inputPath,\n schema: submitInputSchema,\n });\n if (!input.ok) {\n return input.error;\n }\n\n const json = parsed.json;\n return runWithSubmissionClient(options, async ({ client, context }) => {\n const response = await client.submitForm({\n body: input.value,\n credential: context.credential,\n });\n const output = {\n formKey: input.value.formKey,\n project: context.project,\n submission: response,\n ui: createFormsUiOutput({\n context,\n }),\n };\n\n return {\n exitCode: 0,\n stdout: json\n ? stringifySafeJson(output)\n : [\n \"SiteOS form submission smoke test completed.\",\n `Form: ${input.value.formKey}`,\n readOutputString(response.submissionId)\n ? `Submission: ${readOutputString(response.submissionId)}`\n : undefined,\n readOutputString(response.receivedAt)\n ? `Received at: ${readOutputString(response.receivedAt)}`\n : undefined,\n output.ui\n ? `View submissions in SiteOS (optional): ${output.ui.url}`\n : undefined,\n ]\n .filter((line): line is string => Boolean(line))\n .join(\"\\n\"),\n };\n });\n}\n\nasync function runWithFormsManagementClient(\n options: {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n projectBindingStore?: ProjectBindingStore;\n serviceGrantProvider?: ServiceGrantProvider;\n },\n scope: FormsManagementScope,\n run: (input: {\n client: ReturnType<typeof createSiteOSFormsApiClient>;\n context: FormsManagementContext;\n }) => Promise<FormsCommandResult>,\n): Promise<FormsCommandResult> {\n const context = await loadFormsManagementContext(options, scope);\n if (!context.ok) {\n return context.error;\n }\n\n try {\n return await run({ client: context.client, context });\n } catch (error) {\n return formatApiError(error);\n }\n}\n\nasync function runWithSubmissionClient(\n options: {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n projectBindingStore?: ProjectBindingStore;\n },\n run: (input: {\n client: ReturnType<typeof createSiteOSFormsApiClient>;\n context: Extract<SubmissionFormsContext, { ok: true }>;\n }) => Promise<FormsCommandResult>,\n): Promise<FormsCommandResult> {\n const context = await loadSubmissionFormsContext(options);\n if (!context.ok) return context.error;\n\n if (!options.fetchImpl) {\n return {\n exitCode: 1,\n stderr: \"SiteOS API access is unavailable in this runtime.\",\n };\n }\n\n try {\n return await run({\n client: createSiteOSFormsApiClient({\n apiBaseUrl: context.apiBaseUrl,\n fetchImpl: options.fetchImpl,\n }),\n context,\n });\n } catch (error) {\n return formatApiError(error);\n }\n}\n\nasync function loadSubmissionFormsContext(options: {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n projectBindingStore?: ProjectBindingStore;\n}): Promise<SubmissionFormsContext> {\n const credential =\n options.env?.[SITEOS_FORMS_SUBMISSION_CREDENTIAL_ENV]?.trim();\n if (!credential) {\n return {\n error: {\n exitCode: 1,\n stderr: `No SiteOS Forms submission credential found. Set ${SITEOS_FORMS_SUBMISSION_CREDENTIAL_ENV}.`,\n },\n ok: false,\n };\n }\n\n try {\n const common = await readLocalCommonProject(options);\n if (common)\n return {\n apiBaseUrl: common.api.origin,\n commonProjectId: common.binding.project.id,\n ok: true,\n organization: { id: common.binding.organizationId },\n project: { slug: common.binding.project.slug },\n credential,\n };\n const reference = await requireFormsProjectReference(\n options.cwd ?? process.cwd(),\n );\n const apiBaseUrl = resolveSiteOSFormsBaseUrl(options.env);\n const binding = await projectBindingStore(options).read({\n apiOrigin: apiBaseUrl,\n repositoryRoot: reference.rootDir,\n service: \"forms\",\n });\n if (!binding || binding.project.slug !== reference.reference.project.slug) {\n throw new FormsProjectReferenceError(\n binding\n ? \"FORMS_PROJECT_REFERENCE_INVALID\"\n : \"FORMS_PROJECT_REFERENCE_REQUIRED\",\n binding\n ? \"The Forms Project reference and private binding do not match.\"\n : \"Select a Forms Project for this repository first.\",\n );\n }\n return {\n apiBaseUrl,\n ok: true,\n organization: { id: binding.organizationId },\n project: {\n id: binding.project.id,\n name: reference.reference.project.name,\n slug: binding.project.slug,\n },\n credential,\n };\n } catch (error) {\n return { error: formatManagementContextError(error), ok: false };\n }\n}\n\nfunction formatAuthError(\n error: unknown,\n): Extract<SubmissionFormsContext, { ok: false }> {\n if (error instanceof SiteOSAuthApiError) {\n return {\n error: {\n exitCode: 1,\n stderr: [\n \"SiteOS Auth request failed.\",\n error.status ? `Status: ${error.status}` : undefined,\n `Code: ${error.code}`,\n error.message,\n ]\n .filter((line): line is string => Boolean(line))\n .join(\"\\n\"),\n },\n ok: false,\n };\n }\n return {\n error: {\n exitCode: 1,\n stderr: \"SiteOS Auth request failed.\",\n },\n ok: false,\n };\n}\n\nfunction parseProjectFlags(\n action: string,\n args: string[],\n):\n | {\n json: boolean;\n name?: string;\n ok: true;\n replace: boolean;\n slug?: string;\n }\n | { error: FormsCommandResult; ok: false } {\n const creates = action === \"create\";\n const uses = action === \"use\";\n const parsed = parseFlags(args, {\n allowed: new Set([\n JSON_FLAG,\n ...(creates ? [NAME_FLAG, SLUG_FLAG] : []),\n ...(uses ? [REPLACE_FLAG] : []),\n ]),\n boolean: new Set([JSON_FLAG, REPLACE_FLAG]),\n rejectDuplicates: true,\n });\n if (!parsed.ok) return { error: usageError(parsed.error), ok: false };\n\n if (uses) {\n if (parsed.positionals.length !== 1) {\n return {\n error: usageError(\"Project use requires exactly one Project slug.\"),\n ok: false,\n };\n }\n const slug = projectSlugSchema.safeParse(parsed.positionals[0]);\n if (!slug.success) {\n return { error: usageError(\"Project slug is invalid.\"), ok: false };\n }\n return {\n json: parsed.flags.has(JSON_FLAG),\n ok: true,\n replace: parsed.flags.has(REPLACE_FLAG),\n slug: slug.data,\n };\n }\n\n if (parsed.positionals.length > 0) {\n return {\n error: usageError(`Unexpected argument: ${parsed.positionals[0]}`),\n ok: false,\n };\n }\n if (!creates) {\n return {\n json: parsed.flags.has(JSON_FLAG),\n ok: true,\n replace: false,\n };\n }\n\n const slug = projectSlugSchema.safeParse(\n readStringFlag(parsed.flags, SLUG_FLAG),\n );\n const name = environmentNameSchema.safeParse(\n readStringFlag(parsed.flags, NAME_FLAG),\n );\n if (!slug.success) {\n return {\n error: usageError(\"--slug is required and must be valid.\"),\n ok: false,\n };\n }\n if (!name.success) {\n return {\n error: usageError(\"--name is required and must be valid.\"),\n ok: false,\n };\n }\n return {\n json: parsed.flags.has(JSON_FLAG),\n name: name.data,\n ok: true,\n replace: false,\n slug: slug.data,\n };\n}\n\nfunction parseCredentialFlags(\n action: string,\n args: string[],\n):\n | {\n credentialId?: string;\n environmentSlug: string;\n install: boolean;\n json: boolean;\n name?: string;\n ok: true;\n }\n | { error: FormsCommandResult; ok: false } {\n const installs = action === \"issue\" || action === \"rotate\";\n const revokes = action === \"revoke\";\n const parsed = parseFlags(args, {\n allowed: new Set([\n ENVIRONMENT_FLAG,\n JSON_FLAG,\n ...(installs ? [INSTALL_FLAG, NAME_FLAG] : []),\n ...(revokes ? [CREDENTIAL_FLAG] : []),\n ]),\n boolean: new Set([JSON_FLAG, INSTALL_FLAG]),\n rejectDuplicates: true,\n });\n if (!parsed.ok) return { error: usageError(parsed.error), ok: false };\n if (parsed.positionals.length > 0) {\n return {\n error: usageError(`Unexpected argument: ${parsed.positionals[0]}`),\n ok: false,\n };\n }\n\n const environmentSlug = readStringFlag(parsed.flags, ENVIRONMENT_FLAG);\n if (!environmentSlug) {\n return {\n error: usageError(\"--environment is required.\"),\n ok: false,\n };\n }\n if (!isValidEnvironmentSlug(environmentSlug)) {\n return {\n error: usageError(\"--environment must be a valid environment slug.\"),\n ok: false,\n };\n }\n if (installs && !parsed.flags.has(INSTALL_FLAG)) {\n return {\n error: usageError(\"--install is required for issue and rotate.\"),\n ok: false,\n };\n }\n const credentialId = readStringFlag(parsed.flags, CREDENTIAL_FLAG);\n if (revokes && !credentialId) {\n return {\n error: usageError(\"--credential is required for revoke.\"),\n ok: false,\n };\n }\n const name = readStringFlag(parsed.flags, NAME_FLAG);\n if (credentialId && credentialId.length > 255) {\n return {\n error: usageError(\"--credential is invalid.\"),\n ok: false,\n };\n }\n if (name && name.length > 255) {\n return {\n error: usageError(\"--name is invalid.\"),\n ok: false,\n };\n }\n\n return {\n ...(credentialId ? { credentialId } : {}),\n environmentSlug,\n install: installs,\n json: parsed.flags.has(JSON_FLAG),\n ...(name ? { name } : {}),\n ok: true,\n };\n}\n\nfunction parseEnvironmentFlags(\n action: string,\n args: string[],\n):\n | {\n json: boolean;\n name?: string;\n ok: true;\n slug?: string;\n }\n | { error: FormsCommandResult; ok: false } {\n const creates = action === \"create\";\n const parsed = parseFlags(args, {\n allowed: new Set([JSON_FLAG, ...(creates ? [NAME_FLAG, SLUG_FLAG] : [])]),\n boolean: new Set([JSON_FLAG]),\n rejectDuplicates: true,\n });\n if (!parsed.ok) return { error: usageError(parsed.error), ok: false };\n if (parsed.positionals.length > 0) {\n return {\n error: usageError(`Unexpected argument: ${parsed.positionals[0]}`),\n ok: false,\n };\n }\n\n if (!creates) {\n return { json: parsed.flags.has(JSON_FLAG), ok: true };\n }\n\n const slug = readStringFlag(parsed.flags, SLUG_FLAG);\n if (!slug) {\n return { error: usageError(\"--slug is required.\"), ok: false };\n }\n if (!isValidEnvironmentSlug(slug)) {\n return {\n error: usageError(\"--slug must be a valid environment slug.\"),\n ok: false,\n };\n }\n const name = readStringFlag(parsed.flags, NAME_FLAG);\n if (!name) {\n return { error: usageError(\"--name is required.\"), ok: false };\n }\n const parsedName = environmentNameSchema.safeParse(name);\n if (!parsedName.success) {\n return { error: usageError(\"--name is invalid.\"), ok: false };\n }\n return {\n json: parsed.flags.has(JSON_FLAG),\n name: parsedName.data,\n ok: true,\n slug,\n };\n}\n\nfunction parseDefinitionSourceFlags(\n args: string[],\n options: {\n environmentRequired?: boolean;\n usage: string;\n },\n):\n | {\n json: boolean;\n environmentSlug?: string;\n ok: true;\n source: DefinitionSource;\n }\n | {\n error: FormsCommandResult;\n ok: false;\n } {\n const parsed = parseFlags(args, {\n allowed: new Set([\n INPUT_FLAG,\n MANIFEST_FLAG,\n JSON_FLAG,\n ...(options.environmentRequired ? [ENVIRONMENT_FLAG] : []),\n ]),\n boolean: new Set([JSON_FLAG]),\n });\n if (!parsed.ok) {\n return {\n error: usageError(parsed.error),\n ok: false,\n };\n }\n if (parsed.positionals.length > 0) {\n return {\n error: usageError(options.usage),\n ok: false,\n };\n }\n\n const inputPath = readStringFlag(parsed.flags, INPUT_FLAG);\n const manifestPath = readStringFlag(parsed.flags, MANIFEST_FLAG);\n const environmentSlug = readStringFlag(parsed.flags, ENVIRONMENT_FLAG);\n if (options.environmentRequired && !environmentSlug) {\n return {\n error: usageError(\"--environment is required for definition sync.\"),\n ok: false,\n };\n }\n if (environmentSlug && !isValidEnvironmentSlug(environmentSlug)) {\n return {\n error: usageError(\"--environment must be a valid environment slug.\"),\n ok: false,\n };\n }\n if (Boolean(inputPath) === Boolean(manifestPath)) {\n return {\n error: usageError(\n \"Provide exactly one of --input <path> or --manifest <path>.\",\n ),\n ok: false,\n };\n }\n\n return {\n ...(environmentSlug ? { environmentSlug } : {}),\n json: parsed.flags.has(JSON_FLAG),\n ok: true,\n source: inputPath\n ? { path: inputPath, type: \"input\" }\n : { path: manifestPath!, type: \"manifest\" },\n };\n}\n\nasync function loadFormDefinitions(options: {\n cwd?: string;\n source: DefinitionSource;\n}): Promise<\n | {\n definitions: LoadedFormDefinition[];\n ok: true;\n }\n | {\n error: FormsCommandResult;\n ok: false;\n }\n> {\n if (options.source.type === \"input\") {\n const definition = await readInputFile({\n cwd: options.cwd,\n inputPath: options.source.path,\n schema: definitionSyncInputSchema,\n });\n if (!definition.ok) return definition;\n\n return {\n definitions: [\n {\n path: options.source.path,\n value: definition.value,\n },\n ],\n ok: true,\n };\n }\n\n const manifestPath = path.resolve(\n options.cwd ?? process.cwd(),\n options.source.path,\n );\n const manifest = await readInputFile({\n cwd: options.cwd,\n inputPath: options.source.path,\n schema: definitionManifestSchema,\n });\n if (!manifest.ok) return manifest;\n\n const manifestDirectory = path.dirname(manifestPath);\n const definitions: LoadedFormDefinition[] = [];\n for (const definitionPath of manifest.value.forms) {\n if (path.isAbsolute(definitionPath)) {\n return {\n error: usageError(\n `Manifest definition paths must be relative: ${definitionPath}`,\n ),\n ok: false,\n };\n }\n\n const resolvedPath = path.resolve(manifestDirectory, definitionPath);\n const relativePath = path.relative(manifestDirectory, resolvedPath);\n if (relativePath.startsWith(`..${path.sep}`) || relativePath === \"..\") {\n return {\n error: usageError(\n `Manifest definition paths must stay inside the manifest directory: ${definitionPath}`,\n ),\n ok: false,\n };\n }\n\n const definition = await readInputFile({\n inputPath: resolvedPath,\n schema: definitionSyncInputSchema,\n });\n if (!definition.ok) return definition;\n\n definitions.push({\n path: definitionPath,\n value: definition.value,\n });\n }\n\n const duplicateKeys = definitions\n .map((definition) => definition.value.formKey)\n .filter((key, index, keys) => keys.indexOf(key) !== index);\n if (duplicateKeys.length > 0) {\n return {\n error: usageError(\n `Manifest contains duplicate form keys: ${[...new Set(duplicateKeys)].join(\", \")}`,\n ),\n ok: false,\n };\n }\n\n return {\n definitions,\n ok: true,\n };\n}\n\nfunction parseInputFlags(\n args: string[],\n options: {\n usage: string;\n },\n):\n | {\n inputPath: string;\n json: boolean;\n ok: true;\n }\n | {\n error: FormsCommandResult;\n ok: false;\n } {\n const parsed = parseFlags(args, {\n allowed: new Set([INPUT_FLAG, JSON_FLAG]),\n boolean: new Set([JSON_FLAG]),\n });\n if (!parsed.ok) {\n return {\n error: usageError(parsed.error),\n ok: false,\n };\n }\n if (parsed.positionals.length > 0) {\n return {\n error: usageError(options.usage),\n ok: false,\n };\n }\n\n const inputPath = readStringFlag(parsed.flags, INPUT_FLAG);\n if (!inputPath) {\n return {\n error: usageError(\"--input is required.\"),\n ok: false,\n };\n }\n\n return {\n inputPath,\n json: parsed.flags.has(JSON_FLAG),\n ok: true,\n };\n}\n\nasync function readInputFile<T>(options: {\n cwd?: string;\n inputPath: string;\n schema: z.ZodType<T>;\n}): Promise<\n | {\n ok: true;\n value: T;\n }\n | {\n error: FormsCommandResult;\n ok: false;\n }\n> {\n const resolvedInputPath = path.resolve(\n options.cwd ?? process.cwd(),\n options.inputPath,\n );\n const rawInput = await readFile(resolvedInputPath, \"utf-8\").catch(\n (error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n return {\n error: usageError(`Could not read input file: ${message}`),\n ok: false as const,\n };\n },\n );\n\n if (typeof rawInput !== \"string\") {\n return rawInput;\n }\n\n let parsedJson: unknown;\n try {\n parsedJson = JSON.parse(rawInput);\n } catch (error) {\n return {\n error: usageError(\n `Input file is not valid JSON: ${error instanceof Error ? error.message : String(error)}`,\n ),\n ok: false,\n };\n }\n\n const parsedInput = options.schema.safeParse(parsedJson);\n if (!parsedInput.success) {\n return {\n error: usageError(\n `Input file does not match the SiteOS forms contract: ${parsedInput.error.issues\n .map(\n (issue) => `${issue.path.join(\".\") || \"input\"}: ${issue.message}`,\n )\n .join(\"; \")}`,\n ),\n ok: false,\n };\n }\n\n return {\n ok: true,\n value: parsedInput.data,\n };\n}\n\nfunction parseFlags(\n args: string[],\n options: {\n allowed: Set<string>;\n boolean: Set<string>;\n rejectDuplicates?: boolean;\n },\n): ParsedFlags {\n const flags = new Map<string, FlagValue>();\n const positionals: string[] = [];\n\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index];\n if (!arg.startsWith(\"--\")) {\n positionals.push(arg);\n continue;\n }\n\n const [flagName, inlineValue] = splitFlag(arg);\n if (!options.allowed.has(flagName)) {\n return {\n error: `Unexpected argument: ${flagName}`,\n ok: false,\n };\n }\n if (options.rejectDuplicates && flags.has(flagName)) {\n return {\n error: `Duplicate argument: ${flagName}`,\n ok: false,\n };\n }\n\n if (options.boolean.has(flagName)) {\n if (inlineValue !== undefined) {\n return {\n error: `${flagName} does not accept a value.`,\n ok: false,\n };\n }\n flags.set(flagName, true);\n continue;\n }\n\n const value = inlineValue ?? args[index + 1];\n if (!value || value.startsWith(\"--\")) {\n return {\n error: `${flagName} requires a value.`,\n ok: false,\n };\n }\n\n flags.set(flagName, value);\n if (inlineValue === undefined) {\n index += 1;\n }\n }\n\n return {\n flags,\n ok: true,\n positionals,\n };\n}\n\nfunction splitFlag(arg: string): [string, string | undefined] {\n const separatorIndex = arg.indexOf(\"=\");\n if (separatorIndex === -1) {\n return [arg, undefined];\n }\n\n return [arg.slice(0, separatorIndex), arg.slice(separatorIndex + 1)];\n}\n\nfunction readStringFlag(\n flags: Map<string, FlagValue>,\n flagName: string,\n): string | undefined {\n const value = flags.get(flagName);\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction usageError(message: string): FormsCommandResult {\n return {\n exitCode: 1,\n stderr: `${message}\\n\\n${FORMS_HELP}`,\n };\n}\n\nfunction formatApiError(error: unknown): FormsCommandResult {\n if (error instanceof SiteOSFormsApiError) {\n const details = [\n \"SiteOS forms API request failed.\",\n error.status ? `Status: ${error.status}` : undefined,\n `Code: ${error.code}`,\n error.message,\n error.status === 404 && error.code === \"NOT_FOUND\"\n ? \"Verify the selected Project, Environment and form ID. The server must support this command.\"\n : undefined,\n error.status === 409 && error.code === \"PROJECT_FORM_SUBMISSION_EXISTS\"\n ? \"The submission idempotency key was already used. Keep it for an unchanged retry and check the existing receipt before sending again.\"\n : undefined,\n ].filter((line): line is string => Boolean(line));\n\n return {\n exitCode: 1,\n stderr: details.join(\"\\n\"),\n };\n }\n\n return {\n exitCode: 1,\n stderr: \"SiteOS forms command failed.\",\n };\n}\n\nfunction formatCredentialError(error: unknown): FormsCommandResult {\n if (error instanceof SiteOSAuthApiError) {\n return formatAuthError(error).error;\n }\n if (error instanceof SiteOSFormsCredentialStorageError) {\n return {\n exitCode: 1,\n stderr: error.message,\n };\n }\n if (\n error instanceof FormsProjectReferenceError ||\n error instanceof ProjectBindingStoreError ||\n error instanceof RepositoryRootError\n ) {\n return {\n exitCode: 1,\n stderr: [\n \"SiteOS Forms Project access failed.\",\n `Code: ${error.code}`,\n error.message,\n ].join(\"\\n\"),\n };\n }\n if (error instanceof SiteOSFormsApiError) {\n return {\n exitCode: 1,\n stderr: [\n \"SiteOS Forms credential request failed.\",\n error.status ? `Status: ${error.status}` : undefined,\n `Code: ${error.code}`,\n ]\n .filter((line): line is string => Boolean(line))\n .join(\"\\n\"),\n };\n }\n return {\n exitCode: 1,\n stderr: \"SiteOS Forms credential request failed.\",\n };\n}\n\nfunction formatManagementContextError(error: unknown): FormsCommandResult {\n if (error instanceof SiteOSAuthApiError) {\n return formatAuthError(error).error;\n }\n if (\n error instanceof FormsProjectReferenceError ||\n error instanceof ProjectBindingStoreError ||\n error instanceof RepositoryRootError\n ) {\n return {\n exitCode: 1,\n stderr: [\n \"SiteOS Forms Project access failed.\",\n `Code: ${error.code}`,\n error.message,\n ]\n .filter((line): line is string => Boolean(line))\n .join(\"\\n\"),\n };\n }\n return formatApiError(error);\n}\n\nfunction formatProjectError(error: unknown): FormsCommandResult {\n if (error instanceof SiteOSAuthApiError) return formatAuthError(error).error;\n return formatManagementContextError(error);\n}\n\nfunction serviceGrantProvider(options: {\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n serviceGrantProvider?: ServiceGrantProvider;\n}): ServiceGrantProvider {\n return (\n options.serviceGrantProvider ??\n createSiteOSServiceGrantProvider({\n env: options.env,\n fetchImpl: options.fetchImpl,\n })\n );\n}\n\nfunction projectBindingStore(options: {\n env?: NodeJS.ProcessEnv;\n projectBindingStore?: ProjectBindingStore;\n}): ProjectBindingStore {\n return (\n options.projectBindingStore ??\n new NodeProjectBindingStore(\n path.join(\n resolveSiteOSConfigHome({ env: options.env }),\n \"project-bindings.json\",\n ),\n )\n );\n}\n\nfunction requireGrant(\n grant: Awaited<ReturnType<ServiceGrantProvider[\"acquire\"]>>,\n scope: FormsManagementScope,\n): void {\n if (\n grant.grant.audience !== \"siteos-forms\" ||\n grant.grant.scopes.length !== 1 ||\n grant.grant.scopes[0] !== scope\n ) {\n throw new SiteOSAuthApiError({\n code: \"AUTH_INVALID_RESPONSE\",\n message: \"The SiteOS Auth service returned an invalid response.\",\n });\n }\n}\n\nfunction requireProjectOrganization(\n projects: SiteOSFormsProject[],\n organizationId: string,\n): void {\n if (projects.some((project) => project.organizationId !== organizationId)) {\n throw new SiteOSFormsApiError({\n code: \"INVALID_RESPONSE\",\n message: \"SiteOS Forms returned an invalid response.\",\n });\n }\n}\n\nfunction formatProjectListOutput(projects: SiteOSFormsProject[]): string {\n return [\n \"SiteOS Forms Projects.\",\n `Projects: ${projects.length}`,\n ...projects.map(\n (project) => `- ${project.slug}: ${project.name} (${project.id})`,\n ),\n ].join(\"\\n\");\n}\n\nfunction formatCredentialListOutput(input: {\n credentials: Array<{ id: string; name: string; status: string }>;\n environment: string;\n}) {\n return [\n \"SiteOS Forms credentials.\",\n `Environment: ${input.environment}`,\n `Credentials: ${input.credentials.length}`,\n ...input.credentials.map(\n (credential) =>\n `- ${credential.id}: ${credential.name} (${credential.status})`,\n ),\n ].join(\"\\n\");\n}\n\nfunction formatEnvironmentListOutput(\n environments: Array<{ id: string; name: string; slug: string }>,\n) {\n return [\n \"SiteOS Forms Environments.\",\n `Environments: ${environments.length}`,\n ...environments.map(\n (environment) =>\n `- ${environment.slug}: ${environment.name} (${environment.id})`,\n ),\n ].join(\"\\n\");\n}\n\nfunction requireEnvironmentProjectConvergence(\n environments: Array<{ projectId: string }>,\n projectId: string,\n): void {\n if (environments.some((environment) => environment.projectId !== projectId)) {\n throw new SiteOSFormsApiError({\n code: \"INVALID_RESPONSE\",\n message: \"SiteOS Forms returned an invalid response.\",\n });\n }\n}\n\nfunction stringifySafeJson(value: unknown): string {\n return JSON.stringify(value, null, 2);\n}\n\nfunction formatDefinitionSyncOutput(\n definitions: Array<{\n definition: Record<string, unknown>;\n formKey: string;\n path: string;\n ui?: {\n url: string;\n };\n }>,\n): string {\n return [\n \"SiteOS form definition sync completed.\",\n `Forms: ${definitions.length}`,\n ...definitions.flatMap((output) => [\n `- ${output.formKey}`,\n typeof output.definition.version === \"number\" ||\n typeof output.definition.version === \"string\"\n ? ` Version: ${String(output.definition.version)}`\n : undefined,\n typeof output.definition.createdForm === \"boolean\"\n ? ` Created form: ${String(output.definition.createdForm)}`\n : undefined,\n typeof output.definition.createdVersion === \"boolean\"\n ? ` Created version: ${String(output.definition.createdVersion)}`\n : undefined,\n output.ui ? ` View in SiteOS (optional): ${output.ui.url}` : undefined,\n ]),\n ]\n .filter((line): line is string => Boolean(line))\n .join(\"\\n\");\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction readOutputString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction createFormsUiOutput(input: {\n context: {\n commonProjectId?: string;\n apiBaseUrl: string;\n organization: { id?: string; slug?: string };\n project: { id?: string; slug?: string };\n };\n}):\n | {\n url: string;\n }\n | undefined {\n const commonProjectId = input.context.commonProjectId;\n const projectId = commonProjectId ?? input.context.project.id;\n if (!projectId) {\n return undefined;\n }\n\n const url = new URL(\n commonProjectId\n ? `/projects/${encodeURIComponent(commonProjectId)}/forms`\n : `/forms/projects/${encodeURIComponent(projectId)}`,\n new URL(input.context.apiBaseUrl).origin,\n ).toString();\n return {\n url,\n };\n}\n\nasync function runDeployment(options: {\n args: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n}): Promise<FormsCommandResult> {\n const parsed = parseDefinitionSourceFlags(options.args, {\n environmentRequired: false,\n usage: \"Usage: siteos forms deploy --manifest <path> [--json]\",\n });\n if (!parsed.ok) return parsed.error;\n const loaded = await loadFormDefinitions({\n cwd: options.cwd,\n source: parsed.source,\n });\n if (!loaded.ok) return loaded.error;\n const env = options.env ?? process.env;\n const credential = env[SITEOS_FORMS_DEPLOYMENT_KEY_ENV]?.trim();\n const apiBaseUrl = env.SITEOS_FORMS_PUBLIC_URL?.trim();\n if (!credential || !/^pfd_[A-Za-z0-9_-]{43}$/.test(credential) || !apiBaseUrl)\n return {\n exitCode: 1,\n stderr:\n \"Configure SITEOS_FORMS_PUBLIC_URL and SITEOS_FORMS_DEPLOYMENT_KEY in the release environment.\",\n };\n try {\n const client = createSiteOSFormsApiClient({\n apiBaseUrl,\n fetchImpl: options.fetchImpl ?? fetch,\n });\n const result = await client.publishDefinitions({\n credential,\n definitions: loaded.definitions.map((item) => item.value),\n });\n const expected = new Map(\n loaded.definitions.map((item) => [\n item.value.formKey,\n item.value.sourceExportId,\n ]),\n );\n if (\n result.forms.length !== expected.size ||\n new Set(result.forms.map((item) => item.formKey)).size !==\n expected.size ||\n result.forms.some(\n (item) =>\n !expected.has(item.formKey) ||\n expected.get(item.formKey) !== item.contractVersion,\n )\n )\n return {\n exitCode: 1,\n stderr: \"The published Forms versions do not match this build.\",\n };\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson(result)\n : `Published ${result.forms.length} Forms contracts for Environment ${result.environmentId}.`,\n };\n } catch (error) {\n return formatApiError(error);\n }\n}\n","import { z } from \"zod\";\n\nimport type { FetchLike } from \"./siteos-search-api.js\";\n\nexport const DEFAULT_SITEOS_FORMS_BASE_URL = \"https://app.siteos.sh\";\nexport const SITEOS_FORMS_BASE_URL_ENV = \"SITEOS_FORMS_PUBLIC_URL\";\n\nconst opaqueIdentifierSchema = z.string().trim().min(1).max(255);\n\nconst formsProjectSchema = z\n .object({\n createdAt: z.string().datetime({ offset: true }),\n id: opaqueIdentifierSchema,\n name: z.string().trim().min(1).max(255),\n organizationId: opaqueIdentifierSchema,\n slug: z\n .string()\n .trim()\n .min(1)\n .max(120)\n .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),\n updatedAt: z.string().datetime({ offset: true }),\n })\n .strict();\n\nconst formsProjectListSchema = z\n .object({ projects: z.array(formsProjectSchema) })\n .strict();\nconst formsProjectResponseSchema = z\n .object({ project: formsProjectSchema })\n .strict();\n\nconst formsEnvironmentSchema = z\n .object({\n createdAt: z.string().datetime({ offset: true }),\n id: opaqueIdentifierSchema,\n name: z.string().trim().min(1).max(255),\n projectId: opaqueIdentifierSchema,\n slug: z\n .string()\n .trim()\n .min(1)\n .max(120)\n .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),\n updatedAt: z.string().datetime({ offset: true }),\n })\n .strict();\n\nconst formsEnvironmentListSchema = z\n .object({ environments: z.array(formsEnvironmentSchema) })\n .strict();\nconst formsEnvironmentResponseSchema = z\n .object({ environment: formsEnvironmentSchema })\n .strict();\n\nconst formDefinitionSyncResponseSchema = z\n .object({\n activeVersionId: opaqueIdentifierSchema,\n createdForm: z.boolean(),\n createdVersion: z.boolean(),\n formId: opaqueIdentifierSchema,\n formKey: opaqueIdentifierSchema,\n success: z.literal(true),\n version: z.number().int().positive(),\n })\n .strict();\n\nconst definitionSchema = z.object({\n id: opaqueIdentifierSchema,\n environmentId: opaqueIdentifierSchema,\n formKey: opaqueIdentifierSchema,\n name: z.string(),\n sourcePagePath: z.string().nullable(),\n activeVersion: z.number().int().positive(),\n activeVersionId: opaqueIdentifierSchema,\n status: z.enum([\"active\", \"inactive\"]),\n submissionCount: z.number().int().nonnegative(),\n lastSubmittedAt: z.string().datetime({ offset: true }).nullable(),\n createdAt: z.string().datetime({ offset: true }),\n updatedAt: z.string().datetime({ offset: true }),\n});\nconst definitionListSchema = z.object({\n definitions: z.array(definitionSchema),\n});\nconst definitionContextSchema = z.object({\n definition: definitionSchema,\n revision: z.number().int().positive(),\n canManage: z.boolean(),\n project: z.object({ id: opaqueIdentifierSchema, name: z.string() }),\n environment: z.object({\n id: opaqueIdentifierSchema,\n name: z.string(),\n slug: z.string(),\n }),\n});\nconst definitionChangeResponseSchema = z.object({\n deleted: z.boolean(),\n formId: opaqueIdentifierSchema,\n});\nexport type SiteOSFormsDefinitionChange =\n | { action: \"archive\" | \"restore\"; expectedRevision: number }\n | {\n action: \"delete\";\n expectedRevision: number;\n expectedSubmissionCount: number;\n confirmKey: string;\n };\n\nconst formSubmissionResponseSchema = z\n .object({\n formId: opaqueIdentifierSchema,\n receivedAt: z.string().datetime({ offset: true }),\n submissionId: opaqueIdentifierSchema,\n success: z.literal(true),\n })\n .strict();\n\nexport const formsSubmissionStatusSchema = z.enum([\n \"new\",\n \"read\",\n \"archived\",\n \"spam\",\n]);\nconst submissionSummarySchema = z.object({\n id: opaqueIdentifierSchema,\n formId: opaqueIdentifierSchema,\n normalized: z.record(\n z.union([z.string(), z.number(), z.boolean(), z.null()]),\n ),\n status: formsSubmissionStatusSchema,\n submittedAt: z.string().datetime({ offset: true }),\n});\nconst submissionDetailSchema = submissionSummarySchema.extend({\n payload: z.record(z.unknown()),\n fields: z.array(\n z.object({\n key: z.string(),\n label: z.string().optional(),\n kind: z.string().optional(),\n displayRole: z.enum([\"primary\", \"secondary\"]).optional(),\n multiple: z.boolean().optional(),\n options: z\n .array(z.object({ value: z.string(), label: z.string() }))\n .optional(),\n }),\n ),\n version: z.number().int().positive(),\n versionId: opaqueIdentifierSchema,\n});\nconst submissionPageSchema = z.object({\n submissions: z.array(submissionSummarySchema),\n total: z.number().int().nonnegative(),\n nextCursor: z.string().nullable(),\n});\nconst submissionDetailResponseSchema = z.object({\n submission: submissionDetailSchema,\n});\ntype InboxInput = { grant: string; environmentId: string; formId: string };\nexport type SiteOSFormsSubmissionStatus = z.infer<\n typeof formsSubmissionStatusSchema\n>;\n\nexport type SiteOSFormsEnvironment = z.infer<typeof formsEnvironmentSchema>;\nexport type SiteOSFormsProject = z.infer<typeof formsProjectSchema>;\nexport type SiteOSFormDefinitionSyncResponse = z.infer<\n typeof formDefinitionSyncResponseSchema\n>;\nexport type SiteOSFormSubmissionResponse = z.infer<\n typeof formSubmissionResponseSchema\n>;\n\nconst formsCredentialMetadataSchema = z\n .object({\n createdAt: z.string().datetime({ offset: true }),\n id: z.string().trim().min(1).max(255),\n lastUsedAt: z.string().datetime({ offset: true }).nullable(),\n name: z.string().trim().min(1).max(255),\n projectEnvironmentId: z.string().trim().min(1).max(255),\n revokedAt: z.string().datetime({ offset: true }).nullable(),\n status: z.enum([\"active\", \"revoked\"]),\n })\n .strict();\n\nconst formsCredentialListSchema = z\n .object({\n tokens: z.array(formsCredentialMetadataSchema),\n })\n .strict();\n\nconst formsCredentialExchangeSchema = formsCredentialMetadataSchema.extend({\n token: z.string().regex(/^pfs_[A-Za-z0-9_-]{22}$/),\n});\n\nexport type SiteOSFormsCredentialMetadata = z.infer<\n typeof formsCredentialMetadataSchema\n>;\nexport type SiteOSFormsCredentialExchange = z.infer<\n typeof formsCredentialExchangeSchema\n>;\n\nconst formsErrorCodeSchema = z.enum([\n \"AUTHENTICATION_REQUIRED\",\n \"FORBIDDEN\",\n \"CONFLICT\",\n \"INVALID_REQUEST\",\n \"INVALID_INPUT\",\n \"VALIDATION_FAILED\",\n \"API_KEY_INVALID\",\n \"UNAUTHORIZED\",\n \"IDENTITY_REQUIRED\",\n \"NOT_ALLOWED\",\n \"FORM_ARCHIVED\",\n \"FORM_DELETED\",\n \"NOT_FOUND\",\n \"PROJECT_NOT_FOUND\",\n \"PROJECT_CONFLICT\",\n \"PROJECT_FORM_SCHEMA_INVALID\",\n \"PROJECT_FORM_SUBMISSION_EXISTS\",\n \"ENVIRONMENT_NOT_FOUND\",\n \"ENVIRONMENT_CONFLICT\",\n \"ROUTE_NOT_FOUND\",\n \"SERVICE_UNAVAILABLE\",\n \"INTERNAL_ERROR\",\n]);\n\nconst safeFormsErrorMessages: Record<\n z.infer<typeof formsErrorCodeSchema>,\n string\n> = {\n AUTHENTICATION_REQUIRED:\n \"Sign in to SiteOS before reading Forms submissions.\",\n FORBIDDEN: \"Forms management access is denied.\",\n CONFLICT:\n \"The resource changed or this idempotency key belongs to different data. Read the current state before retrying.\",\n INVALID_REQUEST: \"The Forms request is invalid.\",\n INVALID_INPUT: \"Invalid input data.\",\n VALIDATION_FAILED: \"Validation failed.\",\n API_KEY_INVALID: \"Forms submission credential is invalid or revoked.\",\n UNAUTHORIZED: \"Forms management authorization is invalid.\",\n IDENTITY_REQUIRED: \"Forms browser identity is required.\",\n NOT_ALLOWED: \"Forms management access is denied.\",\n FORM_ARCHIVED:\n \"This form is archived. Restore it explicitly before syncing or sending new submissions.\",\n FORM_DELETED:\n \"This form was permanently deleted. Use a new form key for a new form.\",\n NOT_FOUND: \"The requested resource was not found.\",\n PROJECT_NOT_FOUND: \"The Forms Project was not found.\",\n PROJECT_CONFLICT: \"The Forms Project already exists.\",\n PROJECT_FORM_SCHEMA_INVALID: \"Stored Forms schema is invalid.\",\n PROJECT_FORM_SUBMISSION_EXISTS:\n \"A submission with this idempotency key already exists for this Environment.\",\n ENVIRONMENT_NOT_FOUND: \"The Forms Environment was not found.\",\n ENVIRONMENT_CONFLICT: \"The Forms Environment already exists.\",\n ROUTE_NOT_FOUND: \"The requested Forms resource was not found.\",\n SERVICE_UNAVAILABLE: \"The Forms service is unavailable.\",\n INTERNAL_ERROR: \"The Forms request could not be completed.\",\n};\n\nconst apiErrorResponseSchema = z\n .object({\n error: z\n .object({\n code: formsErrorCodeSchema,\n message: z.string().trim().min(1).max(240),\n })\n .strict(),\n })\n .strict();\n\nexport class SiteOSFormsApiError extends Error {\n readonly code: string;\n readonly status?: number;\n\n constructor(options: { code?: string; message: string; status?: number }) {\n super(options.message);\n this.name = \"SiteOSFormsApiError\";\n this.code = options.code ?? \"SITEOS_API_ERROR\";\n this.status = options.status;\n }\n}\n\nexport function resolveSiteOSFormsBaseUrl(\n env: NodeJS.ProcessEnv = process.env,\n): string {\n return normalizeFormsOrigin(\n env[SITEOS_FORMS_BASE_URL_ENV]?.trim() || DEFAULT_SITEOS_FORMS_BASE_URL,\n );\n}\n\nconst deploymentResponseSchema = z.object({\n environmentId: opaqueIdentifierSchema,\n forms: z.array(\n z.object({\n formKey: opaqueIdentifierSchema,\n formId: opaqueIdentifierSchema,\n contractVersion: z.string().regex(/^sha256:[a-f0-9]{64}$/),\n versionId: opaqueIdentifierSchema,\n version: z.number().int().positive(),\n }),\n ),\n});\n\nexport function createSiteOSFormsApiClient(options: {\n deploymentKeys?: boolean;\n apiBaseUrl: string;\n fetchImpl: FetchLike;\n}): {\n publishDefinitions: (input: {\n definitions: unknown[];\n credential: string;\n }) => Promise<z.infer<typeof deploymentResponseSchema>>;\n listDefinitions: (input: {\n grant: string;\n environmentId: string;\n status: \"active\" | \"inactive\" | \"all\";\n }) => Promise<z.infer<typeof definitionListSchema>>;\n readDefinition: (\n input: InboxInput,\n ) => Promise<z.infer<typeof definitionContextSchema>>;\n changeDefinition: (\n input: InboxInput & { change: SiteOSFormsDefinitionChange },\n ) => Promise<z.infer<typeof definitionChangeResponseSchema>>;\n listSubmissions: (\n input: InboxInput & { filters: URLSearchParams },\n ) => Promise<z.infer<typeof submissionPageSchema>>;\n readSubmission: (\n input: InboxInput & { submissionId: string },\n ) => Promise<z.infer<typeof submissionDetailResponseSchema>>;\n updateSubmissionStatus: (\n input: InboxInput & {\n submissionId: string;\n status: SiteOSFormsSubmissionStatus;\n expectedStatus: SiteOSFormsSubmissionStatus;\n },\n ) => Promise<z.infer<typeof submissionDetailResponseSchema>>;\n createProject: (input: {\n grant: string;\n name: string;\n slug: string;\n }) => Promise<{ project: SiteOSFormsProject }>;\n listProjects: (input: {\n grant: string;\n }) => Promise<{ projects: SiteOSFormsProject[] }>;\n issueCredential: (input: {\n environmentSlug: string;\n grant: string;\n name?: string;\n projectId: string;\n }) => Promise<SiteOSFormsCredentialExchange>;\n listCredentials: (input: {\n environmentSlug: string;\n grant: string;\n projectId: string;\n }) => Promise<{ tokens: SiteOSFormsCredentialMetadata[] }>;\n revokeCredential: (input: {\n credentialId: string;\n environmentSlug: string;\n grant: string;\n projectId: string;\n }) => Promise<SiteOSFormsCredentialMetadata>;\n rotateCredential: (input: {\n environmentSlug: string;\n grant: string;\n name?: string;\n projectId: string;\n }) => Promise<SiteOSFormsCredentialExchange>;\n createEnvironment: (input: {\n grant: string;\n name: string;\n projectId: string;\n slug: string;\n }) => Promise<{ environment: SiteOSFormsEnvironment }>;\n listEnvironments: (input: {\n grant: string;\n projectId: string;\n }) => Promise<{ environments: SiteOSFormsEnvironment[] }>;\n submitForm: (input: {\n body: unknown;\n credential: string;\n }) => Promise<SiteOSFormSubmissionResponse>;\n syncDefinition: (input: {\n body: unknown;\n environmentSlug: string;\n grant: string;\n projectId: string;\n }) => Promise<SiteOSFormDefinitionSyncResponse>;\n} {\n const apiBaseUrl = normalizeFormsOrigin(options.apiBaseUrl);\n const inboxPath = (input: InboxInput) =>\n `/api/v1/forms/environments/${encodeURIComponent(input.environmentId)}/forms/${encodeURIComponent(input.formId)}/submissions`;\n const definitionPath = (input: InboxInput) =>\n `/api/v1/forms/environments/${encodeURIComponent(input.environmentId)}/forms/${encodeURIComponent(input.formId)}`;\n const keyCollection = (\n input: Parameters<typeof credentialCollectionPath>[0],\n ) =>\n options.deploymentKeys\n ? `${environmentItemPath(input)}/deployment-keys`\n : credentialCollectionPath(input);\n return {\n publishDefinitions: (input) =>\n requestJson({\n apiBaseUrl,\n fetchImpl: options.fetchImpl,\n method: \"POST\",\n path: \"/api/forms/deployments\",\n body: { definitions: input.definitions },\n headers: { \"x-siteos-forms-deployment-key\": input.credential },\n responseSchema: deploymentResponseSchema,\n }),\n listDefinitions: (input) =>\n requestJson({\n apiBaseUrl,\n fetchImpl: options.fetchImpl,\n headers: managementHeaders(input),\n method: \"GET\",\n path: `/api/v1/forms/environments/${encodeURIComponent(input.environmentId)}/definitions?status=${input.status}`,\n responseSchema: definitionListSchema,\n }),\n readDefinition: (input) =>\n requestJson({\n apiBaseUrl,\n fetchImpl: options.fetchImpl,\n headers: managementHeaders(input),\n method: \"GET\",\n path: definitionPath(input),\n responseSchema: definitionContextSchema,\n }),\n changeDefinition: (input) =>\n requestJson({\n apiBaseUrl,\n fetchImpl: options.fetchImpl,\n headers: managementHeaders(input),\n method: \"PATCH\",\n path: definitionPath(input),\n body: input.change,\n responseSchema: definitionChangeResponseSchema,\n }),\n listSubmissions: (input) =>\n requestJson({\n apiBaseUrl,\n fetchImpl: options.fetchImpl,\n headers: managementHeaders(input),\n method: \"GET\",\n path: `${inboxPath(input)}?${input.filters}`,\n responseSchema: submissionPageSchema,\n }),\n readSubmission: (input) =>\n requestJson({\n apiBaseUrl,\n fetchImpl: options.fetchImpl,\n headers: managementHeaders(input),\n method: \"GET\",\n path: `${inboxPath(input)}/${encodeURIComponent(input.submissionId)}`,\n responseSchema: submissionDetailResponseSchema,\n }),\n updateSubmissionStatus: (input) =>\n requestJson({\n apiBaseUrl,\n fetchImpl: options.fetchImpl,\n headers: managementHeaders(input),\n method: \"PATCH\",\n path: `${inboxPath(input)}/${encodeURIComponent(input.submissionId)}`,\n body: { status: input.status, expectedStatus: input.expectedStatus },\n responseSchema: submissionDetailResponseSchema,\n }),\n createProject: (input) =>\n requestJson({\n apiBaseUrl,\n body: { name: input.name, slug: input.slug },\n fetchImpl: options.fetchImpl,\n headers: managementHeaders(input),\n method: \"POST\",\n path: \"/api/v1/forms/projects\",\n responseSchema: formsProjectResponseSchema,\n }),\n createEnvironment: (input) =>\n requestJson({\n apiBaseUrl,\n body: { name: input.name, slug: input.slug },\n fetchImpl: options.fetchImpl,\n headers: managementHeaders(input),\n method: \"POST\",\n path: environmentCollectionPath(input),\n responseSchema: formsEnvironmentResponseSchema,\n }),\n issueCredential: (input) =>\n requestJson({\n apiBaseUrl,\n body: input.name ? { name: input.name } : {},\n fetchImpl: options.fetchImpl,\n headers: managementHeaders(input),\n method: \"POST\",\n path: keyCollection(input),\n responseSchema: options.deploymentKeys\n ? formsCredentialExchangeSchema.extend({\n token: z.string().regex(/^pfd_[A-Za-z0-9_-]{43}$/),\n })\n : formsCredentialExchangeSchema,\n }),\n listEnvironments: (input) =>\n requestJson({\n apiBaseUrl,\n fetchImpl: options.fetchImpl,\n headers: managementHeaders(input),\n method: \"GET\",\n path: environmentCollectionPath(input),\n responseSchema: formsEnvironmentListSchema,\n }),\n listProjects: (input) =>\n requestJson({\n apiBaseUrl,\n fetchImpl: options.fetchImpl,\n headers: managementHeaders(input),\n method: \"GET\",\n path: \"/api/v1/forms/projects\",\n responseSchema: formsProjectListSchema,\n }),\n listCredentials: (input) =>\n requestJson({\n apiBaseUrl,\n fetchImpl: options.fetchImpl,\n headers: managementHeaders(input),\n method: \"GET\",\n path: keyCollection(input),\n responseSchema: formsCredentialListSchema,\n }),\n revokeCredential: (input) =>\n requestJson({\n apiBaseUrl,\n fetchImpl: options.fetchImpl,\n headers: managementHeaders(input),\n method: \"DELETE\",\n path: options.deploymentKeys\n ? `${keyCollection(input)}/${encodeURIComponent(input.credentialId)}`\n : credentialItemPath(input),\n responseSchema: formsCredentialMetadataSchema,\n }),\n rotateCredential: (input) =>\n requestJson({\n apiBaseUrl,\n body: input.name ? { name: input.name } : {},\n fetchImpl: options.fetchImpl,\n headers: managementHeaders(input),\n method: \"POST\",\n path: credentialRotatePath(input),\n responseSchema: options.deploymentKeys\n ? formsCredentialExchangeSchema.extend({\n token: z.string().regex(/^pfd_[A-Za-z0-9_-]{43}$/),\n })\n : formsCredentialExchangeSchema,\n }),\n submitForm: (input) =>\n requestJson({\n apiBaseUrl,\n body: input.body,\n fetchImpl: options.fetchImpl,\n headers: {\n \"x-siteos-project-forms-credential\": input.credential,\n },\n method: \"POST\",\n path: \"/api/forms/submissions\",\n responseSchema: formSubmissionResponseSchema,\n }),\n syncDefinition: (input) =>\n requestJson({\n apiBaseUrl,\n body: input.body,\n fetchImpl: options.fetchImpl,\n headers: managementHeaders(input),\n method: \"POST\",\n path: `${environmentItemPath(input)}/definitions`,\n responseSchema: formDefinitionSyncResponseSchema,\n }),\n };\n}\n\nasync function requestJson<T>(options: {\n apiBaseUrl: string;\n body?: unknown;\n fetchImpl: FetchLike;\n headers: Record<string, string>;\n method: \"DELETE\" | \"GET\" | \"POST\" | \"PATCH\";\n path: string;\n responseSchema: z.ZodType<T>;\n}): Promise<T> {\n let response: Awaited<ReturnType<FetchLike>>;\n try {\n response = await options.fetchImpl(buildApiUrl(options), {\n body:\n options.body === undefined ? undefined : JSON.stringify(options.body),\n headers: {\n Accept: \"application/json\",\n ...(options.body === undefined\n ? {}\n : { \"Content-Type\": \"application/json\" }),\n ...options.headers,\n },\n method: options.method,\n redirect: \"error\",\n signal: AbortSignal.timeout(30_000),\n });\n } catch {\n throw new SiteOSFormsApiError({\n code: \"REQUEST_FAILED\",\n message: \"SiteOS API request failed.\",\n });\n }\n\n const payload = await response.json().catch(() => undefined);\n\n if (!response.ok) {\n const parsedError = apiErrorResponseSchema.safeParse(payload);\n if (parsedError.success) {\n throw new SiteOSFormsApiError({\n code: parsedError.data.error.code,\n message: safeFormsErrorMessages[parsedError.data.error.code],\n status: response.status,\n });\n }\n throw new SiteOSFormsApiError({\n code: \"UNEXPECTED_RESPONSE\",\n message: \"SiteOS Forms returned an unexpected error response.\",\n status: response.status,\n });\n }\n\n const parsedPayload = options.responseSchema.safeParse(payload);\n if (!parsedPayload.success) {\n throw new SiteOSFormsApiError({\n code: \"INVALID_RESPONSE\",\n message: \"SiteOS Forms returned an invalid response.\",\n status: response.status,\n });\n }\n\n return parsedPayload.data;\n}\n\nfunction managementHeaders(input: { grant: string }): Record<string, string> {\n return {\n Authorization: `Bearer ${input.grant}`,\n };\n}\n\nfunction projectItemPath(input: { projectId: string }): string {\n return `/api/v1/forms/projects/${encodeURIComponent(input.projectId)}`;\n}\n\nfunction environmentCollectionPath(input: { projectId: string }): string {\n return `${projectItemPath(input)}/environments`;\n}\n\nfunction environmentItemPath(input: {\n environmentSlug: string;\n projectId: string;\n}): string {\n return `${environmentCollectionPath(input)}/${encodeURIComponent(input.environmentSlug)}`;\n}\n\nfunction credentialCollectionPath(input: {\n environmentSlug: string;\n projectId: string;\n}) {\n return `${environmentItemPath(input)}/tokens`;\n}\n\nfunction credentialItemPath(input: {\n credentialId: string;\n environmentSlug: string;\n projectId: string;\n}) {\n return `${credentialCollectionPath(input)}/${encodeURIComponent(input.credentialId)}`;\n}\n\nfunction credentialRotatePath(input: {\n environmentSlug: string;\n projectId: string;\n}) {\n return `${credentialCollectionPath(input)}/actions/rotate`;\n}\n\nfunction buildApiUrl(options: { apiBaseUrl: string; path: string }): string {\n return new URL(\n `${options.apiBaseUrl.replace(/\\/+$/, \"\")}${options.path}`,\n ).toString();\n}\n\nfunction normalizeFormsOrigin(rawUrl: string): string {\n try {\n const url = new URL(rawUrl);\n const loopback = [\"localhost\", \"127.0.0.1\", \"::1\", \"[::1]\"].includes(\n url.hostname,\n );\n if (\n ![\"http:\", \"https:\"].includes(url.protocol) ||\n url.username ||\n url.password ||\n url.pathname !== \"/\" ||\n url.search ||\n url.hash ||\n (url.protocol === \"http:\" && !loopback)\n ) {\n throw new Error(\"unsupported Forms URL\");\n }\n return url.origin;\n } catch {\n throw new SiteOSFormsApiError({\n code: \"INVALID_FORMS_BASE_URL\",\n message: \"The SiteOS Forms URL is invalid.\",\n });\n }\n}\n","import { spawn } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport {\n chmod,\n lstat,\n readFile,\n rename,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport const SITEOS_FORMS_SUBMISSION_CREDENTIAL_ENV =\n \"SITEOS_FORMS_SUBMISSION_CREDENTIAL\";\n\nexport const SITEOS_FORMS_DEPLOYMENT_KEY_ENV = \"SITEOS_FORMS_DEPLOYMENT_KEY\";\n\nexport class SiteOSFormsCredentialStorageError extends Error {\n readonly code:\n \"FORMS_CREDENTIAL_STORAGE_INVALID\" | \"FORMS_CREDENTIAL_STORAGE_UNAVAILABLE\";\n\n constructor(\n code:\n | \"FORMS_CREDENTIAL_STORAGE_INVALID\"\n | \"FORMS_CREDENTIAL_STORAGE_UNAVAILABLE\",\n ) {\n super(\n code === \"FORMS_CREDENTIAL_STORAGE_INVALID\"\n ? \"The project credential storage boundary is invalid.\"\n : \"The Forms credential could not be installed.\",\n );\n this.name = \"SiteOSFormsCredentialStorageError\";\n this.code = code;\n }\n}\n\nexport type SiteOSFormsCredentialInstallation = {\n install: (credential: string) => Promise<void>;\n};\n\nexport async function prepareSiteOSFormsCredentialInstallation(options: {\n projectRoot: string;\n deployment?: boolean;\n}): Promise<SiteOSFormsCredentialInstallation> {\n const variable = options.deployment\n ? SITEOS_FORMS_DEPLOYMENT_KEY_ENV\n : SITEOS_FORMS_SUBMISSION_CREDENTIAL_ENV;\n const credentialPattern = options.deployment\n ? /^pfd_[A-Za-z0-9_-]{43}$/\n : /^pfs_[A-Za-z0-9_-]{22}$/;\n const projectRoot = path.resolve(options.projectRoot);\n const dotenvPath = path.join(projectRoot, \".env\");\n\n try {\n await assertSafeProjectRoot(projectRoot);\n if (!(await isDotenvIgnored(projectRoot))) {\n throw new SiteOSFormsCredentialStorageError(\n \"FORMS_CREDENTIAL_STORAGE_INVALID\",\n );\n }\n await readSafeDotenv(dotenvPath);\n\n return {\n install: async (credential) => {\n if (!credentialPattern.test(credential)) {\n throw new SiteOSFormsCredentialStorageError(\n \"FORMS_CREDENTIAL_STORAGE_INVALID\",\n );\n }\n try {\n await assertSafeProjectRoot(projectRoot);\n if (!(await isDotenvIgnored(projectRoot))) {\n throw new SiteOSFormsCredentialStorageError(\n \"FORMS_CREDENTIAL_STORAGE_INVALID\",\n );\n }\n const currentContent = await readSafeDotenv(dotenvPath);\n await writeCredentialAtomically({\n content: setCredential(currentContent, credential, variable),\n dotenvPath,\n projectRoot,\n });\n } catch (error) {\n if (error instanceof SiteOSFormsCredentialStorageError) throw error;\n throw new SiteOSFormsCredentialStorageError(\n \"FORMS_CREDENTIAL_STORAGE_UNAVAILABLE\",\n );\n }\n },\n };\n } catch (error) {\n if (error instanceof SiteOSFormsCredentialStorageError) throw error;\n throw new SiteOSFormsCredentialStorageError(\n \"FORMS_CREDENTIAL_STORAGE_UNAVAILABLE\",\n );\n }\n}\n\nasync function assertSafeProjectRoot(projectRoot: string) {\n const projectStats = await lstat(projectRoot);\n if (!projectStats.isDirectory() || projectStats.isSymbolicLink()) {\n throw new SiteOSFormsCredentialStorageError(\n \"FORMS_CREDENTIAL_STORAGE_INVALID\",\n );\n }\n}\n\nasync function readSafeDotenv(dotenvPath: string) {\n const dotenvStats = await lstat(dotenvPath).catch((error: unknown) => {\n if (isNodeErrorCode(error, \"ENOENT\")) return undefined;\n throw error;\n });\n if (dotenvStats && !dotenvStats.isFile()) {\n throw new SiteOSFormsCredentialStorageError(\n \"FORMS_CREDENTIAL_STORAGE_INVALID\",\n );\n }\n const content = dotenvStats ? await readFile(dotenvPath, \"utf8\") : \"\";\n if (\n [\n SITEOS_FORMS_SUBMISSION_CREDENTIAL_ENV,\n SITEOS_FORMS_DEPLOYMENT_KEY_ENV,\n ].some((variable) => countCredentialEntries(content, variable) > 1)\n ) {\n throw new SiteOSFormsCredentialStorageError(\n \"FORMS_CREDENTIAL_STORAGE_INVALID\",\n );\n }\n return content;\n}\n\nasync function writeCredentialAtomically(options: {\n content: string;\n dotenvPath: string;\n projectRoot: string;\n}) {\n const temporaryPath = path.join(\n options.projectRoot,\n `.siteos-forms-credential.${process.pid}.${randomUUID()}.tmp`,\n );\n try {\n await writeFile(temporaryPath, options.content, {\n encoding: \"utf8\",\n flag: \"wx\",\n mode: 0o600,\n });\n await chmod(temporaryPath, 0o600);\n await rename(temporaryPath, options.dotenvPath);\n } catch {\n throw new SiteOSFormsCredentialStorageError(\n \"FORMS_CREDENTIAL_STORAGE_UNAVAILABLE\",\n );\n } finally {\n await rm(temporaryPath, { force: true }).catch(() => undefined);\n }\n}\n\nfunction setCredential(content: string, credential: string, variable: string) {\n const assignment = `${variable}=${credential}`;\n const existing = new RegExp(`^${variable}=[^\\\\r\\\\n]*(?=\\\\r?$)`, \"m\");\n if (existing.test(content)) return content.replace(existing, assignment);\n const newline = content.includes(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\n if (content.length === 0) return `${assignment}${newline}`;\n return `${content}${content.endsWith(\"\\n\") ? \"\" : newline}${assignment}${newline}`;\n}\n\nfunction countCredentialEntries(content: string, variable: string) {\n return content\n .split(/\\r?\\n/u)\n .filter((line) => line.startsWith(`${variable}=`)).length;\n}\n\nfunction isDotenvIgnored(projectRoot: string) {\n return new Promise<boolean>((resolve, reject) => {\n const child = spawn(\n \"git\",\n [\"check-ignore\", \"--quiet\", \"--no-index\", \"--\", \".env\"],\n {\n cwd: projectRoot,\n stdio: \"ignore\",\n },\n );\n child.once(\"error\", reject);\n child.once(\"exit\", (code) => {\n if (code === 0) resolve(true);\n else if (code === 1) resolve(false);\n else reject(new Error(\"Git ignore inspection failed.\"));\n });\n });\n}\n\nfunction isNodeErrorCode(error: unknown, code: string): boolean {\n return (\n error instanceof Error &&\n \"code\" in error &&\n (error as NodeJS.ErrnoException).code === code\n );\n}\n","const environmentSlugPattern = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\n\nexport function isValidEnvironmentSlug(value: string): boolean {\n return (\n value.length >= 2 &&\n value.length <= 30 &&\n environmentSlugPattern.test(value)\n );\n}\n","import { readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport type PackageMetadata = {\n name: string;\n version: string;\n};\n\nexport function readPackageMetadata(): PackageMetadata {\n const packageJsonPath = path.resolve(\n path.dirname(fileURLToPath(import.meta.url)),\n \"..\",\n \"package.json\",\n );\n const packageJson = JSON.parse(\n readFileSync(packageJsonPath, \"utf8\"),\n ) as Partial<PackageMetadata>;\n\n return {\n name: packageJson.name ?? \"@siteoshq/cli\",\n version: packageJson.version ?? \"0.0.0-development\",\n };\n}\n","import {\n commonServiceContext,\n readCommonProject,\n} from \"./projects/project-context.js\";\nimport path from \"node:path\";\nimport { parseArgs } from \"node:util\";\n\nimport { createSiteOSServiceGrantProvider } from \"./auth/adapters/siteos-service-grant-provider.js\";\nimport type { ServiceGrantProvider } from \"./auth/application/service-grant-provider.js\";\nimport {\n NodeProjectBindingStore,\n ProjectBindingStoreError,\n} from \"./core/adapters/node-project-binding-store.js\";\nimport {\n findRepositoryRoot,\n RepositoryRootError,\n} from \"./core/adapters/node-repository-root.js\";\nimport { CLI_EXIT_CODE, type CommandResult } from \"./core/command-result.js\";\nimport { commandError } from \"./core/errors.js\";\nimport type { ProjectBindingStore } from \"./core/ports/project-binding-store.js\";\nimport { createPulseApiClient, type PulseProject } from \"./pulse/api-client.js\";\nimport { migrateLegacyPulseBinding } from \"./pulse/binding-migration.js\";\nimport { createDeploymentBundle } from \"./pulse/bundle.js\";\nimport {\n CONFIG_FILE,\n loadChecksConfigFile,\n loadChecksConfigSnapshot,\n reconcileProjectSlug,\n} from \"./pulse/config.js\";\nimport {\n DEFAULT_SITEOS_PULSE_API_URL,\n normalizeApiUrl,\n} from \"./pulse/constants.js\";\nimport { CliError } from \"./pulse/errors.js\";\nimport { initializeProject } from \"./pulse/init.js\";\nimport { runSyncCli } from \"./pulse/interactive/sync.js\";\nimport { runProjectTests } from \"./pulse/playwright.js\";\nimport { inspectProjectSync, type SyncReport } from \"./pulse/sync.js\";\nimport { validateProject } from \"./pulse/validate.js\";\nimport { resolveSiteOSConfigHome } from \"./siteos-config.js\";\nimport { SiteOSAuthApiError } from \"./siteos-auth-api.js\";\n\nconst HELP_FLAGS = new Set([\"--help\", \"-h\"]);\nconst PULSE_SCOPE = \"pulse:workspace:write\";\n\nexport const PULSE_HELP = `Usage:\n siteos pulse project list [--json]\n siteos pulse project create --slug <slug> --name <name> [--json]\n siteos pulse project use <slug> [--replace] [--json]\n siteos pulse project status [--json]\n siteos pulse init [--project <slug>] [--suite <slug>] [--tests-dir <path>] [--base-url <url>]\n siteos pulse validate [--json]\n siteos pulse sync [--check] [--json]\n siteos pulse test [--headed] [--project <name>] [--base-url <url>] [-- <playwright-options>]\n siteos pulse deploy [--dry-run] [--output <path>] [--json]\n\nManage SiteOS Pulse projects, Playwright checks, local tests, and deployments.`;\n\nexport type PulseCommandOptions = {\n args: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: typeof fetch;\n homeDir?: string;\n legacyBindingsPath?: string;\n projectBindingStore?: ProjectBindingStore;\n runInteractiveSync?: typeof runSyncCli;\n runTests?: typeof runProjectTests;\n serviceGrantProvider?: ServiceGrantProvider;\n};\n\nexport async function runPulseCommand(\n options: PulseCommandOptions,\n): Promise<CommandResult> {\n if (\n options.args.length === 0 ||\n options.args.some((argument) => HELP_FLAGS.has(argument))\n ) {\n return { exitCode: CLI_EXIT_CODE.success, stdout: PULSE_HELP };\n }\n\n try {\n const [command, ...args] = options.args;\n if (command === \"project\")\n return await runProjectCommand({ ...options, args });\n if (command === \"init\") return await runInitCommand(options, args);\n if (command === \"validate\") return await runValidateCommand(options, args);\n if (command === \"sync\") return await runSyncCommand(options, args);\n if (command === \"test\") return await runTestCommand(options, args);\n if (command === \"deploy\") return await runDeployCommand(options, args);\n throw usageError(\"Unknown SiteOS Pulse command.\");\n } catch (error) {\n return formatPulseError(error, options.args.includes(\"--json\"));\n }\n}\n\nasync function runProjectCommand(\n options: PulseCommandOptions & { args: string[] },\n): Promise<CommandResult> {\n const [action, ...args] = options.args;\n if (!action || ![\"create\", \"list\", \"status\", \"use\"].includes(action)) {\n throw usageError(\"Unknown SiteOS Pulse project command.\");\n }\n const parsed = parseProjectArguments(action, args);\n const cwd = options.cwd ?? process.cwd();\n const root = action === \"list\" ? null : await findRepositoryRoot(cwd);\n const apiOrigin = await resolvePulseApiOrigin({\n cwd: root ?? cwd,\n env: options.env,\n requireConfig: action !== \"list\",\n });\n const grant = await acquirePulseGrant(options);\n const client = createPulseApiClient({\n apiOrigin,\n fetchImpl: options.fetchImpl,\n });\n\n if (action === \"list\") {\n const projects = await client.listProjects({ grant: grant.accessToken });\n return success(\n parsed.json,\n { apiOrigin, organizationId: grant.grant.organizationId, projects },\n formatProjectList(projects),\n );\n }\n\n const repositoryRoot = root!;\n const snapshot = await loadChecksConfigSnapshot(repositoryRoot);\n if (action === \"create\") {\n const baseUrl = snapshot.config.project.baseUrl;\n if (!baseUrl) {\n throw new CliError(\n \"PULSE_PROJECT_BASE_URL_REQUIRED\",\n \"Set project.baseUrl in siteos.config.json before creating the Pulse Project.\",\n );\n }\n const project = await client.createProject({\n baseUrl,\n grant: grant.accessToken,\n monitoringEnabled: snapshot.config.project.monitoringEnabled,\n name: parsed.name!,\n slug: parsed.slug!,\n });\n return success(\n parsed.json,\n { apiOrigin, project },\n [\n \"SiteOS Pulse Project created.\",\n `Project: ${project.slug}`,\n `Name: ${project.name}`,\n `Run \\`siteos pulse project use ${project.slug}\\` to select it for this repository.`,\n ].join(\"\\n\"),\n );\n }\n\n const store = projectBindingStore(options);\n const locator = { apiOrigin, repositoryRoot, service: \"pulse\" as const };\n if (action === \"use\") {\n const projects = await client.listProjects({ grant: grant.accessToken });\n const project = uniqueProjectBySlug(projects, parsed.slug!);\n const previous = await store.read(locator);\n const replacing =\n snapshot.config.project.slug !== project.slug ||\n (previous !== null && previous.project.id !== project.id);\n if (replacing && !parsed.replace) {\n throw new CliError(\n \"PULSE_PROJECT_REFERENCE_CONFLICT\",\n \"A different Pulse Project is already selected. Use --replace to replace it.\",\n );\n }\n\n await store.write({\n ...locator,\n organizationId: grant.grant.organizationId,\n project: { id: project.id, slug: project.slug },\n });\n try {\n await reconcileProjectSlug(repositoryRoot, project.slug, {\n expectedChecksum: snapshot.checksum,\n });\n } catch (error) {\n if (previous) await store.write(previous);\n else await store.remove(locator);\n throw error;\n }\n return success(\n parsed.json,\n {\n apiOrigin,\n organizationId: grant.grant.organizationId,\n project,\n referencePath: path.join(repositoryRoot, CONFIG_FILE),\n },\n [\n \"SiteOS Pulse Project selected.\",\n `Project: ${project.slug}`,\n `Reference: ${path.join(repositoryRoot, CONFIG_FILE)}`,\n ].join(\"\\n\"),\n );\n }\n\n const selected = await requireSelectedProject({\n options,\n apiOrigin,\n client,\n grant,\n legacyBindingsPath: options.legacyBindingsPath,\n projectBindingStore: store,\n projectSlug: snapshot.config.project.slug,\n repositoryRoot,\n });\n return success(\n parsed.json,\n {\n apiOrigin,\n connected: true,\n migration: selected.migration,\n organizationId: grant.grant.organizationId,\n project: selected.project,\n repositoryRoot,\n },\n [\n \"SiteOS Pulse Project connection is valid.\",\n `Project: ${selected.project.slug}`,\n `Organization: ${grant.grant.organizationId}`,\n `API: ${apiOrigin}`,\n ].join(\"\\n\"),\n );\n}\n\nasync function runInitCommand(\n options: PulseCommandOptions,\n args: string[],\n): Promise<CommandResult> {\n const { values } = parseArgs({\n args,\n options: {\n \"base-url\": { type: \"string\" },\n project: { type: \"string\" },\n suite: { type: \"string\" },\n \"tests-dir\": { type: \"string\" },\n },\n strict: true,\n });\n const common =\n !values[\"base-url\"] || !values.project\n ? await optionalProjectContext(options)\n : null;\n const result = await initializeProject({\n baseUrl: values[\"base-url\"] ?? common?.environment.url ?? undefined,\n project: values.project ?? common?.overview.project.slug,\n projectRoot: options.cwd ?? process.cwd(),\n suite: values.suite,\n testsDir: values[\"tests-dir\"],\n });\n return {\n exitCode: CLI_EXIT_CODE.success,\n stdout: [\n \"SiteOS Pulse project initialized.\",\n ...result.created.map((file) => `Created: ${file}`),\n ...result.updated.map((file) => `Updated: ${file}`),\n \"Next: run `siteos pulse validate`, then `siteos pulse test`.\",\n ].join(\"\\n\"),\n };\n}\n\nasync function runValidateCommand(\n options: PulseCommandOptions,\n args: string[],\n): Promise<CommandResult> {\n const { values } = parseArgs({\n args,\n options: { json: { default: false, type: \"boolean\" } },\n strict: true,\n });\n const report = await validateProject(options.cwd ?? process.cwd());\n return {\n exitCode: report.valid ? CLI_EXIT_CODE.success : CLI_EXIT_CODE.internal,\n stdout: values.json\n ? JSON.stringify(report, null, 2)\n : formatValidation(report),\n };\n}\n\nasync function runSyncCommand(\n options: PulseCommandOptions,\n args: string[],\n): Promise<CommandResult> {\n const { values } = parseArgs({\n args,\n options: {\n check: { default: false, type: \"boolean\" },\n json: { default: false, type: \"boolean\" },\n },\n strict: true,\n });\n const cwd = options.cwd ?? process.cwd();\n if (values.check || values.json) {\n const report = (await inspectProjectSync(cwd)).report;\n return {\n exitCode:\n report.hasDrift || report.blockers.length > 0\n ? CLI_EXIT_CODE.internal\n : CLI_EXIT_CODE.success,\n stdout: values.json\n ? JSON.stringify(report, null, 2)\n : formatSyncReport(report),\n };\n }\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n throw new CliError(\n \"INTERACTIVE_TERMINAL_REQUIRED\",\n \"Interactive synchronization requires a terminal. Use --check or --json in automation.\",\n );\n }\n const exitCode = await (options.runInteractiveSync ?? runSyncCli)({\n projectRoot: cwd,\n });\n return {\n exitCode: exitCode === 0 ? CLI_EXIT_CODE.success : CLI_EXIT_CODE.internal,\n };\n}\n\nasync function runTestCommand(\n options: PulseCommandOptions,\n args: string[],\n): Promise<CommandResult> {\n const separator = args.indexOf(\"--\");\n const commandArgs = separator === -1 ? args : args.slice(0, separator);\n const passthrough = separator === -1 ? [] : args.slice(separator + 1);\n const { values } = parseArgs({\n args: commandArgs,\n options: {\n \"base-url\": { type: \"string\" },\n headed: { default: false, type: \"boolean\" },\n project: { type: \"string\" },\n },\n strict: true,\n });\n const exitCode = await (options.runTests ?? runProjectTests)({\n baseUrl:\n values[\"base-url\"] ??\n (await optionalProjectContext(options))?.environment.url ??\n undefined,\n browserProject: values.project,\n headed: values.headed,\n passthrough,\n projectRoot: options.cwd ?? process.cwd(),\n });\n return {\n exitCode: exitCode === 0 ? CLI_EXIT_CODE.success : CLI_EXIT_CODE.internal,\n };\n}\n\nasync function optionalProjectContext(options: PulseCommandOptions) {\n const context = await readCommonProject(options).catch((cause) => {\n if (\n cause instanceof RepositoryRootError &&\n cause.code === \"REPOSITORY_ROOT_REQUIRED\"\n )\n return null;\n throw cause;\n });\n if (context && !context.environment.url)\n throw new CliError(\n \"PULSE_PROJECT_BINDING_INVALID\",\n \"Set the selected environment website URL in Project settings before using Pulse.\",\n );\n return context;\n}\n\nasync function runDeployCommand(\n options: PulseCommandOptions,\n args: string[],\n): Promise<CommandResult> {\n const { values } = parseArgs({\n args,\n options: {\n \"dry-run\": { default: false, type: \"boolean\" },\n json: { default: false, type: \"boolean\" },\n output: { type: \"string\" },\n },\n strict: true,\n });\n const repositoryRoot = await findRepositoryRoot(options.cwd ?? process.cwd());\n const common = await commonServiceContext(options, \"pulse\");\n if (common && (!common.environmentBinding?.slug || !common.environment.url))\n throw new CliError(\n \"PULSE_PROJECT_BINDING_INVALID\",\n \"Set the environment URL and connect Pulse in Project settings before deploying.\",\n );\n const manifest = await createDeploymentBundle({\n ...(common\n ? {\n projectOverride: {\n name: common.overview.project.name,\n slug: common.environmentBinding!.slug!,\n baseUrl: common.environment.url!,\n },\n }\n : {}),\n output: values.output,\n projectRoot: repositoryRoot,\n });\n if (values[\"dry-run\"]) {\n return success(\n values.json,\n { dryRun: true, manifest },\n [\n `Bundle: ${path.relative(repositoryRoot, manifest.archivePath)}`,\n `Checksum: ${manifest.checksum}`,\n `Files: ${manifest.fileCount}`,\n \"Dry run complete; nothing was uploaded.\",\n ].join(\"\\n\"),\n );\n }\n\n const apiOrigin = await resolvePulseApiOrigin({\n cwd: repositoryRoot,\n env: options.env,\n requireConfig: true,\n });\n const grant = await acquirePulseGrant(options);\n const client = createPulseApiClient({\n apiOrigin,\n fetchImpl: options.fetchImpl,\n });\n const snapshot = await loadChecksConfigSnapshot(repositoryRoot);\n const selected = await requireSelectedProject({\n options,\n apiOrigin,\n client,\n grant,\n legacyBindingsPath: options.legacyBindingsPath,\n projectBindingStore: projectBindingStore(options),\n projectSlug: snapshot.config.project.slug,\n repositoryRoot,\n });\n const deployment = await client.uploadDeployment({\n grant: grant.accessToken,\n manifest,\n projectId: selected.project.id,\n });\n if (deployment.projectId !== selected.project.id) {\n throw new CliError(\n \"API_INVALID_RESPONSE\",\n \"SiteOS Pulse deployed a different Project than the selected target.\",\n );\n }\n return success(\n values.json,\n { deployment, dryRun: false, manifest },\n [\n `Bundle: ${path.relative(repositoryRoot, manifest.archivePath)}`,\n `Checksum: ${manifest.checksum}`,\n `Files: ${manifest.fileCount}`,\n `Project ${deployment.projectId} deployed.`,\n ...deployment.checks.map(\n (check) =>\n `${check.slug}: deployment ${check.deploymentId} v${check.version}`,\n ),\n ...(deployment.dashboardUrl\n ? [`Dashboard: ${deployment.dashboardUrl}`]\n : []),\n ].join(\"\\n\"),\n );\n}\n\nasync function acquirePulseGrant(options: PulseCommandOptions) {\n const grant = await (\n options.serviceGrantProvider ??\n createSiteOSServiceGrantProvider({\n env: options.env,\n fetchImpl: options.fetchImpl,\n homeDir: options.homeDir,\n })\n ).acquire({ audience: \"siteos-pulse\", scopes: [PULSE_SCOPE] });\n if (\n grant.grant.audience !== \"siteos-pulse\" ||\n grant.grant.scopes.length !== 1 ||\n grant.grant.scopes[0] !== PULSE_SCOPE\n ) {\n throw new SiteOSAuthApiError({\n code: \"AUTH_INVALID_RESPONSE\",\n message: \"The SiteOS Auth service returned an invalid response.\",\n });\n }\n return grant;\n}\n\nasync function requireSelectedProject(input: {\n options: PulseCommandOptions;\n apiOrigin: string;\n client: ReturnType<typeof createPulseApiClient>;\n grant: Awaited<ReturnType<ServiceGrantProvider[\"acquire\"]>>;\n legacyBindingsPath?: string;\n projectBindingStore: ProjectBindingStore;\n projectSlug: string;\n repositoryRoot: string;\n}) {\n const common = await commonServiceContext(input.options, \"pulse\");\n if (common) {\n if (\n common.api.origin !== input.apiOrigin ||\n common.overview.project.organizationId !==\n input.grant.grant.organizationId\n ) {\n throw new CliError(\n \"PULSE_PROJECT_BINDING_INVALID\",\n \"The selected Project and Pulse deployment origin or organization do not match.\",\n );\n }\n const project = await input.client.getProject({\n grant: input.grant.accessToken,\n projectId: common.resourceId,\n });\n if (\n project.slug !== input.projectSlug &&\n common.overview.project.slug !== input.projectSlug\n )\n throw new CliError(\n \"PULSE_PROJECT_BINDING_INVALID\",\n `Set project.slug in siteos.config.json to ${common.overview.project.slug} before deploying checks to this Project.`,\n );\n return { migration: \"not-required\", project };\n }\n const migration = await migrateLegacyPulseBinding({\n apiOrigin: input.apiOrigin,\n legacyBindingsPath: input.legacyBindingsPath,\n organizationId: input.grant.grant.organizationId,\n projectBindingStore: input.projectBindingStore,\n projectSlug: input.projectSlug,\n repositoryRoot: input.repositoryRoot,\n });\n const binding = migration.binding;\n if (!binding) {\n throw new CliError(\n \"PULSE_PROJECT_BINDING_REQUIRED\",\n \"Select a Pulse Project for this repository first.\",\n { hint: `Run \\`siteos pulse project use ${input.projectSlug}\\`.` },\n );\n }\n if (\n binding.organizationId !== input.grant.grant.organizationId ||\n binding.project.slug !== input.projectSlug\n ) {\n throw new CliError(\n \"PULSE_PROJECT_BINDING_INVALID\",\n \"The Pulse Project configuration and private binding do not match.\",\n {\n hint: `Run \\`siteos pulse project use ${input.projectSlug} --replace\\`.`,\n },\n );\n }\n const project = await input.client.getProject({\n grant: input.grant.accessToken,\n projectId: binding.project.id,\n });\n if (project.slug !== binding.project.slug) {\n throw new CliError(\n \"PULSE_PROJECT_BINDING_STALE\",\n \"The selected Pulse Project is no longer valid.\",\n {\n hint: `Run \\`siteos pulse project use ${input.projectSlug} --replace\\`.`,\n },\n );\n }\n return { migration: migration.status, project };\n}\n\nasync function resolvePulseApiOrigin(input: {\n cwd: string;\n env?: NodeJS.ProcessEnv;\n requireConfig: boolean;\n}): Promise<string> {\n const configured = input.env?.SITEOS_PULSE_API_URL?.trim();\n if (configured) return normalizeApiUrl(configured);\n try {\n const config = await loadChecksConfigFile(input.cwd);\n if (config.apiUrl) return normalizeApiUrl(config.apiUrl);\n } catch (error) {\n if (\n input.requireConfig ||\n !(error instanceof CliError) ||\n error.code !== \"CONFIG_NOT_FOUND\"\n ) {\n throw error;\n }\n }\n return DEFAULT_SITEOS_PULSE_API_URL;\n}\n\nfunction projectBindingStore(\n options: PulseCommandOptions,\n): ProjectBindingStore {\n return (\n options.projectBindingStore ??\n new NodeProjectBindingStore(\n path.join(\n resolveSiteOSConfigHome({ env: options.env, homeDir: options.homeDir }),\n \"project-bindings.json\",\n ),\n )\n );\n}\n\nfunction parseProjectArguments(action: string, args: string[]) {\n const { positionals, values } = parseArgs({\n allowPositionals: true,\n args,\n options: {\n json: { default: false, type: \"boolean\" },\n ...(action === \"create\"\n ? {\n name: { type: \"string\" as const },\n slug: { type: \"string\" as const },\n }\n : {}),\n ...(action === \"use\"\n ? { replace: { default: false, type: \"boolean\" as const } }\n : {}),\n },\n strict: true,\n });\n if (\n action === \"create\" &&\n (!values.slug || !values.name || positionals.length > 0)\n ) {\n throw usageError(\n \"Usage: siteos pulse project create --slug <slug> --name <name> [--json]\",\n );\n }\n if (action === \"use\" && (positionals.length !== 1 || !positionals[0])) {\n throw usageError(\n \"Usage: siteos pulse project use <slug> [--replace] [--json]\",\n );\n }\n if ((action === \"list\" || action === \"status\") && positionals.length > 0) {\n throw usageError(\n `siteos pulse project ${action} does not accept positional arguments.`,\n );\n }\n return {\n json: Boolean(values.json),\n name: typeof values.name === \"string\" ? values.name : undefined,\n replace: Boolean(values.replace),\n slug:\n action === \"use\"\n ? positionals[0]\n : typeof values.slug === \"string\"\n ? values.slug\n : undefined,\n };\n}\n\nfunction uniqueProjectBySlug(\n projects: PulseProject[],\n slug: string,\n): PulseProject {\n const matches = projects.filter((project) => project.slug === slug);\n if (matches.length !== 1) {\n throw new CliError(\n matches.length === 0 ? \"PULSE_PROJECT_NOT_FOUND\" : \"API_INVALID_RESPONSE\",\n matches.length === 0\n ? \"The Pulse Project was not found.\"\n : \"SiteOS Pulse returned an ambiguous Project list.\",\n );\n }\n return matches[0]!;\n}\n\nfunction formatValidation(\n report: Awaited<ReturnType<typeof validateProject>>,\n): string {\n return [\n report.valid\n ? \"SiteOS Pulse project is valid.\"\n : \"SiteOS Pulse project is invalid.\",\n `Bundle inputs: ${report.files.length} files, ${report.totalBytes} bytes`,\n ...report.warnings.map((warning) => `Warning: ${warning}`),\n ...report.errors.map((error) => `Error: ${error}`),\n ].join(\"\\n\");\n}\n\nfunction formatSyncReport(report: SyncReport): string {\n return [\n report.hasDrift\n ? \"Synchronization drift detected.\"\n : \"Monitored tests are synchronized.\",\n ...report.added.map((entry) => `Added: ${entry.path}`),\n ...report.removed.map(\n (entry) => `Removed: ${entry.path} (Check: ${entry.checkSlug})`,\n ),\n ...report.unchanged.map(\n (entry) => `Unchanged: ${entry.path} (Check: ${entry.checkSlug})`,\n ),\n ...report.patternManaged.map(\n (entry) =>\n `Pattern-managed: ${entry.checkSlug} (${entry.matchedSpecs.length} matched spec${entry.matchedSpecs.length === 1 ? \"\" : \"s\"})`,\n ),\n ...report.supportingFiles.added.map(\n (file) => `Supporting file to add: ${file}`,\n ),\n ...(report.migrationRequired\n ? [\"Migration required: version 1 -> version 2\"]\n : []),\n ...report.blockers.map((blocker) => `Blocker: ${blocker.message}`),\n ].join(\"\\n\");\n}\n\nfunction formatProjectList(projects: PulseProject[]): string {\n return [\n \"SiteOS Pulse Projects.\",\n `Projects: ${projects.length}`,\n ...projects.map(\n (project) =>\n `- ${project.slug}: ${project.name} (${project.checkCount} Check${project.checkCount === 1 ? \"\" : \"s\"})`,\n ),\n ].join(\"\\n\");\n}\n\nfunction success(json: boolean, value: unknown, text: string): CommandResult {\n return {\n exitCode: CLI_EXIT_CODE.success,\n stdout: json ? JSON.stringify(value, null, 2) : text,\n };\n}\n\nfunction usageError(message: string): CliError {\n return new CliError(\"USAGE_ERROR\", message, {\n exitCode: CLI_EXIT_CODE.usage,\n });\n}\n\nfunction formatPulseError(error: unknown, json: boolean): CommandResult {\n if (\n error instanceof TypeError &&\n \"code\" in error &&\n error.code === \"ERR_PARSE_ARGS\"\n ) {\n return commandError({\n error: { code: \"USAGE_ERROR\", message: error.message, service: \"pulse\" },\n exitCode: CLI_EXIT_CODE.usage,\n json,\n });\n }\n const normalized = normalizePulseError(error);\n return commandError({\n error: {\n code: normalized.code,\n message: normalized.hint\n ? `${normalized.message}\\nHint: ${normalized.hint}`\n : normalized.message,\n service: \"pulse\",\n },\n exitCode: exitCodeForPulseError(normalized),\n json,\n });\n}\n\nfunction normalizePulseError(error: unknown): CliError {\n if (error instanceof CliError) return error;\n if (error instanceof SiteOSAuthApiError)\n return new CliError(error.code, error.message);\n if (\n error instanceof RepositoryRootError ||\n error instanceof ProjectBindingStoreError\n ) {\n return new CliError(error.code, error.message);\n }\n return new CliError(\n \"UNEXPECTED_ERROR\",\n error instanceof Error ? error.message : \"An unexpected error occurred.\",\n );\n}\n\nfunction exitCodeForPulseError(\n error: CliError,\n): Exclude<(typeof CLI_EXIT_CODE)[keyof typeof CLI_EXIT_CODE], 0> {\n if (error.exitCode === CLI_EXIT_CODE.usage || error.code === \"USAGE_ERROR\") {\n return CLI_EXIT_CODE.usage;\n }\n if (\n [\"UNAUTHORIZED\", \"FORBIDDEN\", \"SESSION_INVALID\", \"GRANT_DENIED\"].includes(\n error.code,\n )\n ) {\n return CLI_EXIT_CODE.authorization;\n }\n if (\n error.code.includes(\"CONFLICT\") ||\n error.code.includes(\"BINDING\") ||\n error.code.includes(\"CHANGED\") ||\n error.code.includes(\"NOT_FOUND\")\n ) {\n return CLI_EXIT_CODE.conflict;\n }\n if (error.code.includes(\"UNAVAILABLE\") || error.code === \"API_UNREACHABLE\") {\n return CLI_EXIT_CODE.unavailable;\n }\n return CLI_EXIT_CODE.internal;\n}\n","import {\n CLI_EXIT_CODE,\n type CliExitCode,\n type CommandResult,\n} from \"./command-result.js\";\n\nexport type SafeCliError = {\n code: string;\n message: string;\n service?: \"auth\" | \"forms\" | \"pulse\" | \"search\";\n};\n\nexport function commandError(input: {\n error: SafeCliError;\n exitCode?: Exclude<CliExitCode, 0>;\n json: boolean;\n}): CommandResult {\n return {\n exitCode: input.exitCode ?? CLI_EXIT_CODE.internal,\n stderr: input.json\n ? JSON.stringify({ ok: false, error: input.error }, null, 2)\n : input.error.message,\n };\n}\n","import { readFile } from \"node:fs/promises\";\n\nimport { z } from \"zod\";\n\nimport type { DeploymentManifest } from \"./bundle.js\";\nimport { CliError } from \"./errors.js\";\n\nconst projectSchema = z\n .object({\n baseUrl: z.string().url().nullable(),\n checkCount: z.number().int().min(0),\n id: z.string().trim().min(1).max(120),\n name: z.string().trim().min(1).max(120),\n slug: z\n .string()\n .trim()\n .min(1)\n .max(80)\n .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),\n })\n .strict();\n\nconst projectListSchema = z\n .object({ projects: z.array(projectSchema) })\n .strict();\nconst projectResponseSchema = z.object({ project: projectSchema }).strict();\nconst deploymentResponseSchema = z\n .object({\n checks: z.array(\n z\n .object({\n checkId: z.string().min(1),\n created: z.boolean(),\n deploymentId: z.string().min(1),\n slug: z.string().min(1),\n version: z.number().int().positive(),\n })\n .strict(),\n ),\n checksum: z.string().min(1),\n dashboardUrl: z.string().url().optional(),\n projectId: z.string().min(1),\n })\n .strict();\n\nexport type PulseProject = z.infer<typeof projectSchema>;\nexport type PulseDeploymentResponse = z.infer<typeof deploymentResponseSchema>;\n\ntype PulseApiErrorPayload = {\n error?: { code?: unknown; message?: unknown } | string;\n};\n\nexport function createPulseApiClient(input: {\n apiOrigin: string;\n fetchImpl?: typeof fetch;\n}) {\n const fetchImpl = input.fetchImpl ?? fetch;\n const request = async <T>(options: {\n body?: BodyInit;\n grant: string;\n method?: string;\n path: string;\n schema: z.ZodType<T>;\n }): Promise<T> => {\n const endpoint = new URL(options.path, input.apiOrigin);\n let response: Response;\n try {\n response = await fetchImpl(endpoint, {\n body: options.body,\n headers: {\n accept: \"application/json\",\n authorization: `Bearer ${options.grant}`,\n ...(typeof options.body === \"string\"\n ? { \"content-type\": \"application/json\" }\n : {}),\n },\n method: options.method,\n });\n } catch {\n throw new CliError(\n \"API_UNREACHABLE\",\n `Could not reach ${endpoint.origin}.`,\n {\n hint: \"Check SITEOS_PULSE_API_URL and the network connection.\",\n },\n );\n }\n\n const body = (await response.json().catch(() => null)) as\n PulseApiErrorPayload | T | null;\n if (!response.ok) throw pulseApiError(body, response.status);\n const parsed = options.schema.safeParse(body);\n if (!parsed.success) {\n throw new CliError(\n \"API_INVALID_RESPONSE\",\n \"SiteOS Pulse returned an invalid response.\",\n );\n }\n return parsed.data;\n };\n\n return {\n async createProject(options: {\n baseUrl: string;\n grant: string;\n monitoringEnabled: boolean;\n name: string;\n slug: string;\n }): Promise<PulseProject> {\n const result = await request({\n body: JSON.stringify({\n baseUrl: options.baseUrl,\n monitoringEnabled: options.monitoringEnabled,\n name: options.name,\n slug: options.slug,\n }),\n grant: options.grant,\n method: \"POST\",\n path: \"/api/cli/v1/projects\",\n schema: projectResponseSchema,\n });\n return result.project;\n },\n\n async getProject(options: {\n grant: string;\n projectId: string;\n }): Promise<PulseProject> {\n const result = await request({\n grant: options.grant,\n path: `/api/cli/v1/projects/${encodeURIComponent(options.projectId)}`,\n schema: projectResponseSchema,\n });\n return result.project;\n },\n\n async listProjects(options: { grant: string }): Promise<PulseProject[]> {\n const result = await request({\n grant: options.grant,\n path: \"/api/cli/v1/projects\",\n schema: projectListSchema,\n });\n return result.projects;\n },\n\n async uploadDeployment(options: {\n grant: string;\n manifest: DeploymentManifest;\n projectId: string;\n }): Promise<PulseDeploymentResponse> {\n const form = new FormData();\n const { archivePath: _archivePath, ...publicManifest } = options.manifest;\n form.set(\"manifest\", JSON.stringify(publicManifest));\n form.set(\n \"target\",\n JSON.stringify({\n version: 1,\n mode: \"update\",\n projectId: options.projectId,\n }),\n );\n form.set(\n \"bundle\",\n new Blob([await readFile(options.manifest.archivePath)], {\n type: \"application/gzip\",\n }),\n \"checks-bundle.tgz\",\n );\n return request({\n body: form,\n grant: options.grant,\n method: \"POST\",\n path: \"/api/cli/v1/deployments\",\n schema: deploymentResponseSchema,\n });\n },\n };\n}\n\nfunction pulseApiError(body: unknown, status: number): CliError {\n const payload = body as PulseApiErrorPayload | null;\n const candidate = payload?.error;\n const code =\n candidate &&\n typeof candidate === \"object\" &&\n typeof candidate.code === \"string\"\n ? candidate.code\n : status === 401\n ? \"UNAUTHORIZED\"\n : status === 403\n ? \"FORBIDDEN\"\n : status === 404\n ? \"NOT_FOUND\"\n : status === 409\n ? \"CONFLICT\"\n : \"API_REJECTED\";\n const message =\n typeof candidate === \"string\"\n ? candidate\n : candidate &&\n typeof candidate === \"object\" &&\n typeof candidate.message === \"string\"\n ? candidate.message\n : `SiteOS Pulse returned ${status}.`;\n return new CliError(code, message);\n}\n","import { createHash } from \"node:crypto\";\nimport { lstat, readFile, realpath } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nimport { z } from \"zod\";\n\nimport type { ProjectBindingStore } from \"../core/ports/project-binding-store.js\";\nimport { normalizeApiUrl } from \"./constants.js\";\nimport { CliError } from \"./errors.js\";\n\nconst legacyBindingSchema = z\n .object({\n apiUrl: z.string().url(),\n organizationId: z.string().trim().min(1).max(255),\n projectId: z.string().trim().min(1).max(255),\n projectRoot: z.string().refine(path.isAbsolute),\n projectSlug: z\n .string()\n .trim()\n .min(1)\n .max(80)\n .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),\n })\n .strict();\n\nconst legacyBindingsSchema = z\n .object({\n bindings: z.record(legacyBindingSchema),\n version: z.literal(2),\n })\n .strict();\n\nexport type PulseBindingMigrationResult =\n | {\n binding: Awaited<ReturnType<ProjectBindingStore[\"read\"]>>;\n status: \"already-current\";\n }\n | {\n binding: Awaited<ReturnType<ProjectBindingStore[\"read\"]>>;\n status: \"imported\";\n }\n | { binding: null; status: \"not-found\" };\n\nexport async function migrateLegacyPulseBinding(input: {\n apiOrigin: string;\n legacyBindingsPath?: string;\n organizationId: string;\n projectBindingStore: ProjectBindingStore;\n projectSlug: string;\n repositoryRoot: string;\n}): Promise<PulseBindingMigrationResult> {\n const apiOrigin = normalizeApiUrl(input.apiOrigin);\n const repositoryRoot = await realpath(path.resolve(input.repositoryRoot));\n const locator = { apiOrigin, repositoryRoot, service: \"pulse\" as const };\n const current = await input.projectBindingStore.read(locator);\n if (current) return { binding: current, status: \"already-current\" };\n\n const legacy = await readLegacyBindings(\n input.legacyBindingsPath ?? legacyPulseBindingsFilePath(),\n );\n if (!legacy) return { binding: null, status: \"not-found\" };\n const key = legacyBindingKey(apiOrigin, repositoryRoot);\n const candidate = legacy.bindings[key];\n if (\n !candidate ||\n candidate.apiUrl !== apiOrigin ||\n candidate.projectRoot !== repositoryRoot ||\n candidate.organizationId !== input.organizationId ||\n candidate.projectSlug !== input.projectSlug\n ) {\n return { binding: null, status: \"not-found\" };\n }\n\n const imported = await input.projectBindingStore.write({\n ...locator,\n organizationId: candidate.organizationId,\n project: { id: candidate.projectId, slug: candidate.projectSlug },\n });\n const readBack = await input.projectBindingStore.read(locator);\n if (!readBack || readBack.project.id !== imported.project.id) {\n throw new CliError(\n \"PROJECT_BINDING_MIGRATION_FAILED\",\n \"The migrated Pulse Project binding could not be verified.\",\n );\n }\n return { binding: readBack, status: \"imported\" };\n}\n\nexport function legacyPulseBindingsFilePath(\n input: {\n env?: NodeJS.ProcessEnv;\n homeDir?: string;\n } = {},\n): string {\n const env = input.env ?? process.env;\n const configRoot = env.XDG_CONFIG_HOME\n ? path.resolve(env.XDG_CONFIG_HOME)\n : path.join(input.homeDir ?? os.homedir(), \".config\");\n return path.join(configRoot, \"siteos\", \"pulse\", \"project-bindings.json\");\n}\n\nasync function readLegacyBindings(filePath: string) {\n try {\n const stats = await lstat(filePath);\n if (stats.isSymbolicLink() || !stats.isFile())\n throw new Error(\"unsafe file\");\n const parsed = legacyBindingsSchema.parse(\n JSON.parse(await readFile(filePath, \"utf8\")),\n );\n for (const [key, binding] of Object.entries(parsed.bindings)) {\n if (\n key !==\n legacyBindingKey(normalizeApiUrl(binding.apiUrl), binding.projectRoot)\n ) {\n throw new Error(\"binding key mismatch\");\n }\n }\n return parsed;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw new CliError(\n \"PROJECT_BINDINGS_INVALID\",\n \"The legacy Pulse Project bindings could not be read safely.\",\n {\n hint: \"Remove the legacy binding file, then run `siteos pulse project use <slug>`.\",\n },\n );\n }\n}\n\nfunction legacyBindingKey(apiUrl: string, projectRoot: string): string {\n return createHash(\"sha256\").update(`${apiUrl}\\0${projectRoot}`).digest(\"hex\");\n}\n","export const DEFAULT_SITEOS_PULSE_API_URL = \"https://app.siteos.sh\";\n\nexport function normalizeApiUrl(value: string): string {\n let url: URL;\n try {\n url = new URL(value);\n } catch {\n throw new Error(\n \"SiteOS Pulse API URL must be an absolute HTTP or HTTPS URL.\",\n );\n }\n if (url.protocol !== \"https:\" && url.protocol !== \"http:\") {\n throw new Error(\"SiteOS Pulse API URL must use HTTP or HTTPS.\");\n }\n return url.origin;\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport {\n access,\n mkdir,\n readFile,\n rename,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport path from \"node:path\";\nimport * as tar from \"tar\";\nimport {\n CONFIG_FILE,\n findChecksConfigFile,\n loadChecksConfig,\n type ChecksConfig,\n} from \"./config.js\";\nimport { CliError } from \"./errors.js\";\nimport { discoverProjectFiles, type ProjectFile } from \"./project-files.js\";\n\nexport type DeploymentManifest = {\n schemaVersion: 2;\n project: ChecksConfig[\"project\"];\n checks: ChecksConfig[\"checks\"];\n testsDir: string;\n playwrightConfig?: string;\n flowCount: number;\n checksum: string;\n archivePath: string;\n fileCount: number;\n totalBytes: number;\n files: ProjectFile[];\n createdAt: string;\n};\n\nasync function hashArchive(archivePath: string): Promise<string> {\n return createHash(\"sha256\")\n .update(await readFile(archivePath))\n .digest(\"hex\");\n}\n\nexport async function createDeploymentBundle(input: {\n projectRoot: string;\n output?: string;\n projectOverride?: Pick<ChecksConfig[\"project\"], \"name\" | \"slug\" | \"baseUrl\">;\n}): Promise<DeploymentManifest> {\n const projectRoot = path.resolve(input.projectRoot);\n const config = await loadChecksConfig(projectRoot);\n const configFile = (await findChecksConfigFile(projectRoot)) ?? CONFIG_FILE;\n const report = await discoverProjectFiles(projectRoot, config);\n if (!report.valid) {\n throw new CliError(\n \"PROJECT_INVALID\",\n `Project validation failed: ${report.errors.join(\"; \")}`,\n {\n hint: \"Run `siteos pulse validate` for the full report.\",\n },\n );\n }\n\n const outputDirectory = input.output\n ? path.dirname(path.resolve(projectRoot, input.output))\n : path.join(projectRoot, \".siteos\", \"pulse\", \"deployments\");\n await mkdir(outputDirectory, { recursive: true });\n const temporaryPath = path.join(\n outputDirectory,\n `.siteos-pulse-${randomUUID()}.tgz`,\n );\n const archiveFiles = [\n ...new Set([configFile, ...report.files.map((file) => file.path)]),\n ].sort();\n\n await tar.create(\n {\n cwd: projectRoot,\n file: temporaryPath,\n gzip: true,\n portable: true,\n noMtime: true,\n follow: false,\n },\n archiveFiles,\n );\n\n const checksum = await hashArchive(temporaryPath);\n const archivePath = input.output\n ? path.resolve(projectRoot, input.output)\n : path.join(outputDirectory, `siteos-pulse-${checksum.slice(0, 16)}.tgz`);\n try {\n await access(archivePath);\n if (input.output) {\n await rm(temporaryPath, { force: true });\n throw new CliError(\n \"OUTPUT_EXISTS\",\n `Refusing to overwrite ${archivePath}.`,\n );\n }\n await rm(temporaryPath, { force: true });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\")\n await rename(temporaryPath, archivePath);\n else throw error;\n }\n\n const manifest: DeploymentManifest = {\n schemaVersion: 2,\n project: { ...config.project, ...input.projectOverride },\n checks: config.checks,\n testsDir: config.testsDir,\n playwrightConfig: config.playwrightConfig,\n flowCount: report.testFileCount,\n checksum,\n archivePath,\n fileCount: report.files.length,\n totalBytes: report.totalBytes,\n files: report.files,\n createdAt: new Date().toISOString(),\n };\n await writeFile(\n `${archivePath}.json`,\n `${JSON.stringify(manifest, null, 2)}\\n`,\n \"utf8\",\n );\n return manifest;\n}\n","import { createHash } from \"node:crypto\";\nimport { lstat, readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport fg from \"fast-glob\";\nimport type { ChecksConfig } from \"./config.js\";\n\nexport const MAX_BUNDLE_FILES = 5_000;\nexport const MAX_BUNDLE_BYTES = 50 * 1024 * 1024;\nexport const MAX_FILE_BYTES = 10 * 1024 * 1024;\n\nconst TEST_FILE_PATTERN = /\\.(?:spec|test)\\.(?:[cm]?[jt]sx?)$/;\nconst SENSITIVE_SEGMENTS = new Set([\n \".git\",\n \"node_modules\",\n \".checks\",\n \".siteos\",\n]);\nconst SENSITIVE_FILES = [\n /^\\.env(?:\\..+)?$/,\n /^\\.npmrc$/,\n /(?:^|[-_.])(secret|credentials?)(?:[-_.]|$)/i,\n];\n\nexport type ProjectFile = { path: string; size: number; checksum: string };\n\nexport type ValidationReport = {\n valid: boolean;\n errors: string[];\n warnings: string[];\n files: ProjectFile[];\n totalBytes: number;\n testFileCount: number;\n};\n\nfunction isSensitive(relativePath: string): boolean {\n const segments = relativePath.split(\"/\");\n if (segments.some((segment) => SENSITIVE_SEGMENTS.has(segment))) return true;\n return SENSITIVE_FILES.some((pattern) => pattern.test(segments.at(-1) ?? \"\"));\n}\n\nasync function hashFile(filePath: string): Promise<string> {\n return createHash(\"sha256\")\n .update(await readFile(filePath))\n .digest(\"hex\");\n}\n\nexport async function discoverProjectFiles(\n projectRoot: string,\n config: ChecksConfig,\n): Promise<ValidationReport> {\n const errors: string[] = [];\n const warnings: string[] = [];\n const includePatterns = [\n ...config.checks.flatMap((check) => check.include),\n ...(config.bundle?.include ?? []),\n ...(config.playwrightConfig ? [config.playwrightConfig] : []),\n ];\n const matches = await fg(includePatterns, {\n cwd: projectRoot,\n onlyFiles: true,\n unique: true,\n dot: true,\n followSymbolicLinks: false,\n ignore: [\n \"**/node_modules/**\",\n \"**/.git/**\",\n \"**/.checks/**\",\n \"**/.siteos/**\",\n ],\n });\n const relativeFiles = [\n ...new Set(matches.map((file) => file.replaceAll(\"\\\\\", \"/\"))),\n ].sort();\n\n if (relativeFiles.length === 0)\n errors.push(\"The include patterns did not match any files.\");\n if (relativeFiles.length > MAX_BUNDLE_FILES) {\n errors.push(\n `The bundle contains ${relativeFiles.length} files; the limit is ${MAX_BUNDLE_FILES}.`,\n );\n }\n\n const selectedTestFiles = new Set<string>();\n\n for (const check of config.checks) {\n const checkTestFiles = await fg(check.include, {\n cwd: projectRoot,\n onlyFiles: true,\n unique: true,\n followSymbolicLinks: false,\n ignore: [\n \"**/node_modules/**\",\n \"**/.git/**\",\n \"**/.checks/**\",\n \"**/.siteos/**\",\n ],\n });\n if (checkTestFiles.length === 0) {\n errors.push(`Check ${check.slug} does not match any bundled files.`);\n continue;\n }\n const runnable = checkTestFiles\n .map((file) => file.replaceAll(\"\\\\\", \"/\"))\n .filter((file) => TEST_FILE_PATTERN.test(file));\n if (runnable.length === 0) {\n errors.push(\n `Check ${check.slug} does not match a Playwright spec or test file.`,\n );\n continue;\n }\n runnable.forEach((file) => selectedTestFiles.add(file));\n const supporting = checkTestFiles.length - runnable.length;\n if (supporting > 0) {\n warnings.push(\n `Check ${check.slug} includes ${supporting} supporting file${supporting === 1 ? \"\" : \"s\"}; move them to bundle.include.`,\n );\n }\n }\n\n const files: ProjectFile[] = [];\n let totalBytes = 0;\n for (const relativePath of relativeFiles) {\n if (isSensitive(relativePath)) {\n errors.push(`Sensitive path cannot be included: ${relativePath}`);\n continue;\n }\n const absolutePath = path.resolve(projectRoot, relativePath);\n const relativeToRoot = path.relative(projectRoot, absolutePath);\n if (relativeToRoot.startsWith(\"..\") || path.isAbsolute(relativeToRoot)) {\n errors.push(`Included path escapes the project root: ${relativePath}`);\n continue;\n }\n const stats = await lstat(absolutePath);\n if (!stats.isFile()) continue;\n if (stats.size > MAX_FILE_BYTES) {\n errors.push(`File exceeds the 10 MiB limit: ${relativePath}`);\n continue;\n }\n totalBytes += stats.size;\n files.push({\n path: relativePath,\n size: stats.size,\n checksum: await hashFile(absolutePath),\n });\n }\n if (totalBytes > MAX_BUNDLE_BYTES)\n errors.push(\"The bundle exceeds the 50 MiB size limit.\");\n\n try {\n const packageSource = await readFile(\n path.join(projectRoot, \"package.json\"),\n \"utf8\",\n );\n const packageJson = JSON.parse(packageSource) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n if (\n !packageJson.dependencies?.[\"@playwright/test\"] &&\n !packageJson.devDependencies?.[\"@playwright/test\"]\n ) {\n errors.push(\"@playwright/test is not declared in package.json.\");\n }\n } catch {\n errors.push(\"A readable package.json is required.\");\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n files,\n totalBytes,\n testFileCount: selectedTestFiles.size,\n };\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n ChecksConfigV2Schema,\n CONFIG_FILE,\n findChecksConfigFile,\n projectDisplayName,\n projectSlug,\n type ChecksConfig,\n} from \"./config.js\";\nimport { DEFAULT_SITEOS_PULSE_API_URL } from \"./constants.js\";\nimport { CliError } from \"./errors.js\";\n\nexport const SITEOS_PLAYWRIGHT_CONFIG = \"siteos.playwright.config.ts\";\nconst PULSE_CACHE_DIRECTORY = \".siteos/pulse/\";\n\nasync function exists(filePath: string): Promise<boolean> {\n try {\n await readFile(filePath);\n return true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return false;\n throw error;\n }\n}\n\nfunction pulsePlaywrightConfigSource(input: {\n testsDir: string;\n baseUrl?: string;\n}): string {\n const testsDir = input.testsDir.replaceAll(\"\\\\\", \"/\");\n return `import { defineConfig, devices } from \"@playwright/test\";\n\nexport default defineConfig({\n testDir: ${JSON.stringify(testsDir === \".\" ? \".\" : `./${testsDir}`)},\n fullyParallel: false,\n forbidOnly: true,\n workers: 1,\n retries: 0,\n projects: [\n {\n name: \"chromium\",\n use: { ...devices[\"Desktop Chrome\"] },\n },\n ],\n use: {\n baseURL:\n process.env.PLAYWRIGHT_BASE_URL ??\n ${JSON.stringify(input.baseUrl ?? \"http://localhost:3000\")},\n screenshot: \"only-on-failure\",\n trace: \"retain-on-failure\",\n video: \"retain-on-failure\",\n },\n});\n`;\n}\n\nasync function createPulsePlaywrightConfig(input: {\n projectRoot: string;\n testsDir: string;\n baseUrl?: string;\n}): Promise<void> {\n const configPath = path.join(input.projectRoot, SITEOS_PLAYWRIGHT_CONFIG);\n if (await exists(configPath)) {\n throw new CliError(\n \"PULSE_PLAYWRIGHT_CONFIG_EXISTS\",\n `${SITEOS_PLAYWRIGHT_CONFIG} already exists.`,\n {\n hint: \"Keep the file and create siteos.config.json manually, or rename it before running `siteos pulse init`.\",\n },\n );\n }\n await writeFile(configPath, pulsePlaywrightConfigSource(input), {\n encoding: \"utf8\",\n flag: \"wx\",\n });\n}\n\nexport async function detectPackageName(projectRoot: string): Promise<string> {\n try {\n const contents = await readFile(\n path.join(projectRoot, \"package.json\"),\n \"utf8\",\n );\n const parsed = JSON.parse(contents) as { name?: unknown };\n return typeof parsed.name === \"string\"\n ? parsed.name\n : path.basename(projectRoot);\n } catch {\n return path.basename(projectRoot);\n }\n}\n\nasync function ensureGitignore(projectRoot: string): Promise<boolean> {\n const gitignorePath = path.join(projectRoot, \".gitignore\");\n let contents = \"\";\n try {\n contents = await readFile(gitignorePath, \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n }\n if (contents.split(/\\r?\\n/).includes(PULSE_CACHE_DIRECTORY)) return false;\n const prefix = contents.length > 0 && !contents.endsWith(\"\\n\") ? \"\\n\" : \"\";\n await writeFile(\n gitignorePath,\n `${contents}${prefix}${PULSE_CACHE_DIRECTORY}\\n`,\n \"utf8\",\n );\n return true;\n}\n\nexport type InitResult = { created: string[]; updated: string[] };\n\nexport async function initializeExistingProject(input: {\n projectRoot: string;\n project: string;\n baseUrl: string;\n testsDir: string;\n supportingFiles: string[];\n checks: ChecksConfig[\"checks\"];\n}): Promise<InitResult> {\n const projectRoot = path.resolve(input.projectRoot);\n const existingConfig = await findChecksConfigFile(projectRoot);\n if (existingConfig) {\n throw new CliError(\"CONFIG_EXISTS\", `${existingConfig} already exists.`, {\n hint: \"Edit the existing file or run `siteos pulse validate`.\",\n });\n }\n const configPath = path.join(projectRoot, CONFIG_FILE);\n const config = ChecksConfigV2Schema.parse({\n version: 2,\n project: {\n slug: projectSlug(input.project),\n name: projectDisplayName(input.project),\n baseUrl: input.baseUrl,\n monitoringEnabled: true,\n },\n testsDir: input.testsDir,\n playwrightConfig: SITEOS_PLAYWRIGHT_CONFIG,\n bundle: input.supportingFiles.length\n ? { include: input.supportingFiles }\n : undefined,\n checks: input.checks,\n apiUrl: DEFAULT_SITEOS_PULSE_API_URL,\n });\n const created = [CONFIG_FILE];\n await createPulsePlaywrightConfig({\n projectRoot,\n testsDir: input.testsDir,\n baseUrl: input.baseUrl,\n });\n created.push(SITEOS_PLAYWRIGHT_CONFIG);\n await writeFile(configPath, `${JSON.stringify(config, null, 2)}\\n`, {\n encoding: \"utf8\",\n flag: \"wx\",\n });\n const updated = (await ensureGitignore(projectRoot)) ? [\".gitignore\"] : [];\n return { created, updated };\n}\n\nexport async function initializeProject(input: {\n projectRoot: string;\n project?: string;\n suite?: string;\n testsDir?: string;\n baseUrl?: string;\n}): Promise<InitResult> {\n const projectRoot = path.resolve(input.projectRoot);\n const existingConfig = await findChecksConfigFile(projectRoot);\n if (existingConfig) {\n throw new CliError(\"CONFIG_EXISTS\", `${existingConfig} already exists.`, {\n hint: \"Edit the existing file or run `siteos pulse validate`.\",\n });\n }\n const configPath = path.join(projectRoot, CONFIG_FILE);\n\n const created: string[] = [];\n const updated: string[] = [];\n const testsDir = input.testsDir ?? \"tests/siteos\";\n const packageName = await detectPackageName(projectRoot);\n const projectName = projectDisplayName(input.project ?? packageName);\n const checkSlug = projectSlug(input.suite ?? \"homepage\");\n const exampleTest = path.posix.join(\n testsDir.replaceAll(\"\\\\\", \"/\"),\n `${checkSlug}.spec.ts`,\n );\n const parsedConfig = ChecksConfigV2Schema.safeParse({\n version: 2,\n project: {\n slug: projectSlug(input.project ?? packageName),\n name: projectName,\n baseUrl: input.baseUrl,\n monitoringEnabled: true,\n },\n testsDir,\n apiUrl: DEFAULT_SITEOS_PULSE_API_URL,\n playwrightConfig: SITEOS_PLAYWRIGHT_CONFIG,\n checks: [\n {\n slug: checkSlug,\n name: projectDisplayName(input.suite ?? \"homepage\"),\n include: [exampleTest],\n active: true,\n schedule: { mode: \"scheduled\", cadenceSeconds: 300 },\n },\n ],\n });\n if (!parsedConfig.success) {\n throw new CliError(\n \"INIT_OPTIONS_INVALID\",\n parsedConfig.error.issues.map((issue) => issue.message).join(\"; \"),\n );\n }\n const config = parsedConfig.data;\n\n await createPulsePlaywrightConfig({\n projectRoot,\n testsDir,\n baseUrl: input.baseUrl,\n });\n created.push(SITEOS_PLAYWRIGHT_CONFIG);\n\n const testDirectory = path.join(projectRoot, testsDir);\n await mkdir(testDirectory, { recursive: true });\n if (!(await exists(path.join(projectRoot, exampleTest)))) {\n await writeFile(\n path.join(projectRoot, exampleTest),\n `import { expect, test } from \"@playwright/test\";\\n\\ntest(${JSON.stringify(`${projectDisplayName(input.suite ?? \"homepage\")} is reachable`)}, async ({ page }) => {\\n await page.goto(\"/\");\\n await expect(page.locator(\"body\")).toBeVisible();\\n});\\n`,\n { encoding: \"utf8\", flag: \"wx\" },\n );\n created.push(exampleTest);\n }\n\n await writeFile(configPath, `${JSON.stringify(config, null, 2)}\\n`, {\n encoding: \"utf8\",\n flag: \"wx\",\n });\n created.unshift(CONFIG_FILE);\n\n if (await ensureGitignore(projectRoot)) updated.push(\".gitignore\");\n return { created, updated };\n}\n","import fg from \"fast-glob\";\n\nimport {\n ChecksConfigV2Schema,\n loadChecksConfigSnapshot,\n saveChecksConfig,\n type ChecksConfig,\n type ChecksConfigSnapshot,\n} from \"./config.js\";\nimport { CliError } from \"./errors.js\";\nimport {\n discoverPlaywrightSelectorMatches,\n discoverPlaywrightSpecs,\n} from \"./interactive/discovery.js\";\nimport { buildSyncPlan, type SyncPlan } from \"./sync-plan.js\";\nimport { analyzeTestImports, type ImportAnalysis } from \"./test-imports.js\";\n\nconst PLAYWRIGHT_SPEC_FILE = /\\.(?:spec|test)\\.(?:[cm]?[jt]sx?)$/;\n\nexport type SyncBlocker = {\n code: \"unsupported-dependency\" | \"compatibility-issue\";\n message: string;\n};\n\nexport type SyncReport = SyncPlan & {\n supportingFiles: {\n configured: string[];\n required: string[];\n added: string[];\n };\n environmentVariables: string[];\n blockers: SyncBlocker[];\n};\n\nexport type SyncInspection = {\n report: SyncReport;\n snapshot: ChecksConfigSnapshot;\n};\n\nexport type PreparedProjectSync = {\n config: ChecksConfig;\n changed: boolean;\n addedChecks: Array<{ path: string; checkSlug: string }>;\n removedSelectors: Array<{ path: string; checkSlug: string }>;\n supportingFilesAdded: string[];\n migrationRequired: boolean;\n};\n\nexport type ProjectSyncResult = Omit<PreparedProjectSync, \"config\">;\n\nfunction sortedUnique(values: string[]): string[] {\n return [...new Set(values)].sort();\n}\n\nfunction exactManagedSpecs(config: ChecksConfig): string[] {\n return sortedUnique(\n config.checks.flatMap((check) => {\n if (check.include.some((selector) => fg.isDynamicPattern(selector)))\n return [];\n return check.include.filter((selector) =>\n PLAYWRIGHT_SPEC_FILE.test(selector),\n );\n }),\n );\n}\n\nfunction blockersFromAnalysis(analysis: ImportAnalysis): SyncBlocker[] {\n const dependencyBlockers = analysis.externalPackages.map((dependency) => {\n const importedBy =\n analysis.externalImporters[dependency]?.join(\", \") ?? \"managed specs\";\n return {\n code: \"unsupported-dependency\" as const,\n message: `${dependency} is imported by ${importedBy}.`,\n };\n });\n return [\n ...dependencyBlockers,\n ...analysis.compatibilityIssues.map((message) => ({\n code: \"compatibility-issue\" as const,\n message,\n })),\n ];\n}\n\nasync function analyzeManagedSpecs(\n projectRoot: string,\n configOrEntryFiles: ChecksConfig | string[],\n): Promise<ImportAnalysis> {\n const entryFiles = Array.isArray(configOrEntryFiles)\n ? sortedUnique(configOrEntryFiles)\n : exactManagedSpecs(configOrEntryFiles);\n if (entryFiles.length === 0) {\n return {\n supportingFiles: [],\n externalPackages: [],\n externalImporters: {},\n environmentVariables: [],\n compatibilityIssues: [],\n };\n }\n return analyzeTestImports({ projectRoot, entryFiles });\n}\n\nexport async function inspectProjectSync(\n projectRoot: string,\n): Promise<SyncInspection> {\n const snapshot = await loadChecksConfigSnapshot(projectRoot);\n const discoveredSpecs = await discoverPlaywrightSpecs(\n projectRoot,\n snapshot.config.testsDir,\n );\n const patternChecks = snapshot.config.checks.filter((check) =>\n check.include.some((selector) => fg.isDynamicPattern(selector)),\n );\n const patternEntries = await Promise.all(\n patternChecks.map(async (check) => [\n check.slug,\n await discoverPlaywrightSelectorMatches(\n projectRoot,\n check.include,\n snapshot.config.testsDir,\n ),\n ]),\n );\n const plan = buildSyncPlan({\n config: snapshot.config,\n discoveredSpecs,\n patternMatchesByCheck: Object.fromEntries(patternEntries),\n migrationRequired: snapshot.migrationRequired,\n });\n const analysis = await analyzeManagedSpecs(\n projectRoot,\n plan.unchanged.map((entry) => entry.path),\n );\n const configuredSupportingFiles = sortedUnique(\n snapshot.config.bundle?.include ?? [],\n );\n const supportingFilesAdded = analysis.supportingFiles.filter(\n (file) => !configuredSupportingFiles.includes(file),\n );\n\n return {\n snapshot,\n report: {\n ...plan,\n hasDrift: plan.hasDrift || supportingFilesAdded.length > 0,\n supportingFiles: {\n configured: configuredSupportingFiles,\n required: analysis.supportingFiles,\n added: supportingFilesAdded,\n },\n environmentVariables: analysis.environmentVariables,\n blockers: blockersFromAnalysis(analysis),\n },\n };\n}\n\nfunction uniqueSlug(base: string, used: Set<string>): string {\n let candidate = base;\n let suffix = 2;\n while (used.has(candidate)) {\n candidate = `${base.slice(0, Math.max(1, 80 - String(suffix).length - 1))}-${suffix}`;\n suffix += 1;\n }\n used.add(candidate);\n return candidate;\n}\n\nfunction assertReviewedSelections(input: {\n inspection: SyncInspection;\n selectedAdded: string[];\n selectedRemoved: Array<{ path: string; checkSlug: string }>;\n}): void {\n const reviewedAdded = new Set(\n input.inspection.report.added.map((entry) => entry.path),\n );\n const reviewedRemoved = new Set(\n input.inspection.report.removed.map(\n (entry) => `${entry.checkSlug}\\0${entry.path}`,\n ),\n );\n const invalidAdded = input.selectedAdded.find(\n (spec) => !reviewedAdded.has(spec),\n );\n const invalidRemoved = input.selectedRemoved.find(\n (entry) => !reviewedRemoved.has(`${entry.checkSlug}\\0${entry.path}`),\n );\n if (invalidAdded || invalidRemoved) {\n throw new CliError(\n \"SYNC_SELECTION_INVALID\",\n \"The synchronization selection contains a change that was not part of the reviewed plan.\",\n {\n hint: \"Run `siteos pulse sync` again and review the current project state.\",\n },\n );\n }\n}\n\nfunction throwForBlockers(analysis: ImportAnalysis): void {\n const dependency = analysis.externalPackages[0];\n if (dependency) {\n const importedBy =\n analysis.externalImporters[dependency]?.join(\", \") ?? \"managed specs\";\n throw new CliError(\n \"SYNC_UNSUPPORTED_DEPENDENCY\",\n `Cannot synchronize ${dependency}; it is imported by ${importedBy}.`,\n { hint: \"Use local helpers or a dedicated Check without that package.\" },\n );\n }\n const compatibilityIssue = analysis.compatibilityIssues[0];\n if (compatibilityIssue) {\n throw new CliError(\"SYNC_COMPATIBILITY_ISSUE\", compatibilityIssue, {\n hint: \"Use a dedicated Pulse Playwright configuration without webServer imports.\",\n });\n }\n}\n\nexport async function prepareProjectSync(input: {\n projectRoot: string;\n inspection: SyncInspection;\n selectedAdded: string[];\n selectedRemoved?: Array<{ path: string; checkSlug: string }>;\n}): Promise<PreparedProjectSync> {\n const selectedAdded = sortedUnique(input.selectedAdded);\n const selectedRemoved =\n input.selectedRemoved ?? input.inspection.report.removed;\n assertReviewedSelections({\n inspection: input.inspection,\n selectedAdded,\n selectedRemoved,\n });\n\n const removedKeys = new Set(\n selectedRemoved.map((entry) => `${entry.checkSlug}\\0${entry.path}`),\n );\n const checks = input.inspection.snapshot.config.checks\n .map((check) => ({\n ...check,\n include: check.include.filter(\n (selector) => !removedKeys.has(`${check.slug}\\0${selector}`),\n ),\n }))\n .filter((check) => check.include.length > 0);\n const usedSlugs = new Set(checks.map((check) => check.slug));\n const addedChecks: PreparedProjectSync[\"addedChecks\"] = [];\n for (const specPath of selectedAdded) {\n const addition = input.inspection.report.added.find(\n (entry) => entry.path === specPath,\n )!;\n const checkSlug = uniqueSlug(addition.defaultSlug, usedSlugs);\n checks.push({\n slug: checkSlug,\n name: addition.defaultName,\n include: [specPath],\n active: true,\n schedule: { mode: \"manual\" },\n });\n addedChecks.push({ path: specPath, checkSlug });\n }\n if (checks.length === 0) {\n throw new CliError(\n \"NO_MONITORED_CHECKS\",\n \"Synchronization would remove every monitored Check.\",\n {\n hint: \"Select at least one discovered spec before applying synchronization.\",\n },\n );\n }\n\n const candidate = ChecksConfigV2Schema.parse({\n ...input.inspection.snapshot.config,\n checks,\n });\n const analysis = await analyzeManagedSpecs(input.projectRoot, candidate);\n throwForBlockers(analysis);\n const configuredSupportingFiles = candidate.bundle?.include ?? [];\n const supportingFilesAdded = analysis.supportingFiles.filter(\n (file) => !configuredSupportingFiles.includes(file),\n );\n const mergedSupportingFiles = sortedUnique([\n ...configuredSupportingFiles,\n ...analysis.supportingFiles,\n ]);\n const config = ChecksConfigV2Schema.parse({\n ...candidate,\n bundle:\n mergedSupportingFiles.length > 0\n ? { include: mergedSupportingFiles }\n : candidate.bundle,\n });\n\n return {\n config,\n changed:\n addedChecks.length > 0 ||\n selectedRemoved.length > 0 ||\n supportingFilesAdded.length > 0 ||\n input.inspection.snapshot.migrationRequired,\n addedChecks,\n removedSelectors: selectedRemoved,\n supportingFilesAdded,\n migrationRequired: input.inspection.snapshot.migrationRequired,\n };\n}\n\nexport async function writeProjectSync(input: {\n projectRoot: string;\n inspection: SyncInspection;\n prepared: PreparedProjectSync;\n}): Promise<ProjectSyncResult> {\n if (input.prepared.changed) {\n await saveChecksConfig(input.projectRoot, input.prepared.config, {\n expectedChecksum: input.inspection.snapshot.checksum,\n });\n }\n const { config: _config, ...result } = input.prepared;\n return result;\n}\n\nexport async function applyProjectSync(input: {\n projectRoot: string;\n inspection: SyncInspection;\n selectedAdded: string[];\n selectedRemoved?: Array<{ path: string; checkSlug: string }>;\n}): Promise<ProjectSyncResult> {\n const prepared = await prepareProjectSync(input);\n return writeProjectSync({\n projectRoot: input.projectRoot,\n inspection: input.inspection,\n prepared,\n });\n}\n","import { readFile } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\n\nimport fg from \"fast-glob\";\n\nimport {\n loadRootPlaywrightConfig,\n type RootPlaywrightConfig,\n} from \"./playwright-config.js\";\n\nconst PLAYWRIGHT_CONFIG_PATTERNS = [\n \"playwright.config.{js,cjs,mjs,ts,cts,mts}\",\n \"**/playwright.config.{js,cjs,mjs,ts,cts,mts}\",\n \"*.playwright.config.{js,cjs,mjs,ts,cts,mts}\",\n \"**/*.playwright.config.{js,cjs,mjs,ts,cts,mts}\",\n];\nconst PLAYWRIGHT_SPEC_PATTERN =\n \"**/*.{spec,test}.{js,cjs,mjs,ts,cts,mts,jsx,tsx}\";\nconst IGNORE = [\n \"**/node_modules/**\",\n \"**/.git/**\",\n \"**/.checks/**\",\n \"**/.siteos/**\",\n \"**/.output/**\",\n \"**/dist/**\",\n \"**/build/**\",\n \"**/output/**\",\n \"**/test-results/**\",\n \"**/playwright-report/**\",\n];\n\nexport async function discoverPlaywrightSpecs(\n projectRoot: string,\n testsDir: string,\n): Promise<string[]> {\n const normalizedTestsDir = testsDir\n .replaceAll(\"\\\\\", \"/\")\n .replace(/^\\.\\//, \"\");\n const specPaths = await fg(PLAYWRIGHT_SPEC_PATTERN, {\n cwd: projectRoot,\n onlyFiles: true,\n unique: true,\n followSymbolicLinks: false,\n ignore: IGNORE,\n });\n return specPaths\n .map((value) => value.replaceAll(\"\\\\\", \"/\"))\n .filter(\n (specPath) =>\n normalizedTestsDir === \".\" ||\n specPath.startsWith(`${normalizedTestsDir}/`),\n )\n .sort();\n}\n\nexport async function discoverPlaywrightSelectorMatches(\n projectRoot: string,\n selectors: string[],\n testsDir: string,\n): Promise<string[]> {\n if (selectors.length === 0) return [];\n const discovered = new Set(\n await discoverPlaywrightSpecs(projectRoot, testsDir),\n );\n const matches = await fg(selectors, {\n cwd: projectRoot,\n onlyFiles: true,\n unique: true,\n followSymbolicLinks: false,\n ignore: IGNORE,\n });\n return matches\n .map((value) => value.replaceAll(\"\\\\\", \"/\"))\n .filter((value) => discovered.has(value))\n .sort();\n}\n\nexport type PlaywrightDiscovery = {\n hasPlaywright: boolean;\n configs: string[];\n rootConfig: RootPlaywrightConfig | null;\n specs: Array<{ path: string; group: string }>;\n};\n\nfunction declaredDependencies(source: unknown): Record<string, unknown> {\n if (!source || typeof source !== \"object\" || Array.isArray(source)) return {};\n const record = source as Record<string, unknown>;\n return {\n ...(record.dependencies && typeof record.dependencies === \"object\"\n ? (record.dependencies as Record<string, unknown>)\n : {}),\n ...(record.devDependencies && typeof record.devDependencies === \"object\"\n ? (record.devDependencies as Record<string, unknown>)\n : {}),\n };\n}\n\nfunction specGroup(specPath: string): string {\n const directory = path.posix.dirname(specPath);\n return directory === \".\" ? \"Project root\" : directory;\n}\n\nfunction playwrightIsResolvable(projectRoot: string): boolean {\n try {\n createRequire(path.join(projectRoot, \"package.json\")).resolve(\n \"@playwright/test\",\n );\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function discoverPlaywrightProject(\n projectRoot: string,\n): Promise<PlaywrightDiscovery> {\n let packageJson: unknown = null;\n try {\n packageJson = JSON.parse(\n await readFile(path.join(projectRoot, \"package.json\"), \"utf8\"),\n );\n } catch {\n // The existing initialization flow reports a missing or invalid package.json during validation.\n }\n const dependencies = declaredDependencies(packageJson);\n const [rawConfigs, allSpecPaths] = await Promise.all([\n fg(PLAYWRIGHT_CONFIG_PATTERNS, {\n cwd: projectRoot,\n onlyFiles: true,\n unique: true,\n followSymbolicLinks: false,\n ignore: IGNORE,\n }),\n discoverPlaywrightSpecs(projectRoot, \".\"),\n ]);\n const configs = rawConfigs.map((value) => value.replaceAll(\"\\\\\", \"/\")).sort();\n const rootConfig = await loadRootPlaywrightConfig(projectRoot, configs);\n const normalizedSpecPaths = allSpecPaths\n .map((value) => value.replaceAll(\"\\\\\", \"/\"))\n .sort();\n const scopedSpecPaths = rootConfig\n ? normalizedSpecPaths.filter(\n (specPath) =>\n rootConfig.testDir === \".\" ||\n specPath.startsWith(`${rootConfig.testDir}/`),\n )\n : normalizedSpecPaths;\n\n return {\n hasPlaywright:\n \"@playwright/test\" in dependencies || playwrightIsResolvable(projectRoot),\n configs,\n rootConfig,\n specs: scopedSpecPaths.map((specPath) => ({\n path: specPath,\n group: specGroup(specPath),\n })),\n };\n}\n\nexport function commonTestsDirectory(files: string[]): string {\n if (files.length === 0) return \"tests\";\n const directories = files.map((file) => path.posix.dirname(file).split(\"/\"));\n const common: string[] = [];\n for (let index = 0; index < directories[0]!.length; index += 1) {\n const segment = directories[0]![index];\n if (\n !segment ||\n directories.some((directory) => directory[index] !== segment)\n )\n break;\n common.push(segment);\n }\n return common.join(\"/\") || \".\";\n}\n\nexport function checkNameFromSpec(specPath: string): string {\n const basename = path.posix\n .basename(specPath)\n .replace(/\\.(?:spec|test)\\.[^.]+$/, \"\");\n return (\n basename\n .split(/[^A-Za-z0-9]+/)\n .filter(Boolean)\n .map((word) => `${word.charAt(0).toUpperCase()}${word.slice(1)}`)\n .join(\" \") || \"Smoke\"\n );\n}\n","import { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { CliError } from \"../errors.js\";\n\nconst ROOT_PLAYWRIGHT_CONFIG_CANDIDATES = [\n \"playwright.config.ts\",\n \"playwright.config.mts\",\n \"playwright.config.cts\",\n \"playwright.config.js\",\n \"playwright.config.mjs\",\n \"playwright.config.cjs\",\n] as const;\n\ntype Token = {\n kind: \"identifier\" | \"punctuation\" | \"spread\" | \"string\" | \"other\";\n value: string;\n};\n\nexport type RootPlaywrightConfig = {\n path: string;\n testDir: string;\n};\n\nfunction isIdentifierStart(character: string): boolean {\n return /[A-Za-z_$]/.test(character);\n}\n\nfunction isIdentifierPart(character: string): boolean {\n return /[A-Za-z0-9_$]/.test(character);\n}\n\nfunction decodeEscape(\n source: string,\n index: number,\n): { value: string; nextIndex: number } {\n const escaped = source[index];\n if (escaped === undefined) return { value: \"\", nextIndex: index };\n const simpleEscapes: Record<string, string> = {\n \"0\": \"\\0\",\n b: \"\\b\",\n f: \"\\f\",\n n: \"\\n\",\n r: \"\\r\",\n t: \"\\t\",\n v: \"\\v\",\n };\n if (escaped in simpleEscapes) {\n return { value: simpleEscapes[escaped]!, nextIndex: index + 1 };\n }\n if (escaped === \"\\n\") return { value: \"\", nextIndex: index + 1 };\n if (escaped === \"\\r\" && source[index + 1] === \"\\n\") {\n return { value: \"\", nextIndex: index + 2 };\n }\n if (escaped === \"x\") {\n const hex = source.slice(index + 1, index + 3);\n if (/^[0-9A-Fa-f]{2}$/.test(hex)) {\n return {\n value: String.fromCodePoint(Number.parseInt(hex, 16)),\n nextIndex: index + 3,\n };\n }\n }\n if (escaped === \"u\") {\n const hex = source.slice(index + 1, index + 5);\n if (/^[0-9A-Fa-f]{4}$/.test(hex)) {\n return {\n value: String.fromCodePoint(Number.parseInt(hex, 16)),\n nextIndex: index + 5,\n };\n }\n }\n return { value: escaped, nextIndex: index + 1 };\n}\n\nfunction readStringToken(\n source: string,\n start: number,\n): { token: Token; nextIndex: number } {\n const quote = source[start]!;\n let value = \"\";\n let dynamicTemplate = false;\n let index = start + 1;\n while (index < source.length) {\n const character = source[index]!;\n if (character === quote) {\n return {\n token: {\n kind: quote === \"`\" && dynamicTemplate ? \"other\" : \"string\",\n value,\n },\n nextIndex: index + 1,\n };\n }\n if (quote === \"`\" && character === \"$\" && source[index + 1] === \"{\") {\n dynamicTemplate = true;\n }\n if (character === \"\\\\\") {\n const decoded = decodeEscape(source, index + 1);\n value += decoded.value;\n index = decoded.nextIndex;\n continue;\n }\n value += character;\n index += 1;\n }\n return { token: { kind: \"other\", value }, nextIndex: source.length };\n}\n\nfunction readRegexToken(source: string, start: number): number {\n let escaped = false;\n let characterClass = false;\n for (let index = start + 1; index < source.length; index += 1) {\n const character = source[index]!;\n if (escaped) {\n escaped = false;\n continue;\n }\n if (character === \"\\\\\") {\n escaped = true;\n continue;\n }\n if (character === \"[\") {\n characterClass = true;\n continue;\n }\n if (character === \"]\") {\n characterClass = false;\n continue;\n }\n if (character === \"/\" && !characterClass) {\n index += 1;\n while (/[A-Za-z]/.test(source[index] ?? \"\")) index += 1;\n return index;\n }\n }\n return source.length;\n}\n\nfunction tokenize(source: string): Token[] {\n const tokens: Token[] = [];\n let index = 0;\n while (index < source.length) {\n const character = source[index]!;\n if (/\\s/.test(character)) {\n index += 1;\n continue;\n }\n if (character === \"/\" && source[index + 1] === \"/\") {\n index = source.indexOf(\"\\n\", index + 2);\n if (index === -1) break;\n continue;\n }\n if (character === \"/\" && source[index + 1] === \"*\") {\n const end = source.indexOf(\"*/\", index + 2);\n index = end === -1 ? source.length : end + 2;\n continue;\n }\n if (\n character === \"/\" &&\n source[index + 1] !== \"/\" &&\n source[index + 1] !== \"*\"\n ) {\n index = readRegexToken(source, index);\n tokens.push({ kind: \"other\", value: \"/\" });\n continue;\n }\n if (character === '\"' || character === \"'\" || character === \"`\") {\n const result = readStringToken(source, index);\n tokens.push(result.token);\n index = result.nextIndex;\n continue;\n }\n if (source.startsWith(\"...\", index)) {\n tokens.push({ kind: \"spread\", value: \"...\" });\n index += 3;\n continue;\n }\n if (isIdentifierStart(character)) {\n let end = index + 1;\n while (end < source.length && isIdentifierPart(source[end]!)) end += 1;\n tokens.push({ kind: \"identifier\", value: source.slice(index, end) });\n index = end;\n continue;\n }\n if (\"{}():,;[]\".includes(character)) {\n tokens.push({ kind: \"punctuation\", value: character });\n index += 1;\n continue;\n }\n tokens.push({ kind: \"other\", value: character });\n index += 1;\n }\n return tokens;\n}\n\nfunction findConfigObjectStart(tokens: Token[]): number | null {\n for (let index = 0; index < tokens.length; index += 1) {\n if (\n tokens[index]?.kind === \"identifier\" &&\n tokens[index]?.value === \"defineConfig\" &&\n tokens[index + 1]?.value === \"(\"\n ) {\n for (\n let candidateIndex = index + 2;\n candidateIndex < tokens.length;\n candidateIndex += 1\n ) {\n const candidate = tokens[candidateIndex]!;\n if (candidate.value === \"{\") return candidateIndex;\n if (candidate.value === \")\" || candidate.value === \";\") break;\n }\n }\n if (\n tokens[index]?.kind === \"identifier\" &&\n tokens[index]?.value === \"export\" &&\n tokens[index + 1]?.kind === \"identifier\" &&\n tokens[index + 1]?.value === \"default\" &&\n tokens[index + 2]?.value === \"{\"\n ) {\n return index + 2;\n }\n }\n return null;\n}\n\nfunction staticTestDir(\n source: string,\n): { kind: \"literal\"; value: string } | { kind: \"omitted\" } {\n const tokens = tokenize(source);\n const objectStart = findConfigObjectStart(tokens);\n if (objectStart === null) {\n throw new CliError(\n \"PLAYWRIGHT_TEST_DIR_UNSUPPORTED\",\n \"The root Playwright configuration cannot be inspected safely.\",\n {\n hint: 'Export defineConfig({ testDir: \"./tests\" }) with a literal testDir, or create dedicated monitoring tests.',\n },\n );\n }\n\n let depth = 0;\n let resolvedLiteral: string | null = null;\n let unresolvedAfterLiteral = false;\n for (let index = objectStart; index < tokens.length; index += 1) {\n const token = tokens[index]!;\n if (token.value === \"{\") {\n depth += 1;\n continue;\n }\n if (token.value === \"}\") {\n depth -= 1;\n if (depth === 0) break;\n continue;\n }\n if (depth !== 1) continue;\n if (token.kind === \"spread\") {\n unresolvedAfterLiteral = true;\n continue;\n }\n if (\n token.value !== \"testDir\" ||\n (token.kind !== \"identifier\" && token.kind !== \"string\")\n ) {\n continue;\n }\n if (tokens[index + 1]?.value !== \":\") {\n throw new CliError(\n \"PLAYWRIGHT_TEST_DIR_UNSUPPORTED\",\n \"The root Playwright testDir must be a string literal.\",\n {\n hint: 'Set testDir directly, for example testDir: \"./tests\", or create dedicated monitoring tests.',\n },\n );\n }\n const value = tokens[index + 2];\n if (value?.kind !== \"string\") {\n throw new CliError(\n \"PLAYWRIGHT_TEST_DIR_UNSUPPORTED\",\n \"The root Playwright testDir must be a string literal.\",\n {\n hint: 'Set testDir directly, for example testDir: \"./tests\", or create dedicated monitoring tests.',\n },\n );\n }\n resolvedLiteral = value.value;\n unresolvedAfterLiteral = false;\n }\n\n if (unresolvedAfterLiteral) {\n throw new CliError(\n \"PLAYWRIGHT_TEST_DIR_UNSUPPORTED\",\n \"The root Playwright testDir may be supplied by a dynamic configuration spread.\",\n {\n hint: \"Set testDir directly in the root config, or create dedicated monitoring tests.\",\n },\n );\n }\n if (resolvedLiteral !== null)\n return { kind: \"literal\", value: resolvedLiteral };\n return { kind: \"omitted\" };\n}\n\nfunction projectRelativeTestDir(\n projectRoot: string,\n configPath: string,\n configured: string,\n): string {\n const absoluteProjectRoot = path.resolve(projectRoot);\n const configDirectory = path.dirname(\n path.join(absoluteProjectRoot, configPath),\n );\n const portableConfiguredPath = configured.replaceAll(\"\\\\\", path.sep);\n const absoluteTestDir = path.resolve(configDirectory, portableConfiguredPath);\n const relative = path.relative(absoluteProjectRoot, absoluteTestDir);\n if (\n relative === \"..\" ||\n relative.startsWith(`..${path.sep}`) ||\n path.isAbsolute(relative)\n ) {\n throw new CliError(\n \"PLAYWRIGHT_TEST_DIR_OUTSIDE_PROJECT\",\n `The root Playwright testDir resolves outside the project: ${configured}.`,\n {\n hint: \"Keep monitored tests inside the project, or create dedicated monitoring tests.\",\n },\n );\n }\n return relative ? relative.replaceAll(path.sep, \"/\") : \".\";\n}\n\nexport async function loadRootPlaywrightConfig(\n projectRoot: string,\n discoveredConfigs: string[],\n): Promise<RootPlaywrightConfig | null> {\n const configPath =\n ROOT_PLAYWRIGHT_CONFIG_CANDIDATES.find((candidate) =>\n discoveredConfigs.includes(candidate),\n ) ?? null;\n if (!configPath) return null;\n\n let source: string;\n try {\n source = await readFile(path.join(projectRoot, configPath), \"utf8\");\n } catch {\n throw new CliError(\n \"PLAYWRIGHT_CONFIG_UNREADABLE\",\n `The root Playwright configuration could not be read: ${configPath}.`,\n { hint: \"Check the file permissions and try again.\" },\n );\n }\n const resolved = staticTestDir(source);\n return {\n path: configPath,\n testDir: projectRelativeTestDir(\n projectRoot,\n configPath,\n resolved.kind === \"literal\" ? resolved.value : \".\",\n ),\n };\n}\n","import path from \"node:path\";\n\nimport fg from \"fast-glob\";\n\nimport { projectSlug, type ChecksConfig } from \"./config.js\";\n\nconst PLAYWRIGHT_SPEC_FILE = /\\.(?:spec|test)\\.(?:[cm]?[jt]sx?)$/;\n\nexport type SyncPlan = {\n added: Array<{ path: string; defaultName: string; defaultSlug: string }>;\n removed: Array<{ path: string; checkSlug: string }>;\n unchanged: Array<{ path: string; checkSlug: string }>;\n patternManaged: Array<{\n checkSlug: string;\n selectors: string[];\n matchedSpecs: string[];\n }>;\n migrationRequired: boolean;\n hasDrift: boolean;\n};\n\nfunction defaultNameFromSpec(specPath: string): string {\n const basename = path.posix\n .basename(specPath)\n .replace(/\\.(?:spec|test)\\.[^.]+$/, \"\");\n return (\n basename\n .split(/[^A-Za-z0-9]+/)\n .filter(Boolean)\n .map((word) => `${word.charAt(0).toUpperCase()}${word.slice(1)}`)\n .join(\" \") || \"Smoke\"\n );\n}\n\nfunction normalizedPaths(paths: string[]): string[] {\n return [...new Set(paths.map((value) => value.replaceAll(\"\\\\\", \"/\")))].sort();\n}\n\nexport function buildSyncPlan(input: {\n config: ChecksConfig;\n discoveredSpecs: string[];\n patternMatchesByCheck: Record<string, string[]>;\n migrationRequired: boolean;\n}): SyncPlan {\n const discovered = normalizedPaths(input.discoveredSpecs);\n const discoveredSet = new Set(discovered);\n const exactConfigured = new Set<string>();\n const patternCovered = new Set<string>();\n const removed: SyncPlan[\"removed\"] = [];\n const unchanged: SyncPlan[\"unchanged\"] = [];\n const patternManaged: SyncPlan[\"patternManaged\"] = [];\n\n for (const check of input.config.checks) {\n const selectors = normalizedPaths(check.include);\n if (selectors.some((selector) => fg.isDynamicPattern(selector))) {\n const matchedSpecs = normalizedPaths(\n input.patternMatchesByCheck[check.slug] ?? [],\n );\n matchedSpecs.forEach((spec) => patternCovered.add(spec));\n patternManaged.push({ checkSlug: check.slug, selectors, matchedSpecs });\n continue;\n }\n\n for (const selector of selectors.filter((value) =>\n PLAYWRIGHT_SPEC_FILE.test(value),\n )) {\n exactConfigured.add(selector);\n if (discoveredSet.has(selector))\n unchanged.push({ path: selector, checkSlug: check.slug });\n else removed.push({ path: selector, checkSlug: check.slug });\n }\n }\n\n const added = discovered\n .filter((spec) => !exactConfigured.has(spec) && !patternCovered.has(spec))\n .map((spec) => {\n const defaultName = defaultNameFromSpec(spec);\n return { path: spec, defaultName, defaultSlug: projectSlug(defaultName) };\n });\n\n removed.sort((left, right) =>\n left.path === right.path\n ? left.checkSlug.localeCompare(right.checkSlug)\n : left.path.localeCompare(right.path),\n );\n unchanged.sort((left, right) =>\n left.path === right.path\n ? left.checkSlug.localeCompare(right.checkSlug)\n : left.path.localeCompare(right.path),\n );\n patternManaged.sort((left, right) =>\n left.checkSlug.localeCompare(right.checkSlug),\n );\n\n return {\n added,\n removed,\n unchanged,\n patternManaged,\n migrationRequired: input.migrationRequired,\n hasDrift: added.length > 0 || removed.length > 0 || input.migrationRequired,\n };\n}\n","import { builtinModules } from \"node:module\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { build } from \"esbuild\";\n\nimport { CliError } from \"./errors.js\";\n\nconst ALLOWED_PACKAGES = new Set([\"@playwright/test\"]);\nconst BUILTINS = new Set([\n ...builtinModules,\n ...builtinModules.map((name) => `node:${name}`),\n]);\nconst ENVIRONMENT_PATTERN = /\\bprocess\\.env\\.([A-Z][A-Z0-9_]*)\\b/g;\n\nexport type ImportAnalysis = {\n supportingFiles: string[];\n externalPackages: string[];\n externalImporters: Record<string, string[]>;\n environmentVariables: string[];\n compatibilityIssues: string[];\n};\n\nfunction packageName(importPath: string): string {\n if (importPath.startsWith(\"@\"))\n return importPath.split(\"/\").slice(0, 2).join(\"/\");\n return importPath.split(\"/\")[0] ?? importPath;\n}\n\nfunction normalizedRelativePath(\n projectRoot: string,\n inputPath: string,\n): string {\n const absolute = path.isAbsolute(inputPath)\n ? inputPath\n : path.resolve(projectRoot, inputPath);\n const relative = path.relative(projectRoot, absolute).replaceAll(\"\\\\\", \"/\");\n if (!relative || relative.startsWith(\"../\") || path.isAbsolute(relative)) {\n throw new CliError(\n \"IMPORT_OUTSIDE_PROJECT\",\n `A selected test imports outside the project: ${inputPath}`,\n );\n }\n return relative;\n}\n\nexport async function analyzeTestImports(input: {\n projectRoot: string;\n entryFiles: string[];\n}): Promise<ImportAnalysis> {\n const projectRoot = path.resolve(input.projectRoot);\n const entryFiles = [\n ...new Set(\n input.entryFiles.map((file) => normalizedRelativePath(projectRoot, file)),\n ),\n ];\n let result: Awaited<ReturnType<typeof build>>;\n try {\n result = await build({\n absWorkingDir: projectRoot,\n entryPoints: entryFiles,\n outdir: \".siteos-pulse-analysis\",\n bundle: true,\n write: false,\n metafile: true,\n platform: \"node\",\n format: \"esm\",\n packages: \"external\",\n logLevel: \"silent\",\n sourcemap: false,\n });\n } catch (error) {\n throw new CliError(\n \"IMPORT_ANALYSIS_FAILED\",\n error instanceof Error\n ? error.message\n : \"Selected Playwright imports could not be analyzed.\",\n {\n hint: \"Use a dedicated Pulse suite or simplify imports used by the selected specs.\",\n },\n );\n }\n\n const inputs = Object.keys(result.metafile?.inputs ?? {}).map((file) =>\n normalizedRelativePath(projectRoot, file),\n );\n const entrySet = new Set(entryFiles);\n const externalPackages = new Set<string>();\n const externalImporters = new Map<string, Set<string>>();\n for (const [sourceFile, inputMetadata] of Object.entries(\n result.metafile?.inputs ?? {},\n )) {\n for (const imported of inputMetadata.imports) {\n if (!imported.external || BUILTINS.has(imported.path)) continue;\n const dependency = packageName(imported.path);\n if (ALLOWED_PACKAGES.has(dependency)) continue;\n const importers = externalImporters.get(dependency) ?? new Set<string>();\n importers.add(normalizedRelativePath(projectRoot, sourceFile));\n externalImporters.set(dependency, importers);\n }\n }\n for (const output of Object.values(result.metafile?.outputs ?? {})) {\n for (const imported of output.imports) {\n if (!imported.external || BUILTINS.has(imported.path)) continue;\n const dependency = packageName(imported.path);\n if (!ALLOWED_PACKAGES.has(dependency)) externalPackages.add(dependency);\n }\n }\n\n const environmentVariables = new Set<string>();\n const compatibilityIssues = new Set<string>();\n await Promise.all(\n inputs.map(async (file) => {\n const source = await readFile(path.join(projectRoot, file), \"utf8\").catch(\n () => \"\",\n );\n for (const match of source.matchAll(ENVIRONMENT_PATTERN)) {\n if (match[1] && match[1] !== \"PLAYWRIGHT_BASE_URL\") {\n environmentVariables.add(match[1]);\n }\n }\n if (\n /playwright\\.config\\.[^.]+$/.test(file) &&\n /\\bwebServer\\s*:/.test(source)\n ) {\n compatibilityIssues.add(\n `${file} defines webServer, which cannot start the repository application in the isolated runner.`,\n );\n }\n }),\n );\n\n return {\n supportingFiles: inputs.filter((file) => !entrySet.has(file)).sort(),\n externalPackages: [...externalPackages].sort(),\n externalImporters: Object.fromEntries(\n [...externalImporters.entries()]\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([dependency, importers]) => [dependency, [...importers].sort()]),\n ),\n environmentVariables: [...environmentVariables].sort(),\n compatibilityIssues: [...compatibilityIssues].sort(),\n };\n}\n","import { createInterface, type Interface } from \"node:readline/promises\";\n\nexport type SelectOption<T extends string> = { label: string; value: T };\n\nexport interface PromptPort {\n pause(message: string): Promise<void>;\n input(input: {\n message: string;\n defaultValue?: string;\n validate?: (value: string) => string | null;\n }): Promise<string>;\n confirm(input: { message: string; defaultValue: boolean }): Promise<boolean>;\n select<T extends string>(input: {\n message: string;\n options: Array<SelectOption<T>>;\n }): Promise<T>;\n multiSelect<T extends string>(input: {\n message: string;\n options: Array<SelectOption<T>>;\n allowEmpty?: boolean;\n }): Promise<T[]>;\n close(): void;\n}\n\nexport class TerminalPrompt implements PromptPort {\n readonly #readline: Interface;\n\n constructor() {\n this.#readline = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n }\n\n async pause(message: string): Promise<void> {\n await this.#readline.question(`${message} `);\n }\n\n async input(input: {\n message: string;\n defaultValue?: string;\n validate?: (value: string) => string | null;\n }): Promise<string> {\n while (true) {\n const suffix = input.defaultValue ? ` (${input.defaultValue})` : \"\";\n const answer = (\n await this.#readline.question(`${input.message}${suffix}: `)\n ).trim();\n const value = answer || input.defaultValue || \"\";\n const validationError = input.validate?.(value) ?? null;\n if (!validationError) return value;\n console.error(validationError);\n }\n }\n\n async confirm(input: {\n message: string;\n defaultValue: boolean;\n }): Promise<boolean> {\n const suffix = input.defaultValue ? \" (Y/n)\" : \" (y/N)\";\n const answer = (\n await this.#readline.question(`${input.message}${suffix}: `)\n )\n .trim()\n .toLowerCase();\n if (!answer) return input.defaultValue;\n return answer === \"y\" || answer === \"yes\";\n }\n\n async select<T extends string>(input: {\n message: string;\n options: Array<SelectOption<T>>;\n }): Promise<T> {\n console.log(input.message);\n input.options.forEach((option, index) =>\n console.log(` ${index + 1}. ${option.label}`),\n );\n while (true) {\n const answer = (\n await this.#readline.question(\"Choose an option: \")\n ).trim();\n const index = Number(answer) - 1;\n const option = input.options[index];\n if (option) return option.value;\n console.error(`Enter a number from 1 to ${input.options.length}.`);\n }\n }\n\n async multiSelect<T extends string>(input: {\n message: string;\n options: Array<SelectOption<T>>;\n allowEmpty?: boolean;\n }): Promise<T[]> {\n console.log(input.message);\n input.options.forEach((option, index) =>\n console.log(` ${index + 1}. ${option.label}`),\n );\n while (true) {\n const answer = (\n await this.#readline.question(\n input.allowEmpty\n ? \"Choose options (comma-separated, or press Enter for none): \"\n : \"Choose one or more options (comma-separated): \",\n )\n ).trim();\n if (!answer && input.allowEmpty) return [];\n const indexes = [\n ...new Set(\n answer\n .split(\",\")\n .map((value) => Number(value.trim()) - 1)\n .filter((value) => Number.isInteger(value)),\n ),\n ];\n const options = indexes\n .map((index) => input.options[index])\n .filter(Boolean) as Array<SelectOption<T>>;\n if (options.length === indexes.length && options.length > 0) {\n return options.map((option) => option.value);\n }\n console.error(\n `Enter one or more numbers from 1 to ${input.options.length}.`,\n );\n }\n }\n\n close(): void {\n this.#readline.close();\n }\n}\n","import {\n inspectProjectSync,\n prepareProjectSync,\n writeProjectSync,\n type PreparedProjectSync,\n type ProjectSyncResult,\n type SyncInspection,\n} from \"../sync.js\";\nimport type { PromptPort } from \"./prompt.js\";\nimport { TerminalPrompt } from \"./prompt.js\";\n\nexport interface SyncOutput {\n log(message: string): void;\n error(message: string): void;\n}\n\nexport interface SyncWorkflowDependencies {\n inspect(projectRoot: string): Promise<SyncInspection>;\n prepare(input: {\n projectRoot: string;\n inspection: SyncInspection;\n selectedAdded: string[];\n }): Promise<PreparedProjectSync>;\n write(input: {\n projectRoot: string;\n inspection: SyncInspection;\n prepared: PreparedProjectSync;\n }): Promise<ProjectSyncResult>;\n}\n\nexport type SyncWorkflowResult = {\n changed: boolean;\n cancelled: boolean;\n};\n\nconst defaultDependencies: SyncWorkflowDependencies = {\n inspect: inspectProjectSync,\n prepare: prepareProjectSync,\n write: writeProjectSync,\n};\n\nfunction printSection(\n output: SyncOutput,\n title: string,\n values: string[],\n): void {\n output.log(`${title} (${values.length})`);\n values.forEach((value) => output.log(` ${value}`));\n}\n\nfunction printInspection(output: SyncOutput, inspection: SyncInspection): void {\n const { report } = inspection;\n printSection(\n output,\n \"Added\",\n report.added.map((entry) => entry.path),\n );\n printSection(\n output,\n \"Removed\",\n report.removed.map((entry) => `${entry.path} (Check: ${entry.checkSlug})`),\n );\n printSection(\n output,\n \"Unchanged\",\n report.unchanged.map(\n (entry) => `${entry.path} (Check: ${entry.checkSlug})`,\n ),\n );\n printSection(\n output,\n \"Pattern-managed\",\n report.patternManaged.map(\n (entry) =>\n `${entry.checkSlug}: ${entry.selectors.join(\", \")} (${entry.matchedSpecs.length} matched)`,\n ),\n );\n printSection(output, \"Supporting files to add\", report.supportingFiles.added);\n if (report.migrationRequired)\n output.log(\"Configuration migration: version 1 -> version 2\");\n for (const blocker of report.blockers)\n output.error(`Blocker: ${blocker.message}`);\n}\n\nfunction printPrepared(\n output: SyncOutput,\n prepared: PreparedProjectSync,\n): void {\n output.log(\"Changes to apply:\");\n prepared.addedChecks.forEach((entry) =>\n output.log(` Add Check ${entry.checkSlug}: ${entry.path}`),\n );\n prepared.removedSelectors.forEach((entry) =>\n output.log(` Remove from ${entry.checkSlug}: ${entry.path}`),\n );\n prepared.supportingFilesAdded.forEach((file) =>\n output.log(` Add supporting file: ${file}`),\n );\n if (prepared.migrationRequired)\n output.log(\" Upgrade configuration to version 2\");\n}\n\nexport async function runSyncWorkflow(input: {\n projectRoot: string;\n prompt: PromptPort;\n output: SyncOutput;\n dependencies?: SyncWorkflowDependencies;\n}): Promise<SyncWorkflowResult> {\n const dependencies = input.dependencies ?? defaultDependencies;\n const inspection = await dependencies.inspect(input.projectRoot);\n printInspection(input.output, inspection);\n if (!inspection.report.hasDrift) {\n input.output.log(\"Monitored tests are already synchronized.\");\n return { changed: false, cancelled: false };\n }\n\n const selectedAdded = inspection.report.added.length\n ? await input.prompt.multiSelect({\n message: \"Select new specs to monitor (each becomes one manual Check):\",\n options: inspection.report.added.map((entry) => ({\n label: `${entry.path} — ${entry.defaultName}`,\n value: entry.path,\n })),\n allowEmpty: true,\n })\n : [];\n const prepared = await dependencies.prepare({\n projectRoot: input.projectRoot,\n inspection,\n selectedAdded,\n });\n if (!prepared.changed) {\n input.output.log(\"No synchronization changes were selected.\");\n return { changed: false, cancelled: false };\n }\n printPrepared(input.output, prepared);\n const confirmed = await input.prompt.confirm({\n message: \"Apply these changes to siteos.config.json?\",\n defaultValue: true,\n });\n if (!confirmed) {\n input.output.log(\"Synchronization cancelled; no files changed.\");\n return { changed: false, cancelled: true };\n }\n\n await dependencies.write({\n projectRoot: input.projectRoot,\n inspection,\n prepared,\n });\n input.output.log(\"Updated: siteos.config.json\");\n return { changed: true, cancelled: false };\n}\n\nexport async function runSyncCli(input: {\n projectRoot: string;\n prompt?: PromptPort;\n output?: SyncOutput;\n}): Promise<number> {\n const prompt = input.prompt ?? new TerminalPrompt();\n const ownsPrompt = !input.prompt;\n try {\n await runSyncWorkflow({\n projectRoot: input.projectRoot,\n prompt,\n output: input.output ?? {\n log: (message) => console.log(message),\n error: (message) => console.error(message),\n },\n });\n return 0;\n } finally {\n if (ownsPrompt) prompt.close();\n }\n}\n","import { spawn } from \"node:child_process\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { loadChecksConfig } from \"./config.js\";\nimport { CliError } from \"./errors.js\";\nimport {\n detectPackageManager,\n playwrightBrowserInstallCommand,\n} from \"./package-manager.js\";\nimport { discoverProjectFiles } from \"./project-files.js\";\n\nexport type ProcessExecution = { exitCode: number; outputTail: string };\n\nexport type ProcessRunner = (input: {\n command: string;\n args: string[];\n cwd: string;\n env: NodeJS.ProcessEnv;\n}) => Promise<ProcessExecution>;\n\nconst MAX_DIAGNOSTIC_OUTPUT = 64 * 1024;\n\nfunction appendDiagnostic(output: string, chunk: Buffer): string {\n return `${output}${chunk.toString(\"utf8\")}`.slice(-MAX_DIAGNOSTIC_OUTPUT);\n}\n\nexport const runProcess: ProcessRunner = ({ command, args, cwd, env }) =>\n new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n cwd,\n env,\n stdio: [\"inherit\", \"pipe\", \"pipe\"],\n });\n let outputTail = \"\";\n child.stdout.on(\"data\", (chunk: Buffer) => {\n process.stdout.write(chunk);\n outputTail = appendDiagnostic(outputTail, chunk);\n });\n child.stderr.on(\"data\", (chunk: Buffer) => {\n process.stderr.write(chunk);\n outputTail = appendDiagnostic(outputTail, chunk);\n });\n child.once(\"error\", reject);\n child.once(\"close\", (code, signal) => {\n if (signal)\n reject(\n new CliError(\n \"TEST_INTERRUPTED\",\n `Playwright stopped with ${signal}.`,\n ),\n );\n else resolve({ exitCode: code ?? 1, outputTail });\n });\n });\n\nexport function isMissingBrowserDiagnostic(output: string): boolean {\n return (\n /executable doesn't exist(?: at)?/i.test(output) &&\n /playwright install/i.test(output)\n );\n}\n\nexport function resolvePlaywrightCli(projectRoot: string): string {\n try {\n const requireFromProject = createRequire(\n path.join(projectRoot, \"package.json\"),\n );\n const packageJson = requireFromProject.resolve(\n \"@playwright/test/package.json\",\n );\n return path.join(path.dirname(packageJson), \"cli.js\");\n } catch {\n throw new CliError(\n \"PLAYWRIGHT_NOT_INSTALLED\",\n \"The project cannot resolve @playwright/test.\",\n {\n hint: \"Install @playwright/test in the project and run `npx playwright install chromium`.\",\n },\n );\n }\n}\n\nexport async function runProjectTests(input: {\n projectRoot: string;\n headed?: boolean;\n browserProject?: string;\n baseUrl?: string;\n passthrough?: string[];\n processRunner?: ProcessRunner;\n playwrightCli?: string;\n}): Promise<number> {\n const projectRoot = path.resolve(input.projectRoot);\n const config = await loadChecksConfig(projectRoot);\n const report = await discoverProjectFiles(projectRoot, config);\n if (!report.valid) {\n throw new CliError(\n \"PROJECT_INVALID\",\n `Project validation failed: ${report.errors.join(\"; \")}`,\n {\n hint: \"Run `siteos pulse validate` before running the suite.\",\n },\n );\n }\n\n const selectors = [\n ...new Set(\n config.checks\n .filter((check) => check.active)\n .flatMap((check) => check.include),\n ),\n ];\n if (selectors.length === 0) {\n throw new CliError(\n \"NO_ACTIVE_CHECKS\",\n \"No active Check selectors are configured.\",\n {\n hint: \"Enable at least one Check before running local monitoring tests.\",\n },\n );\n }\n const args = [\n input.playwrightCli ?? resolvePlaywrightCli(projectRoot),\n \"test\",\n ...selectors,\n ];\n if (config.playwrightConfig) args.push(\"--config\", config.playwrightConfig);\n if (input.headed) args.push(\"--headed\");\n if (input.browserProject) args.push(\"--project\", input.browserProject);\n args.push(...(input.passthrough ?? []));\n\n const execution = await (input.processRunner ?? runProcess)({\n command: process.execPath,\n args,\n cwd: projectRoot,\n env: {\n ...process.env,\n ...(input.baseUrl ? { PLAYWRIGHT_BASE_URL: input.baseUrl } : {}),\n },\n });\n if (\n execution.exitCode !== 0 &&\n isMissingBrowserDiagnostic(execution.outputTail)\n ) {\n const packageManager = await detectPackageManager(projectRoot);\n const installCommand = playwrightBrowserInstallCommand(packageManager);\n throw new CliError(\n \"PLAYWRIGHT_BROWSER_NOT_INSTALLED\",\n \"Chromium is not installed for the project's Playwright version.\",\n { hint: `Run \\`${installCommand}\\`, then run SiteOS Pulse again.` },\n );\n }\n return execution.exitCode;\n}\n","import { spawn } from \"node:child_process\";\nimport { access, readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { CliError } from \"./errors.js\";\n\nexport type PackageManager = \"npm\" | \"pnpm\" | \"yarn\" | \"bun\";\n\nexport type PackageManagerCommand = {\n command: string;\n args: string[];\n};\n\nexport type InstallProcessRunner = (input: {\n command: string;\n args: string[];\n cwd: string;\n}) => Promise<number>;\n\nconst LOCKFILES: Array<{\n packageManager: PackageManager;\n filenames: string[];\n}> = [\n { packageManager: \"pnpm\", filenames: [\"pnpm-lock.yaml\"] },\n { packageManager: \"yarn\", filenames: [\"yarn.lock\"] },\n { packageManager: \"bun\", filenames: [\"bun.lock\", \"bun.lockb\"] },\n {\n packageManager: \"npm\",\n filenames: [\"package-lock.json\", \"npm-shrinkwrap.json\"],\n },\n];\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath);\n return true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return false;\n throw error;\n }\n}\n\nasync function declaredPackageManager(\n projectRoot: string,\n): Promise<PackageManager | null> {\n let contents: string;\n try {\n contents = await readFile(path.join(projectRoot, \"package.json\"), \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n }\n\n let packageJson: { packageManager?: unknown };\n try {\n packageJson = JSON.parse(contents) as { packageManager?: unknown };\n } catch {\n throw new CliError(\n \"PACKAGE_JSON_INVALID\",\n \"package.json is not valid JSON.\",\n {\n hint: \"Fix package.json before running SiteOS Pulse setup.\",\n },\n );\n }\n if (packageJson.packageManager === undefined) return null;\n if (typeof packageJson.packageManager !== \"string\") {\n throw new CliError(\n \"PACKAGE_MANAGER_INVALID\",\n \"The packageManager field in package.json must be a string.\",\n { hint: \"Use a value such as `pnpm@10.11.0` or remove the field.\" },\n );\n }\n\n const name = packageJson.packageManager.split(\"@\", 1)[0];\n if (name === \"npm\" || name === \"pnpm\" || name === \"yarn\" || name === \"bun\")\n return name;\n throw new CliError(\n \"PACKAGE_MANAGER_UNSUPPORTED\",\n `SiteOS Pulse does not support the declared package manager: ${packageJson.packageManager}.`,\n {\n hint: \"Use npm, pnpm, Yarn, or Bun to install @playwright/test manually.\",\n },\n );\n}\n\nexport async function detectPackageManager(\n projectRoot: string,\n): Promise<PackageManager> {\n const root = path.resolve(projectRoot);\n const declared = await declaredPackageManager(root);\n if (declared) return declared;\n\n const matches = (\n await Promise.all(\n LOCKFILES.map(async ({ packageManager, filenames }) => ({\n packageManager,\n filenames: (\n await Promise.all(\n filenames.map(async (filename) => ({\n filename,\n exists: await fileExists(path.join(root, filename)),\n })),\n )\n )\n .filter((entry) => entry.exists)\n .map((entry) => entry.filename),\n })),\n )\n ).filter((entry) => entry.filenames.length > 0);\n\n if (matches.length === 0) return \"npm\";\n if (matches.length === 1) return matches[0]!.packageManager;\n\n const filenames = matches.flatMap((entry) => entry.filenames).sort();\n throw new CliError(\n \"PACKAGE_MANAGER_AMBIGUOUS\",\n `Multiple package-manager lockfiles were found: ${filenames.join(\", \")}.`,\n {\n hint: \"Remove stale lockfiles or declare the intended package manager in package.json.\",\n },\n );\n}\n\nexport function playwrightDependencyInstallCommand(\n packageManager: PackageManager,\n): PackageManagerCommand {\n if (packageManager === \"pnpm\") {\n return { command: \"pnpm\", args: [\"add\", \"--save-dev\", \"@playwright/test\"] };\n }\n if (packageManager === \"yarn\") {\n return { command: \"yarn\", args: [\"add\", \"--dev\", \"@playwright/test\"] };\n }\n if (packageManager === \"bun\") {\n return { command: \"bun\", args: [\"add\", \"--dev\", \"@playwright/test\"] };\n }\n return {\n command: \"npm\",\n args: [\"install\", \"--save-dev\", \"@playwright/test\"],\n };\n}\n\nexport function playwrightBrowserInstallCommand(\n packageManager: PackageManager,\n): string {\n if (packageManager === \"pnpm\") return \"pnpm exec playwright install chromium\";\n if (packageManager === \"yarn\") return \"yarn playwright install chromium\";\n if (packageManager === \"bun\") return \"bunx playwright install chromium\";\n return \"npx playwright install chromium\";\n}\n\nexport function formatPackageManagerCommand(\n command: PackageManagerCommand,\n): string {\n return [command.command, ...command.args].join(\" \");\n}\n\nexport const runInstallProcess: InstallProcessRunner = ({\n command,\n args,\n cwd,\n}) =>\n new Promise((resolve, reject) => {\n const displayCommand = formatPackageManagerCommand({ command, args });\n const child = spawn(command, args, { cwd, stdio: \"inherit\" });\n child.once(\"error\", () => {\n reject(\n new CliError(\n \"PACKAGE_MANAGER_UNAVAILABLE\",\n `SiteOS Pulse could not start the ${command} package manager.`,\n {\n hint: `Install ${command}, then run \\`${displayCommand}\\` manually and restart SiteOS Pulse.`,\n },\n ),\n );\n });\n child.once(\"close\", (code, signal) => {\n if (signal) {\n reject(\n new CliError(\n \"PLAYWRIGHT_INSTALL_INTERRUPTED\",\n `Playwright dependency installation stopped with ${signal}.`,\n {\n hint: `Run \\`${displayCommand}\\` manually, then restart SiteOS Pulse.`,\n },\n ),\n );\n } else {\n resolve(code ?? 1);\n }\n });\n });\n\nexport async function installPlaywrightDependency(input: {\n projectRoot: string;\n packageManager: PackageManager;\n processRunner?: InstallProcessRunner;\n}): Promise<number> {\n const installCommand = playwrightDependencyInstallCommand(\n input.packageManager,\n );\n return (input.processRunner ?? runInstallProcess)({\n ...installCommand,\n cwd: path.resolve(input.projectRoot),\n });\n}\n","import path from \"node:path\";\nimport { loadChecksConfig } from \"./config.js\";\nimport {\n discoverProjectFiles,\n type ValidationReport,\n} from \"./project-files.js\";\n\nexport async function validateProject(\n projectRoot: string,\n): Promise<ValidationReport> {\n const root = path.resolve(projectRoot);\n const config = await loadChecksConfig(root);\n return discoverProjectFiles(root, config);\n}\n","import {\n commonServiceContext,\n commonEnvironmentArguments,\n readLocalCommonProject,\n} from \"./projects/project-context.js\";\nimport path from \"node:path\";\n\nimport { createSiteOSServiceGrantProvider } from \"./auth/adapters/siteos-service-grant-provider.js\";\nimport type { ServiceGrantProvider } from \"./auth/application/service-grant-provider.js\";\nimport {\n NodeProjectBindingStore,\n ProjectBindingStoreError,\n} from \"./core/adapters/node-project-binding-store.js\";\nimport { RepositoryRootError } from \"./core/adapters/node-repository-root.js\";\nimport type { ProjectBindingStore } from \"./core/ports/project-binding-store.js\";\nimport {\n inspectSearchProjectReference,\n SearchProjectReferenceError,\n writeSearchProjectReference,\n} from \"./search/project-reference.js\";\nimport { resolveSiteOSConfigHome } from \"./siteos-config.js\";\nimport {\n createSiteOSSearchApiClient,\n resolveSiteOSSearchBaseUrl,\n SiteOSSearchApiError,\n type FetchLike,\n type SiteOSSearchProject,\n} from \"./siteos-search-api.js\";\nimport { SiteOSAuthApiError } from \"./siteos-auth-api.js\";\nimport { isValidEnvironmentSlug } from \"./environment-slug.js\";\nimport {\n prepareSiteOSSearchIndexingCredentialInstallation,\n prepareSiteOSSearchCredentialInstallation,\n SITEOS_SEARCH_ENVIRONMENT_ENV,\n SITEOS_SEARCH_INDEXING_CREDENTIAL_ENV,\n SITEOS_SEARCH_QUERY_CREDENTIAL_ENV,\n SiteOSSearchCredentialStorageError,\n type SiteOSSearchCredentialInstallation,\n} from \"./siteos-search-credential.js\";\nimport type { SiteOSSearchCredentialMetadata } from \"./siteos-search-api.js\";\n\nconst HELP_FLAGS = new Set([\"--help\", \"-h\"]);\nconst JSON_FLAG = \"--json\";\nconst ENVIRONMENT_FLAG = \"--environment\";\nconst CREDENTIAL_FLAG = \"--credential\";\nconst INSTALL_FLAG = \"--install\";\nconst NAME_FLAG = \"--name\";\nconst SLUG_FLAG = \"--slug\";\nconst SOURCE_FLAG = \"--source\";\nconst REPLACE_FLAG = \"--replace\";\n\nexport const SEARCH_HELP = `Usage:\n siteos search project list [--json]\n siteos search project create --slug <slug> --name <name> [--json]\n siteos search project use <slug> [--replace] [--json]\n siteos search project status [--json]\n siteos search environment list [--json]\n siteos search environment create --slug <slug> --name <name> [--json]\n siteos search environment update --environment <slug> --name <name> [--json]\n siteos search environment fork --source <slug> --slug <slug> --name <name> [--json]\n siteos search environment delete --environment <slug> [--json]\n siteos search analytics --environment <slug> [--json]\n siteos search diagnostics --environment <slug> [--json]\n siteos search doctor --environment <slug> [--json]\n siteos search reindex --environment <slug> [--json]\n siteos search credential list --environment <slug> [--json]\n siteos search credential issue --environment <slug> --install [--name <name>] [--json]\n siteos search credential rotate --environment <slug> --install [--name <name>] [--json]\n siteos search credential revoke --environment <slug> --credential <credential-id> [--json]\n siteos search indexing-credential list --environment <slug> [--json]\n siteos search indexing-credential issue --environment <slug> --install [--name <name>] [--json]\n siteos search indexing-credential rotate --environment <slug> --install [--name <name>] [--json]\n siteos search indexing-credential revoke --environment <slug> --credential <credential-id> [--json]\n\nManage SiteOS search operations for one explicit project environment.`;\n\nexport {\n SITEOS_SEARCH_ENVIRONMENT_ENV,\n SITEOS_SEARCH_INDEXING_CREDENTIAL_ENV,\n SITEOS_SEARCH_QUERY_CREDENTIAL_ENV,\n} from \"./siteos-search-credential.js\";\n\nexport type SearchCommandResult = {\n exitCode: number;\n stderr?: string;\n stdout?: string;\n};\n\ntype SearchContext =\n | {\n apiBaseUrl: string;\n credential: string;\n ok: true;\n project: { id: string; name: string; slug: string };\n projectId: string;\n rootDir: string;\n }\n | { error: SearchCommandResult; ok: false };\n\nexport async function runSearchCommand(options: {\n args: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n prepareCredentialInstallation?: typeof prepareSiteOSSearchCredentialInstallation;\n prepareIndexingCredentialInstallation?: typeof prepareSiteOSSearchIndexingCredentialInstallation;\n projectBindingStore?: ProjectBindingStore;\n serviceGrantProvider?: ServiceGrantProvider;\n}): Promise<SearchCommandResult> {\n if (\n options.args.length === 0 ||\n options.args.some((arg) => HELP_FLAGS.has(arg))\n ) {\n return { exitCode: 0, stdout: SEARCH_HELP };\n }\n if (options.args.some((arg) => splitFlag(arg)[0] === \"--env\")) {\n return usageError(\"Use --environment for SiteOS search environments.\");\n }\n\n if (options.args[0] !== \"project\") {\n try {\n options = {\n ...options,\n args: await commonEnvironmentArguments(options, \"search\", options.args),\n };\n } catch (error) {\n return {\n exitCode: 1,\n stderr:\n error instanceof Error\n ? error.message\n : \"Environment could not be selected.\",\n };\n }\n }\n const [subcommand, ...args] = options.args;\n if (subcommand === \"project\") {\n return runProjectCommand({ ...options, args });\n }\n if (subcommand === \"environment\") {\n return runEnvironmentCommand({ ...options, args });\n }\n if (subcommand === \"credential\") {\n return runCredentialCommand({ ...options, args, credentialKind: \"query\" });\n }\n if (subcommand === \"indexing-credential\") {\n return runCredentialCommand({\n ...options,\n args,\n credentialKind: \"indexing\",\n });\n }\n if (\n subcommand === \"analytics\" ||\n subcommand === \"diagnostics\" ||\n subcommand === \"doctor\" ||\n subcommand === \"reindex\"\n ) {\n return runSearchOperation({ ...options, args, operation: subcommand });\n }\n return usageError(\"Unknown SiteOS search command.\");\n}\n\nasync function runProjectCommand(options: {\n args: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n projectBindingStore?: ProjectBindingStore;\n serviceGrantProvider?: ServiceGrantProvider;\n}): Promise<SearchCommandResult> {\n const action = options.args[0];\n if (!action || ![\"create\", \"list\", \"status\", \"use\"].includes(action)) {\n return usageError(\"Unknown SiteOS search project command.\");\n }\n const parsed = parseProjectFlags(action, options.args.slice(1));\n if (!parsed.ok) return parsed.error;\n if (!options.fetchImpl) {\n return {\n exitCode: 1,\n stderr: \"SiteOS API access is unavailable in this runtime.\",\n };\n }\n\n try {\n const apiBaseUrl = resolveSiteOSSearchBaseUrl(options.env);\n const grant = await serviceGrantProvider(options).acquire({\n audience: \"siteos-search\",\n scopes: [\"search:workspace:write\"],\n });\n requireGrant(grant, \"search:workspace:write\");\n const client = createSiteOSSearchApiClient({\n apiBaseUrl,\n fetchImpl: options.fetchImpl,\n });\n\n if (action === \"list\") {\n const projects = await client.listProjects({ token: grant.accessToken });\n requireProjectOrganization(projects, grant.grant.organizationId);\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson({ projects })\n : formatProjectListOutput(projects),\n };\n }\n\n if (action === \"create\") {\n const project = await client.createProject({\n name: parsed.name!,\n slug: parsed.slug!,\n token: grant.accessToken,\n });\n requireProjectOrganization([project], grant.grant.organizationId);\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson({ project })\n : [\n \"SiteOS Search Project created.\",\n `Project: ${project.slug}`,\n `Name: ${project.name}`,\n `Run \\`siteos search project use ${project.slug}\\` to select it for this repository.`,\n ].join(\"\\n\"),\n };\n }\n\n const reference = await inspectSearchProjectReference(\n options.cwd ?? process.cwd(),\n );\n const store = projectBindingStore(options);\n const locator = {\n apiOrigin: apiBaseUrl,\n repositoryRoot: reference.rootDir,\n service: \"search\" as const,\n };\n\n if (action === \"use\") {\n const projects = await client.listProjects({ token: grant.accessToken });\n requireProjectOrganization(projects, grant.grant.organizationId);\n const matches = projects.filter(\n (project) => project.slug === parsed.slug,\n );\n if (matches.length !== 1) {\n throw new SiteOSSearchApiError({\n code: matches.length === 0 ? \"PROJECT_NOT_FOUND\" : \"INVALID_RESPONSE\",\n message:\n matches.length === 0\n ? \"The Search Project was not found.\"\n : \"SiteOS Search returned an invalid response.\",\n status: matches.length === 0 ? 404 : undefined,\n });\n }\n const project = matches[0]!;\n if (\n reference.status === \"loaded\" &&\n reference.reference.project.slug !== project.slug &&\n !parsed.replace\n ) {\n throw new SearchProjectReferenceError(\n \"SEARCH_PROJECT_REFERENCE_CONFLICT\",\n \"A different Search Project is already selected. Use --replace to replace it.\",\n );\n }\n\n const previousBinding = await store.read(locator);\n await store.write({\n ...locator,\n organizationId: grant.grant.organizationId,\n project: { id: project.id, slug: project.slug },\n });\n try {\n await writeSearchProjectReference({\n expectedChecksum:\n reference.status === \"loaded\" ? reference.checksum : null,\n project: { name: project.name, slug: project.slug },\n rootDir: reference.rootDir,\n });\n } catch (error) {\n if (previousBinding) await store.write(previousBinding);\n else await store.remove(locator);\n throw error;\n }\n const output = {\n apiOrigin: apiBaseUrl,\n organizationId: grant.grant.organizationId,\n project,\n referencePath: path.join(\n reference.rootDir,\n \".siteos\",\n \"search\",\n \"project.json\",\n ),\n };\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson(output)\n : [\n \"SiteOS Search Project selected.\",\n `Project: ${project.slug}`,\n `Reference: ${output.referencePath}`,\n ].join(\"\\n\"),\n };\n }\n\n if (reference.status === \"missing\") {\n throw new SearchProjectReferenceError(\n \"SEARCH_PROJECT_REFERENCE_REQUIRED\",\n \"Select a Search Project for this repository first.\",\n );\n }\n const binding = await store.read(locator);\n if (\n !binding ||\n binding.organizationId !== grant.grant.organizationId ||\n binding.project.slug !== reference.reference.project.slug\n ) {\n throw new SearchProjectReferenceError(\n binding\n ? \"SEARCH_PROJECT_REFERENCE_INVALID\"\n : \"SEARCH_PROJECT_REFERENCE_REQUIRED\",\n binding\n ? \"The Search Project reference and private binding do not match.\"\n : \"Select a Search Project for this repository first.\",\n );\n }\n const projects = await client.listProjects({ token: grant.accessToken });\n requireProjectOrganization(projects, grant.grant.organizationId);\n const project = projects.find(\n (candidate) => candidate.id === binding.project.id,\n );\n if (!project || project.slug !== binding.project.slug) {\n throw new SiteOSSearchApiError({\n code: \"PROJECT_NOT_FOUND\",\n message: \"The Search Project was not found.\",\n status: 404,\n });\n }\n const output = {\n apiOrigin: apiBaseUrl,\n connected: true,\n organizationId: binding.organizationId,\n project,\n repositoryRoot: reference.rootDir,\n };\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson(output)\n : [\n \"SiteOS Search Project connection is valid.\",\n `Project: ${project.slug}`,\n `Organization: ${binding.organizationId}`,\n `API: ${apiBaseUrl}`,\n ].join(\"\\n\"),\n };\n } catch (error) {\n return formatProjectError(error);\n }\n}\n\nasync function runEnvironmentCommand(options: {\n args: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n projectBindingStore?: ProjectBindingStore;\n serviceGrantProvider?: ServiceGrantProvider;\n}): Promise<SearchCommandResult> {\n const [action, ...args] = options.args;\n if (\n !action ||\n ![\"list\", \"create\", \"update\", \"fork\", \"delete\"].includes(action)\n ) {\n return usageError(\"Unknown SiteOS search environment command.\");\n }\n const parsed = parseEnvironmentFlags(action, args);\n if (!parsed.ok) return parsed.error;\n return runWithSearchClient(options, async ({ client, context }) => {\n const authorization = {\n projectId: context.projectId,\n token: context.credential,\n };\n if (action === \"list\") {\n const environments = await client.listEnvironments(authorization);\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson({ environments })\n : [\n \"SiteOS Search Environments.\",\n `Environments: ${environments.length}`,\n ...environments.map(({ slug, name }) => `- ${slug}: ${name}`),\n ].join(\"\\n\"),\n };\n }\n const environment =\n action === \"create\"\n ? await client.createEnvironment({\n ...authorization,\n slug: parsed.slug!,\n name: parsed.name!,\n })\n : action === \"update\"\n ? await client.updateEnvironment({\n ...authorization,\n environmentSlug: parsed.environmentSlug!,\n name: parsed.name!,\n })\n : action === \"fork\"\n ? await client.forkEnvironment({\n ...authorization,\n sourceEnvironmentSlug: parsed.sourceSlug!,\n slug: parsed.slug!,\n name: parsed.name!,\n })\n : undefined;\n if (action === \"delete\") {\n const result = await client.deleteEnvironment({\n ...authorization,\n environmentSlug: parsed.environmentSlug!,\n });\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson({ environment: parsed.environmentSlug, result })\n : `SiteOS Search Environment ${parsed.environmentSlug} deleted.`,\n };\n }\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson({ environment })\n : `SiteOS Search Environment ${environment!.slug} ${action === \"fork\" ? \"forked\" : action === \"create\" ? \"created\" : \"updated\"}.`,\n };\n });\n}\n\nfunction parseEnvironmentFlags(\n action: string,\n args: string[],\n):\n | {\n environmentSlug?: string;\n json: boolean;\n name?: string;\n ok: true;\n slug?: string;\n sourceSlug?: string;\n }\n | { error: SearchCommandResult; ok: false } {\n const required =\n action === \"create\"\n ? [SLUG_FLAG, NAME_FLAG]\n : action === \"update\"\n ? [ENVIRONMENT_FLAG, NAME_FLAG]\n : action === \"fork\"\n ? [SOURCE_FLAG, SLUG_FLAG, NAME_FLAG]\n : action === \"delete\"\n ? [ENVIRONMENT_FLAG]\n : [];\n const allowed = new Set([JSON_FLAG, ...required]);\n const flags = new Map<string, string | true>();\n for (let index = 0; index < args.length; index += 1) {\n const [flag, inlineValue] = splitFlag(args[index]);\n if (!allowed.has(flag) || flags.has(flag)) {\n return { error: usageError(`Unexpected argument: ${flag}`), ok: false };\n }\n if (flag === JSON_FLAG) {\n if (inlineValue !== undefined) {\n return {\n error: usageError(\"--json does not accept a value.\"),\n ok: false,\n };\n }\n flags.set(flag, true);\n continue;\n }\n const value = inlineValue ?? args[index + 1];\n if (!value || value.startsWith(\"--\")) {\n return { error: usageError(`${flag} requires a value.`), ok: false };\n }\n flags.set(flag, value.trim());\n if (inlineValue === undefined) index += 1;\n }\n for (const flag of required) {\n if (!flags.has(flag))\n return { error: usageError(`${flag} is required.`), ok: false };\n }\n const environmentSlug = readCredentialStringFlag(flags, ENVIRONMENT_FLAG);\n const sourceSlug = readCredentialStringFlag(flags, SOURCE_FLAG);\n const slug = readCredentialStringFlag(flags, SLUG_FLAG);\n if (\n [environmentSlug, sourceSlug, slug].some(\n (value) => value && !isValidEnvironmentSlug(value),\n )\n ) {\n return { error: usageError(\"Environment slugs must be valid.\"), ok: false };\n }\n const name = readCredentialStringFlag(flags, NAME_FLAG);\n if (name && name.length > 255)\n return { error: usageError(\"--name is invalid.\"), ok: false };\n return {\n ...(environmentSlug ? { environmentSlug } : {}),\n json: flags.has(JSON_FLAG),\n ...(name ? { name } : {}),\n ok: true,\n ...(slug ? { slug } : {}),\n ...(sourceSlug ? { sourceSlug } : {}),\n };\n}\n\nasync function runCredentialCommand(options: {\n args: string[];\n credentialKind: \"indexing\" | \"query\";\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n prepareCredentialInstallation?: typeof prepareSiteOSSearchCredentialInstallation;\n prepareIndexingCredentialInstallation?: typeof prepareSiteOSSearchIndexingCredentialInstallation;\n projectBindingStore?: ProjectBindingStore;\n serviceGrantProvider?: ServiceGrantProvider;\n}): Promise<SearchCommandResult> {\n const action = options.args[0];\n if (!action || ![\"issue\", \"list\", \"revoke\", \"rotate\"].includes(action)) {\n return usageError(\n `Unknown SiteOS search ${options.credentialKind === \"query\" ? \"credential\" : \"indexing-credential\"} command.`,\n );\n }\n const parsed = parseCredentialFlags(\n action,\n options.args.slice(1),\n options.credentialKind,\n );\n if (!parsed.ok) return parsed.error;\n\n const context = await loadCredentialManagementContext({\n ...options,\n install: parsed.install,\n });\n if (!context.ok) return context.error;\n\n try {\n if (action === \"list\") {\n const credentials =\n options.credentialKind === \"query\"\n ? (\n await context.client.listCredentials({\n environmentSlug: parsed.environmentSlug,\n projectId: context.projectId,\n token: context.grant,\n })\n ).tokens\n : (\n await context.client.listIndexingCredentials({\n environmentSlug: parsed.environmentSlug,\n projectId: context.projectId,\n token: context.grant,\n })\n ).credentials;\n const output = {\n credentials,\n environment: parsed.environmentSlug,\n };\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson(output)\n : formatCredentialListOutput({\n ...output,\n credentialKind: options.credentialKind,\n }),\n };\n }\n\n if (action === \"revoke\") {\n const credential =\n options.credentialKind === \"query\"\n ? await context.client.revokeCredential({\n credentialId: parsed.credentialId!,\n environmentSlug: parsed.environmentSlug,\n projectId: context.projectId,\n token: context.grant,\n })\n : await context.client.revokeIndexingCredential({\n credentialId: parsed.credentialId!,\n environmentSlug: parsed.environmentSlug,\n projectId: context.projectId,\n token: context.grant,\n });\n const output = {\n credential,\n environment: parsed.environmentSlug,\n revoked: true,\n };\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson(output)\n : `SiteOS Search ${credentialKindLabel(options.credentialKind)} credential revoked.\\nCredential: ${credential.id}\\nEnvironment: ${parsed.environmentSlug}`,\n };\n }\n\n if (options.credentialKind === \"query\") {\n const previousCredentials =\n action === \"rotate\"\n ? (\n await context.client.listCredentials({\n environmentSlug: parsed.environmentSlug,\n projectId: context.projectId,\n token: context.grant,\n })\n ).tokens.filter((credential) => credential.status === \"active\")\n : [];\n const exchange = await context.client.issueCredential({\n environmentSlug: parsed.environmentSlug,\n name: parsed.name,\n projectId: context.projectId,\n token: context.grant,\n });\n const { token, ...credential } = exchange;\n const result = await completeCredentialInstallation({\n action,\n credential,\n credentialKind: options.credentialKind,\n environmentSlug: parsed.environmentSlug,\n installation: context.installation!,\n json: parsed.json,\n secret: token,\n searchOrigin: context.apiBaseUrl,\n });\n if (action === \"rotate\") {\n await Promise.all(\n previousCredentials.map((previousCredential) =>\n context.client.revokeCredential({\n credentialId: previousCredential.id,\n environmentSlug: parsed.environmentSlug,\n projectId: context.projectId,\n token: context.grant,\n }),\n ),\n );\n }\n return result;\n }\n\n const previousCredentials =\n action === \"rotate\"\n ? (\n await context.client.listIndexingCredentials({\n environmentSlug: parsed.environmentSlug,\n projectId: context.projectId,\n token: context.grant,\n })\n ).credentials.filter((credential) => credential.status === \"active\")\n : [];\n const exchange = await context.client.issueIndexingCredential({\n environmentSlug: parsed.environmentSlug,\n name: parsed.name,\n projectId: context.projectId,\n token: context.grant,\n });\n const { credential: secret, ...credential } = exchange;\n const result = await completeCredentialInstallation({\n action,\n credential,\n credentialKind: options.credentialKind,\n environmentSlug: parsed.environmentSlug,\n installation: context.installation!,\n json: parsed.json,\n secret,\n searchOrigin: context.apiBaseUrl,\n });\n if (action === \"rotate\") {\n await Promise.all(\n previousCredentials.map((previousCredential) =>\n context.client.revokeIndexingCredential({\n credentialId: previousCredential.id,\n environmentSlug: parsed.environmentSlug,\n projectId: context.projectId,\n token: context.grant,\n }),\n ),\n );\n }\n return result;\n } catch (error) {\n return formatCredentialError(error);\n }\n}\n\nasync function completeCredentialInstallation(options: {\n action: string;\n credential: SiteOSSearchCredentialMetadata;\n credentialKind: \"indexing\" | \"query\";\n environmentSlug: string;\n installation: SiteOSSearchCredentialInstallation;\n json: boolean;\n searchOrigin: string;\n secret: string;\n}): Promise<SearchCommandResult> {\n await options.installation.install({\n credential: options.secret,\n environmentSlug: options.environmentSlug,\n searchOrigin: options.searchOrigin,\n });\n const credentialVariable =\n options.credentialKind === \"query\"\n ? SITEOS_SEARCH_QUERY_CREDENTIAL_ENV\n : SITEOS_SEARCH_INDEXING_CREDENTIAL_ENV;\n const installed = {\n credentialVariable,\n ...(options.credentialKind === \"query\"\n ? { environmentVariable: SITEOS_SEARCH_ENVIRONMENT_ENV }\n : {}),\n };\n const output = {\n credential: options.credential,\n environment: options.environmentSlug,\n installed,\n operation: options.action === \"issue\" ? \"issued\" : \"rotated\",\n };\n return {\n exitCode: 0,\n stdout: options.json\n ? stringifySafeJson(output)\n : [\n `SiteOS Search ${credentialKindLabel(options.credentialKind)} credential ${output.operation} and installed.`,\n `Credential: ${options.credential.id}`,\n `Environment: ${options.environmentSlug}`,\n `Credential variable: ${credentialVariable}`,\n options.credentialKind === \"query\"\n ? `Environment variable: ${SITEOS_SEARCH_ENVIRONMENT_ENV}`\n : undefined,\n ]\n .filter((line): line is string => Boolean(line))\n .join(\"\\n\"),\n };\n}\n\nasync function loadCredentialManagementContext(options: {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n install: boolean;\n credentialKind: \"indexing\" | \"query\";\n prepareCredentialInstallation?: typeof prepareSiteOSSearchCredentialInstallation;\n prepareIndexingCredentialInstallation?: typeof prepareSiteOSSearchIndexingCredentialInstallation;\n projectBindingStore?: ProjectBindingStore;\n serviceGrantProvider?: ServiceGrantProvider;\n}): Promise<\n | {\n apiBaseUrl: string;\n client: ReturnType<typeof createSiteOSSearchApiClient>;\n grant: string;\n installation?: SiteOSSearchCredentialInstallation;\n ok: true;\n projectId: string;\n }\n | { error: SearchCommandResult; ok: false }\n> {\n try {\n const local = await readLocalCommonProject(options);\n let rootDir = local?.rootDir;\n if (!rootDir) {\n const reference = await inspectSearchProjectReference(\n options.cwd ?? process.cwd(),\n );\n if (reference.status === \"missing\")\n throw new SearchProjectReferenceError(\n \"SEARCH_PROJECT_REFERENCE_REQUIRED\",\n \"Select a Search Project for this repository first.\",\n );\n rootDir = reference.rootDir;\n }\n const installation = options.install\n ? await (\n options.credentialKind === \"query\"\n ? (options.prepareCredentialInstallation ??\n prepareSiteOSSearchCredentialInstallation)\n : (options.prepareIndexingCredentialInstallation ??\n prepareSiteOSSearchIndexingCredentialInstallation)\n )({ projectRoot: rootDir })\n : undefined;\n const context = await loadSearchContext(options, \"search:credential:issue\");\n if (!context.ok) return context;\n return {\n apiBaseUrl: context.apiBaseUrl,\n client: createSiteOSSearchApiClient({\n apiBaseUrl: context.apiBaseUrl,\n fetchImpl: options.fetchImpl!,\n }),\n grant: context.credential,\n ...(installation ? { installation } : {}),\n ok: true,\n projectId: context.projectId,\n };\n } catch (error) {\n return { error: formatCredentialError(error), ok: false };\n }\n}\n\nasync function runSearchOperation(options: {\n args: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n projectBindingStore?: ProjectBindingStore;\n serviceGrantProvider?: ServiceGrantProvider;\n operation: \"analytics\" | \"diagnostics\" | \"doctor\" | \"reindex\";\n}): Promise<SearchCommandResult> {\n const parsed = parseFlags(options.args);\n if (!parsed.ok) return usageError(parsed.error);\n if (parsed.positionals.length > 0) {\n return usageError(\n `Usage: siteos search ${options.operation} --environment <slug> [--json]`,\n );\n }\n const environmentSlug = parsed.flags.get(ENVIRONMENT_FLAG);\n if (!environmentSlug) return usageError(\"--environment is required.\");\n if (!isValidEnvironmentSlug(environmentSlug)) {\n return usageError(\"--environment must be a valid environment slug.\");\n }\n\n return runWithSearchClient(options, async ({ client, context }) => {\n const response =\n options.operation === \"reindex\"\n ? await client.reindex({\n environmentSlug,\n projectId: context.projectId,\n token: context.credential,\n })\n : options.operation === \"analytics\"\n ? await client.analytics({\n environmentSlug,\n projectId: context.projectId,\n token: context.credential,\n })\n : await client.diagnostics({\n environmentSlug,\n projectId: context.projectId,\n token: context.credential,\n });\n const output = {\n environment: environmentSlug,\n project: context.project,\n ...(options.operation === \"reindex\"\n ? { result: response }\n : options.operation === \"analytics\"\n ? { analytics: response }\n : { diagnostics: response }),\n };\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson(output)\n : [\n options.operation === \"reindex\"\n ? \"SiteOS search reindex submitted.\"\n : `SiteOS search ${options.operation} completed.`,\n `Environment: ${environmentSlug}`,\n context.project.slug\n ? `Project: ${context.project.slug}`\n : undefined,\n ]\n .filter((line): line is string => Boolean(line))\n .join(\"\\n\"),\n };\n });\n}\n\nasync function runWithSearchClient(\n options: {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n projectBindingStore?: ProjectBindingStore;\n serviceGrantProvider?: ServiceGrantProvider;\n },\n run: (input: {\n client: ReturnType<typeof createSiteOSSearchApiClient>;\n context: Extract<SearchContext, { ok: true }>;\n }) => Promise<SearchCommandResult>,\n): Promise<SearchCommandResult> {\n const context = await loadSearchContext(options);\n if (!context.ok) return context.error;\n if (!options.fetchImpl)\n return {\n exitCode: 1,\n stderr: \"SiteOS API access is unavailable in this runtime.\",\n };\n try {\n return await run({\n client: createSiteOSSearchApiClient({\n apiBaseUrl: context.apiBaseUrl,\n fetchImpl: options.fetchImpl,\n }),\n context,\n });\n } catch (error) {\n return error instanceof SiteOSSearchApiError\n ? { exitCode: 1, stderr: `SiteOS API error: ${error.message}` }\n : { exitCode: 1, stderr: \"SiteOS search command failed.\" };\n }\n}\n\nasync function loadSearchContext(\n options: {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n projectBindingStore?: ProjectBindingStore;\n serviceGrantProvider?: ServiceGrantProvider;\n },\n requiredScope = \"search:workspace:write\",\n): Promise<SearchContext> {\n if (!options.fetchImpl) {\n return {\n error: {\n exitCode: 1,\n stderr: \"SiteOS API access is unavailable in this runtime.\",\n },\n ok: false,\n };\n }\n try {\n const common = await commonServiceContext(options, \"search\");\n if (common) {\n const grant = await serviceGrantProvider(options).acquire({\n audience: \"siteos-search\",\n scopes: [requiredScope],\n });\n requireGrant(grant, requiredScope);\n if (grant.grant.organizationId !== common.overview.project.organizationId)\n throw new SiteOSAuthApiError({\n code: \"PROJECT_ORGANIZATION_MISMATCH\",\n message:\n \"The Project and service grant belong to different organizations.\",\n });\n return {\n apiBaseUrl: common.api.origin,\n credential: grant.accessToken,\n ok: true,\n project: {\n id: common.resourceId,\n name: common.overview.project.name,\n slug: common.overview.project.slug,\n },\n projectId: common.resourceId,\n rootDir: common.rootDir,\n };\n }\n\n const reference = await inspectSearchProjectReference(\n options.cwd ?? process.cwd(),\n );\n if (reference.status === \"missing\") {\n throw new SearchProjectReferenceError(\n \"SEARCH_PROJECT_REFERENCE_REQUIRED\",\n \"Select a Search Project for this repository first.\",\n );\n }\n const apiBaseUrl = resolveSiteOSSearchBaseUrl(options.env);\n const binding = await projectBindingStore(options).read({\n apiOrigin: apiBaseUrl,\n repositoryRoot: reference.rootDir,\n service: \"search\",\n });\n if (!binding) {\n throw new SearchProjectReferenceError(\n \"SEARCH_PROJECT_REFERENCE_REQUIRED\",\n \"Select a Search Project for this repository first.\",\n );\n }\n const grant = await serviceGrantProvider(options).acquire({\n audience: \"siteos-search\",\n scopes: [requiredScope],\n });\n requireGrant(grant, requiredScope);\n if (\n grant.grant.organizationId !== binding.organizationId ||\n binding.project.slug !== reference.reference.project.slug\n ) {\n throw new SearchProjectReferenceError(\n \"SEARCH_PROJECT_REFERENCE_INVALID\",\n \"The Search Project reference, private binding, and Auth Organization do not match.\",\n );\n }\n return {\n apiBaseUrl,\n credential: grant.accessToken,\n ok: true,\n project: {\n id: binding.project.id,\n name: reference.reference.project.name,\n slug: binding.project.slug,\n },\n projectId: binding.project.id,\n rootDir: reference.rootDir,\n };\n } catch (error) {\n if (error instanceof SiteOSAuthApiError) return formatAuthError(error);\n return { error: formatProjectError(error), ok: false };\n }\n}\n\nfunction formatAuthError(\n error: unknown,\n): Extract<SearchContext, { ok: false }> {\n if (error instanceof SiteOSAuthApiError) {\n return {\n error: {\n exitCode: 1,\n stderr: [\n \"SiteOS Auth request failed.\",\n error.status ? `Status: ${error.status}` : undefined,\n `Code: ${error.code}`,\n error.message,\n ]\n .filter((line): line is string => Boolean(line))\n .join(\"\\n\"),\n },\n ok: false,\n };\n }\n return {\n error: {\n exitCode: 1,\n stderr: \"SiteOS Auth request failed.\",\n },\n ok: false,\n };\n}\n\nfunction parseProjectFlags(\n action: string,\n args: string[],\n):\n | {\n json: boolean;\n name?: string;\n ok: true;\n replace: boolean;\n slug?: string;\n }\n | { error: SearchCommandResult; ok: false } {\n const flags = new Map<string, string | true>();\n const positionals: string[] = [];\n const allowed = new Set([\n JSON_FLAG,\n ...(action === \"create\" ? [NAME_FLAG, SLUG_FLAG] : []),\n ...(action === \"use\" ? [REPLACE_FLAG] : []),\n ]);\n const boolean = new Set([JSON_FLAG, REPLACE_FLAG]);\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index]!;\n if (!arg.startsWith(\"--\")) {\n positionals.push(arg);\n continue;\n }\n const [flag, inlineValue] = splitFlag(arg);\n if (!allowed.has(flag) || flags.has(flag)) {\n return { error: usageError(`Unexpected argument: ${flag}`), ok: false };\n }\n if (boolean.has(flag)) {\n if (inlineValue !== undefined) {\n return {\n error: usageError(`${flag} does not accept a value.`),\n ok: false,\n };\n }\n flags.set(flag, true);\n continue;\n }\n const value = inlineValue ?? args[index + 1];\n if (!value || value.startsWith(\"--\")) {\n return { error: usageError(`${flag} requires a value.`), ok: false };\n }\n flags.set(flag, value.trim());\n if (inlineValue === undefined) index += 1;\n }\n\n if (action === \"use\") {\n if (positionals.length !== 1 || !isValidProjectSlug(positionals[0]!)) {\n return {\n error: usageError(\n \"Project use requires exactly one valid Project slug.\",\n ),\n ok: false,\n };\n }\n return {\n json: flags.has(JSON_FLAG),\n ok: true,\n replace: flags.has(REPLACE_FLAG),\n slug: positionals[0],\n };\n }\n if (positionals.length > 0) {\n return {\n error: usageError(`Unexpected argument: ${positionals[0]}`),\n ok: false,\n };\n }\n if (action !== \"create\") {\n return { json: flags.has(JSON_FLAG), ok: true, replace: false };\n }\n const slug = readCredentialStringFlag(flags, SLUG_FLAG);\n const name = readCredentialStringFlag(flags, NAME_FLAG);\n if (!slug || !isValidProjectSlug(slug)) {\n return {\n error: usageError(\"--slug is required and must be valid.\"),\n ok: false,\n };\n }\n if (!name || name.length > 255) {\n return {\n error: usageError(\"--name is required and must be valid.\"),\n ok: false,\n };\n }\n return {\n json: flags.has(JSON_FLAG),\n name,\n ok: true,\n replace: false,\n slug,\n };\n}\n\nfunction isValidProjectSlug(value: string): boolean {\n return (\n value.length >= 1 &&\n value.length <= 120 &&\n /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(value)\n );\n}\n\nfunction parseCredentialFlags(\n action: string,\n args: string[],\n credentialKind: \"indexing\" | \"query\",\n):\n | {\n credentialId?: string;\n environmentSlug: string;\n install: boolean;\n json: boolean;\n name?: string;\n ok: true;\n }\n | { error: SearchCommandResult; ok: false } {\n const installs = action === \"issue\" || action === \"rotate\";\n const revokes = action === \"revoke\";\n const allowed = new Set([\n ENVIRONMENT_FLAG,\n JSON_FLAG,\n ...(installs ? [INSTALL_FLAG, NAME_FLAG] : []),\n ...(revokes ? [CREDENTIAL_FLAG] : []),\n ]);\n const booleanFlags = new Set([JSON_FLAG, INSTALL_FLAG]);\n const flags = new Map<string, string | true>();\n const positionals: string[] = [];\n\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index];\n if (!arg.startsWith(\"--\")) {\n positionals.push(arg);\n continue;\n }\n const [flagName, inlineValue] = splitFlag(arg);\n if (!allowed.has(flagName)) {\n return {\n error: usageError(`Unexpected argument: ${flagName}`),\n ok: false,\n };\n }\n if (flags.has(flagName)) {\n return {\n error: usageError(`Duplicate argument: ${flagName}`),\n ok: false,\n };\n }\n if (booleanFlags.has(flagName)) {\n if (inlineValue !== undefined) {\n return {\n error: usageError(`${flagName} does not accept a value.`),\n ok: false,\n };\n }\n flags.set(flagName, true);\n continue;\n }\n const value = inlineValue ?? args[index + 1];\n if (!value || value.startsWith(\"--\")) {\n return {\n error: usageError(`${flagName} requires a value.`),\n ok: false,\n };\n }\n flags.set(flagName, value);\n if (inlineValue === undefined) index += 1;\n }\n\n if (positionals.length > 0) {\n return {\n error: usageError(`Unexpected argument: ${positionals[0]}`),\n ok: false,\n };\n }\n const environmentSlug = readCredentialStringFlag(flags, ENVIRONMENT_FLAG);\n if (!environmentSlug) {\n return {\n error: usageError(\"--environment is required.\"),\n ok: false,\n };\n }\n if (!isValidEnvironmentSlug(environmentSlug)) {\n return {\n error: usageError(\"--environment must be a valid environment slug.\"),\n ok: false,\n };\n }\n if (installs && !flags.has(INSTALL_FLAG)) {\n return {\n error: usageError(\"--install is required for issue and rotate.\"),\n ok: false,\n };\n }\n const credentialId = readCredentialStringFlag(flags, CREDENTIAL_FLAG);\n if (revokes && !credentialId) {\n return {\n error: usageError(\"--credential is required for revoke.\"),\n ok: false,\n };\n }\n const name = readCredentialStringFlag(flags, NAME_FLAG);\n if (credentialId && credentialId.length > 255) {\n return {\n error: usageError(\"--credential is invalid.\"),\n ok: false,\n };\n }\n if (name && name.length > (credentialKind === \"indexing\" ? 100 : 255)) {\n return {\n error: usageError(\"--name is invalid.\"),\n ok: false,\n };\n }\n\n return {\n ...(credentialId ? { credentialId } : {}),\n environmentSlug,\n install: installs,\n json: flags.has(JSON_FLAG),\n ...(name ? { name } : {}),\n ok: true,\n };\n}\n\nfunction readCredentialStringFlag(\n flags: Map<string, string | true>,\n flagName: string,\n): string | undefined {\n const value = flags.get(flagName);\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction formatCredentialError(error: unknown): SearchCommandResult {\n if (error instanceof SiteOSAuthApiError) {\n return formatAuthError(error).error;\n }\n if (error instanceof SiteOSSearchCredentialStorageError) {\n return { exitCode: 1, stderr: error.message };\n }\n if (error instanceof SiteOSSearchApiError) {\n return {\n exitCode: 1,\n stderr: [\n \"SiteOS Search credential request failed.\",\n error.status ? `Status: ${error.status}` : undefined,\n `Code: ${error.code}`,\n ]\n .filter((line): line is string => Boolean(line))\n .join(\"\\n\"),\n };\n }\n return {\n exitCode: 1,\n stderr: \"SiteOS Search credential request failed.\",\n };\n}\n\nfunction formatProjectError(error: unknown): SearchCommandResult {\n if (error instanceof SiteOSAuthApiError) return formatAuthError(error).error;\n if (error instanceof SiteOSSearchApiError) {\n return {\n exitCode: 1,\n stderr: [\n \"SiteOS Search Project request failed.\",\n error.status ? `Status: ${error.status}` : undefined,\n `Code: ${error.code}`,\n ]\n .filter((line): line is string => Boolean(line))\n .join(\"\\n\"),\n };\n }\n if (\n error instanceof SearchProjectReferenceError ||\n error instanceof ProjectBindingStoreError ||\n error instanceof RepositoryRootError\n ) {\n return {\n exitCode: 1,\n stderr: [\n \"SiteOS Search Project access failed.\",\n `Code: ${error.code}`,\n error.message,\n ].join(\"\\n\"),\n };\n }\n return { exitCode: 1, stderr: \"SiteOS Search Project request failed.\" };\n}\n\nfunction serviceGrantProvider(options: {\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n serviceGrantProvider?: ServiceGrantProvider;\n}): ServiceGrantProvider {\n return (\n options.serviceGrantProvider ??\n createSiteOSServiceGrantProvider({\n env: options.env,\n fetchImpl: options.fetchImpl,\n })\n );\n}\n\nfunction projectBindingStore(options: {\n env?: NodeJS.ProcessEnv;\n projectBindingStore?: ProjectBindingStore;\n}): ProjectBindingStore {\n return (\n options.projectBindingStore ??\n new NodeProjectBindingStore(\n path.join(\n resolveSiteOSConfigHome({ env: options.env }),\n \"project-bindings.json\",\n ),\n )\n );\n}\n\nfunction requireGrant(\n grant: Awaited<ReturnType<ServiceGrantProvider[\"acquire\"]>>,\n scope: string,\n): void {\n if (\n grant.grant.audience !== \"siteos-search\" ||\n grant.grant.scopes.length !== 1 ||\n grant.grant.scopes[0] !== scope\n ) {\n throw new SiteOSAuthApiError({\n code: \"AUTH_INVALID_RESPONSE\",\n message: \"The SiteOS Auth service returned an invalid response.\",\n });\n }\n}\n\nfunction requireProjectOrganization(\n projects: SiteOSSearchProject[],\n organizationId: string,\n): void {\n if (projects.some((project) => project.organizationId !== organizationId)) {\n throw new SiteOSSearchApiError({\n code: \"INVALID_RESPONSE\",\n message: \"SiteOS Search returned an invalid response.\",\n });\n }\n}\n\nfunction formatProjectListOutput(projects: SiteOSSearchProject[]): string {\n return [\n \"SiteOS Search Projects.\",\n `Projects: ${projects.length}`,\n ...projects.map(\n (project) => `- ${project.slug}: ${project.name} (${project.id})`,\n ),\n ].join(\"\\n\");\n}\n\nfunction formatCredentialListOutput(input: {\n credentialKind: \"indexing\" | \"query\";\n credentials: Array<{ id: string; name: string; status: string }>;\n environment: string;\n}) {\n return [\n `SiteOS Search ${credentialKindLabel(input.credentialKind)} credentials.`,\n `Environment: ${input.environment}`,\n `Credentials: ${input.credentials.length}`,\n ...input.credentials.map(\n (credential) =>\n `- ${credential.id}: ${credential.name} (${credential.status})`,\n ),\n ].join(\"\\n\");\n}\n\nfunction credentialKindLabel(credentialKind: \"indexing\" | \"query\") {\n return credentialKind === \"query\" ? \"query\" : \"indexing\";\n}\n\nfunction parseFlags(args: string[]):\n | {\n flags: Map<string, string>;\n json: boolean;\n ok: true;\n positionals: string[];\n }\n | { error: string; ok: false } {\n const flags = new Map<string, string>();\n const positionals: string[] = [];\n let json = false;\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index];\n if (!arg.startsWith(\"--\")) {\n positionals.push(arg);\n continue;\n }\n const [flagName, inlineValue] = splitFlag(arg);\n if (flagName === JSON_FLAG) {\n if (inlineValue !== undefined)\n return { error: \"--json does not accept a value.\", ok: false };\n json = true;\n continue;\n }\n if (flagName !== ENVIRONMENT_FLAG)\n return { error: `Unexpected argument: ${flagName}`, ok: false };\n const value = inlineValue ?? args[index + 1];\n if (!value || value.startsWith(\"--\"))\n return { error: \"--environment requires a value.\", ok: false };\n flags.set(flagName, value);\n if (inlineValue === undefined) index += 1;\n }\n return { flags, json, ok: true, positionals };\n}\n\nfunction splitFlag(arg: string): [string, string | undefined] {\n const separatorIndex = arg.indexOf(\"=\");\n return separatorIndex === -1\n ? [arg, undefined]\n : [arg.slice(0, separatorIndex), arg.slice(separatorIndex + 1)];\n}\n\nfunction stringifySafeJson(value: unknown): string {\n return JSON.stringify(redactSensitiveFields(value), null, 2);\n}\n\nfunction redactSensitiveFields(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(redactSensitiveFields);\n if (typeof value !== \"object\" || value === null) return value;\n return Object.fromEntries(\n Object.entries(value).flatMap(([key, nestedValue]) =>\n [\"token\", \"apikey\", \"api_key\", \"authorization\"].includes(\n key.toLowerCase(),\n )\n ? []\n : [[key, redactSensitiveFields(nestedValue)]],\n ),\n );\n}\n\nfunction usageError(message: string): SearchCommandResult {\n return { exitCode: 1, stderr: `${message}\\n\\n${SEARCH_HELP}` };\n}\n","import { z } from \"zod\";\n\nexport const DEFAULT_SITEOS_SEARCH_BASE_URL = \"https://app.siteos.sh\";\nexport const SITEOS_SEARCH_BASE_URL_ENV = \"SITEOS_SEARCH_PUBLIC_URL\";\n\nexport type FetchLike = (\n input: string,\n init?: {\n body?: string;\n headers?: Record<string, string>;\n method?: string;\n redirect?: \"error\";\n signal?: AbortSignal;\n },\n) => Promise<{ json: () => Promise<unknown>; ok: boolean; status: number }>;\n\nexport type SiteOSSearchDiagnosticsResponse = Record<string, unknown>;\nexport type SiteOSSearchAnalyticsResponse = Record<string, unknown>;\nexport type SiteOSSearchActionResponse = Record<string, unknown>;\n\nconst permissiveObjectSchema = z.record(z.unknown());\nconst environmentSlugSchema = z\n .string()\n .min(2)\n .max(30)\n .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/);\nconst searchProjectSchema = z\n .object({\n createdAt: z.string().datetime({ offset: true }),\n id: z.string().trim().min(1).max(255),\n name: z.string().trim().min(1).max(255),\n organizationId: z.string().trim().min(1).max(255),\n slug: z\n .string()\n .trim()\n .min(1)\n .max(120)\n .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),\n updatedAt: z.string().datetime({ offset: true }),\n })\n .strict();\nconst searchProjectListResponseSchema = z\n .object({ projects: z.array(searchProjectSchema), success: z.literal(true) })\n .strict();\nconst searchProjectResponseSchema = z\n .object({ project: searchProjectSchema, success: z.literal(true) })\n .strict();\nconst searchEnvironmentSchema = z\n .object({\n createdAt: z.string().datetime({ offset: true }),\n id: z.string().trim().min(1).max(255),\n name: z.string().trim().min(1).max(255),\n projectId: z.string().trim().min(1).max(255),\n slug: environmentSlugSchema,\n updatedAt: z.string().datetime({ offset: true }),\n })\n .strict();\nconst searchEnvironmentListResponseSchema = z\n .object({\n environments: z.array(searchEnvironmentSchema),\n success: z.literal(true),\n })\n .strict();\nconst searchEnvironmentResponseSchema = z\n .object({ environment: searchEnvironmentSchema, success: z.literal(true) })\n .passthrough();\nconst searchCredentialMetadataSchema = z\n .object({\n createdAt: z.string().datetime({ offset: true }),\n id: z.string().trim().min(1).max(255),\n lastUsedAt: z.string().datetime({ offset: true }).nullable(),\n name: z.string().trim().min(1).max(255),\n projectEnvironmentId: z.string().trim().min(1).max(255),\n revokedAt: z.string().datetime({ offset: true }).nullable(),\n status: z.enum([\"active\", \"revoked\"]),\n })\n .strict();\nconst searchCredentialListResponseSchema = z\n .object({\n environmentSlug: environmentSlugSchema,\n success: z.literal(true),\n tokens: z.array(searchCredentialMetadataSchema),\n })\n .strict();\nconst searchCredentialExchangeResponseSchema = z\n .object({\n environmentSlug: environmentSlugSchema,\n success: z.literal(true),\n token: searchCredentialMetadataSchema.extend({\n token: z.string().regex(/^psq_[A-Za-z0-9_-]{22}$/),\n }),\n })\n .strict();\nconst searchCredentialRevokeResponseSchema = z\n .object({\n environmentSlug: environmentSlugSchema,\n success: z.literal(true),\n token: searchCredentialMetadataSchema,\n })\n .strict();\nconst searchIndexingCredentialListResponseSchema = z\n .object({\n credentials: z.array(searchCredentialMetadataSchema),\n environmentSlug: environmentSlugSchema,\n success: z.literal(true),\n })\n .strict();\nconst searchIndexingCredentialExchangeResponseSchema = z\n .object({\n credential: searchCredentialMetadataSchema\n .extend({\n credential: z.string().regex(/^psi_[A-Za-z0-9_-]{22}$/),\n })\n .strict(),\n environmentSlug: environmentSlugSchema,\n success: z.literal(true),\n })\n .strict();\nconst searchIndexingCredentialRevokeResponseSchema = z\n .object({\n credential: searchCredentialMetadataSchema,\n environmentSlug: environmentSlugSchema,\n success: z.literal(true),\n })\n .strict();\nconst nestedApiErrorResponseSchema = z\n .object({\n error: z.object({\n code: z.string().trim().min(1).optional(),\n message: z.string().trim().min(1),\n nextActions: z.array(z.string()).optional(),\n }),\n })\n .passthrough();\nconst directApiErrorResponseSchema = z\n .object({\n code: z.string().trim().min(1).optional(),\n message: z.string().trim().min(1).optional(),\n status: z.number().int().optional(),\n })\n .passthrough();\n\nexport class SiteOSSearchApiError extends Error {\n readonly code: string;\n readonly nextActions?: string[];\n readonly status?: number;\n\n constructor(options: {\n code?: string;\n message: string;\n nextActions?: string[];\n status?: number;\n }) {\n super(options.message);\n this.name = \"SiteOSSearchApiError\";\n this.code = options.code ?? \"SITEOS_API_ERROR\";\n this.nextActions = options.nextActions;\n this.status = options.status;\n }\n}\n\nexport type SiteOSSearchCredentialMetadata = z.infer<\n typeof searchCredentialMetadataSchema\n>;\nexport type SiteOSSearchCredentialExchange = z.infer<\n typeof searchCredentialExchangeResponseSchema\n>[\"token\"];\nexport type SiteOSSearchIndexingCredentialExchange = z.infer<\n typeof searchIndexingCredentialExchangeResponseSchema\n>[\"credential\"];\nexport type SiteOSSearchEnvironment = z.infer<typeof searchEnvironmentSchema>;\nexport type SiteOSSearchProject = z.infer<typeof searchProjectSchema>;\n\nexport function resolveSiteOSSearchBaseUrl(\n env: NodeJS.ProcessEnv = process.env,\n): string {\n return normalizeSearchOrigin(\n env[SITEOS_SEARCH_BASE_URL_ENV]?.trim() || DEFAULT_SITEOS_SEARCH_BASE_URL,\n );\n}\n\nexport function createSiteOSSearchApiClient(options: {\n apiBaseUrl: string;\n fetchImpl: FetchLike;\n}): {\n createProject: (input: {\n name: string;\n slug: string;\n token: string;\n }) => Promise<SiteOSSearchProject>;\n listProjects: (input: { token: string }) => Promise<SiteOSSearchProject[]>;\n diagnostics: (input: {\n environmentSlug: string;\n projectId: string;\n token: string;\n }) => Promise<SiteOSSearchDiagnosticsResponse>;\n analytics: (input: {\n environmentSlug: string;\n projectId: string;\n token: string;\n }) => Promise<SiteOSSearchAnalyticsResponse>;\n reindex: (input: {\n environmentSlug: string;\n projectId: string;\n token: string;\n }) => Promise<SiteOSSearchActionResponse>;\n listEnvironments: (input: {\n projectId: string;\n token: string;\n }) => Promise<SiteOSSearchEnvironment[]>;\n createEnvironment: (input: {\n slug: string;\n name: string;\n projectId: string;\n token: string;\n }) => Promise<SiteOSSearchEnvironment>;\n updateEnvironment: (input: {\n environmentSlug: string;\n name: string;\n projectId: string;\n token: string;\n }) => Promise<SiteOSSearchEnvironment>;\n forkEnvironment: (input: {\n sourceEnvironmentSlug: string;\n slug: string;\n name: string;\n projectId: string;\n token: string;\n }) => Promise<SiteOSSearchEnvironment>;\n deleteEnvironment: (input: {\n environmentSlug: string;\n projectId: string;\n token: string;\n }) => Promise<SiteOSSearchActionResponse>;\n issueCredential: (input: {\n environmentSlug: string;\n name?: string;\n projectId: string;\n token: string;\n }) => Promise<SiteOSSearchCredentialExchange>;\n listCredentials: (input: {\n environmentSlug: string;\n projectId: string;\n token: string;\n }) => Promise<{ tokens: SiteOSSearchCredentialMetadata[] }>;\n revokeCredential: (input: {\n credentialId: string;\n environmentSlug: string;\n projectId: string;\n token: string;\n }) => Promise<SiteOSSearchCredentialMetadata>;\n rotateCredential: (input: {\n environmentSlug: string;\n name?: string;\n projectId: string;\n token: string;\n }) => Promise<SiteOSSearchCredentialExchange>;\n issueIndexingCredential: (input: {\n environmentSlug: string;\n name?: string;\n projectId: string;\n token: string;\n }) => Promise<SiteOSSearchIndexingCredentialExchange>;\n listIndexingCredentials: (input: {\n environmentSlug: string;\n projectId: string;\n token: string;\n }) => Promise<{ credentials: SiteOSSearchCredentialMetadata[] }>;\n revokeIndexingCredential: (input: {\n credentialId: string;\n environmentSlug: string;\n projectId: string;\n token: string;\n }) => Promise<SiteOSSearchCredentialMetadata>;\n rotateIndexingCredential: (input: {\n environmentSlug: string;\n name?: string;\n projectId: string;\n token: string;\n }) => Promise<SiteOSSearchIndexingCredentialExchange>;\n} {\n return {\n createProject: async (input) => {\n const response = await requestJson({\n apiBaseUrl: options.apiBaseUrl,\n authToken: input.token,\n body: { name: input.name, slug: input.slug },\n fetchImpl: options.fetchImpl,\n method: \"POST\",\n path: \"/api/v1/search/projects\",\n responseSchema: searchProjectResponseSchema,\n });\n return response.project;\n },\n listProjects: async (input) => {\n const response = await requestJson({\n apiBaseUrl: options.apiBaseUrl,\n authToken: input.token,\n fetchImpl: options.fetchImpl,\n method: \"GET\",\n path: \"/api/v1/search/projects\",\n responseSchema: searchProjectListResponseSchema,\n });\n return response.projects;\n },\n listEnvironments: async (input) => {\n const response = await requestJson({\n apiBaseUrl: options.apiBaseUrl,\n authToken: input.token,\n fetchImpl: options.fetchImpl,\n method: \"GET\",\n path: environmentCollectionPath(input.projectId),\n responseSchema: searchEnvironmentListResponseSchema,\n });\n return response.environments;\n },\n createEnvironment: async (input) => {\n const response = await requestJson({\n apiBaseUrl: options.apiBaseUrl,\n authToken: input.token,\n body: { slug: input.slug, name: input.name },\n fetchImpl: options.fetchImpl,\n method: \"POST\",\n path: environmentCollectionPath(input.projectId),\n responseSchema: searchEnvironmentResponseSchema,\n });\n return response.environment;\n },\n updateEnvironment: async (input) => {\n const response = await requestJson({\n apiBaseUrl: options.apiBaseUrl,\n authToken: input.token,\n body: { name: input.name },\n fetchImpl: options.fetchImpl,\n method: \"PATCH\",\n path: environmentPath(input.projectId, input.environmentSlug),\n responseSchema: searchEnvironmentResponseSchema,\n });\n return response.environment;\n },\n forkEnvironment: async (input) => {\n const response = await requestJson({\n apiBaseUrl: options.apiBaseUrl,\n authToken: input.token,\n body: { slug: input.slug, name: input.name },\n fetchImpl: options.fetchImpl,\n method: \"POST\",\n path: `${environmentPath(input.projectId, input.sourceEnvironmentSlug)}/actions/fork`,\n responseSchema: searchEnvironmentResponseSchema,\n });\n return response.environment;\n },\n deleteEnvironment: (input) =>\n requestJson({\n apiBaseUrl: options.apiBaseUrl,\n authToken: input.token,\n fetchImpl: options.fetchImpl,\n method: \"DELETE\",\n path: environmentPath(input.projectId, input.environmentSlug),\n }),\n analytics: (input) =>\n requestJson({\n apiBaseUrl: options.apiBaseUrl,\n authToken: input.token,\n fetchImpl: options.fetchImpl,\n method: \"GET\",\n path: `${projectPath(input.projectId)}/analytics`,\n query: {\n environmentSlug: input.environmentSlug,\n },\n }),\n diagnostics: (input) =>\n requestJson({\n apiBaseUrl: options.apiBaseUrl,\n authToken: input.token,\n fetchImpl: options.fetchImpl,\n method: \"GET\",\n path: `${projectPath(input.projectId)}/diagnostics`,\n query: {\n environmentSlug: input.environmentSlug,\n },\n }),\n reindex: (input) =>\n requestJson({\n apiBaseUrl: options.apiBaseUrl,\n authToken: input.token,\n body: {},\n fetchImpl: options.fetchImpl,\n method: \"POST\",\n path: `${environmentPath(input.projectId, input.environmentSlug)}/actions/reindex`,\n }),\n issueCredential: async (input) => {\n const response = await requestJson({\n apiBaseUrl: options.apiBaseUrl,\n authToken: input.token,\n body: input.name ? { name: input.name } : {},\n fetchImpl: options.fetchImpl,\n method: \"POST\",\n path: credentialCollectionPath(input.projectId, input.environmentSlug),\n responseSchema: searchCredentialExchangeResponseSchema,\n });\n assertResponseEnvironment(\n response.environmentSlug,\n input.environmentSlug,\n );\n return response.token;\n },\n listCredentials: async (input) => {\n const response = await requestJson({\n apiBaseUrl: options.apiBaseUrl,\n authToken: input.token,\n fetchImpl: options.fetchImpl,\n method: \"GET\",\n path: credentialCollectionPath(input.projectId, input.environmentSlug),\n responseSchema: searchCredentialListResponseSchema,\n });\n assertResponseEnvironment(\n response.environmentSlug,\n input.environmentSlug,\n );\n return { tokens: response.tokens };\n },\n revokeCredential: async (input) => {\n const response = await requestJson({\n apiBaseUrl: options.apiBaseUrl,\n authToken: input.token,\n fetchImpl: options.fetchImpl,\n method: \"DELETE\",\n path: `${credentialCollectionPath(input.projectId, input.environmentSlug)}/${encodeURIComponent(input.credentialId)}`,\n responseSchema: searchCredentialRevokeResponseSchema,\n });\n assertResponseEnvironment(\n response.environmentSlug,\n input.environmentSlug,\n );\n return response.token;\n },\n rotateCredential: async (input) => {\n const response = await requestJson({\n apiBaseUrl: options.apiBaseUrl,\n authToken: input.token,\n body: input.name ? { name: input.name } : {},\n fetchImpl: options.fetchImpl,\n method: \"POST\",\n path: `${credentialCollectionPath(input.projectId, input.environmentSlug)}/actions/rotate`,\n responseSchema: searchCredentialExchangeResponseSchema,\n });\n assertResponseEnvironment(\n response.environmentSlug,\n input.environmentSlug,\n );\n return response.token;\n },\n issueIndexingCredential: async (input) => {\n const response = await requestJson({\n apiBaseUrl: options.apiBaseUrl,\n authToken: input.token,\n body: input.name ? { name: input.name } : {},\n fetchImpl: options.fetchImpl,\n method: \"POST\",\n path: indexingCredentialCollectionPath(\n input.projectId,\n input.environmentSlug,\n ),\n responseSchema: searchIndexingCredentialExchangeResponseSchema,\n });\n assertResponseEnvironment(\n response.environmentSlug,\n input.environmentSlug,\n );\n return response.credential;\n },\n listIndexingCredentials: async (input) => {\n const response = await requestJson({\n apiBaseUrl: options.apiBaseUrl,\n authToken: input.token,\n fetchImpl: options.fetchImpl,\n method: \"GET\",\n path: indexingCredentialCollectionPath(\n input.projectId,\n input.environmentSlug,\n ),\n responseSchema: searchIndexingCredentialListResponseSchema,\n });\n assertResponseEnvironment(\n response.environmentSlug,\n input.environmentSlug,\n );\n return { credentials: response.credentials };\n },\n revokeIndexingCredential: async (input) => {\n const response = await requestJson({\n apiBaseUrl: options.apiBaseUrl,\n authToken: input.token,\n fetchImpl: options.fetchImpl,\n method: \"DELETE\",\n path: `${indexingCredentialCollectionPath(input.projectId, input.environmentSlug)}/${encodeURIComponent(input.credentialId)}`,\n responseSchema: searchIndexingCredentialRevokeResponseSchema,\n });\n assertResponseEnvironment(\n response.environmentSlug,\n input.environmentSlug,\n );\n return response.credential;\n },\n rotateIndexingCredential: async (input) => {\n const response = await requestJson({\n apiBaseUrl: options.apiBaseUrl,\n authToken: input.token,\n body: input.name ? { name: input.name } : {},\n fetchImpl: options.fetchImpl,\n method: \"POST\",\n path: `${indexingCredentialCollectionPath(input.projectId, input.environmentSlug)}/actions/rotate`,\n responseSchema: searchIndexingCredentialExchangeResponseSchema,\n });\n assertResponseEnvironment(\n response.environmentSlug,\n input.environmentSlug,\n );\n return response.credential;\n },\n };\n}\n\nasync function requestJson<T extends Record<string, unknown>>(options: {\n apiBaseUrl: string;\n authToken: string;\n body?: unknown;\n fetchImpl: FetchLike;\n method: \"DELETE\" | \"GET\" | \"PATCH\" | \"POST\";\n path: string;\n query?: Record<string, string>;\n responseSchema?: z.ZodType<T>;\n}): Promise<T> {\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n Authorization: `Bearer ${options.authToken}`,\n };\n const body =\n options.body === undefined ? undefined : JSON.stringify(options.body);\n if (body) headers[\"Content-Type\"] = \"application/json\";\n\n let response: Awaited<ReturnType<FetchLike>>;\n try {\n response = await options.fetchImpl(buildApiUrl(options), {\n body,\n headers,\n method: options.method,\n });\n } catch {\n throw new SiteOSSearchApiError({\n code: \"REQUEST_FAILED\",\n message: \"SiteOS API request failed.\",\n });\n }\n\n const payload = await response.json().catch(() => undefined);\n if (!response.ok) {\n const nestedError = nestedApiErrorResponseSchema.safeParse(payload);\n if (nestedError.success) {\n throw new SiteOSSearchApiError({\n code: nestedError.data.error.code,\n message: nestedError.data.error.message,\n nextActions: nestedError.data.error.nextActions,\n status: response.status,\n });\n }\n const directError = directApiErrorResponseSchema.safeParse(payload);\n if (\n directError.success &&\n (directError.data.code || directError.data.message)\n ) {\n throw new SiteOSSearchApiError({\n code: directError.data.code,\n message:\n directError.data.message ?? \"SiteOS API returned an error response.\",\n status: directError.data.status ?? response.status,\n });\n }\n throw new SiteOSSearchApiError({\n code: \"UNEXPECTED_RESPONSE\",\n message: \"SiteOS API returned an unexpected error response.\",\n status: response.status,\n });\n }\n\n const parsedPayload = (\n options.responseSchema ?? (permissiveObjectSchema as z.ZodType<T>)\n ).safeParse(payload);\n if (!parsedPayload.success) {\n throw new SiteOSSearchApiError({\n code: \"INVALID_RESPONSE\",\n message: \"SiteOS API returned an invalid response.\",\n status: response.status,\n });\n }\n return parsedPayload.data as T;\n}\n\nfunction projectPath(projectId: string): string {\n return `/api/v1/search/projects/${encodeURIComponent(projectId)}`;\n}\n\nfunction environmentCollectionPath(projectId: string): string {\n return `${projectPath(projectId)}/environments`;\n}\n\nfunction environmentPath(projectId: string, environmentSlug: string): string {\n return `${environmentCollectionPath(projectId)}/${encodeURIComponent(environmentSlug)}`;\n}\n\nfunction credentialCollectionPath(\n projectId: string,\n environmentSlug: string,\n): string {\n return `${environmentPath(projectId, environmentSlug)}/tokens`;\n}\n\nfunction indexingCredentialCollectionPath(\n projectId: string,\n environmentSlug: string,\n): string {\n return `${environmentPath(projectId, environmentSlug)}/indexing-credentials`;\n}\n\nfunction assertResponseEnvironment(actual: string, expected: string): void {\n if (actual !== expected) {\n throw new SiteOSSearchApiError({\n code: \"INVALID_RESPONSE\",\n message: \"SiteOS API returned an invalid response.\",\n });\n }\n}\n\nfunction buildApiUrl(options: {\n apiBaseUrl: string;\n path: string;\n query?: Record<string, string>;\n}): string {\n const url = new URL(\n `${options.apiBaseUrl.replace(/\\/+$/, \"\")}${options.path}`,\n );\n for (const [key, value] of Object.entries(options.query ?? {})) {\n url.searchParams.set(key, value);\n }\n return url.toString();\n}\n\nfunction normalizeSearchOrigin(value: string): string {\n try {\n const url = new URL(value);\n const loopback = [\"localhost\", \"127.0.0.1\", \"[::1]\", \"::1\"].includes(\n url.hostname,\n );\n if (\n url.username ||\n url.password ||\n url.pathname !== \"/\" ||\n url.search ||\n url.hash ||\n (url.protocol !== \"https:\" && !(url.protocol === \"http:\" && loopback))\n ) {\n throw new Error(\"invalid Search origin\");\n }\n return url.origin;\n } catch {\n throw new SiteOSSearchApiError({\n code: \"INVALID_SEARCH_BASE_URL\",\n message: \"The SiteOS Search URL is invalid.\",\n });\n }\n}\n","import { spawn } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport {\n chmod,\n lstat,\n readFile,\n rename,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { isValidEnvironmentSlug } from \"./environment-slug.js\";\n\nexport const SITEOS_SEARCH_QUERY_CREDENTIAL_ENV = \"SITEOS_SEARCH_TOKEN\";\nexport const SITEOS_SEARCH_ENVIRONMENT_ENV = \"SITEOS_SEARCH_ENV\";\nexport const SITEOS_SEARCH_INDEXING_CREDENTIAL_ENV =\n \"SITEOS_SEARCH_INDEXING_CREDENTIAL\";\nexport const SITEOS_SEARCH_PUBLIC_URL_ENV = \"SITEOS_SEARCH_PUBLIC_URL\";\n\nconst queryCredentialPattern = /^psq_[A-Za-z0-9_-]{22}$/;\nconst indexingCredentialPattern = /^psi_[A-Za-z0-9_-]{22}$/;\n\nexport class SiteOSSearchCredentialStorageError extends Error {\n readonly code:\n | \"SEARCH_CREDENTIAL_STORAGE_INVALID\"\n | \"SEARCH_CREDENTIAL_STORAGE_UNAVAILABLE\";\n\n constructor(\n code:\n | \"SEARCH_CREDENTIAL_STORAGE_INVALID\"\n | \"SEARCH_CREDENTIAL_STORAGE_UNAVAILABLE\",\n ) {\n super(\n code === \"SEARCH_CREDENTIAL_STORAGE_INVALID\"\n ? \"The Search credential storage boundary is invalid.\"\n : \"The Search credential could not be installed.\",\n );\n this.name = \"SiteOSSearchCredentialStorageError\";\n this.code = code;\n }\n}\n\nexport type SiteOSSearchCredentialInstallation = {\n install: (input: {\n credential: string;\n environmentSlug: string;\n searchOrigin: string;\n }) => Promise<void>;\n};\n\nexport async function prepareSiteOSSearchCredentialInstallation(options: {\n projectRoot: string;\n}): Promise<SiteOSSearchCredentialInstallation> {\n const projectRoot = path.resolve(options.projectRoot);\n const dotenvPath = path.join(projectRoot, \".env\");\n\n try {\n await assertSafeProjectRoot(projectRoot);\n if (!(await isDotenvIgnored(projectRoot))) {\n throw new SiteOSSearchCredentialStorageError(\n \"SEARCH_CREDENTIAL_STORAGE_INVALID\",\n );\n }\n await readSafeDotenv(dotenvPath, [\n SITEOS_SEARCH_QUERY_CREDENTIAL_ENV,\n SITEOS_SEARCH_ENVIRONMENT_ENV,\n SITEOS_SEARCH_PUBLIC_URL_ENV,\n ]);\n\n return {\n install: async ({ credential, environmentSlug, searchOrigin }) => {\n if (\n !queryCredentialPattern.test(credential) ||\n !isValidEnvironmentSlug(environmentSlug) ||\n !isSafeSearchOrigin(searchOrigin)\n ) {\n throw new SiteOSSearchCredentialStorageError(\n \"SEARCH_CREDENTIAL_STORAGE_INVALID\",\n );\n }\n try {\n await assertSafeProjectRoot(projectRoot);\n if (!(await isDotenvIgnored(projectRoot))) {\n throw new SiteOSSearchCredentialStorageError(\n \"SEARCH_CREDENTIAL_STORAGE_INVALID\",\n );\n }\n const currentContent = await readSafeDotenv(dotenvPath, [\n SITEOS_SEARCH_QUERY_CREDENTIAL_ENV,\n SITEOS_SEARCH_ENVIRONMENT_ENV,\n SITEOS_SEARCH_PUBLIC_URL_ENV,\n ]);\n await writeCredentialAtomically({\n content: setRuntimeContext(\n currentContent,\n credential,\n environmentSlug,\n searchOrigin,\n ),\n dotenvPath,\n projectRoot,\n });\n } catch (error) {\n if (error instanceof SiteOSSearchCredentialStorageError) throw error;\n throw new SiteOSSearchCredentialStorageError(\n \"SEARCH_CREDENTIAL_STORAGE_UNAVAILABLE\",\n );\n }\n },\n };\n } catch (error) {\n if (error instanceof SiteOSSearchCredentialStorageError) throw error;\n throw new SiteOSSearchCredentialStorageError(\n \"SEARCH_CREDENTIAL_STORAGE_UNAVAILABLE\",\n );\n }\n}\n\nexport async function prepareSiteOSSearchIndexingCredentialInstallation(options: {\n projectRoot: string;\n}): Promise<SiteOSSearchCredentialInstallation> {\n const projectRoot = path.resolve(options.projectRoot);\n const dotenvPath = path.join(projectRoot, \".env\");\n\n try {\n await assertSafeProjectRoot(projectRoot);\n if (!(await isDotenvIgnored(projectRoot))) {\n throw new SiteOSSearchCredentialStorageError(\n \"SEARCH_CREDENTIAL_STORAGE_INVALID\",\n );\n }\n await readSafeDotenv(dotenvPath, [\n SITEOS_SEARCH_INDEXING_CREDENTIAL_ENV,\n SITEOS_SEARCH_PUBLIC_URL_ENV,\n ]);\n\n return {\n install: async ({ credential, environmentSlug, searchOrigin }) => {\n if (\n !indexingCredentialPattern.test(credential) ||\n !isValidEnvironmentSlug(environmentSlug) ||\n !isSafeSearchOrigin(searchOrigin)\n ) {\n throw new SiteOSSearchCredentialStorageError(\n \"SEARCH_CREDENTIAL_STORAGE_INVALID\",\n );\n }\n try {\n await assertSafeProjectRoot(projectRoot);\n if (!(await isDotenvIgnored(projectRoot))) {\n throw new SiteOSSearchCredentialStorageError(\n \"SEARCH_CREDENTIAL_STORAGE_INVALID\",\n );\n }\n const currentContent = await readSafeDotenv(dotenvPath, [\n SITEOS_SEARCH_INDEXING_CREDENTIAL_ENV,\n SITEOS_SEARCH_PUBLIC_URL_ENV,\n ]);\n await writeCredentialAtomically({\n content: setAssignment(\n setAssignment(\n currentContent,\n SITEOS_SEARCH_INDEXING_CREDENTIAL_ENV,\n credential,\n ),\n SITEOS_SEARCH_PUBLIC_URL_ENV,\n searchOrigin,\n ),\n dotenvPath,\n projectRoot,\n });\n } catch (error) {\n if (error instanceof SiteOSSearchCredentialStorageError) throw error;\n throw new SiteOSSearchCredentialStorageError(\n \"SEARCH_CREDENTIAL_STORAGE_UNAVAILABLE\",\n );\n }\n },\n };\n } catch (error) {\n if (error instanceof SiteOSSearchCredentialStorageError) throw error;\n throw new SiteOSSearchCredentialStorageError(\n \"SEARCH_CREDENTIAL_STORAGE_UNAVAILABLE\",\n );\n }\n}\n\nasync function assertSafeProjectRoot(projectRoot: string) {\n const projectStats = await lstat(projectRoot);\n if (!projectStats.isDirectory() || projectStats.isSymbolicLink()) {\n throw new SiteOSSearchCredentialStorageError(\n \"SEARCH_CREDENTIAL_STORAGE_INVALID\",\n );\n }\n}\n\nasync function readSafeDotenv(\n dotenvPath: string,\n managedEnvironmentNames: string[],\n) {\n const dotenvStats = await lstat(dotenvPath).catch((error: unknown) => {\n if (isNodeErrorCode(error, \"ENOENT\")) return undefined;\n throw error;\n });\n if (dotenvStats && !dotenvStats.isFile()) {\n throw new SiteOSSearchCredentialStorageError(\n \"SEARCH_CREDENTIAL_STORAGE_INVALID\",\n );\n }\n const content = dotenvStats ? await readFile(dotenvPath, \"utf8\") : \"\";\n if (\n managedEnvironmentNames.some(\n (name) => countManagedEntries(content, name) > 1,\n )\n ) {\n throw new SiteOSSearchCredentialStorageError(\n \"SEARCH_CREDENTIAL_STORAGE_INVALID\",\n );\n }\n return content;\n}\n\nasync function writeCredentialAtomically(options: {\n content: string;\n dotenvPath: string;\n projectRoot: string;\n}) {\n const temporaryPath = path.join(\n options.projectRoot,\n `.siteos-search-credential.${process.pid}.${randomUUID()}.tmp`,\n );\n try {\n await writeFile(temporaryPath, options.content, {\n encoding: \"utf8\",\n flag: \"wx\",\n mode: 0o600,\n });\n await chmod(temporaryPath, 0o600);\n await rename(temporaryPath, options.dotenvPath);\n } catch {\n throw new SiteOSSearchCredentialStorageError(\n \"SEARCH_CREDENTIAL_STORAGE_UNAVAILABLE\",\n );\n } finally {\n await rm(temporaryPath, { force: true }).catch(() => undefined);\n }\n}\n\nfunction setRuntimeContext(\n content: string,\n credential: string,\n environmentSlug: string,\n searchOrigin: string,\n) {\n return setAssignment(\n setAssignment(\n setAssignment(content, SITEOS_SEARCH_QUERY_CREDENTIAL_ENV, credential),\n SITEOS_SEARCH_ENVIRONMENT_ENV,\n environmentSlug,\n ),\n SITEOS_SEARCH_PUBLIC_URL_ENV,\n searchOrigin,\n );\n}\n\nfunction isSafeSearchOrigin(value: string): boolean {\n try {\n const url = new URL(value);\n return (\n !url.username &&\n !url.password &&\n !url.search &&\n !url.hash &&\n url.pathname === \"/\" &&\n (url.protocol === \"https:\" ||\n (url.protocol === \"http:\" &&\n [\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(url.hostname)))\n );\n } catch {\n return false;\n }\n}\n\nfunction setAssignment(content: string, name: string, value: string) {\n const assignment = `${name}=${value}`;\n const existing = new RegExp(`^${name}=[^\\\\r\\\\n]*(?=\\\\r?$)`, \"m\");\n if (existing.test(content)) return content.replace(existing, assignment);\n const newline = content.includes(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\n if (content.length === 0) return `${assignment}${newline}`;\n return `${content}${content.endsWith(\"\\n\") ? \"\" : newline}${assignment}${newline}`;\n}\n\nfunction countManagedEntries(content: string, name: string) {\n return content.split(/\\r?\\n/u).filter((line) => line.startsWith(`${name}=`))\n .length;\n}\n\nfunction isDotenvIgnored(projectRoot: string) {\n return new Promise<boolean>((resolve, reject) => {\n const child = spawn(\n \"git\",\n [\"check-ignore\", \"--quiet\", \"--no-index\", \"--\", \".env\"],\n {\n cwd: projectRoot,\n stdio: \"ignore\",\n },\n );\n child.once(\"error\", reject);\n child.once(\"exit\", (code) => {\n if (code === 0) resolve(true);\n else if (code === 1) resolve(false);\n else reject(new Error(\"Git ignore inspection failed.\"));\n });\n });\n}\n\nfunction isNodeErrorCode(error: unknown, code: string): boolean {\n return (\n error instanceof Error &&\n \"code\" in error &&\n (error as NodeJS.ErrnoException).code === code\n );\n}\n","import { parseArgs } from \"node:util\";\nimport { findRepositoryRoot } from \"../core/adapters/node-repository-root.js\";\nimport type { CommandResult } from \"../core/command-result.js\";\nimport { SiteOSAuthApiError } from \"../siteos-auth-api.js\";\nimport {\n commonProjectRuntime,\n readCommonProject,\n type ProjectCommandOptions,\n} from \"./project-context.js\";\nimport {\n PROJECT_SERVICES,\n type CommonProject,\n type ProjectService,\n} from \"./project-api.js\";\n\nexport const PROJECT_HELP = `One Project for your website and all its services.\n\nUsage:\n siteos project list [--json]\n siteos project create --name <name> --slug <slug> [--url <url>] [--domain <domain>] [--json]\n siteos project use <id-or-slug> [--json]\n siteos project update [--name <name>] [--slug <slug>] [--url <production-url>] [--json]\n siteos project status [--json]\n siteos project connect <pulse|cookie|forms|search|trace|seo> [--resource <id>] [--json]\n siteos project environment list [--json]\n siteos project environment create --name <name> --slug <slug> [--url <url>] [--json]\n siteos project environment use <slug> [--json]\n siteos project environment update <slug> [--name <name>] [--url <url>] [--json]\n siteos project environment resources <pulse|cookie|forms|search|trace|seo> [--json]\n siteos project environment connect <pulse|cookie|forms|search|trace|seo> --environment <slug> [--resource <id>] [--json]\n\nSelect a Project once per repository. Service commands use its configured resources.\nConnect creates a draft workspace, or explicitly attaches an existing resource.\nIt does not publish a banner, install a script, send a notification or deploy checks.`;\n\nexport async function runProjectCommand(\n options: ProjectCommandOptions & { args: string[] },\n): Promise<CommandResult> {\n if (\n !options.args.length ||\n options.args.some((arg) => arg === \"--help\" || arg === \"-h\")\n )\n return { exitCode: 0, stdout: PROJECT_HELP };\n try {\n const [action, ...args] = options.args;\n if (action === \"environment\")\n return await runEnvironmentCommand({ ...options, args });\n if (\n ![\"list\", \"create\", \"use\", \"status\", \"connect\", \"update\"].includes(\n action!,\n )\n )\n throw new Error(\"Unknown Project command.\");\n const parsed = parseArgs({\n args,\n allowPositionals: true,\n strict: true,\n options: {\n json: { type: \"boolean\" },\n ...(action === \"create\" || action === \"update\"\n ? {\n name: { type: \"string\" as const },\n slug: { type: \"string\" as const },\n url: { type: \"string\" as const },\n ...(action === \"create\"\n ? { domain: { type: \"string\" as const, multiple: true } }\n : {}),\n }\n : {}),\n ...(action === \"connect\"\n ? { resource: { type: \"string\" as const } }\n : {}),\n },\n });\n if (\n parsed.positionals.length !==\n (action === \"use\" || action === \"connect\" ? 1 : 0)\n )\n throw new Error(\"Unexpected Project arguments.\");\n const { api, store } = commonProjectRuntime(options);\n let result: unknown;\n let message: string;\n if (action === \"list\") {\n const projects = await api.list();\n result = { projects };\n message = projects.length\n ? projects\n .map((project) => `${project.slug}\\t${project.name}\\t${project.id}`)\n .join(\"\\n\")\n : \"No Projects yet. Create one with `siteos project create`.\";\n } else if (action === \"create\") {\n if (!parsed.values.name || !parsed.values.slug)\n throw new Error(\"Project create requires --name and --slug.\");\n const project = await api.create({\n name: parsed.values.name as string,\n slug: parsed.values.slug as string,\n ...(parsed.values.url\n ? { websiteUrl: parsed.values.url as string }\n : {}),\n domains: Array.isArray(parsed.values.domain)\n ? parsed.values.domain\n : [],\n });\n result = { project };\n message = `Created ${project.name}.\\nSelect it with \\`siteos project use ${project.slug}\\`.`;\n } else if (action === \"use\") {\n const matches = (await api.list()).filter(\n (project) =>\n project.id === parsed.positionals[0] ||\n project.slug === parsed.positionals[0],\n );\n if (matches.length !== 1)\n throw new Error(\n matches.length\n ? \"Use the exact Project ID to disambiguate this selection.\"\n : \"Project not found in the active organization.\",\n );\n const project = matches[0]!;\n await store.write({\n apiOrigin: api.origin,\n repositoryRoot: await findRepositoryRoot(options.cwd ?? process.cwd()),\n service: \"project\",\n organizationId: project.organizationId,\n project: { id: project.id, slug: project.slug },\n });\n result = { project };\n message = `Selected ${project.name} for this repository.\\nRun \\`siteos project status\\` to inspect its services.`;\n } else {\n const context = await readCommonProject(options);\n if (!context)\n throw new Error(\n \"Select a Project first with `siteos project use <id-or-slug>`.\",\n );\n let overview = context.overview;\n if (action === \"update\") {\n if (\n !parsed.values.name &&\n !parsed.values.slug &&\n parsed.values.url === undefined\n )\n throw new Error(\"Choose --name, --slug or --url to update.\");\n const project = overview.project;\n await api.update(project.id, {\n name: (parsed.values.name as string) ?? project.name,\n slug: (parsed.values.slug as string) ?? project.slug,\n domains: project.domains,\n websiteUrl:\n parsed.values.url === undefined\n ? project.environments.find((item) => item.slug === \"production\")\n ?.url\n : (parsed.values.url as string) || null,\n });\n overview = await api.get(project.id, context.environment.slug);\n await context.store.write({\n ...context.binding,\n project: { id: overview.project.id, slug: overview.project.slug },\n });\n }\n if (action === \"connect\") {\n const service = parsed.positionals[0] as ProjectService;\n if (!PROJECT_SERVICES.includes(service))\n throw new Error(\n \"Choose pulse, cookie, forms, search, trace or seo. Organization connections use `siteos integrations`. \",\n );\n overview = await api.connect(\n overview.project.id,\n service,\n parsed.values.resource as string | undefined,\n context.environment.slug,\n );\n }\n result = overview;\n message = `${projectLabel(overview.project)} · ${context.environment.name}\\n${overview.services.map((service) => `${service.service}: ${service.observation?.summary ?? \"Not configured\"}`).join(\"\\n\")}`;\n }\n return {\n exitCode: 0,\n stdout: parsed.values.json ? JSON.stringify(result, null, 2) : message,\n };\n } catch (cause) {\n return {\n exitCode: cause instanceof SiteOSAuthApiError ? 1 : 2,\n stderr:\n cause instanceof Error ? cause.message : \"The Project command failed.\",\n };\n }\n}\nfunction projectLabel(project: CommonProject) {\n return `${project.name} (${project.slug})`;\n}\n\nasync function runEnvironmentCommand(\n options: ProjectCommandOptions & { args: string[] },\n): Promise<CommandResult> {\n const [action, ...args] = options.args;\n if (\n ![\"list\", \"create\", \"connect\", \"resources\", \"use\", \"update\"].includes(\n action!,\n )\n )\n throw new Error(\"Unknown Project environment command.\");\n const { positionals, values } = parseArgs({\n args,\n allowPositionals: true,\n strict: true,\n options: {\n json: { type: \"boolean\" },\n ...(action === \"create\" || action === \"update\"\n ? {\n name: { type: \"string\" as const },\n ...(action === \"create\"\n ? { slug: { type: \"string\" as const } }\n : {}),\n url: { type: \"string\" as const },\n }\n : {}),\n ...(action === \"connect\"\n ? {\n environment: { type: \"string\" as const },\n resource: { type: \"string\" as const },\n }\n : {}),\n },\n });\n if (\n positionals.length !==\n (action === \"connect\" ||\n action === \"resources\" ||\n action === \"use\" ||\n action === \"update\"\n ? 1\n : 0)\n )\n throw new Error(\"Unexpected Project environment arguments.\");\n if (action === \"create\" && (!values.name || !values.slug))\n throw new Error(\"Environment create requires --name and --slug.\");\n const service = positionals[0] as ProjectService;\n if (\n (action === \"connect\" || action === \"resources\") &&\n !PROJECT_SERVICES.includes(service)\n )\n throw new Error(\"Choose pulse, cookie, forms, search, trace or seo.\");\n if (action === \"connect\" && !values.environment)\n throw new Error(\"Choose a Project environment with --environment <slug>.\");\n const context = await readCommonProject(\n options,\n action === \"use\" ? \"production\" : undefined,\n );\n if (!context)\n throw new Error(\"Select a Project with `siteos project use` first.\");\n const { project } = context.overview;\n let result: unknown;\n if (action === \"use\") {\n const environment = project.environments.find(\n (item) => item.slug === positionals[0],\n );\n if (!environment)\n throw new Error(\n \"Environment not found. Run `siteos project environment list`.\",\n );\n await context.store.write({\n ...context.binding,\n environmentSlug: environment.slug,\n });\n result = { project: { id: project.id, name: project.name }, environment };\n } else if (action === \"update\") {\n const environment = project.environments.find(\n (item) => item.slug === positionals[0],\n );\n if (!environment)\n throw new Error(\n \"Environment not found. Run `siteos project environment list`.\",\n );\n if (!values.name && values.url === undefined)\n throw new Error(\"Choose --name or --url to update.\");\n result = {\n project: await context.api.updateEnvironment(project.id, environment.id, {\n name: (values.name as string) ?? environment.name,\n url:\n values.url === undefined\n ? (environment.url ?? null)\n : (values.url as string) || null,\n }),\n };\n } else if (action === \"list\")\n result = {\n environments: project.environments,\n services: context.overview.services.map(({ service, attachment }) => ({\n service,\n environments: attachment?.environments ?? [],\n })),\n };\n else if (action === \"create\")\n result = {\n project: await context.api.createEnvironment(project.id, {\n name: values.name as string,\n slug: values.slug as string,\n ...(values.url ? { url: values.url as string } : {}),\n }),\n };\n else if (action === \"resources\")\n result = {\n environments: await context.api.availableEnvironments(\n project.id,\n service,\n ),\n };\n else {\n const environment = project.environments.find(\n (item) => item.slug === values.environment,\n );\n if (!environment)\n throw new Error(\n \"Project environment not found. Run `siteos project environment list`.\",\n );\n result = await context.api.connectEnvironment(\n project.id,\n service,\n environment.id,\n values.resource as string | undefined,\n );\n }\n return { exitCode: 0, stdout: JSON.stringify(result, null, 2) };\n}\n","import { readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { parseArgs } from \"node:util\";\nimport { z } from \"zod\";\nimport type { CommandResult } from \"../core/command-result.js\";\nimport type { SiteOSServiceAudience } from \"../auth/application/service-grant-provider.js\";\nimport { SiteOSAuthApiError } from \"../siteos-auth-api.js\";\nimport {\n commonProjectRuntime,\n commonServiceContext,\n type ProjectCommandOptions,\n} from \"../projects/project-context.js\";\n\ntype Service = \"cookie\" | \"trace\" | \"integrations\";\n\nexport const SERVICE_HELP: Record<Service, string> = {\n cookie: `Manage Cookie for the selected SiteOS Project.\n\nUsage:\n siteos cookie status [--json]\n siteos cookie installation [--json]\n siteos cookie schema [--json]\n siteos cookie validate --input <draft.json> [--json]\n siteos cookie regions resolve [--country <ISO>] [--subdivision <code>] [--source <draft|published>] [--json]\n siteos cookie verify [--url <same-origin-url>] [--browser <chromium|webkit>] [--json]\n siteos cookie restore --input <restore.json> [--json]\n siteos cookie draft get [--json]\n siteos cookie draft save --input <draft.json> [--json]\n siteos cookie publish --input <publication.json> [--json]\n siteos cookie analytics [--range-days <7|30|90>] [--json]\n\nStart with siteos project use, then siteos project connect cookie.\nDraft get returns the complete save payload including expectedDraftVersion.\nPublish input: {\"expectedDraftVersion\":1,\"idempotencyKey\":\"a-unique-request-key\"}.\nSaving a draft has no public effect. Publish activates the reviewed banner at Cookie Edge.`,\n trace: `Manage Trace for the selected SiteOS Project.\n\nUsage:\n siteos trace status [--json]\n siteos trace environments [--json]\n siteos trace report [--environment <slug>] [--json]\n siteos trace installation <show|ensure|save|publish> [--environment <slug>] [--input <draft.json>] [--json]\n siteos trace tracking-plan <show|ensure|save|publish> [--environment <slug>] [--input <plan.json>] [--json]\n\nStart with siteos project use, then siteos project connect trace.\nCommands use the selected Project environment. Save requires --input with expectedDraftVersion.\nEnsure creates a draft; publish activates the reviewed configuration.`,\n integrations: `Manage shared Organization connections and notification destinations.\n\nUsage:\n siteos integrations status [--json]\n siteos integrations connect [--json]\n siteos integrations channels [--query <name>] [--cursor <cursor>] [--json]\n siteos integrations destination create --channel <provider-channel-id> [--json]\n\nConnect returns the SiteOS page for completing Slack authorization in your browser.\nDestination creation makes a channel available for service notification settings.\nIt does not send a message or subscribe every Project.`,\n};\n\nexport async function runServiceCommand(\n service: Service,\n options: ProjectCommandOptions & { args: string[] },\n): Promise<CommandResult> {\n if (\n !options.args.length ||\n options.args.includes(\"--help\") ||\n options.args.includes(\"-h\")\n )\n return { exitCode: 0, stdout: SERVICE_HELP[service] };\n try {\n const { positionals, values } = parseArgs({\n args: options.args,\n allowPositionals: true,\n strict: true,\n options: {\n json: { type: \"boolean\" },\n input: { type: \"string\" },\n environment: { type: \"string\" },\n \"range-days\": { type: \"string\" },\n query: { type: \"string\" },\n cursor: { type: \"string\" },\n channel: { type: \"string\" },\n country: { type: \"string\" },\n subdivision: { type: \"string\" },\n source: { type: \"string\" },\n url: { type: \"string\" },\n browser: { type: \"string\" },\n },\n });\n const [action, subaction] = positionals;\n const route = positionals.join(\" \");\n const allowed: Record<Service, Record<string, string[]>> = {\n cookie: {\n status: [],\n installation: [],\n schema: [],\n validate: [\"input\"],\n \"regions resolve\": [\"country\", \"subdivision\", \"source\"],\n verify: [\"url\", \"browser\"],\n restore: [\"input\"],\n \"draft get\": [],\n \"draft save\": [\"input\"],\n publish: [\"input\"],\n analytics: [\"range-days\"],\n },\n trace: {\n status: [],\n environments: [],\n report: [\"environment\"],\n ...Object.fromEntries(\n [\"installation\", \"tracking-plan\"].flatMap((section) =>\n [\"show\", \"ensure\", \"save\", \"publish\"].map((operation) => [\n `${section} ${operation}`,\n operation === \"save\" ? [\"environment\", \"input\"] : [\"environment\"],\n ]),\n ),\n ),\n },\n integrations: {\n status: [],\n connect: [],\n channels: [\"query\", \"cursor\"],\n \"destination create\": [\"channel\"],\n },\n };\n const flags = allowed[service][route];\n if (!flags)\n throw new Error(\n `Unknown ${service} operation. Run \\`siteos ${service} --help\\`.`,\n );\n if (\n Object.keys(values).some(\n (flag) => flag !== \"json\" && !flags.includes(flag),\n )\n )\n throw new Error(\"This flag does not apply to the selected operation.\");\n if (flags.includes(\"input\") && !values.input)\n throw new Error(\"This operation requires --input <json-file>.\");\n if (flags.includes(\"channel\") && !values.channel)\n throw new Error(\n \"Destination creation requires --channel <provider-channel-id>.\",\n );\n const runtime = commonProjectRuntime(options);\n const common =\n service === \"integrations\"\n ? null\n : await commonServiceContext(\n options,\n service,\n values.environment as string | undefined,\n );\n if (service !== \"integrations\" && !common)\n throw new Error(\n \"Select a SiteOS Project with `siteos project use` first.\",\n );\n const audience = `siteos-${service}` as SiteOSServiceAudience;\n async function request(\n suffix: string,\n method = \"GET\",\n body?: unknown,\n scope?: string,\n ): Promise<unknown> {\n const required =\n scope ?? `${service}:workspace:${method === \"GET\" ? \"read\" : \"write\"}`;\n const grant = await runtime.grants.acquire({\n audience,\n scopes: [required],\n });\n if (\n grant.grant.audience !== audience ||\n grant.grant.scopes.length !== 1 ||\n grant.grant.scopes[0] !== required ||\n (common &&\n grant.grant.organizationId !== common.overview.project.organizationId)\n )\n throw new SiteOSAuthApiError({\n code: \"AUTH_INVALID_RESPONSE\",\n message:\n \"The service grant does not match this Project and operation.\",\n });\n if (!options.fetchImpl)\n throw new Error(\"SiteOS API access is unavailable.\");\n const response = await options.fetchImpl(\n `${runtime.api.origin}/api/${service}/v1${suffix}`,\n {\n method,\n headers: {\n Accept: \"application/json\",\n Authorization: `Bearer ${grant.accessToken}`,\n ...(body === undefined\n ? {}\n : { \"Content-Type\": \"application/json\" }),\n },\n ...(body === undefined ? {} : { body: JSON.stringify(body) }),\n signal: AbortSignal.timeout(30_000),\n },\n );\n const result = await response.json();\n if (!response.ok) {\n const error = z\n .object({\n error: z.object({ code: z.string(), message: z.string().max(500) }),\n })\n .safeParse(result);\n throw new SiteOSAuthApiError({\n code: error.success\n ? error.data.error.code\n : \"SERVICE_REQUEST_FAILED\",\n message: error.success\n ? error.data.error.message\n : \"The service request failed.\",\n status: response.status,\n });\n }\n return result;\n }\n async function inputFile() {\n if (!values.input)\n throw new Error(\"This operation requires --input <json-file>.\");\n const filename = path.resolve(options.cwd ?? process.cwd(), values.input);\n const info = await stat(filename);\n if (!info.isFile() || info.size > 512 * 1024)\n throw new Error(\"Use a JSON file smaller than 512 KB.\");\n return JSON.parse(await readFile(filename, \"utf8\")) as unknown;\n }\n const site = common\n ? `/sites/${encodeURIComponent(common.resourceId)}`\n : \"\";\n let result: unknown;\n if (service === \"cookie\") {\n if (action === \"status\" && positionals.length === 1)\n result = await request(site);\n else if (action === \"schema\") result = await request(`${site}/schema`);\n else if (action === \"validate\") {\n result = await request(\n `${site}/validate`,\n \"POST\",\n await inputFile(),\n \"cookie:workspace:read\",\n );\n const validation = z\n .object({\n valid: z.boolean(),\n draftVersionMatches: z.boolean().optional(),\n })\n .parse(result);\n if (!validation.valid || validation.draftVersionMatches === false)\n return { exitCode: 2, stdout: JSON.stringify(result, null, 2) };\n } else if (action === \"restore\")\n result = await request(`${site}/restore`, \"POST\", await inputFile());\n else if (action === \"regions\") {\n const query = new URLSearchParams();\n for (const key of [\"country\", \"subdivision\", \"source\"] as const)\n if (values[key]) query.set(key, values[key]);\n result = await request(`${site}/regions?${query}`);\n } else if (action === \"verify\") {\n const {\n VerificationInstallation,\n verificationTarget,\n verifyCookieWebsite,\n } = await import(\"./cookie-verification.js\");\n const browserName = values.browser ?? \"chromium\";\n if (browserName !== \"chromium\" && browserName !== \"webkit\")\n throw new Error(\"Choose chromium or webkit.\");\n if (!common!.environment.url)\n throw new Error(\n \"Set the selected Project environment URL before verification.\",\n );\n const url = verificationTarget(common!.environment.url, values.url);\n result = await verifyCookieWebsite({\n installation: VerificationInstallation.parse(\n await request(`${site}/installation`),\n ),\n url,\n browserName,\n });\n return {\n exitCode: (result as { status: string }).status === \"passed\" ? 0 : 1,\n stdout: JSON.stringify(result, null, 2),\n };\n } else if (action === \"installation\")\n result = await request(`${site}/installation`);\n else if (\n action === \"draft\" &&\n subaction === \"get\" &&\n positionals.length === 2\n ) {\n const response = z\n .object({\n name: z.string(),\n hostname: z.string(),\n draftVersion: z.number(),\n draft: z.unknown(),\n })\n .parse(await request(site));\n result = {\n name: response.name,\n hostname: response.hostname,\n expectedDraftVersion: response.draftVersion,\n draft: response.draft,\n };\n } else if (\n action === \"draft\" &&\n subaction === \"save\" &&\n positionals.length === 2\n )\n result = await request(site, \"PATCH\", await inputFile());\n else if (action === \"publish\" && positionals.length === 1)\n result = await request(\n `${site}/publish`,\n \"POST\",\n await inputFile(),\n \"cookie:publication:write\",\n );\n else if (action === \"analytics\" && positionals.length === 1) {\n const range = values[\"range-days\"] ?? \"30\";\n if (![\"7\", \"30\", \"90\"].includes(range))\n throw new Error(\"Choose a range of 7, 30 or 90 days.\");\n result = await request(`${site}/analytics?rangeDays=${range}`);\n } else\n throw new Error(\n \"Unknown Cookie operation. Run `siteos cookie --help`.\",\n );\n } else if (service === \"trace\") {\n if (action === \"status\" && positionals.length === 1)\n result = await request(site);\n else if (action === \"environments\" && positionals.length === 1)\n result = await request(`${site}/environments`);\n else if (\n action === \"report\" ||\n action === \"installation\" ||\n action === \"tracking-plan\"\n ) {\n const response = z\n .object({\n environments: z.array(\n z.object({ id: z.string(), slug: z.string() }),\n ),\n })\n .parse(await request(`${site}/environments`));\n const environment = common!.overview.project.environments.find(\n (item) =>\n item.slug === (values.environment ?? common!.environment.slug),\n );\n const attachment = common!.overview.services.find(\n (item) => item.service === \"trace\",\n )!.attachment!;\n const binding = attachment.environments.find(\n (item) => item.environmentId === environment?.id,\n );\n if (!binding)\n throw new Error(\n \"Connect this environment with `siteos project environment connect trace` first.\",\n );\n const matches = response.environments.filter(\n (environment) => environment.id === binding.resourceId,\n );\n if (matches.length !== 1)\n throw new Error(\n \"Choose an environment from `siteos trace environments`.\",\n );\n const base = `/environments/${encodeURIComponent(matches[0]!.id)}`;\n if (action === \"report\" && positionals.length === 1) {\n const detail = z\n .object({\n site: z.object({\n id: z.literal(common!.resourceId),\n environments: z.array(\n z.object({ id: z.string(), evidence: z.unknown() }),\n ),\n }),\n })\n .parse(await request(site));\n const environment = detail.site.environments.find(\n (item) => item.id === matches[0]!.id,\n );\n if (!environment)\n throw new Error(\"Trace returned an invalid environment report.\");\n result = environment.evidence;\n } else if (positionals.length === 2 && subaction === \"show\")\n result = await request(`${base}/${action}`);\n else if (positionals.length === 2 && subaction === \"save\")\n result = await request(\n `${base}/${action}`,\n \"PATCH\",\n await inputFile(),\n );\n else if (\n positionals.length === 2 &&\n (subaction === \"ensure\" || subaction === \"publish\")\n )\n result = await request(\n `${base}/${action}/${subaction}`,\n \"POST\",\n {},\n subaction === \"publish\" ? \"trace:publication:write\" : undefined,\n );\n else\n throw new Error(\n \"Unknown Trace operation. Run `siteos trace --help`.\",\n );\n } else\n throw new Error(\"Unknown Trace operation. Run `siteos trace --help`.\");\n } else {\n const base = \"/connections/slack\";\n if (action === \"status\" && positionals.length === 1)\n result = await request(base);\n else if (action === \"connect\" && positionals.length === 1)\n result = {\n url: `${runtime.api.origin}/integrations`,\n nextStep:\n \"Open this page, select your Organization, and connect Slack in SiteOS.\",\n };\n else if (action === \"channels\" && positionals.length === 1) {\n const query = new URLSearchParams();\n if (values.query) query.set(\"query\", values.query);\n if (values.cursor) query.set(\"cursor\", values.cursor);\n result = await request(`${base}/channels?${query}`);\n } else if (\n action === \"destination\" &&\n subaction === \"create\" &&\n positionals.length === 2 &&\n values.channel\n )\n result = await request(`${base}/destinations`, \"POST\", {\n providerChannelId: values.channel,\n });\n else\n throw new Error(\n \"Unknown Integrations operation. Run `siteos integrations --help`.\",\n );\n }\n return { exitCode: 0, stdout: JSON.stringify(result, null, 2) };\n } catch (cause) {\n return {\n exitCode: cause instanceof SiteOSAuthApiError ? 1 : 2,\n stderr:\n cause instanceof SiteOSAuthApiError ||\n (!(cause instanceof z.ZodError) && cause instanceof Error)\n ? cause.message\n : \"The service returned an invalid response.\",\n };\n }\n}\n","import { writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { parseArgs } from \"node:util\";\nimport { z } from \"zod\";\nimport type { CommandResult } from \"../core/command-result.js\";\nimport {\n commonProjectRuntime,\n commonServiceContext,\n type ProjectCommandOptions,\n} from \"../projects/project-context.js\";\nimport { SiteOSAuthApiError } from \"../siteos-auth-api.js\";\nimport {\n PERFORMANCE_HELP,\n runSeoPerformanceCommand,\n} from \"./seo-performance-command.js\";\nexport const SEO_HELP = `Audit public HTML in the selected Project environment.\n\nUsage:\n siteos seo status [--environment <slug>] [--json]\n siteos seo audit run [--environment <slug>] [--json]\n siteos seo audit list [--environment <slug>] [--json]\n siteos seo audit show <id> [--environment <slug>] [--json]\n siteos seo audit cancel <id> [--environment <slug>] [--json]\n siteos seo pages [--audit <id>] [--query <text>] [--url <url>] [--page <number>] [--environment <slug>] [--json]\n siteos seo issues [--audit <id>] [--rule <id>] [--page <number>] [--environment <slug>] [--json]\n siteos seo changes [--audit <id>] [--state <new|reopened|still_present|resolved|not_rechecked>] [--page <number>] [--environment <slug>] [--json]\n siteos seo recheck --audit <id> --url <url> [--environment <slug>] [--json]\n siteos seo issue <ignore|restore> --audit <id> --url <url> --rule <id> --reason <text> --revision <number> [--environment <slug>] [--json]\n siteos seo schedule show [--environment <slug>] [--json]\n siteos seo schedule set --enabled <true|false> --weekday <1-7> --time <HH:mm> --timezone <IANA> --revision <number> [--environment <slug>] [--json]\n siteos seo notifications retry <notification-id> [--environment <slug>] [--json]\n siteos seo notifications show [--environment <slug>] [--json]\n siteos seo notifications destinations [--environment <slug>] [--json]\n siteos seo notifications set --enabled <true|false> [--destination <candidate-id>] --severity <error|warning> --failures <true|false> --revision <number> [--environment <slug>] [--json]\n siteos seo export --audit <id> --kind <pages|issues|changes> --format <csv|json> --output <new-file> [--query <text>] [--rule <id>] [--severity <error|warning|notice>] [--state <page-or-change-state>] [--environment <slug>] [--json]\n${PERFORMANCE_HELP.trim().split(\"\\n\\n\")[0]}\n\nSchedule and notification writes require an owner/admin and the saved revision (initially 0).\nExport writes all matching rows to a new file; existing files are never overwritten.\nRuns are queued. Read audit show until terminal; an accepted run is not a completed check.\nRecheck accepts a URL observed in the source audit. Cross-page rules require a full audit.\nRead the current disposition revision before ignore/restore; use 0 if no decision exists.\nSetup: siteos project connect seo. No crawl runs during setup.\n${PERFORMANCE_HELP.trim().split(\"\\n\\n\").slice(1).join(\"\\n\\n\")}`;\n\nexport async function runSeoCommand(\n options: ProjectCommandOptions & { args: string[] },\n): Promise<CommandResult> {\n if (\n !options.args.length ||\n options.args.some((arg) => [\"--help\", \"-h\"].includes(arg))\n )\n return { exitCode: 0, stdout: SEO_HELP };\n if (options.args[0] === \"performance\")\n return runSeoPerformanceCommand(options);\n const json = options.args.includes(\"--json\");\n try {\n const { positionals, values } = parseArgs({\n args: options.args,\n strict: true,\n allowPositionals: true,\n options: {\n json: { type: \"boolean\" },\n environment: { type: \"string\" },\n audit: { type: \"string\" },\n url: { type: \"string\" },\n rule: { type: \"string\" },\n reason: { type: \"string\" },\n revision: { type: \"string\" },\n query: { type: \"string\" },\n page: { type: \"string\" },\n state: { type: \"string\" },\n enabled: { type: \"string\" },\n weekday: { type: \"string\" },\n time: { type: \"string\" },\n timezone: { type: \"string\" },\n destination: { type: \"string\" },\n severity: { type: \"string\" },\n failures: { type: \"string\" },\n kind: { type: \"string\" },\n format: { type: \"string\" },\n output: { type: \"string\" },\n },\n });\n const route = positionals.slice(0, 2).join(\" \");\n const action = positionals[0];\n const operations: Record<string, { flags: string[]; args: number }> = {\n status: { flags: [], args: 1 },\n \"schedule show\": { flags: [], args: 2 },\n \"schedule set\": {\n flags: [\"enabled\", \"weekday\", \"time\", \"timezone\", \"revision\"],\n args: 2,\n },\n \"notifications retry\": { flags: [], args: 3 },\n \"notifications show\": { flags: [], args: 2 },\n \"notifications destinations\": { flags: [], args: 2 },\n \"notifications set\": {\n flags: [\"enabled\", \"destination\", \"severity\", \"failures\", \"revision\"],\n args: 2,\n },\n export: {\n flags: [\n \"audit\",\n \"kind\",\n \"format\",\n \"output\",\n \"query\",\n \"rule\",\n \"severity\",\n \"state\",\n ],\n args: 1,\n },\n \"audit run\": { flags: [], args: 2 },\n \"audit list\": { flags: [], args: 2 },\n \"audit show\": { flags: [], args: 3 },\n \"audit cancel\": { flags: [], args: 3 },\n pages: { flags: [\"audit\", \"url\", \"query\", \"page\"], args: 1 },\n issues: { flags: [\"audit\", \"rule\", \"page\"], args: 1 },\n changes: { flags: [\"audit\", \"state\", \"page\"], args: 1 },\n recheck: { flags: [\"audit\", \"url\"], args: 1 },\n \"issue ignore\": {\n flags: [\"audit\", \"url\", \"rule\", \"reason\", \"revision\"],\n args: 2,\n },\n \"issue restore\": {\n flags: [\"audit\", \"url\", \"rule\", \"reason\", \"revision\"],\n args: 2,\n },\n };\n const operation = operations[route];\n if (\n !operation ||\n positionals.length !== operation.args ||\n Object.keys(values).some(\n (key) => ![\"json\", \"environment\", ...operation.flags].includes(key),\n )\n )\n throw new Error(\n \"Invalid SEO operation or flags. Run `siteos seo --help`.\",\n );\n if (action === \"recheck\" && (!values.audit || !values.url))\n throw new Error(\"Recheck requires --audit and --url.\");\n if (\n action === \"issue\" &&\n [\"audit\", \"url\", \"rule\", \"reason\", \"revision\"].some(\n (key) => !values[key as keyof typeof values],\n )\n )\n throw new Error(\n \"Issue decisions require --audit, --url, --rule, --reason and --revision.\",\n );\n if (values.page && !/^[1-9]\\d{0,5}$/u.test(values.page))\n throw new Error(\"Use a positive page number.\");\n if (values.revision && !/^\\d{1,9}$/u.test(values.revision))\n throw new Error(\"Use a non-negative revision.\");\n if (\n values.reason &&\n (values.reason.trim().length < 3 || values.reason.length > 500)\n )\n throw new Error(\"Use a reason between 3 and 500 characters.\");\n const pageStateFilter = action === \"export\" && values.kind !== \"changes\";\n if (\n values.state &&\n !(\n pageStateFilter\n ? [\"analyzed\", \"unavailable\", \"excluded\", \"non_html\"]\n : [\"new\", \"reopened\", \"still_present\", \"resolved\", \"not_rechecked\"]\n ).includes(values.state)\n )\n throw new Error(\"Use a documented page or change state for this export.\");\n const automation = [\"schedule\", \"notifications\"].includes(action ?? \"\");\n const setting = automation && positionals[1] === \"set\";\n if (\n setting &&\n (!values.revision || ![\"true\", \"false\"].includes(values.enabled ?? \"\"))\n )\n throw new Error(\"Settings require --enabled true|false and --revision.\");\n if (route === \"schedule set\") {\n if (\n !/^[1-7]$/u.test(values.weekday ?? \"\") ||\n !/^([01]\\d|2[0-3]):[0-5]\\d$/u.test(values.time ?? \"\") ||\n !values.timezone\n )\n throw new Error(\"Use weekday 1–7, HH:mm and an IANA time zone.\");\n try {\n new Intl.DateTimeFormat(\"en\", { timeZone: values.timezone });\n } catch {\n throw new Error(\"Use a valid IANA time zone.\");\n }\n }\n if (\n route === \"notifications set\" &&\n (![\"error\", \"warning\"].includes(values.severity ?? \"\") ||\n ![\"true\", \"false\"].includes(values.failures ?? \"\") ||\n (values.enabled === \"true\" && !values.destination))\n )\n throw new Error(\n \"Notifications require --severity, --failures and an available --destination when enabled.\",\n );\n if (\n action === \"export\" &&\n (!values.audit ||\n ![\"pages\", \"issues\", \"changes\"].includes(values.kind ?? \"\") ||\n ![\"csv\", \"json\"].includes(values.format ?? \"\") ||\n !values.output)\n )\n throw new Error(\n \"Export requires --audit, --kind, --format and --output.\",\n );\n if (\n values.severity &&\n ![\"error\", \"warning\", \"notice\"].includes(values.severity)\n )\n throw new Error(\"Use a documented severity.\");\n const context = await commonServiceContext(\n options,\n \"seo\",\n values.environment,\n );\n if (!context)\n throw new Error(\n \"Select a SiteOS Project with `siteos project use` first.\",\n );\n const runtime = commonProjectRuntime(options);\n const retryNotification = route === \"notifications retry\";\n const writing =\n retryNotification ||\n setting ||\n [\n \"audit run\",\n \"audit cancel\",\n \"recheck\",\n \"issue ignore\",\n \"issue restore\",\n ].includes(route);\n const scope = retryNotification\n ? \"seo:notifications:write\"\n : setting\n ? action === \"schedule\"\n ? \"seo:schedule:write\"\n : \"seo:notifications:write\"\n : !writing\n ? \"seo:workspace:read\"\n : action === \"issue\"\n ? \"seo:issues:write\"\n : \"seo:audits:write\";\n const grant = await runtime.grants.acquire({\n audience: \"siteos-seo\",\n scopes: [scope],\n });\n if (\n grant.grant.audience !== \"siteos-seo\" ||\n grant.grant.scopes.length !== 1 ||\n grant.grant.scopes[0] !== scope ||\n grant.grant.organizationId !== context.overview.project.organizationId\n )\n throw new SiteOSAuthApiError({\n code: \"AUTH_INVALID_RESPONSE\",\n message: \"The SEO grant does not match this Project and operation.\",\n });\n const query = new URLSearchParams();\n for (const [flag, name] of [\n [\"audit\", \"audit\"],\n [\"rule\", \"rule\"],\n [\"query\", \"q\"],\n [\"url\", \"pageUrl\"],\n [\"page\", \"page\"],\n [\"state\", \"change\"],\n [\"kind\", \"kind\"],\n [\"format\", \"format\"],\n [\"severity\", \"severity\"],\n ] as const)\n if (values[flag] && !writing) query.set(name, values[flag]);\n if (pageStateFilter && values.state) {\n query.delete(\"change\");\n query.set(\"state\", values.state);\n }\n if (route === \"audit show\") query.set(\"audit\", positionals[2]!);\n const suffix = retryNotification\n ? \"/notification-retries\"\n : automation\n ? setting\n ? `/${action}`\n : route === \"notifications destinations\"\n ? \"/destinations\"\n : \"/automation\"\n : action === \"export\"\n ? `/export?${query}`\n : route === \"audit run\"\n ? \"/audits\"\n : route === \"audit cancel\"\n ? `/audits/${encodeURIComponent(positionals[2]!)}/cancel`\n : action === \"recheck\"\n ? \"/rechecks\"\n : action === \"issue\"\n ? \"/dispositions\"\n : `?${query}`;\n const body = retryNotification\n ? { notificationId: positionals[2] }\n : route === \"schedule set\"\n ? {\n enabled: values.enabled === \"true\",\n weekday: Number(values.weekday),\n time: values.time,\n timeZone: values.timezone,\n expectedRevision: Number(values.revision),\n }\n : route === \"notifications set\"\n ? {\n enabled: values.enabled === \"true\",\n candidateId: values.destination ?? null,\n minimumSeverity: values.severity,\n includeFailures: values.failures === \"true\",\n expectedRevision: Number(values.revision),\n }\n : action === \"recheck\"\n ? { auditId: values.audit, urls: [values.url] }\n : action === \"issue\"\n ? {\n auditId: values.audit,\n url: values.url,\n ruleId: values.rule,\n reason: values.reason,\n expectedRevision: Number(values.revision),\n ignored: positionals[1] === \"ignore\",\n }\n : undefined;\n if (!options.fetchImpl)\n throw new Error(\"SiteOS API access is unavailable.\");\n const response = await options.fetchImpl(\n `${runtime.api.origin}/api/seo/v1/resources/${encodeURIComponent(context.resourceId)}${suffix}`,\n {\n method: setting ? \"PATCH\" : writing ? \"POST\" : \"GET\",\n headers: {\n Accept: \"application/json\",\n Authorization: `Bearer ${grant.accessToken}`,\n ...(body ? { \"Content-Type\": \"application/json\" } : {}),\n },\n ...(body ? { body: JSON.stringify(body) } : {}),\n signal: AbortSignal.timeout(30000),\n },\n );\n if (action === \"export\" && response.ok) {\n if (!(response instanceof Response))\n throw new Error(\"The API transport does not support file exports.\");\n const mime = values.format === \"csv\" ? \"text/csv\" : \"application/json\";\n const rows = Number(response.headers.get(\"X-SEO-Export-Rows\"));\n if (\n response.headers.get(\"X-SEO-Audit-Id\") !== values.audit ||\n !response.headers.get(\"Content-Type\")?.startsWith(mime) ||\n !response.headers.has(\"X-SEO-Export-Rows\") ||\n !Number.isSafeInteger(rows) ||\n rows < 0\n )\n throw new Error(\n \"The export response does not match the requested audit.\",\n );\n const text = await response.text();\n if (values.format === \"json\")\n z.object({\n contractVersion: z.literal(1),\n audit: z.object({\n id: z.literal(values.audit!),\n resourceId: z.literal(context.resourceId),\n }),\n kind: z.literal(values.kind!),\n totalRows: z.literal(rows),\n rows: z.array(z.unknown()).length(rows),\n }).parse(JSON.parse(text));\n const output = path.resolve(options.cwd ?? process.cwd(), values.output!);\n await writeFile(output, text, { flag: \"wx\", mode: 0o600 });\n return {\n exitCode: 0,\n stdout: JSON.stringify(\n {\n auditId: values.audit,\n kind: values.kind,\n format: values.format,\n rows,\n output,\n },\n null,\n 2,\n ),\n };\n }\n const data: unknown = await response.json();\n if (!response.ok) {\n const result = z\n .object({\n error: z.object({ code: z.string(), message: z.string().max(500) }),\n })\n .safeParse(data);\n throw new SiteOSAuthApiError({\n code: result.success ? result.data.error.code : \"SEO_REQUEST_FAILED\",\n message: result.success\n ? result.data.error.message\n : \"The SEO request failed.\",\n status: response.status,\n });\n }\n const record = z\n .object({ contractVersion: z.literal(1) })\n .passthrough()\n .parse(data);\n if (automation) {\n z.literal(context.resourceId).parse(record.resourceId);\n const schedule = z.object({\n enabled: z.boolean(),\n weekday: z.number().int().min(1).max(7),\n time: z.string(),\n timeZone: z.string(),\n revision: z.number().int().min(0),\n nextRunAt: z.string().nullable(),\n });\n const notificationRoute = z.object({\n enabled: z.boolean(),\n minimumSeverity: z.enum([\"error\", \"warning\"]),\n includeFailures: z.boolean(),\n revision: z.number().int().min(0),\n destinationId: z.string().nullable(),\n });\n if (retryNotification) {\n z.literal(true).parse(record.retryQueued);\n z.literal(positionals[2]!).parse(record.notificationId);\n } else if (route === \"notifications destinations\")\n z.object({\n candidates: z.array(\n z.object({\n candidateId: z.string(),\n label: z.string(),\n availability: z.literal(\"available\"),\n }),\n ),\n }).parse(record);\n else if (setting) {\n const value =\n action === \"schedule\"\n ? schedule.parse(record.schedule)\n : notificationRoute.parse(record.route);\n if (\n value.revision !== Number(values.revision) + 1 ||\n value.enabled !== (values.enabled === \"true\")\n )\n throw new Error(\"The saved settings do not match this change.\");\n } else {\n schedule.parse(record.schedule);\n notificationRoute.parse(record.route);\n }\n } else if (!writing) {\n const validated = z\n .object({\n resource: z.object({\n id: z.literal(context.resourceId),\n organizationId: z.literal(context.overview.project.organizationId),\n }),\n audits: z.array(z.object({ id: z.string() }).passthrough()),\n audit: z\n .object({\n id: z.string(),\n resourceId: z.literal(context.resourceId),\n })\n .passthrough()\n .nullable(),\n pages: z.array(z.unknown()),\n issues: z.array(z.unknown()),\n changes: z.array(z.unknown()),\n totalChanges: z.number(),\n dispositions: z.array(z.unknown()),\n })\n .passthrough()\n .parse(record);\n const selected = query.get(\"audit\");\n if (selected && validated.audit?.id !== selected)\n throw new Error(\"The SEO response does not match the requested audit.\");\n } else if (record.audit)\n z.object({\n id: z.string(),\n resourceId: z.literal(context.resourceId),\n organizationId: z.literal(context.overview.project.organizationId),\n state: z.literal(\"queued\"),\n }).parse(record.audit);\n else if (route === \"audit cancel\") z.literal(true).parse(record.cancelled);\n else if (action === \"issue\")\n z.object({\n url: z.literal(values.url!),\n ruleId: z.literal(values.rule!),\n ignored: z.literal(positionals[1] === \"ignore\"),\n revision: z.literal(Number(values.revision) + 1),\n }).parse(record.disposition);\n else throw new Error(\"The SEO service returned an invalid response.\");\n return { exitCode: 0, stdout: JSON.stringify(record, null, 2) };\n } catch (cause) {\n const error = {\n code:\n cause instanceof SiteOSAuthApiError ? cause.code : \"SEO_COMMAND_FAILED\",\n message:\n cause instanceof z.ZodError\n ? \"The SEO service returned an invalid response.\"\n : cause instanceof Error\n ? cause.message\n : \"The SEO command failed.\",\n };\n return {\n exitCode: cause instanceof SiteOSAuthApiError ? 1 : 2,\n ...(json\n ? { stdout: JSON.stringify({ error }) }\n : { stderr: error.message }),\n };\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport { writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { setTimeout } from \"node:timers/promises\";\nimport { parseArgs } from \"node:util\";\nimport { z } from \"zod\";\nimport type { CommandResult } from \"../core/command-result.js\";\nimport {\n commonProjectRuntime,\n commonServiceContext,\n type ProjectCommandOptions,\n} from \"../projects/project-context.js\";\nimport { SiteOSAuthApiError } from \"../siteos-auth-api.js\";\n\nexport const PERFORMANCE_HELP = `\n siteos seo performance run --audit <id> --url <url> [--url <url>...] [--device <mobile|desktop>] [--idempotency-key <key>] [--environment <slug>] [--json]\n siteos seo performance list [--device <mobile|desktop>] [--environment <slug>] [--json]\n siteos seo performance show <id> [--url <url>] [--environment <slug>] [--json]\n siteos seo performance wait <id> [--timeout <seconds>] [--environment <slug>] [--json]\n siteos seo performance cancel <id> [--environment <slug>] [--json]\n siteos seo performance history --url <url> [--device <mobile|desktop>] [--environment <slug>] [--json]\n siteos seo performance export <id> --format <csv|json> --output <new-file> [--environment <slug>] [--json]\n\nPerformance checks use up to 10 explicitly selected URLs from a saved full HTML audit.\nMobile is the default for a new run. Scores are Lighthouse lab data, not real-user Core Web Vitals.\nReuse the returned idempotency key after an uncertain run response. Wait defaults to 120 seconds (maximum 900).\n`;\nexport async function runSeoPerformanceCommand(\n options: ProjectCommandOptions & { args: string[] },\n): Promise<CommandResult> {\n let idempotencyKey: string | undefined;\n try {\n const { values, positionals } = parseArgs({\n args: options.args.slice(1),\n strict: true,\n allowPositionals: true,\n options: {\n json: { type: \"boolean\" },\n environment: { type: \"string\" },\n audit: { type: \"string\" },\n url: { type: \"string\", multiple: true },\n device: { type: \"string\" },\n \"idempotency-key\": { type: \"string\" },\n timeout: { type: \"string\" },\n format: { type: \"string\" },\n output: { type: \"string\" },\n },\n });\n const action = positionals[0] ?? \"\";\n const id = positionals[1];\n const operations: Record<string, { args: number; flags: string[] }> = {\n run: { args: 1, flags: [\"audit\", \"url\", \"device\", \"idempotency-key\"] },\n list: { args: 1, flags: [\"device\"] },\n show: { args: 2, flags: [\"url\"] },\n wait: { args: 2, flags: [\"timeout\"] },\n cancel: { args: 2, flags: [] },\n history: { args: 1, flags: [\"url\", \"device\"] },\n export: { args: 2, flags: [\"format\", \"output\"] },\n };\n const operation = operations[action];\n if (\n !operation ||\n positionals.length !== operation.args ||\n Object.keys(values).some(\n (key) => ![\"environment\", \"json\", ...operation.flags].includes(key),\n )\n )\n throw new Error(\n \"Invalid performance operation or flags. Run siteos seo --help.\",\n );\n if (values.device && ![\"mobile\", \"desktop\"].includes(values.device))\n throw new Error(\"Use --device mobile or desktop.\");\n if (\n action === \"run\" &&\n (!values.audit || !values.url?.length || values.url.length > 10)\n )\n throw new Error(\n \"Choose a source --audit and between 1 and 10 --url values.\",\n );\n if (\n (action === \"history\" && values.url?.length !== 1) ||\n (action === \"show\" && values.url && values.url.length !== 1)\n )\n throw new Error(\"Use one --url for page evidence or history.\");\n for (const value of values.url ?? []) {\n const url = new URL(value);\n if (\n ![\"http:\", \"https:\"].includes(url.protocol) ||\n url.username ||\n url.password ||\n url.port ||\n value.length > 2048\n )\n throw new Error(\"Use eligible public HTTP(S) URLs.\");\n }\n const timeout = Number(values.timeout ?? 120);\n if (!Number.isInteger(timeout) || timeout < 1 || timeout > 900)\n throw new Error(\"Use a wait timeout between 1 and 900 seconds.\");\n if (\n action === \"export\" &&\n (!values.output || ![\"csv\", \"json\"].includes(values.format ?? \"\"))\n )\n throw new Error(\n \"Export requires --format csv|json and --output for a new file.\",\n );\n if (action === \"run\") {\n idempotencyKey = values[\"idempotency-key\"] ?? randomUUID();\n if (!/^[a-zA-Z0-9_-]{16,100}$/u.test(idempotencyKey))\n throw new Error(\n \"Use an idempotency key of 16 to 100 letters, digits, underscores or hyphens.\",\n );\n }\n const context = await commonServiceContext(\n options,\n \"seo\",\n values.environment,\n );\n if (!context)\n throw new Error(\"Select a SiteOS Project with siteos project use first.\");\n const runtime = commonProjectRuntime(options);\n const writing = [\"run\", \"cancel\"].includes(action);\n const scope = writing ? \"seo:audits:write\" : \"seo:workspace:read\";\n const batchSchema = z\n .object({\n id: z.string(),\n resourceId: z.literal(context.resourceId),\n organizationId: z.literal(context.overview.project.organizationId),\n sourceAuditId: z.string(),\n state: z.enum([\n \"queued\",\n \"running\",\n \"completed\",\n \"partial\",\n \"failed\",\n \"cancelled\",\n ]),\n device: z.enum([\"mobile\", \"desktop\"]),\n urls: z.array(z.string()).min(1).max(10),\n })\n .passthrough();\n const query = new URLSearchParams();\n if (values.device) query.set(\"device\", values.device);\n if (!writing && values.url?.[0]) query.set(\"pageUrl\", values.url[0]);\n const suffix = id\n ? `/${encodeURIComponent(id)}${action === \"cancel\" ? \"/cancel\" : action === \"export\" ? \"/export\" : \"\"}`\n : \"\";\n if (action === \"export\") query.set(\"format\", values.format!);\n const deadline = Date.now() + timeout * 1000;\n while (true) {\n const grant = await runtime.grants.acquire({\n audience: \"siteos-seo\",\n scopes: [scope],\n });\n if (\n grant.grant.audience !== \"siteos-seo\" ||\n grant.grant.organizationId !==\n context.overview.project.organizationId ||\n grant.grant.scopes.length !== 1 ||\n grant.grant.scopes[0] !== scope\n )\n throw new Error(\n \"The SEO grant does not match this Project and operation.\",\n );\n if (!options.fetchImpl)\n throw new Error(\"SiteOS API access is unavailable.\");\n const response = await options.fetchImpl(\n `${runtime.api.origin}/api/seo/v1/resources/${encodeURIComponent(context.resourceId)}/browser-checks${suffix}?${query}`,\n {\n method: writing ? \"POST\" : \"GET\",\n headers: {\n Accept: \"application/json\",\n Authorization: `Bearer ${grant.accessToken}`,\n ...(action === \"run\" ? { \"Content-Type\": \"application/json\" } : {}),\n },\n ...(action === \"run\"\n ? {\n body: JSON.stringify({\n auditId: values.audit,\n urls: values.url,\n device: values.device ?? \"mobile\",\n idempotencyKey,\n }),\n }\n : {}),\n signal: AbortSignal.timeout(30000),\n },\n );\n if (action === \"export\" && response.ok) {\n if (\n !(response instanceof Response) ||\n response.headers.get(\"X-SEO-Browser-Id\") !== id ||\n !response.headers\n .get(\"Content-Type\")\n ?.startsWith(\n values.format === \"csv\" ? \"text/csv\" : \"application/json\",\n )\n )\n throw new Error(\n \"The export response does not match the selected check.\",\n );\n const text = await response.text();\n if (values.format === \"json\") {\n const parsed = z\n .object({\n contractVersion: z.literal(1),\n batch: batchSchema,\n pages: z.array(z.unknown()),\n })\n .parse(JSON.parse(text));\n if (parsed.batch.id !== id)\n throw new Error(\n \"The export response does not match the selected check.\",\n );\n }\n const output = path.resolve(\n options.cwd ?? process.cwd(),\n values.output!,\n );\n await writeFile(output, text, { flag: \"wx\", mode: 0o600 });\n return {\n exitCode: 0,\n stdout: JSON.stringify(\n { batchId: id, output, format: values.format },\n null,\n 2,\n ),\n };\n }\n const data: unknown = await response.json();\n if (!response.ok) {\n const error = z\n .object({\n error: z.object({ code: z.string(), message: z.string().max(500) }),\n })\n .safeParse(data);\n throw new SiteOSAuthApiError({\n code: error.success ? error.data.error.code : \"SEO_REQUEST_FAILED\",\n message: error.success\n ? error.data.error.message\n : \"The performance request failed.\",\n status: response.status,\n });\n }\n const record = z\n .object({ contractVersion: z.literal(1) })\n .passthrough()\n .parse(data);\n if (action === \"cancel\") z.literal(true).parse(record.cancelled);\n else if (action === \"run\") {\n const accepted = batchSchema.parse(record.batch);\n const normalize = (url: string) => {\n const value = new URL(url);\n value.hash = \"\";\n return value.href;\n };\n if (\n accepted.sourceAuditId !== values.audit ||\n accepted.device !== (values.device ?? \"mobile\") ||\n JSON.stringify([...new Set(accepted.urls.map(normalize))].sort()) !==\n JSON.stringify([...new Set(values.url!.map(normalize))].sort())\n )\n throw new Error(\n \"The queued check does not match the requested source, device and URLs.\",\n );\n } else {\n z.literal(context.resourceId).parse(record.resourceId);\n z.array(batchSchema).parse(record.batches);\n const selected = batchSchema.nullable().parse(record.batch);\n if (id && selected?.id !== id)\n throw new Error(\n \"The response does not match the selected performance check.\",\n );\n }\n const batch = record.batch ? batchSchema.parse(record.batch) : null;\n if (\n action !== \"wait\" ||\n !batch ||\n ![\"queued\", \"running\"].includes(batch.state)\n )\n return {\n exitCode: 0,\n stdout: JSON.stringify(\n { ...record, ...(idempotencyKey ? { idempotencyKey } : {}) },\n null,\n 2,\n ),\n };\n if (Date.now() >= deadline)\n return {\n exitCode: 3,\n stdout: JSON.stringify({ ...record, timedOut: true }, null, 2),\n };\n await setTimeout(Math.min(3000, Math.max(0, deadline - Date.now())));\n }\n } catch (cause) {\n const error = {\n code:\n cause instanceof SiteOSAuthApiError ? cause.code : \"SEO_COMMAND_FAILED\",\n message:\n cause instanceof z.ZodError\n ? \"The SEO service returned an invalid response.\"\n : cause instanceof Error\n ? cause.message\n : \"The performance command failed.\",\n };\n return {\n exitCode: cause instanceof SiteOSAuthApiError ? 1 : 2,\n ...(options.args.includes(\"--json\")\n ? {\n stdout: JSON.stringify({\n error,\n ...(idempotencyKey ? { idempotencyKey } : {}),\n }),\n }\n : {\n stderr: `${error.message}${idempotencyKey ? ` Retry key: ${idempotencyKey}` : \"\"}`,\n }),\n };\n }\n}\n","#!/usr/bin/env node\nimport { createHealthCheckResult } from \"./health-check.js\";\nimport { runAuthCommand } from \"./auth-command.js\";\nimport {\n createCommandRegistry,\n dispatchCommand,\n} from \"./core/command-registry.js\";\nimport {\n CLI_EXIT_CODE,\n normalizeCommandResult,\n type CommandResult,\n} from \"./core/command-result.js\";\nimport { runFormsCommand } from \"./forms-command.js\";\nimport { readPackageMetadata } from \"./package-metadata.js\";\nimport { runPulseCommand } from \"./pulse-command.js\";\nimport { runSearchCommand } from \"./search-command.js\";\nimport { runProjectCommand } from \"./projects/project-command.js\";\nimport { runServiceCommand } from \"./services/service-command.js\";\nimport { runSeoCommand } from \"./services/seo-command.js\";\nimport type { FetchLike } from \"./siteos-search-api.js\";\n\nconst [command, ...args] = process.argv.slice(2);\nconst HELP_FLAGS = new Set([\"--help\", \"-h\"]);\nconst VERSION_FLAGS = new Set([\"--version\", \"-v\"]);\nconst REJECTED_LEGACY_COMMANDS = new Set([\n [\"ai\", \"setup\"].join(\"-\"),\n \"environment\",\n \"org\",\n \"pull\",\n \"ui\",\n]);\n\nif (!command || command === \"--help\" || command === \"-h\") {\n printRootHelp();\n process.exitCode = 0;\n} else if (VERSION_FLAGS.has(command)) {\n console.log(readPackageMetadata().version);\n process.exitCode = 0;\n} else {\n const result = await dispatchCommand(rootCommandRegistry(), command, args);\n if (result) {\n printCommandResult(result);\n } else if (\n REJECTED_LEGACY_COMMANDS.has(command) ||\n looksLikeApiKeyInit(command)\n ) {\n printUnsupportedLegacyCommand();\n process.exitCode = CLI_EXIT_CODE.usage;\n } else {\n console.error(\"Unknown SiteOS command.\");\n console.error(\"\");\n printRootHelp();\n process.exitCode = CLI_EXIT_CODE.usage;\n }\n}\n\nfunction rootCommandRegistry() {\n return createCommandRegistry({\n seo: (args) =>\n runSeoCommand({\n args,\n cwd: process.cwd(),\n env: process.env,\n fetchImpl: globalThis.fetch,\n }),\n \"health-check\": runHealthCheck,\n project: (args) =>\n runProjectCommand({\n args,\n cwd: process.cwd(),\n env: process.env,\n fetchImpl: globalThis.fetch,\n }),\n cookie: (args) =>\n runServiceCommand(\"cookie\", {\n args,\n cwd: process.cwd(),\n env: process.env,\n fetchImpl: globalThis.fetch,\n }),\n trace: (args) =>\n runServiceCommand(\"trace\", {\n args,\n cwd: process.cwd(),\n env: process.env,\n fetchImpl: globalThis.fetch,\n }),\n integrations: (args) =>\n runServiceCommand(\"integrations\", {\n args,\n cwd: process.cwd(),\n env: process.env,\n fetchImpl: globalThis.fetch,\n }),\n auth: async (args) =>\n normalizeCommandResult(\n await runAuthCommand({\n args,\n env: process.env,\n fetchImpl: globalThis.fetch,\n }),\n ),\n forms: async (args) =>\n normalizeCommandResult(\n await runFormsCommand({\n args,\n cwd: process.cwd(),\n env: process.env,\n fetchImpl: globalThis.fetch as FetchLike | undefined,\n }),\n ),\n pulse: async (args) =>\n normalizeCommandResult(\n await runPulseCommand({\n args,\n cwd: process.cwd(),\n env: process.env,\n fetchImpl: globalThis.fetch,\n }),\n ),\n search: async (args) =>\n normalizeCommandResult(\n await runSearchCommand({\n args,\n cwd: process.cwd(),\n env: process.env,\n fetchImpl: globalThis.fetch as FetchLike | undefined,\n }),\n ),\n });\n}\n\nasync function runHealthCheck(args: string[]): Promise<CommandResult> {\n if (args.some((arg) => HELP_FLAGS.has(arg))) {\n return { exitCode: CLI_EXIT_CODE.success, stdout: healthCheckHelp() };\n }\n\n const unsupportedArgs = args.filter((arg) => arg !== \"--json\");\n if (unsupportedArgs.length > 0) {\n return {\n exitCode: CLI_EXIT_CODE.usage,\n stderr: `health-check only accepts --json.\\n\\n${healthCheckHelp()}`,\n };\n }\n\n const result = createHealthCheckResult({\n cwd: process.cwd(),\n env: process.env,\n packageMetadata: readPackageMetadata(),\n });\n\n return {\n exitCode: CLI_EXIT_CODE.success,\n stdout: JSON.stringify(await result, null, 2),\n };\n}\n\nfunction printCommandResult(result: CommandResult): void {\n if (result.stdout) {\n console.log(result.stdout);\n }\n\n if (result.stderr) {\n console.error(result.stderr);\n }\n\n process.exitCode = result.exitCode;\n}\n\nfunction looksLikeApiKeyInit(commandName: string): boolean {\n return (\n /^sos_[a-zA-Z0-9]+/.test(commandName) ||\n /^p[a-z]+_[a-zA-Z0-9]+/.test(commandName)\n );\n}\n\nfunction printUnsupportedLegacyCommand(): void {\n console.error(\"This legacy flow is not supported by the SiteOS CLI.\");\n console.error(\"\");\n printRootHelp();\n}\n\nfunction printRootHelp(): void {\n console.log(`SiteOS CLI\n\nUsage:\n siteos health-check [--json]\n siteos auth --help\n siteos project --help\n siteos cookie --help\n siteos trace --help\n siteos seo --help\n siteos integrations --help\n siteos pulse --help\n siteos search --help\n siteos forms --help\n\nCommands:\n health-check Print SiteOS local readiness diagnostics.\n auth Authenticate the SiteOS CLI with central Auth.\n project Select one Project and configure its services and environments.\n cookie Configure, publish, and inspect the Project’s cookie banner.\n trace Configure analytics observation and inspect evidence.\n seo Audit HTML, inspect changes and verify fixes.\n integrations Manage Organization connections and destinations.\n pulse Manage monitoring checks, tests, and deployments.\n search Run SiteOS search operations for a project environment.\n forms Sync SiteOS form definitions and run submission smoke tests.\n`);\n}\n\nfunction healthCheckHelp(): string {\n return `Usage:\n siteos health-check [--json]\n\nPrint SiteOS local readiness diagnostics as JSON.`;\n}\n"],"mappings":"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","names":["z","path","path","os","z","z","path","os","createHash","path","z","randomUUID","chmod","lstat","mkdir","readFile","rename","rm","writeFile","path","isNodeErrorCode","z","path","createHash","lstat","realpath","path","assertDirectory","safeLstat","isNodeErrorCode","z","z","path","path","args","slug","path","z","path","z","createHash","readFile","rename","writeFile","path","z","path","z","createHash","readFile","writeFile","rename","projectSlug","path","z","path","z","codec","mapReferenceError","project","path","createHash","randomBytes","os","z","z","args","os","displayName","randomBytes","createHash","command","args","readFile","path","z","z","requestJson","randomUUID","chmod","lstat","readFile","rename","rm","writeFile","path","isNodeErrorCode","HELP_FLAGS","z","args","usageError","project","output","path","response","credential","grant","slug","readFile","path","path","commandError","readFile","z","z","deploymentResponseSchema","readFile","createHash","lstat","readFile","realpath","os","path","z","z","path","realpath","os","lstat","readFile","createHash","createHash","randomUUID","mkdir","readFile","rename","rm","writeFile","path","createHash","lstat","readFile","path","createHash","readFile","path","mkdir","randomUUID","checksum","rm","rename","writeFile","mkdir","readFile","writeFile","path","readFile","path","writeFile","path","packageName","mkdir","writeFile","fg","readFile","path","fg","readFile","path","fg","path","fg","path","fg","readFile","path","path","readFile","PLAYWRIGHT_SPEC_FILE","fg","spawn","createRequire","path","spawn","access","readFile","path","fileExists","access","readFile","path","filenames","command","args","spawn","createRequire","path","path","path","HELP_FLAGS","command","args","runProjectCommand","usageError","projectBindingStore","path","project","slug","commandError","path","z","requestJson","environmentCollectionPath","credentialCollectionPath","buildApiUrl","spawn","randomUUID","chmod","lstat","readFile","rename","rm","writeFile","path","path","assertSafeProjectRoot","isDotenvIgnored","readSafeDotenv","writeCredentialAtomically","lstat","isNodeErrorCode","readFile","randomUUID","writeFile","chmod","rename","rm","spawn","HELP_FLAGS","JSON_FLAG","ENVIRONMENT_FLAG","CREDENTIAL_FLAG","INSTALL_FLAG","NAME_FLAG","SLUG_FLAG","REPLACE_FLAG","splitFlag","usageError","args","runProjectCommand","runEnvironmentCommand","runCredentialCommand","parseProjectFlags","serviceGrantProvider","requireGrant","projects","requireProjectOrganization","stringifySafeJson","formatProjectListOutput","project","projectBindingStore","output","path","formatProjectError","parseEnvironmentFlags","slug","parseCredentialFlags","loadCredentialManagementContext","formatCredentialListOutput","credential","previousCredentials","exchange","result","formatCredentialError","parseFlags","grant","formatAuthError","parseArgs","runProjectCommand","args","runEnvironmentCommand","parseArgs","project","service","readFile","path","parseArgs","z","parseArgs","result","z","path","readFile","VerificationInstallation","verificationTarget","verifyCookieWebsite","environment","writeFile","path","parseArgs","z","randomUUID","writeFile","path","setTimeout","parseArgs","z","parseArgs","randomUUID","z","path","writeFile","setTimeout","parseArgs","z","path","writeFile","HELP_FLAGS","args","runProjectCommand"]}
|
|
1
|
+
{"version":3,"sources":["../src/services/cookie-verification.ts","../src/health-check.ts","../src/projects/project-context.ts","../src/siteos-service-grant.ts","../src/siteos-auth-api.ts","../src/siteos-auth-state.ts","../src/siteos-config.ts","../src/auth/adapters/siteos-service-grant-provider.ts","../src/core/adapters/node-project-binding-store.ts","../src/core/ports/project-binding-store.ts","../src/core/adapters/node-json-document-store.ts","../src/core/adapters/node-repository-root.ts","../src/projects/project-api.ts","../src/forms/project-reference.ts","../src/pulse/config.ts","../src/pulse/errors.ts","../src/search/project-reference.ts","../src/auth-command.ts","../src/core/command-registry.ts","../src/core/command-result.ts","../src/forms-command.ts","../src/siteos-forms-api.ts","../src/siteos-forms-credential.ts","../src/environment-slug.ts","../src/package-metadata.ts","../src/pulse-command.ts","../src/core/errors.ts","../src/pulse/api-client.ts","../src/pulse/binding-migration.ts","../src/pulse/constants.ts","../src/pulse/bundle.ts","../src/pulse/project-files.ts","../src/pulse/init.ts","../src/pulse/sync.ts","../src/pulse/interactive/discovery.ts","../src/pulse/interactive/playwright-config.ts","../src/pulse/sync-plan.ts","../src/pulse/test-imports.ts","../src/pulse/interactive/prompt.ts","../src/pulse/interactive/sync.ts","../src/pulse/playwright.ts","../src/pulse/package-manager.ts","../src/pulse/validate.ts","../src/search-command.ts","../src/siteos-search-api.ts","../src/siteos-search-credential.ts","../src/projects/project-command.ts","../src/services/service-command.ts","../src/services/trace-explorer-command.ts","../src/services/analytics-command.ts","../src/services/seo-command.ts","../src/services/seo-performance-command.ts","../src/cli.ts"],"sourcesContent":["import { z } from \"zod\";\nimport type { Browser, Page } from \"playwright\";\n\nconst Names = z.object({\n exact: z.array(z.string()),\n prefixes: z.array(z.string()),\n});\nconst Service = z.object({\n key: z.string(),\n purposeKey: z.string(),\n lifecycle: z\n .object({\n scriptOrigins: z.array(z.string()),\n iframeOrigins: z.array(z.string()),\n pixelOrigins: z.array(z.string()),\n firstPartyCookies: Names,\n localStorage: Names,\n })\n .optional(),\n});\nconst Envelope = z.object({\n publicKey: z.string(),\n revision: z.number(),\n ruleKey: z.string(),\n profileKey: z.string(),\n trustedSignals: z\n .object({\n region: z\n .object({\n countryCode: z.string().nullable(),\n subdivisionCode: z.string().nullable(),\n })\n .optional(),\n })\n .optional(),\n config: z.object({\n services: z.array(Service),\n categories: z.array(z.object({ key: z.string(), required: z.boolean() })),\n integrations: z.object({ googleConsentMode: z.string() }),\n }),\n});\nconst State = z.object({\n runtimeVersion: z.string(),\n preview: z.boolean(),\n resolved: z\n .object({\n publicKey: z.string(),\n revision: z.number(),\n ruleKey: z.string(),\n profileKey: z.string(),\n })\n .nullable(),\n consent: z.object({\n categories: z.array(z.string()),\n decision: z.string(),\n globalPrivacyControl: z.boolean(),\n privacyChoices: z.object({\n saleOrShareOptOut: z.boolean(),\n targetedAdvertisingOptOut: z.boolean(),\n }),\n }),\n services: z.array(\n z.object({\n key: z.string(),\n allowed: z.boolean(),\n footprintPresent: z.boolean(),\n }),\n ),\n});\nexport const VerificationInstallation = z.object({\n publicKey: z.string(),\n currentPublishedRevision: z.number().int().positive(),\n delivery: z.object({\n runtimeUrl: z.string().url(),\n configUrl: z.string().url(),\n analyticsUrl: z.string().url().nullable(),\n receiptsUrl: z.string().url(),\n handshakeUrl: z.string().url(),\n }),\n});\ntype Installation = z.infer<typeof VerificationInstallation>;\ntype Issue = { code: string; scenario: string; detail: string };\ntype RequestEvidence = { origin: string; type: string; scenario: string };\ntype Observation = {\n scenario: string;\n state: z.infer<typeof State>;\n cookies: string[];\n localStorage: string[];\n};\n\nexport function verificationTarget(\n websiteUrl: string,\n candidate?: string,\n): string {\n const website = new URL(websiteUrl);\n const target = new URL(candidate ?? websiteUrl, website);\n if (\n target.origin !== website.origin ||\n target.username ||\n target.password ||\n target.hash ||\n ![\"https:\", \"http:\"].includes(target.protocol)\n )\n throw new Error(\n \"Verify a URL on the selected Project environment's origin, without credentials or fragments.\",\n );\n return target.toString();\n}\nfunction matchesName(\n value: string,\n names: z.infer<typeof Names> | undefined,\n): boolean {\n return Boolean(\n names &&\n (names.exact.includes(value) ||\n names.prefixes.some((prefix) => value.startsWith(prefix))),\n );\n}\n\nexport function assessCookieObservations(input: {\n envelope: z.infer<typeof Envelope>;\n observations: Observation[];\n requests: RequestEvidence[];\n firstPartyOrigin: string;\n deliveryOrigins: string[];\n}) {\n const issues: Issue[] = [];\n const unknownOrigins = new Set<string>();\n const unknownStorage = new Set<string>();\n const services = input.envelope.config.services;\n for (const request of input.requests) {\n const matches = services.filter(\n (service) =>\n service.lifecycle &&\n [\n ...service.lifecycle.scriptOrigins,\n ...service.lifecycle.iframeOrigins,\n ...service.lifecycle.pixelOrigins,\n ].some((url) => new URL(url).origin === request.origin),\n );\n const state = input.observations.find(\n (item) => item.scenario === request.scenario,\n )?.state;\n if (matches.length) {\n const allowed = matches.some(\n (service) =>\n state?.services.find((item) => item.key === service.key)?.allowed,\n );\n const advancedGoogle =\n input.envelope.config.integrations.googleConsentMode === \"advanced\" &&\n matches.every((service) =>\n [\"google-analytics\", \"google-ads\"].includes(service.key),\n );\n if (!allowed && !advancedGoogle)\n issues.push({\n code: \"request_without_permission\",\n scenario: request.scenario,\n detail: request.origin,\n });\n } else if (\n request.origin !== input.firstPartyOrigin &&\n !input.deliveryOrigins.includes(request.origin)\n )\n unknownOrigins.add(request.origin);\n }\n for (const observation of input.observations) {\n for (const service of services) {\n const allowed = observation.state.services.find(\n (item) => item.key === service.key,\n )?.allowed;\n const stored =\n observation.cookies.some((name) =>\n matchesName(name, service.lifecycle?.firstPartyCookies),\n ) ||\n observation.localStorage.some((name) =>\n matchesName(name, service.lifecycle?.localStorage),\n );\n if (!allowed && stored)\n issues.push({\n code: \"storage_without_permission\",\n scenario: observation.scenario,\n detail: service.key,\n });\n }\n for (const name of observation.cookies) {\n if (\n name !== \"siteos_consent\" &&\n !services.some((service) =>\n matchesName(name, service.lifecycle?.firstPartyCookies),\n )\n )\n unknownStorage.add(`cookie:${name}`);\n }\n for (const name of observation.localStorage) {\n if (\n !name.startsWith(\"siteos-cookie:\") &&\n !services.some((service) =>\n matchesName(name, service.lifecycle?.localStorage),\n )\n )\n unknownStorage.add(`localStorage:${name}`);\n }\n }\n return {\n issues,\n unknownOrigins: [...unknownOrigins].sort(),\n unknownStorage: [...unknownStorage].sort(),\n };\n}\n\n/** Runs only in an isolated local browser. No authenticated browser state or raw payloads are exported. */\nexport async function verifyCookieWebsite(input: {\n installation: Installation;\n url: string;\n browserName: \"chromium\" | \"webkit\";\n launch?: () => Promise<Browser>;\n}) {\n const startedAt = new Date().toISOString();\n const issues: Issue[] = [];\n const requests: RequestEvidence[] = [];\n const observations: Observation[] = [];\n let envelope: z.infer<typeof Envelope> | null = null;\n let scenario = \"first-visit\";\n let overflow = false;\n const installation = input.installation;\n const browser = await (\n input.launch ??\n (async () => {\n const playwright = await import(\"playwright\");\n try {\n return await playwright[input.browserName].launch({ headless: true });\n } catch {\n throw new Error(\n `The ${input.browserName} browser is unavailable. Run npx playwright@1.61.1 install ${input.browserName}, then retry.`,\n );\n }\n })\n )();\n const readState = async (page: Page) =>\n State.parse(\n await page.evaluate(() =>\n (\n window as unknown as { SiteOSCookie: { getDebugState(): unknown } }\n ).SiteOSCookie.getDebugState(),\n ),\n );\n const waitForRuntime = async (page: Page) => {\n await page.waitForFunction(\n () =>\n Boolean(\n (\n window as unknown as {\n SiteOSCookie?: { getDebugState(): { resolved: unknown } };\n }\n ).SiteOSCookie?.getDebugState().resolved,\n ),\n undefined,\n { timeout: 15_000 },\n );\n };\n try {\n for (const gpc of [false, true]) {\n const context = await browser.newContext({\n serviceWorkers: \"block\",\n ...(gpc ? { extraHTTPHeaders: { \"Sec-GPC\": \"1\" } } : {}),\n });\n if (gpc)\n await context.addInitScript(() =>\n Object.defineProperty(navigator, \"globalPrivacyControl\", {\n get: () => true,\n }),\n );\n const page = await context.newPage();\n page.setDefaultTimeout(15_000);\n page.setDefaultNavigationTimeout(25_000);\n const pending = new Set<Promise<void>>();\n page.on(\"request\", (request) => {\n if (!/^https?:/u.test(request.url())) return;\n if (requests.length >= 2000) {\n overflow = true;\n return;\n }\n requests.push({\n origin: new URL(request.url()).origin,\n type: request.resourceType(),\n scenario,\n });\n });\n page.on(\"response\", (response) => {\n const expectedUrl = new URL(installation.delivery.configUrl);\n const responseUrl = new URL(response.url());\n if (\n responseUrl.origin !== expectedUrl.origin ||\n responseUrl.pathname !== expectedUrl.pathname\n )\n return;\n const responseScenario = scenario;\n const reading = (async () => {\n let timeout: ReturnType<typeof setTimeout> | undefined;\n try {\n const raw = await Promise.race([\n response.body(),\n new Promise<never>((_, reject) => {\n timeout = setTimeout(() => reject(new Error(\"timeout\")), 5000);\n }),\n ]);\n if (raw.byteLength > 512 * 1024) throw new Error(\"size\");\n const parsed = Envelope.parse(JSON.parse(raw.toString()));\n if (\n parsed.publicKey !== installation.publicKey ||\n parsed.revision !== installation.currentPublishedRevision\n )\n throw new Error(\"revision\");\n envelope = parsed;\n } catch {\n issues.push({\n code: \"configuration_mismatch\",\n scenario: responseScenario,\n detail:\n \"Configuration is unavailable, invalid, or differs from the published revision.\",\n });\n } finally {\n clearTimeout(timeout);\n }\n })();\n pending.add(reading);\n void reading.finally(() => pending.delete(reading));\n });\n scenario = gpc ? \"gpc-first-visit\" : \"first-visit\";\n try {\n await page.goto(input.url, { waitUntil: \"domcontentloaded\" });\n if (new URL(page.url()).origin !== new URL(input.url).origin)\n throw new Error(\"The website redirected to another origin.\");\n await waitForRuntime(page);\n await Promise.all([...pending]);\n const capture = async () => {\n // Fixed observation window: do not equate network-idle with complete tracking inventory.\n await page.waitForTimeout(1500);\n if (new URL(page.url()).origin !== new URL(input.url).origin)\n throw new Error(\"The website navigated to another origin.\");\n await waitForRuntime(page);\n const state = await readState(page);\n if (\n state.preview ||\n state.resolved?.publicKey !== installation.publicKey ||\n state.resolved?.revision !== installation.currentPublishedRevision\n )\n issues.push({\n code: \"runtime_mismatch\",\n scenario,\n detail:\n \"The loaded runtime is a preview or uses another publication.\",\n });\n if (Number(state.runtimeVersion.split(\".\")[0]) < 11)\n issues.push({\n code: \"runtime_outdated\",\n scenario,\n detail: state.runtimeVersion,\n });\n observations.push({\n scenario,\n state,\n cookies: [\n ...new Set(\n (await context.cookies()).map((cookie) => cookie.name),\n ),\n ].sort(),\n localStorage: await page.evaluate(() =>\n Object.keys(localStorage).sort(),\n ),\n });\n };\n await capture();\n if (gpc) {\n const state = observations.at(-1)!.state;\n if (\n !state.consent.globalPrivacyControl ||\n !state.consent.privacyChoices.saleOrShareOptOut ||\n !state.consent.privacyChoices.targetedAdvertisingOptOut\n )\n issues.push({\n code: \"gpc_not_applied\",\n scenario,\n detail: \"GPC must be visible and both privacy opt-outs applied.\",\n });\n } else {\n for (const action of [\n \"reject\",\n \"accept\",\n \"granular\",\n \"withdraw\",\n ] as const) {\n scenario = action;\n try {\n await page.evaluate(async (choice) => {\n const api = (\n window as unknown as {\n SiteOSCookie: {\n rejectAll(): Promise<void>;\n acceptAll(): Promise<void>;\n updateConsent(keys: string[]): Promise<void>;\n getConsent(): { categories: string[] };\n };\n }\n ).SiteOSCookie;\n if (choice === \"accept\") await api.acceptAll();\n else if (choice === \"granular\")\n await api.updateConsent(\n api\n .getConsent()\n .categories.filter((key) => key !== \"necessary\")\n .slice(0, 1),\n );\n else await api.rejectAll();\n }, action);\n } catch (error) {\n if (\n !(error instanceof Error) ||\n !/Execution context was destroyed/u.test(error.message)\n )\n throw error;\n }\n await capture();\n const state = observations.at(-1)!.state;\n if (\n (action === \"reject\" || action === \"withdraw\") &&\n state.consent.categories.some((key) => key !== \"necessary\")\n )\n issues.push({\n code: \"refusal_not_applied\",\n scenario,\n detail: \"Optional categories remain granted.\",\n });\n }\n scenario = \"returning-after-refusal\";\n await page.reload({ waitUntil: \"domcontentloaded\" });\n await capture();\n if (\n observations\n .at(-1)!\n .state.consent.categories.some((key) => key !== \"necessary\")\n )\n issues.push({\n code: \"refusal_not_persisted\",\n scenario,\n detail: \"Refusal was not preserved across reload.\",\n });\n }\n } catch {\n issues.push({\n code: \"scenario_incomplete\",\n scenario,\n detail:\n \"The page or Cookie runtime did not complete this scenario within the time limit.\",\n });\n } finally {\n await context.close();\n await Promise.all([...pending]);\n }\n }\n } finally {\n await browser.close();\n }\n const assessment = envelope\n ? assessCookieObservations({\n envelope,\n observations,\n requests,\n firstPartyOrigin: new URL(input.url).origin,\n deliveryOrigins: Object.values(installation.delivery)\n .filter((url): url is string => typeof url === \"string\")\n .map((url) => new URL(url).origin),\n })\n : { issues: [], unknownOrigins: [], unknownStorage: [] };\n issues.push(...assessment.issues);\n if (!envelope)\n issues.push({\n code: \"configuration_not_observed\",\n scenario: \"all\",\n detail: \"No matching public configuration response was observed.\",\n });\n if (overflow)\n issues.push({\n code: \"request_limit\",\n scenario: \"all\",\n detail: \"The request limit was reached; this run is incomplete.\",\n });\n const config = envelope as z.infer<typeof Envelope> | null;\n const status = issues.length\n ? \"failed\"\n : assessment.unknownOrigins.length ||\n assessment.unknownStorage.length ||\n config?.config.integrations.googleConsentMode === \"advanced\"\n ? \"needs-review\"\n : \"passed\";\n return {\n schemaVersion: 1,\n status,\n startedAt,\n completedAt: new Date().toISOString(),\n expiresAt: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(),\n target: {\n origin: new URL(input.url).origin,\n path: new URL(input.url).pathname,\n },\n browser: input.browserName,\n publicKey: installation.publicKey,\n revision: installation.currentPublishedRevision,\n region: config?.trustedSignals?.region ?? null,\n issues: [\n ...new Map(\n issues.map((issue) => [JSON.stringify(issue), issue]),\n ).values(),\n ],\n unknownOrigins: assessment.unknownOrigins,\n unknownStorage: assessment.unknownStorage,\n observations,\n requestCounts: [\n ...new Set(requests.map((item) => `${item.scenario} ${item.origin}`)),\n ].map((key) => ({\n scenario: key.split(\" \")[0],\n origin: key.split(\" \")[1],\n count: requests.filter(\n (item) => `${item.scenario} ${item.origin}` === key,\n ).length,\n })),\n limits: [\n \"One route, fresh local browser, 1.5-second observation per scenario, at most 2000 requests.\",\n \"Consent actions use the public runtime API. Visual, keyboard and GTM Tag Assistant acceptance remain separate.\",\n \"Unknown origins/storage need classification. First-party or server-side tracking and delayed/interaction-only resources require a source audit.\",\n \"Geography is this browser's actual Edge location. Use regions resolve for simulations; do not spoof production geography.\",\n \"No cookie values, request query strings, bodies, credentials or visitor identifiers are included. A pass covers only the observed scope, not legal compliance.\",\n ],\n };\n}\n","import path from \"node:path\";\nimport { readLocalCommonProject } from \"./projects/project-context.js\";\nimport type { ProjectBindingStore } from \"./core/ports/project-binding-store.js\";\n\nimport {\n findRepositoryRoot,\n RepositoryRootError,\n} from \"./core/adapters/node-repository-root.js\";\nimport {\n FORMS_PROJECT_REFERENCE_RELATIVE_PATH,\n inspectFormsProjectReference,\n} from \"./forms/project-reference.js\";\nimport { CONFIG_FILE, loadChecksConfigSnapshot } from \"./pulse/config.js\";\nimport {\n inspectSearchProjectReference,\n SEARCH_PROJECT_REFERENCE_RELATIVE_PATH,\n} from \"./search/project-reference.js\";\nimport { resolveSiteOSConfigHome } from \"./siteos-config.js\";\n\ntype ProductProjectDiagnostic =\n | { path: string; slug: string; status: \"configured\"; version: number }\n | { error?: string; path: string; status: \"invalid\" | \"missing\" };\n\nexport type HealthCheckResult = {\n checks: {\n configHome: { path: string; status: \"ok\" };\n project:\n | { status: \"selected\"; id: string; slug: string }\n | { status: \"missing\" | \"invalid\" };\n productProjects: {\n forms: ProductProjectDiagnostic;\n pulse: ProductProjectDiagnostic;\n search: ProductProjectDiagnostic;\n };\n repository: { rootDir?: string; status: \"missing\" | \"ok\" };\n };\n package: { binary: \"siteos\"; name: string; version: string };\n status: \"needs-setup\" | \"ok\";\n message: string;\n};\n\ntype HealthCheckOptions = {\n projectBindingStore?: ProjectBindingStore;\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n homeDir?: string;\n packageMetadata?: { name: string; version: string };\n};\n\nexport async function createHealthCheckResult(\n options: HealthCheckOptions = {},\n): Promise<HealthCheckResult> {\n const packageMetadata = options.packageMetadata ?? {\n name: \"@siteoshq/cli\",\n version: \"0.0.0-development\",\n };\n const cwd = options.cwd ?? process.cwd();\n const configHome = resolveSiteOSConfigHome({\n env: options.env ?? process.env,\n homeDir: options.homeDir,\n });\n const repositoryRoot = await optionalRepositoryRoot(cwd);\n const productProjects = repositoryRoot\n ? await inspectProductProjects(repositoryRoot)\n : missingProductProjects(cwd);\n let project: HealthCheckResult[\"checks\"][\"project\"] = { status: \"missing\" };\n if (repositoryRoot) {\n try {\n const common = await readLocalCommonProject({\n ...options,\n cwd: repositoryRoot,\n });\n if (common)\n project = {\n status: \"selected\",\n id: common.binding.project.id,\n slug: common.binding.project.slug,\n };\n } catch {\n project = { status: \"invalid\" };\n }\n }\n const configured =\n project.status === \"selected\" ||\n Object.values(productProjects).some(\n (project) => project.status === \"configured\",\n );\n\n return {\n checks: {\n configHome: { path: configHome, status: \"ok\" },\n productProjects,\n project,\n repository: repositoryRoot\n ? { rootDir: repositoryRoot, status: \"ok\" }\n : { status: \"missing\" },\n },\n package: {\n binary: \"siteos\",\n name: packageMetadata.name,\n version: packageMetadata.version,\n },\n status: repositoryRoot && configured ? \"ok\" : \"needs-setup\",\n message: \"SiteOS CLI local health check completed.\",\n };\n}\n\nasync function optionalRepositoryRoot(cwd: string): Promise<string | null> {\n try {\n return await findRepositoryRoot(cwd);\n } catch (error) {\n if (\n error instanceof RepositoryRootError &&\n error.code === \"REPOSITORY_ROOT_REQUIRED\"\n ) {\n return null;\n }\n throw error;\n }\n}\n\nasync function inspectProductProjects(repositoryRoot: string) {\n const [forms, pulse, search] = await Promise.all([\n inspectReference(\n \"forms\",\n path.join(repositoryRoot, FORMS_PROJECT_REFERENCE_RELATIVE_PATH),\n () => inspectFormsProjectReference(repositoryRoot),\n ),\n inspectPulse(repositoryRoot),\n inspectReference(\n \"search\",\n path.join(repositoryRoot, SEARCH_PROJECT_REFERENCE_RELATIVE_PATH),\n () => inspectSearchProjectReference(repositoryRoot),\n ),\n ]);\n return { forms, pulse, search };\n}\n\nasync function inspectReference(\n service: \"forms\" | \"search\",\n referencePath: string,\n inspect: () => Promise<\n | { reference: { project: { slug: string }; version: 1 }; status: \"loaded\" }\n | { status: \"missing\" }\n >,\n): Promise<ProductProjectDiagnostic> {\n try {\n const state = await inspect();\n return state.status === \"loaded\"\n ? {\n path: referencePath,\n slug: state.reference.project.slug,\n status: \"configured\",\n version: state.reference.version,\n }\n : { path: referencePath, status: \"missing\" };\n } catch (error) {\n return {\n error:\n error instanceof Error && \"code\" in error\n ? String(error.code)\n : `${service.toUpperCase()}_PROJECT_REFERENCE_INVALID`,\n path: referencePath,\n status: \"invalid\",\n };\n }\n}\n\nasync function inspectPulse(\n repositoryRoot: string,\n): Promise<ProductProjectDiagnostic> {\n const configPath = path.join(repositoryRoot, CONFIG_FILE);\n try {\n const snapshot = await loadChecksConfigSnapshot(repositoryRoot);\n return {\n path: configPath,\n slug: snapshot.config.project.slug,\n status: \"configured\",\n version: snapshot.fileConfig.version,\n };\n } catch (error) {\n if (\n error instanceof Error &&\n \"code\" in error &&\n error.code === \"CONFIG_NOT_FOUND\"\n ) {\n return { path: configPath, status: \"missing\" };\n }\n return {\n error:\n error instanceof Error && \"code\" in error\n ? String(error.code)\n : \"CONFIG_INVALID\",\n path: configPath,\n status: \"invalid\",\n };\n }\n}\n\nfunction missingProductProjects(cwd: string) {\n const root = path.resolve(cwd);\n return {\n forms: {\n path: path.join(root, FORMS_PROJECT_REFERENCE_RELATIVE_PATH),\n status: \"missing\" as const,\n },\n pulse: { path: path.join(root, CONFIG_FILE), status: \"missing\" as const },\n search: {\n path: path.join(root, SEARCH_PROJECT_REFERENCE_RELATIVE_PATH),\n status: \"missing\" as const,\n },\n };\n}\n","import path from \"node:path\";\nimport { createSiteOSServiceGrantProvider } from \"../auth/adapters/siteos-service-grant-provider.js\";\nimport type { ServiceGrantProvider } from \"../auth/application/service-grant-provider.js\";\nimport { NodeProjectBindingStore } from \"../core/adapters/node-project-binding-store.js\";\nimport {\n findRepositoryRoot,\n RepositoryRootError,\n} from \"../core/adapters/node-repository-root.js\";\nimport type { ProjectBindingStore } from \"../core/ports/project-binding-store.js\";\nimport {\n SiteOSAuthApiError,\n type SiteOSAuthFetchLike,\n} from \"../siteos-auth-api.js\";\nimport { resolveSiteOSConfigHome } from \"../siteos-config.js\";\nimport { createProjectApi, type ProjectService } from \"./project-api.js\";\n\nexport type ProjectCommandOptions = {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n homeDir?: string;\n fetchImpl?: SiteOSAuthFetchLike;\n projectBindingStore?: ProjectBindingStore;\n serviceGrantProvider?: ServiceGrantProvider;\n};\nexport function commonProjectRuntime(options: ProjectCommandOptions) {\n const store =\n options.projectBindingStore ??\n new NodeProjectBindingStore(\n path.join(resolveSiteOSConfigHome(options), \"project-bindings.json\"),\n );\n const grants =\n options.serviceGrantProvider ?? createSiteOSServiceGrantProvider(options);\n return { store, grants, api: createProjectApi({ ...options, grants }) };\n}\nexport async function readLocalCommonProject(options: ProjectCommandOptions) {\n const runtime = commonProjectRuntime(options);\n const rootDir = await findRepositoryRoot(options.cwd ?? process.cwd());\n const locator = {\n apiOrigin: runtime.api.origin,\n repositoryRoot: rootDir,\n service: \"project\" as const,\n };\n const binding = await runtime.store.read(locator);\n if (!binding || binding.service !== \"project\") return null;\n return { ...runtime, rootDir, binding, locator };\n}\nexport async function readCommonProject(\n options: ProjectCommandOptions,\n environmentSlug?: string,\n) {\n const local = await readLocalCommonProject(options);\n if (!local) return null;\n const { api, binding } = local;\n const selectedSlug =\n environmentSlug ?? binding.environmentSlug ?? \"production\";\n const overview = await api.get(binding.project.id, selectedSlug);\n if (overview.project.organizationId !== binding.organizationId)\n throw new SiteOSAuthApiError({\n code: \"PROJECT_ORGANIZATION_MISMATCH\",\n message:\n \"Select this repository’s Project in the active organization with `siteos project use`.\",\n });\n const environment = overview.project.environments.find(\n (item) => item.slug === selectedSlug,\n );\n if (!environment)\n throw new SiteOSAuthApiError({\n code: \"PROJECT_ENVIRONMENT_NOT_FOUND\",\n message:\n \"Select an available environment with `siteos project environment use <slug>`.\",\n });\n return { ...local, overview, environment };\n}\nexport async function commonServiceContext(\n options: ProjectCommandOptions,\n service: ProjectService,\n environmentSlug?: string,\n) {\n const context = await readCommonProject(options, environmentSlug);\n if (!context) return null;\n const attachment = context.overview.services.find(\n (item) => item.service === service,\n )?.attachment;\n if (!attachment)\n throw new SiteOSAuthApiError({\n code: \"PROJECT_SERVICE_NOT_CONFIGURED\",\n message: `Set up ${service} for this Project with \\`siteos project connect ${service}\\`.`,\n });\n const binding = attachment.environments.find(\n (item) => item.environmentId === context.environment.id,\n );\n if ([\"pulse\", \"cookie\", \"seo\", \"analytics\"].includes(service) && !binding)\n throw new SiteOSAuthApiError({\n code: \"PROJECT_ENVIRONMENT_NOT_CONFIGURED\",\n message: `Set up ${service} in ${context.environment.name} with \\`siteos project connect ${service}\\`.`,\n });\n return {\n ...context,\n resourceId: [\"pulse\", \"cookie\", \"seo\", \"analytics\"].includes(service)\n ? binding!.resourceId\n : attachment.resourceId,\n environmentBinding: binding,\n };\n}\n\nexport async function commonEnvironmentArguments(\n options: ProjectCommandOptions,\n service: \"forms\" | \"search\",\n args: string[],\n) {\n if (service === \"forms\" && args[0] === \"definition\" && args[1] === \"check\")\n return args;\n const local = await readLocalCommonProject(options).catch((cause) => {\n if (\n cause instanceof RepositoryRootError &&\n cause.code === \"REPOSITORY_ROOT_REQUIRED\"\n )\n return null;\n throw cause;\n });\n if (!local) return args;\n if (args[0] === \"environment\" && args[1] !== \"list\")\n throw new Error(\n \"Manage shared environments with `siteos project environment` or Project settings.\",\n );\n if ([\"project\", \"environment\", \"submit\"].includes(args[0] ?? \"\")) return args;\n const normalized = args.flatMap((arg) =>\n arg.startsWith(\"--environment=\")\n ? [\"--environment\", arg.slice(\"--environment=\".length)]\n : [arg],\n );\n if (normalized.filter((arg) => arg === \"--environment\").length > 1)\n return args;\n const index = normalized.indexOf(\"--environment\");\n const slug = index >= 0 ? normalized[index + 1] : undefined;\n if (index >= 0 && (!slug || slug.startsWith(\"--\"))) return args;\n const context = await commonServiceContext(options, service, slug);\n const binding = context?.environmentBinding;\n if (!context || !binding?.slug)\n throw new Error(\n `Connect the ${service} environment in Project settings before running this command.`,\n );\n const result = [...normalized];\n if (index >= 0) result[index + 1] = binding.slug;\n else result.push(\"--environment\", binding.slug);\n return result;\n}\n","import os from \"node:os\";\n\nimport {\n createSiteOSAuthApiClient,\n isDefinitiveInvalidSession,\n resolveSiteOSAuthBaseUrl,\n siteOSServiceGrantRequestSchema,\n SiteOSAuthApiError,\n type SiteOSAuthFetchLike,\n type SiteOSServiceGrantResponse,\n} from \"./siteos-auth-api.js\";\nimport {\n loadSiteOSAuthState,\n writeSiteOSAuthState,\n} from \"./siteos-auth-state.js\";\nimport { resolveSiteOSConfigHome } from \"./siteos-config.js\";\n\nexport async function acquireSiteOSServiceGrant(options: {\n audience: unknown;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: SiteOSAuthFetchLike;\n homeDir?: string;\n scopes: unknown;\n}): Promise<SiteOSServiceGrantResponse> {\n const configHome = resolveSiteOSConfigHome({\n env: options.env,\n homeDir: options.homeDir ?? os.homedir(),\n });\n const loaded = await loadSiteOSAuthState({ configHome });\n\n if (loaded.status === \"missing\") {\n throw new SiteOSAuthApiError({\n code: \"AUTH_SESSION_REQUIRED\",\n message: \"Authenticate the SiteOS CLI first.\",\n });\n }\n const session = loaded.state.session;\n if (!session) {\n throw new SiteOSAuthApiError({\n code: \"AUTH_SESSION_REQUIRED\",\n message: \"Authenticate the SiteOS CLI first.\",\n });\n }\n if (session.metadata.status !== \"authenticated\") {\n await writeSiteOSAuthState({\n configHome,\n state: { ...loaded.state, session: undefined },\n });\n throw new SiteOSAuthApiError({\n code: \"SESSION_INVALID\",\n message: \"The CLI session is not valid.\",\n status: 401,\n });\n }\n if (!session.selectedOrganization) {\n throw new SiteOSAuthApiError({\n code: \"AUTH_ORGANIZATION_REQUIRED\",\n message: \"Select a SiteOS Organization first.\",\n });\n }\n if (!options.fetchImpl) {\n throw new SiteOSAuthApiError({\n code: \"AUTH_UNAVAILABLE\",\n message: \"SiteOS Auth access is unavailable in this runtime.\",\n });\n }\n\n const grantRequest = siteOSServiceGrantRequestSchema.safeParse({\n organizationId: session.selectedOrganization.id,\n audience: options.audience,\n scopes: options.scopes,\n });\n if (!grantRequest.success) {\n throw new SiteOSAuthApiError({\n code: \"GRANT_INPUT_INVALID\",\n message: \"The service grant request is invalid.\",\n });\n }\n\n try {\n return await createSiteOSAuthApiClient({\n apiBaseUrl: resolveSiteOSAuthBaseUrl(options.env),\n fetchImpl: options.fetchImpl,\n }).serviceGrant({\n ...grantRequest.data,\n sessionCredential: session.credential,\n });\n } catch (error) {\n if (isDefinitiveInvalidSession(error)) {\n await writeSiteOSAuthState({\n configHome,\n state: { ...loaded.state, session: undefined },\n });\n }\n throw error;\n }\n}\n","import { z } from \"zod\";\n\nexport const DEFAULT_SITEOS_AUTH_BASE_URL = \"https://app.siteos.sh\";\nexport const SITEOS_AUTH_BASE_URL_ENV = \"SITEOS_AUTH_BASE_URL\";\n\nexport type SiteOSAuthFetchLike = (\n input: string,\n init?: {\n body?: string;\n headers?: Record<string, string>;\n method?: string;\n signal?: AbortSignal;\n },\n) => Promise<{\n json: () => Promise<unknown>;\n ok: boolean;\n status: number;\n}>;\n\nexport const siteOSCliSessionStatusSchema = z\n .object({\n contractVersion: z.literal(1),\n status: z.enum([\"authenticated\", \"expired\", \"revoked\"]),\n user: z\n .object({\n id: z.string().trim().min(1).max(255),\n email: z.string().trim().email(),\n })\n .strict(),\n organization: z\n .object({\n id: z.string().trim().min(1).max(255),\n displayName: z.string().trim().min(1).max(255),\n })\n .strict()\n .nullable(),\n expiresAt: z.number().int().positive(),\n })\n .strict();\n\nexport const siteOSCliOrganizationSchema = z\n .object({\n id: z.string().trim().min(1).max(255),\n displayName: z.string().trim().min(1).max(255),\n membershipRole: z.enum([\"owner\", \"admin\", \"member\"]),\n })\n .strict();\n\nconst organizationCreatedResponseSchema = z\n .object({\n contractVersion: z.literal(1),\n status: z.literal(\"created\"),\n organization: siteOSCliOrganizationSchema\n .extend({\n displayName: z\n .string()\n .transform((value) => value.trim())\n .refine((value) => {\n const visibleLength = Array.from(value).length;\n return visibleLength >= 2 && visibleLength <= 80;\n }),\n membershipRole: z.literal(\"owner\"),\n })\n .strict(),\n })\n .strict();\n\nexport const siteOSServiceAudienceSchema = z.enum([\n \"siteos-projects\",\n \"siteos-trace\",\n \"siteos-integrations\",\n \"siteos-cookie\",\n \"siteos-forms\",\n \"siteos-pulse\",\n \"siteos-search\",\n \"siteos-seo\",\n \"siteos-analytics\",\n]);\n\nexport const siteOSServiceScopeSchema = z\n .string()\n .min(1)\n .max(160)\n .regex(/^[a-z][a-z0-9-]*(?::[a-z][a-z0-9-]*){2,}$/);\n\nconst scopeNamespaceByAudience = {\n \"siteos-projects\": \"projects\",\n \"siteos-trace\": \"trace\",\n \"siteos-integrations\": \"integrations\",\n \"siteos-cookie\": \"cookie\",\n \"siteos-forms\": \"forms\",\n \"siteos-pulse\": \"pulse\",\n \"siteos-search\": \"search\",\n \"siteos-seo\": \"seo\",\n \"siteos-analytics\": \"analytics\",\n} as const;\n\nfunction matchingServiceScopes<\n T extends {\n audience: z.infer<typeof siteOSServiceAudienceSchema>;\n scopes: string[];\n },\n>(value: T, context: z.RefinementCtx): void {\n const prefix = `${scopeNamespaceByAudience[value.audience]}:`;\n if (new Set(value.scopes).size !== value.scopes.length) {\n context.addIssue({\n code: \"custom\",\n message: \"Service scopes must be unique.\",\n path: [\"scopes\"],\n });\n }\n for (const [index, scope] of value.scopes.entries()) {\n if (!scope.startsWith(prefix)) {\n context.addIssue({\n code: \"custom\",\n message: \"Service scope namespace must match the audience.\",\n path: [\"scopes\", index],\n });\n }\n }\n}\n\nexport const siteOSServiceGrantRequestSchema = z\n .object({\n organizationId: z.string().trim().min(1).max(255),\n audience: siteOSServiceAudienceSchema,\n scopes: z.array(siteOSServiceScopeSchema).min(1).max(64),\n })\n .strict()\n .superRefine(matchingServiceScopes);\n\nconst serviceGrantResponseSchema = z\n .object({\n contractVersion: z.literal(1),\n accessToken: z.string().min(16).max(16_384),\n tokenType: z.literal(\"Bearer\"),\n grant: z\n .object({\n id: z.string().trim().min(1).max(255),\n organizationId: z.string().trim().min(1).max(255),\n audience: siteOSServiceAudienceSchema,\n scopes: z.array(siteOSServiceScopeSchema).min(1).max(64),\n expiresAt: z.number().int().positive(),\n })\n .strict()\n .superRefine(matchingServiceScopes),\n })\n .strict();\n\nconst projectIdentityAssertionResponseSchema = z\n .object({\n contractVersion: z.literal(1),\n accessToken: z.string().min(1).max(16_384),\n tokenType: z.literal(\"Bearer\"),\n expiresAt: z.number().int().positive(),\n })\n .strict();\n\nconst organizationsResponseSchema = z\n .object({\n contractVersion: z.literal(1),\n organizations: z.array(siteOSCliOrganizationSchema),\n })\n .strict();\n\nconst startResponseSchema = z\n .object({\n requestId: z.string().trim().min(1).max(255),\n status: z.literal(\"verification_required\"),\n channel: z.literal(\"email\"),\n expiresInSeconds: z.number().int().positive(),\n })\n .strict();\n\nconst completeResponseSchema = z\n .object({\n session: siteOSCliSessionStatusSchema,\n sessionCredential: z.string().trim().min(16).max(4096),\n })\n .strict();\n\nconst errorResponseSchema = z\n .object({\n error: z\n .object({\n code: z.string().trim().min(1).max(80),\n message: z.string().trim().min(1).max(240),\n })\n .strict(),\n })\n .strict();\n\nexport type SiteOSCliSessionStatus = z.infer<\n typeof siteOSCliSessionStatusSchema\n>;\nexport type SiteOSAuthStartResponse = z.infer<typeof startResponseSchema>;\nexport type SiteOSAuthCompleteResponse = z.infer<typeof completeResponseSchema>;\nexport type SiteOSCliOrganization = z.infer<typeof siteOSCliOrganizationSchema>;\nexport type SiteOSAuthOrganizationsResponse = z.infer<\n typeof organizationsResponseSchema\n>;\nexport type SiteOSAuthOrganizationCreatedResponse = z.infer<\n typeof organizationCreatedResponseSchema\n>;\nexport type SiteOSServiceGrantRequest = z.infer<\n typeof siteOSServiceGrantRequestSchema\n>;\nexport type SiteOSServiceGrantResponse = z.infer<\n typeof serviceGrantResponseSchema\n>;\nexport type SiteOSProjectIdentityAssertionResponse = z.infer<\n typeof projectIdentityAssertionResponseSchema\n>;\n\nconst safeMessages: Record<string, string> = {\n BAD_REQUEST: \"The Auth request is invalid.\",\n GRANT_DENIED: \"The service grant request was denied.\",\n INTERNAL_SERVER_ERROR: \"The Auth service could not complete the request.\",\n INVALID_INPUT: \"The authorization input is invalid.\",\n ASSERTION_DENIED: \"The Project identity assertion request was denied.\",\n RATE_LIMITED: \"Too many Auth requests. Try again shortly.\",\n SESSION_INVALID: \"The CLI session is not valid.\",\n UNAUTHORIZED: \"The CLI session is not valid.\",\n VERIFICATION_DENIED: \"The authorization request could not be verified.\",\n};\n\nexport class SiteOSAuthApiError extends Error {\n readonly code: string;\n readonly status?: number;\n\n constructor(options: { code: string; message: string; status?: number }) {\n super(options.message);\n this.name = \"SiteOSAuthApiError\";\n this.code = options.code;\n this.status = options.status;\n }\n}\n\nexport function resolveSiteOSAuthBaseUrl(\n env: NodeJS.ProcessEnv = process.env,\n): string {\n const rawUrl =\n env[SITEOS_AUTH_BASE_URL_ENV]?.trim() || DEFAULT_SITEOS_AUTH_BASE_URL;\n\n try {\n const url = new URL(rawUrl);\n if (\n ![\"http:\", \"https:\"].includes(url.protocol) ||\n url.username ||\n url.password\n ) {\n throw new Error(\"unsupported Auth URL\");\n }\n return url.origin;\n } catch {\n throw new SiteOSAuthApiError({\n code: \"INVALID_AUTH_BASE_URL\",\n message: \"The SiteOS Auth URL is invalid.\",\n });\n }\n}\n\nexport function isDefinitiveInvalidSession(\n error: unknown,\n): error is SiteOSAuthApiError {\n return (\n error instanceof SiteOSAuthApiError &&\n error.status === 401 &&\n [\"SESSION_INVALID\", \"UNAUTHORIZED\"].includes(error.code)\n );\n}\n\nexport function createSiteOSAuthApiClient(options: {\n apiBaseUrl: string;\n fetchImpl: SiteOSAuthFetchLike;\n}) {\n return {\n start(input: {\n email: string;\n installationIdHash: string;\n pkceChallenge: string;\n }): Promise<SiteOSAuthStartResponse> {\n return requestJson({\n ...options,\n body: input,\n method: \"POST\",\n path: \"/api/cli/v1/authorization-requests\",\n responseSchema: startResponseSchema,\n });\n },\n complete(input: {\n pkceVerifier: string;\n requestId: string;\n token: string;\n }): Promise<SiteOSAuthCompleteResponse> {\n return requestJson({\n ...options,\n body: {\n pkceVerifier: input.pkceVerifier,\n token: input.token,\n },\n method: \"POST\",\n path: `/api/cli/v1/authorization-requests/${encodeURIComponent(input.requestId)}/complete`,\n responseSchema: completeResponseSchema,\n });\n },\n status(input: {\n sessionCredential: string;\n }): Promise<SiteOSCliSessionStatus> {\n return requestJson({\n ...options,\n method: \"GET\",\n path: \"/api/cli/v1/session\",\n responseSchema: siteOSCliSessionStatusSchema,\n sessionCredential: input.sessionCredential,\n });\n },\n organizations(input: {\n sessionCredential: string;\n }): Promise<SiteOSAuthOrganizationsResponse> {\n return requestJson({\n ...options,\n method: \"GET\",\n path: \"/api/cli/v1/organizations\",\n responseSchema: organizationsResponseSchema,\n sessionCredential: input.sessionCredential,\n });\n },\n createOrganization(input: {\n displayName: string;\n sessionCredential: string;\n }): Promise<SiteOSAuthOrganizationCreatedResponse> {\n return requestJson({\n ...options,\n body: { displayName: input.displayName },\n method: \"POST\",\n path: \"/api/cli/v1/organizations\",\n responseSchema: organizationCreatedResponseSchema,\n sessionCredential: input.sessionCredential,\n });\n },\n serviceGrant(\n input: SiteOSServiceGrantRequest & { sessionCredential: string },\n ): Promise<SiteOSServiceGrantResponse> {\n return requestJson({\n ...options,\n body: {\n organizationId: input.organizationId,\n audience: input.audience,\n scopes: input.scopes,\n },\n method: \"POST\",\n path: \"/api/cli/v1/service-grants\",\n responseSchema: serviceGrantResponseSchema,\n sessionCredential: input.sessionCredential,\n });\n },\n projectIdentityAssertion(input: {\n organizationId: string;\n sessionCredential: string;\n }): Promise<SiteOSProjectIdentityAssertionResponse> {\n return requestJson({\n ...options,\n body: { organizationId: input.organizationId },\n method: \"POST\",\n path: \"/api/cli/v1/project-identity-assertions\",\n responseSchema: projectIdentityAssertionResponseSchema,\n sessionCredential: input.sessionCredential,\n });\n },\n revoke(input: {\n sessionCredential: string;\n }): Promise<SiteOSCliSessionStatus> {\n return requestJson({\n ...options,\n method: \"DELETE\",\n path: \"/api/cli/v1/session\",\n responseSchema: siteOSCliSessionStatusSchema,\n sessionCredential: input.sessionCredential,\n });\n },\n };\n}\n\nasync function requestJson<T>(options: {\n apiBaseUrl: string;\n body?: unknown;\n fetchImpl: SiteOSAuthFetchLike;\n method: \"DELETE\" | \"GET\" | \"POST\";\n path: string;\n responseSchema: z.ZodType<T>;\n sessionCredential?: string;\n}): Promise<T> {\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n };\n let body: string | undefined;\n\n if (options.body !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n body = JSON.stringify(options.body);\n }\n if (options.sessionCredential) {\n headers.Authorization = `Bearer ${options.sessionCredential}`;\n }\n\n let response: Awaited<ReturnType<SiteOSAuthFetchLike>>;\n try {\n response = await options.fetchImpl(\n `${options.apiBaseUrl.replace(/\\/+$/, \"\")}${options.path}`,\n {\n body,\n headers,\n method: options.method,\n },\n );\n } catch {\n throw new SiteOSAuthApiError({\n code: \"AUTH_REQUEST_FAILED\",\n message: \"The SiteOS Auth request failed.\",\n });\n }\n\n const payload = await response.json().catch(() => undefined);\n if (!response.ok) {\n const parsedError = errorResponseSchema.safeParse(payload);\n if (parsedError.success) {\n const code = parsedError.data.error.code;\n throw new SiteOSAuthApiError({\n code,\n message: safeMessages[code] ?? \"The SiteOS Auth request failed.\",\n status: response.status,\n });\n }\n throw new SiteOSAuthApiError({\n code: \"AUTH_UNEXPECTED_RESPONSE\",\n message: \"The SiteOS Auth service returned an unexpected response.\",\n status: response.status,\n });\n }\n\n const parsedResponse = options.responseSchema.safeParse(payload);\n if (!parsedResponse.success) {\n throw new SiteOSAuthApiError({\n code: \"AUTH_INVALID_RESPONSE\",\n message: \"The SiteOS Auth service returned an invalid response.\",\n status: response.status,\n });\n }\n return parsedResponse.data;\n}\n","import {\n chmod,\n lstat,\n mkdir,\n readFile,\n rename,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\n\nimport { z } from \"zod\";\n\nimport {\n siteOSCliSessionStatusSchema,\n type SiteOSCliSessionStatus,\n} from \"./siteos-auth-api.js\";\n\nexport const SITEOS_AUTH_STATE_FILE_NAME = \"auth.json\";\nexport const SITEOS_AUTH_STATE_VERSION = 2 as const;\n\nconst selectedOrganizationSchema = z\n .object({\n id: z.string().trim().min(1).max(255),\n })\n .strict();\n\nconst legacySiteOSAuthStateSchema = z\n .object({\n version: z.literal(1),\n installationId: z.string().trim().min(16).max(255),\n pending: z\n .object({\n requestId: z.string().trim().min(1).max(255),\n pkceVerifier: z.string().regex(/^[A-Za-z0-9_-]{43,128}$/),\n expiresAt: z.number().int().positive(),\n })\n .strict()\n .optional(),\n session: z\n .object({\n credential: z.string().trim().min(16).max(4096),\n metadata: z\n .object({\n contractVersion: z.literal(1),\n status: z.enum([\"authenticated\", \"expired\", \"revoked\"]),\n user: z\n .object({\n id: z.string().trim().min(1).max(255),\n email: z.string().trim().email(),\n })\n .strict(),\n organization: z\n .object({\n id: z.string().trim().min(1).max(255),\n slug: z\n .string()\n .min(1)\n .max(80)\n .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),\n })\n .strict()\n .nullable(),\n expiresAt: z.number().int().positive(),\n })\n .strict(),\n selectedOrganization: z\n .object({\n id: z.string().trim().min(1).max(255),\n slug: z\n .string()\n .min(1)\n .max(80)\n .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),\n })\n .strict()\n .optional(),\n })\n .strict()\n .optional(),\n })\n .strict();\n\nconst siteOSAuthStateSchema = z\n .object({\n version: z.literal(SITEOS_AUTH_STATE_VERSION),\n installationId: z.string().trim().min(16).max(255),\n pending: z\n .object({\n requestId: z.string().trim().min(1).max(255),\n pkceVerifier: z.string().regex(/^[A-Za-z0-9_-]{43,128}$/),\n expiresAt: z.number().int().positive(),\n })\n .strict()\n .optional(),\n session: z\n .object({\n credential: z.string().trim().min(16).max(4096),\n metadata: siteOSCliSessionStatusSchema,\n selectedOrganization: selectedOrganizationSchema.optional(),\n })\n .strict()\n .optional(),\n })\n .strict();\n\nexport type SiteOSAuthState = {\n installationId: string;\n pending?: {\n requestId: string;\n pkceVerifier: string;\n expiresAt: number;\n };\n session?: {\n credential: string;\n metadata: SiteOSCliSessionStatus;\n selectedOrganization?: SiteOSSelectedOrganization;\n };\n version: typeof SITEOS_AUTH_STATE_VERSION;\n};\n\nexport type SiteOSSelectedOrganization = z.infer<\n typeof selectedOrganizationSchema\n>;\n\nexport class SiteOSAuthStateError extends Error {\n readonly code: \"AUTH_STATE_INVALID\" | \"AUTH_STATE_UNAVAILABLE\";\n\n constructor(\n code: \"AUTH_STATE_INVALID\" | \"AUTH_STATE_UNAVAILABLE\",\n message: string,\n ) {\n super(message);\n this.name = \"SiteOSAuthStateError\";\n this.code = code;\n }\n}\n\nexport async function loadSiteOSAuthState(options: {\n configHome: string;\n}): Promise<\n { state: SiteOSAuthState; status: \"loaded\" } | { status: \"missing\" }\n> {\n const statePath = path.join(options.configHome, SITEOS_AUTH_STATE_FILE_NAME);\n const stats = await lstat(statePath).catch((error: unknown) => {\n if (isNodeErrorCode(error, \"ENOENT\")) return undefined;\n throw new SiteOSAuthStateError(\n \"AUTH_STATE_UNAVAILABLE\",\n \"SiteOS Auth state could not be read.\",\n );\n });\n if (!stats) return { status: \"missing\" };\n if (!stats.isFile()) {\n throw new SiteOSAuthStateError(\n \"AUTH_STATE_INVALID\",\n \"SiteOS Auth state is invalid.\",\n );\n }\n\n await Promise.all([\n chmod(options.configHome, 0o700),\n chmod(statePath, 0o600),\n ]).catch(() => {\n throw new SiteOSAuthStateError(\n \"AUTH_STATE_UNAVAILABLE\",\n \"SiteOS Auth state could not be read.\",\n );\n });\n\n const rawState = await readFile(statePath, \"utf-8\").catch(() => {\n throw new SiteOSAuthStateError(\n \"AUTH_STATE_UNAVAILABLE\",\n \"SiteOS Auth state could not be read.\",\n );\n });\n let parsedJson: unknown;\n try {\n parsedJson = JSON.parse(rawState);\n } catch {\n throw new SiteOSAuthStateError(\n \"AUTH_STATE_INVALID\",\n \"SiteOS Auth state is invalid.\",\n );\n }\n const parsedState = siteOSAuthStateSchema.safeParse(parsedJson);\n if (parsedState.success) {\n return {\n state: parsedState.data,\n status: \"loaded\",\n };\n }\n\n const legacyState = legacySiteOSAuthStateSchema.safeParse(parsedJson);\n if (!legacyState.success) {\n throw new SiteOSAuthStateError(\n \"AUTH_STATE_INVALID\",\n \"SiteOS Auth state is invalid.\",\n );\n }\n\n const legacySession = legacyState.data.session;\n const selectedOrganizationId =\n legacySession?.selectedOrganization?.id ??\n legacySession?.metadata.organization?.id;\n const migratedState: SiteOSAuthState = {\n installationId: legacyState.data.installationId,\n pending: legacyState.data.pending,\n session: legacySession\n ? {\n credential: legacySession.credential,\n metadata: {\n ...legacySession.metadata,\n organization: null,\n },\n selectedOrganization: selectedOrganizationId\n ? { id: selectedOrganizationId }\n : undefined,\n }\n : undefined,\n version: SITEOS_AUTH_STATE_VERSION,\n };\n await writeSiteOSAuthState({\n configHome: options.configHome,\n state: migratedState,\n });\n return {\n state: migratedState,\n status: \"loaded\",\n };\n}\n\nexport async function writeSiteOSAuthState(options: {\n configHome: string;\n state: SiteOSAuthState;\n}): Promise<void> {\n const parsedState = siteOSAuthStateSchema.safeParse(options.state);\n if (!parsedState.success) {\n throw new SiteOSAuthStateError(\n \"AUTH_STATE_INVALID\",\n \"SiteOS Auth state is invalid.\",\n );\n }\n\n const statePath = path.join(options.configHome, SITEOS_AUTH_STATE_FILE_NAME);\n const temporaryPath = path.join(\n options.configHome,\n `.${SITEOS_AUTH_STATE_FILE_NAME}.${process.pid}.${randomUUID()}.tmp`,\n );\n\n try {\n await mkdir(options.configHome, { mode: 0o700, recursive: true });\n await chmod(options.configHome, 0o700);\n await writeFile(\n temporaryPath,\n `${JSON.stringify(parsedState.data, null, 2)}\\n`,\n {\n encoding: \"utf-8\",\n flag: \"wx\",\n mode: 0o600,\n },\n );\n await chmod(temporaryPath, 0o600);\n await rename(temporaryPath, statePath);\n await chmod(statePath, 0o600);\n } catch (error) {\n if (error instanceof SiteOSAuthStateError) throw error;\n throw new SiteOSAuthStateError(\n \"AUTH_STATE_UNAVAILABLE\",\n \"SiteOS Auth state could not be saved.\",\n );\n } finally {\n await rm(temporaryPath, { force: true }).catch(() => undefined);\n }\n}\n\nfunction isNodeErrorCode(error: unknown, code: string): boolean {\n return (\n error instanceof Error &&\n \"code\" in error &&\n (error as NodeJS.ErrnoException).code === code\n );\n}\n","import os from \"node:os\";\nimport path from \"node:path\";\n\nexport const SITEOS_HOME_ENV = \"SITEOS_HOME\";\n\nexport function resolveSiteOSConfigHome(\n options: { env?: NodeJS.ProcessEnv; homeDir?: string } = {},\n): string {\n const configuredHome = options.env?.[SITEOS_HOME_ENV]?.trim();\n return configuredHome\n ? path.resolve(configuredHome)\n : path.join(options.homeDir ?? os.homedir(), \".siteos\");\n}\n","import type { SiteOSAuthFetchLike } from \"../../siteos-auth-api.js\";\nimport { acquireSiteOSServiceGrant } from \"../../siteos-service-grant.js\";\nimport type {\n ServiceGrantProvider,\n ServiceGrantRequest,\n} from \"../application/service-grant-provider.js\";\n\nexport function createSiteOSServiceGrantProvider(options: {\n env?: NodeJS.ProcessEnv;\n fetchImpl?: SiteOSAuthFetchLike;\n homeDir?: string;\n}): ServiceGrantProvider {\n return {\n async acquire(request: ServiceGrantRequest) {\n return acquireSiteOSServiceGrant({\n ...options,\n audience: request.audience,\n scopes: request.scopes,\n });\n },\n };\n}\n","import { createHash } from \"node:crypto\";\nimport { realpath } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { z } from \"zod\";\n\nimport type {\n ProductProjectBinding,\n ProductProjectBindingLocator,\n ProjectBindingStore,\n} from \"../ports/project-binding-store.js\";\nimport { PROJECT_BINDING_SERVICES } from \"../ports/project-binding-store.js\";\nimport type {\n JsonDocumentCodec,\n JsonDocumentSnapshot,\n JsonDocumentStore,\n} from \"../ports/json-document-store.js\";\nimport {\n JsonDocumentStoreError,\n NodeJsonDocumentStore,\n} from \"./node-json-document-store.js\";\n\nconst projectBindingSchema = z\n .object({\n service: z.enum(PROJECT_BINDING_SERVICES),\n apiOrigin: z\n .string()\n .url()\n .refine((value) => new URL(value).origin === value),\n repositoryRoot: z.string().refine(path.isAbsolute),\n organizationId: z.string().trim().min(1).max(255),\n environmentSlug: z\n .string()\n .regex(/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/)\n .max(30)\n .optional(),\n project: z\n .object({\n id: z.string().trim().min(1).max(255),\n slug: z\n .string()\n .trim()\n .min(1)\n .max(255)\n .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),\n })\n .strict(),\n })\n .strict();\n\nconst projectBindingsSchema = z\n .object({\n version: z.literal(1),\n bindings: z.record(projectBindingSchema),\n })\n .strict()\n .superRefine((document, context) => {\n for (const [key, binding] of Object.entries(document.bindings)) {\n if (key !== projectBindingKey(binding)) {\n context.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Project binding key does not match its contents.\",\n path: [\"bindings\", key],\n });\n }\n }\n });\n\ntype ProjectBindingsDocument = z.infer<typeof projectBindingsSchema>;\n\nconst projectBindingsCodec: JsonDocumentCodec<ProjectBindingsDocument> = {\n decode(input) {\n return { migrated: false, value: projectBindingsSchema.parse(input) };\n },\n encode(value) {\n return projectBindingsSchema.parse(value);\n },\n};\n\nexport type ProjectBindingStoreErrorCode =\n | \"PROJECT_BINDINGS_CONFLICT\"\n | \"PROJECT_BINDINGS_INVALID\"\n | \"PROJECT_BINDINGS_UNAVAILABLE\";\n\nexport class ProjectBindingStoreError extends Error {\n readonly code: ProjectBindingStoreErrorCode;\n\n constructor(code: ProjectBindingStoreErrorCode, message: string) {\n super(message);\n this.name = \"ProjectBindingStoreError\";\n this.code = code;\n }\n}\n\nexport class NodeProjectBindingStore implements ProjectBindingStore {\n constructor(\n private readonly filePath: string,\n private readonly documents: JsonDocumentStore = new NodeJsonDocumentStore(),\n ) {}\n\n async read(\n locator: ProductProjectBindingLocator,\n ): Promise<ProductProjectBinding | null> {\n try {\n const normalized = await normalizeLocator(locator);\n const snapshot = await this.readDocument();\n if (snapshot.status === \"missing\") return null;\n return snapshot.value.bindings[projectBindingKey(normalized)] ?? null;\n } catch (error) {\n throw mapStoreError(error);\n }\n }\n\n async write(binding: ProductProjectBinding): Promise<ProductProjectBinding> {\n try {\n const normalized = projectBindingSchema.parse({\n ...binding,\n ...(await normalizeLocator(binding)),\n });\n const snapshot = await this.readDocument();\n const document =\n snapshot.status === \"loaded\" ? snapshot.value : emptyDocument();\n document.bindings[projectBindingKey(normalized)] = normalized;\n await this.documents.write({\n codec: projectBindingsCodec,\n expectedChecksum:\n snapshot.status === \"loaded\" ? snapshot.checksum : null,\n filePath: this.filePath,\n security: \"private\",\n value: document,\n });\n return normalized;\n } catch (error) {\n throw mapStoreError(error);\n }\n }\n\n async remove(locator: ProductProjectBindingLocator): Promise<boolean> {\n try {\n const normalized = await normalizeLocator(locator);\n const snapshot = await this.readDocument();\n if (snapshot.status === \"missing\") return false;\n const key = projectBindingKey(normalized);\n if (!snapshot.value.bindings[key]) return false;\n delete snapshot.value.bindings[key];\n await this.documents.write({\n codec: projectBindingsCodec,\n expectedChecksum: snapshot.checksum,\n filePath: this.filePath,\n security: \"private\",\n value: snapshot.value,\n });\n return true;\n } catch (error) {\n throw mapStoreError(error);\n }\n }\n\n private readDocument(): Promise<\n JsonDocumentSnapshot<ProjectBindingsDocument>\n > {\n return this.documents.read({\n codec: projectBindingsCodec,\n filePath: this.filePath,\n security: \"private\",\n });\n }\n}\n\nexport function projectBindingKey(\n locator: ProductProjectBindingLocator,\n): string {\n return createHash(\"sha256\")\n .update(\n `${locator.apiOrigin}\\0${locator.repositoryRoot}\\0${locator.service}`,\n )\n .digest(\"hex\");\n}\n\nasync function normalizeLocator(\n locator: ProductProjectBindingLocator,\n): Promise<ProductProjectBindingLocator> {\n return {\n apiOrigin: normalizeApiOrigin(locator.apiOrigin),\n repositoryRoot: await realpath(path.resolve(locator.repositoryRoot)),\n service: locator.service,\n };\n}\n\nfunction normalizeApiOrigin(value: string): string {\n let url: URL;\n try {\n url = new URL(value);\n } catch {\n throw new ProjectBindingStoreError(\n \"PROJECT_BINDINGS_INVALID\",\n \"The product Project binding is invalid.\",\n );\n }\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n throw new ProjectBindingStoreError(\n \"PROJECT_BINDINGS_INVALID\",\n \"The product Project binding is invalid.\",\n );\n }\n return url.origin;\n}\n\nfunction emptyDocument(): ProjectBindingsDocument {\n return { version: 1, bindings: {} };\n}\n\nfunction mapStoreError(error: unknown): ProjectBindingStoreError {\n if (error instanceof ProjectBindingStoreError) return error;\n if (error instanceof z.ZodError) {\n return new ProjectBindingStoreError(\n \"PROJECT_BINDINGS_INVALID\",\n \"Product Project bindings are invalid.\",\n );\n }\n if (error instanceof JsonDocumentStoreError) {\n if (error.code === \"JSON_DOCUMENT_CONFLICT\") {\n return new ProjectBindingStoreError(\n \"PROJECT_BINDINGS_CONFLICT\",\n \"Product Project bindings changed before they could be saved.\",\n );\n }\n if (\n error.code === \"JSON_DOCUMENT_INVALID\" ||\n error.code === \"JSON_DOCUMENT_UNSAFE\"\n ) {\n return new ProjectBindingStoreError(\n \"PROJECT_BINDINGS_INVALID\",\n \"Product Project bindings are invalid.\",\n );\n }\n }\n return new ProjectBindingStoreError(\n \"PROJECT_BINDINGS_UNAVAILABLE\",\n \"Product Project bindings could not be accessed.\",\n );\n}\n","export const PRODUCT_SERVICES = [\"pulse\", \"forms\", \"search\"] as const;\n\nexport type ProductService = (typeof PRODUCT_SERVICES)[number];\nexport const PROJECT_BINDING_SERVICES = [\n \"project\",\n ...PRODUCT_SERVICES,\n] as const;\nexport type ProjectBindingService = (typeof PROJECT_BINDING_SERVICES)[number];\n\nexport type ProductProjectBindingLocator = {\n apiOrigin: string;\n repositoryRoot: string;\n service: ProjectBindingService;\n};\n\nexport type ProductProjectBinding = ProductProjectBindingLocator & {\n environmentSlug?: string;\n organizationId: string;\n project: {\n id: string;\n slug: string;\n };\n};\n\nexport interface ProjectBindingStore {\n read(\n locator: ProductProjectBindingLocator,\n ): Promise<ProductProjectBinding | null>;\n remove(locator: ProductProjectBindingLocator): Promise<boolean>;\n write(binding: ProductProjectBinding): Promise<ProductProjectBinding>;\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport {\n chmod,\n lstat,\n mkdir,\n readFile,\n rename,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type {\n JsonDocumentSecurity,\n JsonDocumentSnapshot,\n JsonDocumentStore,\n ReadJsonDocumentInput,\n WriteJsonDocumentInput,\n} from \"../ports/json-document-store.js\";\n\nexport type JsonDocumentStoreErrorCode =\n | \"JSON_DOCUMENT_CONFLICT\"\n | \"JSON_DOCUMENT_INVALID\"\n | \"JSON_DOCUMENT_UNAVAILABLE\"\n | \"JSON_DOCUMENT_UNSAFE\";\n\nexport class JsonDocumentStoreError extends Error {\n readonly code: JsonDocumentStoreErrorCode;\n\n constructor(code: JsonDocumentStoreErrorCode, message: string) {\n super(message);\n this.name = \"JsonDocumentStoreError\";\n this.code = code;\n }\n}\n\nexport class NodeJsonDocumentStore implements JsonDocumentStore {\n async read<T>(\n input: ReadJsonDocumentInput<T>,\n ): Promise<JsonDocumentSnapshot<T>> {\n const fileStats = await safeLstat(input.filePath);\n if (!fileStats) return { status: \"missing\" };\n if (fileStats.isSymbolicLink() || !fileStats.isFile())\n throw unsafeDocument();\n\n const directory = path.dirname(input.filePath);\n await assertDirectory(directory);\n await repairPermissions(input.filePath, directory, input.security);\n\n const source = await readFile(input.filePath, \"utf8\").catch(() => {\n throw unavailableDocument();\n });\n let parsed: unknown;\n try {\n parsed = JSON.parse(source);\n } catch {\n throw invalidDocument();\n }\n\n try {\n const decoded = input.codec.decode(parsed);\n return {\n checksum: checksum(source),\n migrated: decoded.migrated,\n source,\n status: \"loaded\",\n value: decoded.value,\n };\n } catch (error) {\n if (error instanceof JsonDocumentStoreError) throw error;\n throw invalidDocument();\n }\n }\n\n async write<T>(\n input: WriteJsonDocumentInput<T>,\n ): Promise<{ checksum: string }> {\n let source: string;\n try {\n source = `${JSON.stringify(input.codec.encode(input.value), null, 2)}\\n`;\n } catch {\n throw invalidDocument();\n }\n\n const directory = path.dirname(input.filePath);\n await ensureDirectory(directory, input.security);\n const existing = await safeLstat(input.filePath);\n if (existing && (existing.isSymbolicLink() || !existing.isFile()))\n throw unsafeDocument();\n\n const temporaryPath = path.join(\n directory,\n `.${path.basename(input.filePath)}.${process.pid}.${randomUUID()}.tmp`,\n );\n const fileMode = input.security === \"private\" ? 0o600 : 0o644;\n\n try {\n await writeFile(temporaryPath, source, {\n encoding: \"utf8\",\n flag: \"wx\",\n mode: fileMode,\n });\n await chmod(temporaryPath, fileMode);\n await assertExpectedChecksum(input.filePath, input.expectedChecksum);\n await rename(temporaryPath, input.filePath);\n await chmod(input.filePath, fileMode);\n return { checksum: checksum(source) };\n } catch (error) {\n if (error instanceof JsonDocumentStoreError) throw error;\n throw unavailableDocument();\n } finally {\n await rm(temporaryPath, { force: true }).catch(() => undefined);\n }\n }\n}\n\nasync function ensureDirectory(\n directory: string,\n security: JsonDocumentSecurity,\n): Promise<void> {\n const mode = security === \"private\" ? 0o700 : 0o755;\n await mkdir(directory, { mode, recursive: true }).catch(() => {\n throw unavailableDocument();\n });\n await assertDirectory(directory);\n await chmod(directory, mode).catch(() => {\n throw unavailableDocument();\n });\n}\n\nasync function assertDirectory(directory: string): Promise<void> {\n const stats = await safeLstat(directory);\n if (!stats || stats.isSymbolicLink() || !stats.isDirectory())\n throw unsafeDocument();\n}\n\nasync function repairPermissions(\n filePath: string,\n directory: string,\n security: JsonDocumentSecurity,\n): Promise<void> {\n if (security !== \"private\") return;\n await Promise.all([chmod(directory, 0o700), chmod(filePath, 0o600)]).catch(\n () => {\n throw unavailableDocument();\n },\n );\n}\n\nasync function assertExpectedChecksum(\n filePath: string,\n expectedChecksum: string | null | undefined,\n): Promise<void> {\n if (expectedChecksum === undefined) return;\n const stats = await safeLstat(filePath);\n if (!stats) {\n if (expectedChecksum === null) return;\n throw conflictDocument();\n }\n if (stats.isSymbolicLink() || !stats.isFile()) throw unsafeDocument();\n if (expectedChecksum === null) throw conflictDocument();\n const currentSource = await readFile(filePath, \"utf8\").catch(() => {\n throw unavailableDocument();\n });\n if (checksum(currentSource) !== expectedChecksum) throw conflictDocument();\n}\n\nasync function safeLstat(candidate: string) {\n return lstat(candidate).catch((error: unknown) => {\n if (isNodeErrorCode(error, \"ENOENT\") || isNodeErrorCode(error, \"ENOTDIR\"))\n return undefined;\n throw unavailableDocument();\n });\n}\n\nfunction checksum(source: string): string {\n return createHash(\"sha256\").update(source).digest(\"hex\");\n}\n\nfunction conflictDocument(): JsonDocumentStoreError {\n return new JsonDocumentStoreError(\n \"JSON_DOCUMENT_CONFLICT\",\n \"The JSON document changed before it could be replaced.\",\n );\n}\n\nfunction invalidDocument(): JsonDocumentStoreError {\n return new JsonDocumentStoreError(\n \"JSON_DOCUMENT_INVALID\",\n \"The JSON document is invalid.\",\n );\n}\n\nfunction unavailableDocument(): JsonDocumentStoreError {\n return new JsonDocumentStoreError(\n \"JSON_DOCUMENT_UNAVAILABLE\",\n \"The JSON document could not be accessed.\",\n );\n}\n\nfunction unsafeDocument(): JsonDocumentStoreError {\n return new JsonDocumentStoreError(\n \"JSON_DOCUMENT_UNSAFE\",\n \"The JSON document path is not safe.\",\n );\n}\n\nfunction isNodeErrorCode(error: unknown, code: string): boolean {\n return (\n error instanceof Error &&\n \"code\" in error &&\n (error as NodeJS.ErrnoException).code === code\n );\n}\n","import { lstat, realpath } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport type RepositoryRootErrorCode =\n | \"REPOSITORY_ROOT_INVALID\"\n | \"REPOSITORY_ROOT_REQUIRED\"\n | \"REPOSITORY_ROOT_UNAVAILABLE\";\n\nexport class RepositoryRootError extends Error {\n readonly code: RepositoryRootErrorCode;\n\n constructor(code: RepositoryRootErrorCode, message: string) {\n super(message);\n this.name = \"RepositoryRootError\";\n this.code = code;\n }\n}\n\nexport async function findRepositoryRoot(startDir: string): Promise<string> {\n let current: string;\n try {\n current = await realpath(path.resolve(startDir));\n } catch {\n throw unavailableRoot();\n }\n\n await assertDirectory(current);\n while (true) {\n const marker = await safeLstat(path.join(current, \".git\"));\n if (marker) {\n if (\n marker.isSymbolicLink() ||\n (!marker.isDirectory() && !marker.isFile())\n ) {\n throw new RepositoryRootError(\n \"REPOSITORY_ROOT_INVALID\",\n \"The repository root is not safe for product Project state.\",\n );\n }\n return current;\n }\n\n const parent = path.dirname(current);\n if (parent === current) {\n throw new RepositoryRootError(\n \"REPOSITORY_ROOT_REQUIRED\",\n \"Run this command inside a repository before selecting a product Project.\",\n );\n }\n current = parent;\n }\n}\n\nasync function assertDirectory(candidate: string): Promise<void> {\n const stats = await safeLstat(candidate);\n if (!stats || stats.isSymbolicLink() || !stats.isDirectory()) {\n throw new RepositoryRootError(\n \"REPOSITORY_ROOT_INVALID\",\n \"The repository root is not safe for product Project state.\",\n );\n }\n}\n\nasync function safeLstat(candidate: string) {\n return lstat(candidate).catch((error: unknown) => {\n if (isNodeErrorCode(error, \"ENOENT\") || isNodeErrorCode(error, \"ENOTDIR\"))\n return undefined;\n throw unavailableRoot();\n });\n}\n\nfunction unavailableRoot(): RepositoryRootError {\n return new RepositoryRootError(\n \"REPOSITORY_ROOT_UNAVAILABLE\",\n \"The repository root could not be accessed.\",\n );\n}\n\nfunction isNodeErrorCode(error: unknown, code: string): boolean {\n return (\n error instanceof Error &&\n \"code\" in error &&\n (error as NodeJS.ErrnoException).code === code\n );\n}\n","import { z } from \"zod\";\nimport {\n SiteOSAuthApiError,\n resolveSiteOSAuthBaseUrl,\n type SiteOSAuthFetchLike,\n} from \"../siteos-auth-api.js\";\nimport type { ServiceGrantProvider } from \"../auth/application/service-grant-provider.js\";\n\nexport const PROJECT_SERVICES = [\n \"pulse\",\n \"cookie\",\n \"forms\",\n \"search\",\n \"trace\",\n \"seo\",\n \"analytics\",\n] as const;\nexport type ProjectService = (typeof PROJECT_SERVICES)[number];\nconst ProjectSchema = z.object({\n id: z.string().min(1),\n organizationId: z.string().min(1),\n name: z.string(),\n slug: z.string(),\n domains: z.array(z.string()),\n environments: z.array(\n z.object({\n id: z.string(),\n name: z.string(),\n slug: z.string(),\n url: z.string().nullable().optional(),\n }),\n ),\n createdAt: z.string(),\n updatedAt: z.string(),\n});\nconst OverviewSchema = z.object({\n project: ProjectSchema,\n services: z.array(\n z.object({\n service: z.enum(PROJECT_SERVICES),\n attachment: z\n .object({\n resourceId: z.string(),\n projectId: z.string(),\n service: z.enum(PROJECT_SERVICES),\n createdAt: z.string(),\n environments: z.array(\n z.object({\n environmentId: z.string(),\n resourceId: z.string(),\n slug: z.string().optional(),\n }),\n ),\n })\n .nullable(),\n observation: z\n .object({\n state: z.enum([\n \"setup_required\",\n \"configured\",\n \"waiting\",\n \"active\",\n \"attention\",\n \"unavailable\",\n ]),\n summary: z.string(),\n observedAt: z.string().nullable(),\n })\n .nullable(),\n }),\n ),\n});\nexport type CommonProject = z.infer<typeof ProjectSchema>;\nexport type CommonProjectOverview = z.infer<typeof OverviewSchema>;\n\nexport function createProjectApi(input: {\n env?: NodeJS.ProcessEnv;\n fetchImpl?: SiteOSAuthFetchLike;\n grants: ServiceGrantProvider;\n}) {\n const origin = resolveSiteOSAuthBaseUrl(input.env);\n async function request<T>(\n path: string,\n schema: z.ZodType<T>,\n body?: unknown,\n method?: \"PATCH\",\n ) {\n const scope =\n body === undefined\n ? \"projects:workspace:read\"\n : \"projects:workspace:write\";\n const grant = await input.grants.acquire({\n audience: \"siteos-projects\",\n scopes: [scope],\n });\n if (\n grant.grant.audience !== \"siteos-projects\" ||\n !grant.grant.scopes.includes(scope)\n )\n throw invalidResponse();\n if (!input.fetchImpl)\n throw new SiteOSAuthApiError({\n code: \"AUTH_UNAVAILABLE\",\n message: \"SiteOS API access is unavailable.\",\n });\n const response = await input.fetchImpl(\n `${origin}/api/projects/v1/projects${path}`,\n {\n method: method ?? (body === undefined ? \"GET\" : \"POST\"),\n headers: {\n Authorization: `Bearer ${grant.accessToken}`,\n Accept: \"application/json\",\n ...(body === undefined ? {} : { \"Content-Type\": \"application/json\" }),\n },\n ...(body === undefined ? {} : { body: JSON.stringify(body) }),\n signal: AbortSignal.timeout(30_000),\n },\n );\n const value = await response.json();\n if (!response.ok) {\n const error = z\n .object({\n error: z.object({ code: z.string(), message: z.string().max(500) }),\n })\n .safeParse(value);\n throw new SiteOSAuthApiError({\n code: error.success ? error.data.error.code : \"PROJECT_REQUEST_FAILED\",\n message: error.success\n ? error.data.error.message\n : \"The Project request failed.\",\n status: response.status,\n });\n }\n const parsed = schema.safeParse(value);\n if (!parsed.success) throw invalidResponse();\n return { value: parsed.data, organizationId: grant.grant.organizationId };\n }\n function checkOrganization(project: CommonProject, organizationId: string) {\n if (project.organizationId !== organizationId) throw invalidResponse();\n }\n return {\n origin,\n async update(\n id: string,\n details: {\n name: string;\n slug: string;\n domains: string[];\n websiteUrl?: string | null;\n },\n ) {\n const { value, organizationId } = await request(\n `/${encodeURIComponent(id)}`,\n z.object({ project: ProjectSchema }),\n details,\n \"PATCH\",\n );\n checkOrganization(value.project, organizationId);\n if (value.project.id !== id) throw invalidResponse();\n return value.project;\n },\n async updateEnvironment(\n id: string,\n environmentId: string,\n details: { name: string; url: string | null },\n ) {\n const { value, organizationId } = await request(\n `/${encodeURIComponent(id)}/environments/${encodeURIComponent(environmentId)}`,\n z.object({ project: ProjectSchema }),\n details,\n \"PATCH\",\n );\n checkOrganization(value.project, organizationId);\n if (value.project.id !== id) throw invalidResponse();\n return value.project;\n },\n async list() {\n const { value, organizationId } = await request(\n \"\",\n z.object({ projects: z.array(ProjectSchema) }),\n );\n value.projects.forEach((project) =>\n checkOrganization(project, organizationId),\n );\n return value.projects;\n },\n async get(id: string, environmentSlug?: string) {\n const { value, organizationId } = await request(\n `/${encodeURIComponent(id)}${environmentSlug ? `?env=${encodeURIComponent(environmentSlug)}` : \"\"}`,\n OverviewSchema,\n );\n checkOrganization(value.project, organizationId);\n if (\n value.project.id !== id ||\n value.services.some(\n (service) =>\n service.attachment &&\n (service.attachment.projectId !== id ||\n service.attachment.service !== service.service),\n )\n )\n throw invalidResponse();\n return value;\n },\n async create(details: {\n name: string;\n slug: string;\n domains: string[];\n websiteUrl?: string;\n }) {\n const { value, organizationId } = await request(\n \"\",\n z.object({ project: ProjectSchema }),\n details,\n );\n checkOrganization(value.project, organizationId);\n return value.project;\n },\n async connect(\n id: string,\n service: ProjectService,\n resourceId?: string,\n environmentSlug?: string,\n ) {\n await request(\n `/${encodeURIComponent(id)}/services/${service}${environmentSlug ? `?env=${encodeURIComponent(environmentSlug)}` : \"\"}`,\n z.object({\n attachment: z.object({\n resourceId: z.string(),\n projectId: z.literal(id),\n service: z.literal(service),\n }),\n }),\n resourceId ? { resourceId } : { create: true },\n );\n return this.get(id, environmentSlug);\n },\n async createEnvironment(\n id: string,\n details: { name: string; slug: string; url?: string },\n ) {\n const { value, organizationId } = await request(\n `/${encodeURIComponent(id)}/environments`,\n z.object({ project: ProjectSchema }),\n details,\n );\n checkOrganization(value.project, organizationId);\n if (value.project.id !== id) throw invalidResponse();\n return value.project;\n },\n async availableEnvironments(id: string, service: ProjectService) {\n return (\n await request(\n `/${encodeURIComponent(id)}/services/${service}/environments`,\n z.object({\n environments: z.array(\n z.object({ id: z.string(), name: z.string(), slug: z.string() }),\n ),\n }),\n )\n ).value.environments;\n },\n async connectEnvironment(\n id: string,\n service: ProjectService,\n environmentId: string,\n resourceId?: string,\n ) {\n await request(\n `/${encodeURIComponent(id)}/services/${service}/environments/${encodeURIComponent(environmentId)}`,\n z.object({\n attachment: z.object({\n projectId: z.literal(id),\n service: z.literal(service),\n }),\n }),\n resourceId ? { resourceId } : { create: true },\n );\n return this.get(id);\n },\n };\n}\nfunction invalidResponse() {\n return new SiteOSAuthApiError({\n code: \"AUTH_INVALID_RESPONSE\",\n message: \"SiteOS returned an invalid Project response.\",\n });\n}\n","import path from \"node:path\";\n\nimport { z } from \"zod\";\n\nimport {\n findRepositoryRoot,\n RepositoryRootError,\n} from \"../core/adapters/node-repository-root.js\";\nimport {\n JsonDocumentStoreError,\n NodeJsonDocumentStore,\n} from \"../core/adapters/node-json-document-store.js\";\nimport type {\n JsonDocumentCodec,\n JsonDocumentStore,\n} from \"../core/ports/json-document-store.js\";\n\nexport const FORMS_PROJECT_REFERENCE_RELATIVE_PATH = path.join(\n \".siteos\",\n \"forms\",\n \"project.json\",\n);\n\nconst formsProjectReferenceSchema = z\n .object({\n version: z.literal(1),\n service: z.literal(\"forms\"),\n project: z\n .object({\n name: z.string().trim().min(1).max(255),\n slug: z\n .string()\n .trim()\n .min(1)\n .max(80)\n .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),\n })\n .strict(),\n })\n .strict();\n\nexport type FormsProjectReference = z.infer<typeof formsProjectReferenceSchema>;\n\nconst codec: JsonDocumentCodec<FormsProjectReference> = {\n decode(input) {\n return { migrated: false, value: formsProjectReferenceSchema.parse(input) };\n },\n encode(value) {\n return formsProjectReferenceSchema.parse(value);\n },\n};\n\nexport type FormsProjectReferenceState =\n | {\n checksum: string;\n reference: FormsProjectReference;\n rootDir: string;\n status: \"loaded\";\n }\n | { rootDir: string; status: \"missing\" };\n\nexport type FormsProjectReferenceErrorCode =\n | \"FORMS_PROJECT_REFERENCE_CONFLICT\"\n | \"FORMS_PROJECT_REFERENCE_INVALID\"\n | \"FORMS_PROJECT_REFERENCE_REQUIRED\"\n | \"FORMS_PROJECT_REFERENCE_UNAVAILABLE\";\n\nexport class FormsProjectReferenceError extends Error {\n readonly code: FormsProjectReferenceErrorCode;\n\n constructor(code: FormsProjectReferenceErrorCode, message: string) {\n super(message);\n this.name = \"FormsProjectReferenceError\";\n this.code = code;\n }\n}\n\nexport async function inspectFormsProjectReference(\n startDir: string,\n documents: JsonDocumentStore = new NodeJsonDocumentStore(),\n): Promise<FormsProjectReferenceState> {\n try {\n const rootDir = await findRepositoryRoot(startDir);\n const snapshot = await documents.read({\n codec,\n filePath: path.join(rootDir, FORMS_PROJECT_REFERENCE_RELATIVE_PATH),\n security: \"tracked\",\n });\n if (snapshot.status === \"missing\") return { rootDir, status: \"missing\" };\n return {\n checksum: snapshot.checksum,\n reference: snapshot.value,\n rootDir,\n status: \"loaded\",\n };\n } catch (error) {\n throw mapReferenceError(error);\n }\n}\n\nexport async function writeFormsProjectReference(options: {\n documents?: JsonDocumentStore;\n expectedChecksum?: string | null;\n project: { name: string; slug: string };\n rootDir: string;\n}): Promise<FormsProjectReference> {\n const reference = formsProjectReferenceSchema.parse({\n version: 1,\n service: \"forms\",\n project: options.project,\n });\n try {\n await (options.documents ?? new NodeJsonDocumentStore()).write({\n codec,\n expectedChecksum: options.expectedChecksum,\n filePath: path.join(\n await findRepositoryRoot(options.rootDir),\n FORMS_PROJECT_REFERENCE_RELATIVE_PATH,\n ),\n security: \"tracked\",\n value: reference,\n });\n return reference;\n } catch (error) {\n throw mapReferenceError(error);\n }\n}\n\nfunction mapReferenceError(error: unknown): FormsProjectReferenceError {\n if (error instanceof FormsProjectReferenceError) return error;\n if (error instanceof RepositoryRootError) throw error;\n if (error instanceof JsonDocumentStoreError) {\n if (error.code === \"JSON_DOCUMENT_CONFLICT\") {\n return new FormsProjectReferenceError(\n \"FORMS_PROJECT_REFERENCE_CONFLICT\",\n \"The Forms Project reference changed before it could be saved.\",\n );\n }\n if (\n error.code === \"JSON_DOCUMENT_INVALID\" ||\n error.code === \"JSON_DOCUMENT_UNSAFE\"\n ) {\n return new FormsProjectReferenceError(\n \"FORMS_PROJECT_REFERENCE_INVALID\",\n \"The Forms Project reference is invalid.\",\n );\n }\n }\n if (error instanceof z.ZodError) {\n return new FormsProjectReferenceError(\n \"FORMS_PROJECT_REFERENCE_INVALID\",\n \"The Forms Project reference is invalid.\",\n );\n }\n return new FormsProjectReferenceError(\n \"FORMS_PROJECT_REFERENCE_UNAVAILABLE\",\n \"The Forms Project reference could not be accessed.\",\n );\n}\n","import { createHash, randomBytes } from \"node:crypto\";\nimport { readFile, rename, unlink, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { z } from \"zod\";\n\nimport { CliError } from \"./errors.js\";\n\nexport const CONFIG_FILE = \"siteos.config.json\";\n\nfunction isSafeRelativePath(value: string): boolean {\n if (!value || path.isAbsolute(value) || value.startsWith(\"!\")) return false;\n return !value.split(/[\\\\/]/).includes(\"..\");\n}\n\nconst safeRelativePath = z\n .string()\n .trim()\n .min(1)\n .refine(\n isSafeRelativePath,\n \"Use a relative path without '..' or negated glob patterns.\",\n );\n\nconst slug = z\n .string()\n .trim()\n .min(1)\n .max(80)\n .regex(\n /^[a-z0-9]+(?:-[a-z0-9]+)*$/,\n \"Use lowercase letters, numbers, and hyphens.\",\n );\n\nconst displayName = z.string().trim().min(1).max(120);\n\nconst httpUrl = z\n .string()\n .url()\n .refine((value) => [\"http:\", \"https:\"].includes(new URL(value).protocol), {\n message: \"Use an HTTP or HTTPS URL.\",\n });\n\nconst legacySchedule = z\n .object({\n enabled: z.boolean().default(true),\n cadenceSeconds: z.number().int().min(60).max(2_592_000).default(300),\n })\n .default({ enabled: true, cadenceSeconds: 300 });\n\nexport const ChecksConfigV1Schema = z.object({\n version: z.literal(1),\n project: slug,\n suite: slug.default(\"smoke\"),\n testsDir: safeRelativePath.default(\"tests/checks\"),\n playwrightConfig: safeRelativePath.optional(),\n include: z.array(safeRelativePath).min(1).max(100),\n baseUrl: httpUrl.optional(),\n schedule: legacySchedule,\n apiUrl: httpUrl.optional(),\n});\n\nconst ScheduledConfigSchema = z.object({\n mode: z.literal(\"scheduled\"),\n cadenceSeconds: z.number().int().min(60).max(2_592_000).default(300),\n});\n\nconst ManualConfigSchema = z.object({ mode: z.literal(\"manual\") });\n\nexport const CheckConfigSchema = z.object({\n slug,\n name: displayName,\n include: z.array(safeRelativePath).min(1).max(100),\n active: z.boolean().default(true),\n schedule: z\n .discriminatedUnion(\"mode\", [ScheduledConfigSchema, ManualConfigSchema])\n .default({ mode: \"scheduled\", cadenceSeconds: 300 }),\n});\n\nexport const ChecksConfigV2Schema = z\n .object({\n version: z.literal(2),\n project: z.object({\n slug,\n name: displayName,\n baseUrl: httpUrl.optional(),\n monitoringEnabled: z.boolean().default(true),\n }),\n testsDir: safeRelativePath.default(\"tests/siteos\"),\n playwrightConfig: safeRelativePath.optional(),\n bundle: z\n .object({ include: z.array(safeRelativePath).max(500).default([]) })\n .strict()\n .optional(),\n checks: z.array(CheckConfigSchema).min(1).max(100),\n apiUrl: httpUrl.optional(),\n })\n .superRefine((config, context) => {\n const slugs = new Set<string>();\n for (const [index, check] of config.checks.entries()) {\n if (slugs.has(check.slug)) {\n context.addIssue({\n code: z.ZodIssueCode.custom,\n path: [\"checks\", index, \"slug\"],\n message: `Duplicate Check slug: ${check.slug}`,\n });\n }\n slugs.add(check.slug);\n }\n });\n\nexport const ChecksConfigSchema = z.union([\n ChecksConfigV1Schema,\n ChecksConfigV2Schema,\n]);\n\nexport type ChecksConfigV1 = z.infer<typeof ChecksConfigV1Schema>;\nexport type ChecksConfig = z.infer<typeof ChecksConfigV2Schema>;\nexport type ChecksConfigFile = z.infer<typeof ChecksConfigSchema>;\n\nexport type ChecksConfigSnapshot = {\n configFile: string;\n source: string;\n checksum: string;\n fileConfig: ChecksConfigFile;\n config: ChecksConfig;\n migrationRequired: boolean;\n};\n\nfunction sourceChecksum(source: string): string {\n return createHash(\"sha256\").update(source).digest(\"hex\");\n}\n\nfunction titleFromSlug(value: string): string {\n return value\n .split(\"-\")\n .filter(Boolean)\n .map((part) => `${part.charAt(0).toUpperCase()}${part.slice(1)}`)\n .join(\" \");\n}\n\nexport function normalizeChecksConfig(config: ChecksConfigFile): ChecksConfig {\n if (config.version === 2) return config;\n\n return ChecksConfigV2Schema.parse({\n version: 2,\n project: {\n slug: config.project,\n name: titleFromSlug(config.project),\n baseUrl: config.baseUrl,\n monitoringEnabled: true,\n },\n testsDir: config.testsDir,\n playwrightConfig: config.playwrightConfig,\n checks: [\n {\n slug: config.suite,\n name: titleFromSlug(config.suite),\n include: config.include,\n active: true,\n schedule: config.schedule.enabled\n ? {\n mode: \"scheduled\",\n cadenceSeconds: config.schedule.cadenceSeconds,\n }\n : { mode: \"manual\" },\n },\n ],\n apiUrl: config.apiUrl,\n });\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await readFile(filePath);\n return true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return false;\n throw error;\n }\n}\n\nexport async function findChecksConfigFile(\n projectRoot: string,\n): Promise<string | null> {\n return (await fileExists(path.join(projectRoot, CONFIG_FILE)))\n ? CONFIG_FILE\n : null;\n}\n\nexport async function loadChecksConfigFile(\n projectRoot: string,\n): Promise<ChecksConfigFile> {\n return (await loadChecksConfigSnapshot(projectRoot)).fileConfig;\n}\n\nexport async function loadChecksConfigSnapshot(\n projectRoot: string,\n): Promise<ChecksConfigSnapshot> {\n const configFile = await findChecksConfigFile(projectRoot);\n if (!configFile) {\n throw new CliError(\n \"CONFIG_NOT_FOUND\",\n `${CONFIG_FILE} was not found in ${projectRoot}.`,\n {\n hint: \"Run `siteos pulse init` from the project root.\",\n },\n );\n }\n const configPath = path.join(projectRoot, configFile);\n let source: string;\n try {\n source = await readFile(configPath, \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new CliError(\n \"CONFIG_NOT_FOUND\",\n `${configFile} was not found in ${projectRoot}.`,\n {\n hint: \"Run `siteos pulse init` from the project root.\",\n },\n );\n }\n throw error;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(source);\n } catch {\n throw new CliError(\n \"CONFIG_INVALID_JSON\",\n `${configFile} is not valid JSON.`,\n );\n }\n\n const result = ChecksConfigSchema.safeParse(parsed);\n if (!result.success) {\n const details = result.error.issues\n .map((issue) => `${issue.path.join(\".\") || \"config\"}: ${issue.message}`)\n .join(\"; \");\n throw new CliError(\n \"CONFIG_INVALID\",\n `${configFile} is invalid: ${details}`,\n );\n }\n const fileConfig = result.data;\n return {\n configFile,\n source,\n checksum: sourceChecksum(source),\n fileConfig,\n config: normalizeChecksConfig(fileConfig),\n migrationRequired: fileConfig.version === 1,\n };\n}\n\nexport async function loadChecksConfig(\n projectRoot: string,\n): Promise<ChecksConfig> {\n return normalizeChecksConfig(await loadChecksConfigFile(projectRoot));\n}\n\nexport async function saveChecksConfig(\n projectRoot: string,\n config: ChecksConfig,\n options: { expectedChecksum?: string } = {},\n): Promise<void> {\n const configFile = (await findChecksConfigFile(projectRoot)) ?? CONFIG_FILE;\n const configPath = path.join(projectRoot, configFile);\n const temporaryPath = path.join(\n projectRoot,\n `.${configFile}.${process.pid}.${randomBytes(6).toString(\"hex\")}`,\n );\n try {\n await writeFile(\n temporaryPath,\n `${JSON.stringify(ChecksConfigV2Schema.parse(config), null, 2)}\\n`,\n {\n encoding: \"utf8\",\n flag: \"wx\",\n },\n );\n if (options.expectedChecksum) {\n const currentSource = await readFile(configPath, \"utf8\").catch(\n (error: unknown) => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n },\n );\n if (\n currentSource === null ||\n sourceChecksum(currentSource) !== options.expectedChecksum\n ) {\n throw new CliError(\n \"CONFIG_CHANGED\",\n `${configFile} changed while synchronization was being reviewed.`,\n {\n hint: \"Run `siteos pulse sync` again and review the latest configuration.\",\n },\n );\n }\n }\n await rename(temporaryPath, configPath);\n } catch (error) {\n await unlink(temporaryPath).catch(() => undefined);\n throw error;\n }\n}\n\nexport async function reconcileProjectSlug(\n projectRoot: string,\n projectSlug: string,\n options: { expectedChecksum?: string } = {},\n): Promise<ChecksConfigSnapshot> {\n const snapshot = await loadChecksConfigSnapshot(projectRoot);\n const config = ChecksConfigV2Schema.parse({\n ...snapshot.config,\n project: { ...snapshot.config.project, slug: projectSlug },\n });\n if (\n config.project.slug !== snapshot.config.project.slug ||\n snapshot.migrationRequired\n ) {\n await saveChecksConfig(projectRoot, config, {\n expectedChecksum: options.expectedChecksum ?? snapshot.checksum,\n });\n }\n return loadChecksConfigSnapshot(projectRoot);\n}\n\nexport function projectSlug(value: string): string {\n const normalized = value\n .trim()\n .toLowerCase()\n .replace(/^@[^/]+\\//, \"\")\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/(^-|-$)/g, \"\")\n .slice(0, 80);\n return normalized || \"siteos-pulse-project\";\n}\n\nexport function projectDisplayName(value: string): string {\n const withoutScope = value.trim().replace(/^@[^/]+\\//, \"\");\n const words = withoutScope\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .split(/[^A-Za-z0-9]+/)\n .filter(Boolean);\n const name = words\n .map((word) => `${word.charAt(0).toUpperCase()}${word.slice(1)}`)\n .join(\" \");\n return name.slice(0, 120) || \"SiteOS Pulse Project\";\n}\n","export class CliError extends Error {\n readonly code: string;\n readonly exitCode: number;\n readonly hint?: string;\n\n constructor(\n code: string,\n message: string,\n options?: { exitCode?: number; hint?: string },\n ) {\n super(message);\n this.name = \"CliError\";\n this.code = code;\n this.exitCode = options?.exitCode ?? 1;\n this.hint = options?.hint;\n }\n}\n\nexport function normalizeCliError(error: unknown): CliError {\n if (error instanceof CliError) return error;\n if (error instanceof Error) {\n return new CliError(\"UNEXPECTED_ERROR\", error.message, {\n hint: \"Run the command again with a valid SiteOS Pulse project configuration.\",\n });\n }\n return new CliError(\"UNEXPECTED_ERROR\", \"An unexpected error occurred.\");\n}\n","import path from \"node:path\";\n\nimport { z } from \"zod\";\n\nimport {\n findRepositoryRoot,\n RepositoryRootError,\n} from \"../core/adapters/node-repository-root.js\";\nimport {\n JsonDocumentStoreError,\n NodeJsonDocumentStore,\n} from \"../core/adapters/node-json-document-store.js\";\nimport type {\n JsonDocumentCodec,\n JsonDocumentStore,\n} from \"../core/ports/json-document-store.js\";\n\nexport const SEARCH_PROJECT_REFERENCE_RELATIVE_PATH = path.join(\n \".siteos\",\n \"search\",\n \"project.json\",\n);\n\nconst searchProjectReferenceSchema = z\n .object({\n version: z.literal(1),\n service: z.literal(\"search\"),\n project: z\n .object({\n name: z.string().trim().min(1).max(255),\n slug: z\n .string()\n .trim()\n .min(1)\n .max(120)\n .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),\n })\n .strict(),\n })\n .strict();\n\nexport type SearchProjectReference = z.infer<\n typeof searchProjectReferenceSchema\n>;\n\nconst codec: JsonDocumentCodec<SearchProjectReference> = {\n decode(input) {\n return {\n migrated: false,\n value: searchProjectReferenceSchema.parse(input),\n };\n },\n encode(value) {\n return searchProjectReferenceSchema.parse(value);\n },\n};\n\nexport type SearchProjectReferenceState =\n | {\n checksum: string;\n reference: SearchProjectReference;\n rootDir: string;\n status: \"loaded\";\n }\n | { rootDir: string; status: \"missing\" };\n\nexport type SearchProjectReferenceErrorCode =\n | \"SEARCH_PROJECT_REFERENCE_CONFLICT\"\n | \"SEARCH_PROJECT_REFERENCE_INVALID\"\n | \"SEARCH_PROJECT_REFERENCE_REQUIRED\"\n | \"SEARCH_PROJECT_REFERENCE_UNAVAILABLE\";\n\nexport class SearchProjectReferenceError extends Error {\n readonly code: SearchProjectReferenceErrorCode;\n\n constructor(code: SearchProjectReferenceErrorCode, message: string) {\n super(message);\n this.name = \"SearchProjectReferenceError\";\n this.code = code;\n }\n}\n\nexport async function inspectSearchProjectReference(\n startDir: string,\n documents: JsonDocumentStore = new NodeJsonDocumentStore(),\n): Promise<SearchProjectReferenceState> {\n try {\n const rootDir = await findRepositoryRoot(startDir);\n const snapshot = await documents.read({\n codec,\n filePath: path.join(rootDir, SEARCH_PROJECT_REFERENCE_RELATIVE_PATH),\n security: \"tracked\",\n });\n if (snapshot.status === \"missing\") return { rootDir, status: \"missing\" };\n return {\n checksum: snapshot.checksum,\n reference: snapshot.value,\n rootDir,\n status: \"loaded\",\n };\n } catch (error) {\n throw mapReferenceError(error);\n }\n}\n\nexport async function writeSearchProjectReference(options: {\n documents?: JsonDocumentStore;\n expectedChecksum?: string | null;\n project: { name: string; slug: string };\n rootDir: string;\n}): Promise<SearchProjectReference> {\n const reference = searchProjectReferenceSchema.parse({\n version: 1,\n service: \"search\",\n project: options.project,\n });\n try {\n await (options.documents ?? new NodeJsonDocumentStore()).write({\n codec,\n expectedChecksum: options.expectedChecksum,\n filePath: path.join(\n await findRepositoryRoot(options.rootDir),\n SEARCH_PROJECT_REFERENCE_RELATIVE_PATH,\n ),\n security: \"tracked\",\n value: reference,\n });\n return reference;\n } catch (error) {\n throw mapReferenceError(error);\n }\n}\n\nfunction mapReferenceError(error: unknown): SearchProjectReferenceError {\n if (error instanceof SearchProjectReferenceError) return error;\n if (error instanceof RepositoryRootError) throw error;\n if (error instanceof JsonDocumentStoreError) {\n if (error.code === \"JSON_DOCUMENT_CONFLICT\") {\n return new SearchProjectReferenceError(\n \"SEARCH_PROJECT_REFERENCE_CONFLICT\",\n \"The Search Project reference changed before it could be saved.\",\n );\n }\n if (\n error.code === \"JSON_DOCUMENT_INVALID\" ||\n error.code === \"JSON_DOCUMENT_UNSAFE\"\n ) {\n return new SearchProjectReferenceError(\n \"SEARCH_PROJECT_REFERENCE_INVALID\",\n \"The Search Project reference is invalid.\",\n );\n }\n }\n if (error instanceof z.ZodError) {\n return new SearchProjectReferenceError(\n \"SEARCH_PROJECT_REFERENCE_INVALID\",\n \"The Search Project reference is invalid.\",\n );\n }\n return new SearchProjectReferenceError(\n \"SEARCH_PROJECT_REFERENCE_UNAVAILABLE\",\n \"The Search Project reference could not be accessed.\",\n );\n}\n","import { createHash, randomBytes } from \"node:crypto\";\nimport os from \"node:os\";\n\nimport { z } from \"zod\";\n\nimport {\n createSiteOSAuthApiClient,\n isDefinitiveInvalidSession,\n resolveSiteOSAuthBaseUrl,\n SiteOSAuthApiError,\n type SiteOSAuthFetchLike,\n type SiteOSAuthOrganizationsResponse,\n type SiteOSCliOrganization,\n type SiteOSCliSessionStatus,\n} from \"./siteos-auth-api.js\";\nimport {\n loadSiteOSAuthState,\n SITEOS_AUTH_STATE_VERSION,\n SiteOSAuthStateError,\n type SiteOSSelectedOrganization,\n type SiteOSAuthState,\n writeSiteOSAuthState,\n} from \"./siteos-auth-state.js\";\nimport { resolveSiteOSConfigHome } from \"./siteos-config.js\";\n\nconst HELP_FLAGS = new Set([\"--help\", \"-h\"]);\nconst organizationDisplayNameSchema = z\n .string()\n .transform((value) => value.trim())\n .refine((value) => {\n const visibleLength = Array.from(value).length;\n return visibleLength >= 2 && visibleLength <= 80;\n });\n\nexport const AUTH_HELP = `Usage:\n siteos auth start --email <email> [--json]\n siteos auth complete --token <token> [--json]\n siteos auth status [--json]\n siteos auth organizations [--json]\n siteos auth organizations create --display-name <display-name> [--json]\n siteos auth select --organization <organization-id> [--json]\n siteos auth logout [--json]\n\nAuthenticate the SiteOS CLI with a user-level session.`;\n\nexport type AuthCommandResult = {\n exitCode: number;\n stderr?: string;\n stdout?: string;\n};\n\nexport async function runAuthCommand(options: {\n args: string[];\n env?: NodeJS.ProcessEnv;\n fetchImpl?: SiteOSAuthFetchLike;\n generateInstallationId?: () => string;\n generatePkceVerifier?: () => string;\n homeDir?: string;\n now?: () => Date;\n}): Promise<AuthCommandResult> {\n if (\n options.args.length === 0 ||\n options.args.some((arg) => HELP_FLAGS.has(arg))\n ) {\n return { exitCode: 0, stdout: AUTH_HELP };\n }\n\n const subcommand = options.args[0];\n const args = options.args.slice(1);\n const configHome = resolveSiteOSConfigHome({\n env: options.env,\n homeDir: options.homeDir ?? os.homedir(),\n });\n const now = options.now ?? (() => new Date());\n\n if (subcommand === \"start\") {\n const parsed = parseValueCommand(args, \"--email\");\n if (!parsed.ok) return usageError(parsed.error, parsed.json);\n const email = z.string().trim().email().safeParse(parsed.value);\n if (!email.success) return usageError(\"--email is invalid.\", parsed.json);\n return runStart({\n ...options,\n configHome,\n email: email.data,\n json: parsed.json,\n now,\n });\n }\n\n if (subcommand === \"complete\") {\n const parsed = parseValueCommand(args, \"--token\");\n if (!parsed.ok) return usageError(parsed.error, parsed.json);\n const token = z\n .string()\n .trim()\n .regex(/^[A-Za-z0-9_-]{16}$/)\n .safeParse(parsed.value);\n if (!token.success) return usageError(\"--token is invalid.\", parsed.json);\n return runComplete({\n ...options,\n configHome,\n json: parsed.json,\n token: token.data,\n });\n }\n\n if (subcommand === \"select\") {\n const parsed = parseValueCommand(args, \"--organization\");\n if (!parsed.ok) return usageError(parsed.error, parsed.json);\n return runSelectOrganization({\n ...options,\n configHome,\n json: parsed.json,\n organization: parsed.value,\n });\n }\n\n if (subcommand === \"organizations\" && args[0] === \"create\") {\n const parsed = parseValueCommand(args.slice(1), \"--display-name\");\n if (!parsed.ok) return usageError(parsed.error, parsed.json);\n const displayName = organizationDisplayNameSchema.safeParse(parsed.value);\n if (!displayName.success) {\n return usageError(\"--display-name is invalid.\", parsed.json);\n }\n return runCreateOrganization({\n ...options,\n configHome,\n displayName: displayName.data,\n json: parsed.json,\n });\n }\n\n if (\n subcommand === \"status\" ||\n subcommand === \"organizations\" ||\n subcommand === \"logout\"\n ) {\n const parsed = parseJsonOnly(args);\n if (!parsed.ok) return usageError(parsed.error, parsed.json);\n if (subcommand === \"status\") {\n return runStatus({ ...options, configHome, json: parsed.json });\n }\n if (subcommand === \"organizations\") {\n return runOrganizations({ ...options, configHome, json: parsed.json });\n }\n return runLogout({ ...options, configHome, json: parsed.json });\n }\n\n return usageError(\"Unknown SiteOS Auth command.\", args.includes(\"--json\"));\n}\n\nasync function runStart(options: {\n configHome: string;\n email: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: SiteOSAuthFetchLike;\n generateInstallationId?: () => string;\n generatePkceVerifier?: () => string;\n json: boolean;\n now: () => Date;\n}): Promise<AuthCommandResult> {\n try {\n const loaded = await loadSiteOSAuthState({\n configHome: options.configHome,\n });\n const installationId =\n loaded.status === \"loaded\"\n ? loaded.state.installationId\n : (options.generateInstallationId ?? generateOpaqueValue)();\n const pkceVerifier =\n options.generatePkceVerifier?.() ?? generateOpaqueValue();\n const client = createClient(options);\n const response = await client.start({\n email: options.email,\n installationIdHash: sha256Base64Url(installationId),\n pkceChallenge: sha256Base64Url(pkceVerifier),\n });\n const state: SiteOSAuthState = {\n ...(loaded.status === \"loaded\" ? loaded.state : {}),\n installationId,\n pending: {\n requestId: response.requestId,\n pkceVerifier,\n expiresAt:\n Math.floor(options.now().getTime() / 1_000) +\n response.expiresInSeconds,\n },\n version: SITEOS_AUTH_STATE_VERSION,\n };\n await writeSiteOSAuthState({ configHome: options.configHome, state });\n\n const safe = {\n status: response.status,\n channel: response.channel,\n expiresInSeconds: response.expiresInSeconds,\n };\n return {\n exitCode: 0,\n stdout: options.json\n ? JSON.stringify(safe, null, 2)\n : \"SiteOS sign-in email sent. Run the completion command from the email.\",\n };\n } catch (error) {\n return formatError(error, options.json);\n }\n}\n\nasync function runComplete(options: {\n configHome: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: SiteOSAuthFetchLike;\n json: boolean;\n token: string;\n}): Promise<AuthCommandResult> {\n try {\n const loaded = await loadSiteOSAuthState({\n configHome: options.configHome,\n });\n if (loaded.status === \"missing\" || !loaded.state.pending) {\n return commandError(\n \"AUTH_REQUEST_MISSING\",\n \"No pending SiteOS authorization request was found.\",\n options.json,\n );\n }\n const response = await createClient(options).complete({\n pkceVerifier: loaded.state.pending.pkceVerifier,\n requestId: loaded.state.pending.requestId,\n token: options.token,\n });\n if (response.session.status !== \"authenticated\") {\n throw new SiteOSAuthApiError({\n code: \"AUTH_INVALID_RESPONSE\",\n message: \"The SiteOS Auth service returned an invalid response.\",\n });\n }\n await writeSiteOSAuthState({\n configHome: options.configHome,\n state: {\n installationId: loaded.state.installationId,\n session: {\n credential: response.sessionCredential,\n metadata: response.session,\n selectedOrganization: response.session.organization\n ? { id: response.session.organization.id }\n : undefined,\n },\n version: SITEOS_AUTH_STATE_VERSION,\n },\n });\n return sessionResult(response.session, options.json, \"authenticated\");\n } catch (error) {\n return formatError(error, options.json);\n }\n}\n\nasync function runStatus(options: {\n configHome: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: SiteOSAuthFetchLike;\n json: boolean;\n}): Promise<AuthCommandResult> {\n try {\n const loaded = await loadSiteOSAuthState({\n configHome: options.configHome,\n });\n if (loaded.status === \"missing\" || !loaded.state.session) {\n return signedOutResult(options.json);\n }\n try {\n const client = createClient(options);\n const session = await client.status({\n sessionCredential: loaded.state.session.credential,\n });\n if (session.status !== \"authenticated\") {\n await writeSiteOSAuthState({\n configHome: options.configHome,\n state: { ...loaded.state, session: undefined },\n });\n } else {\n const organizations = await client.organizations({\n sessionCredential: loaded.state.session.credential,\n });\n const selectedOrganization = reconcileSelectedOrganization(\n session.organization\n ? { id: session.organization.id }\n : loaded.state.session.selectedOrganization,\n organizations.organizations,\n );\n const selectedOrganizationDetails = selectedOrganization\n ? organizations.organizations.find(\n (organization) => organization.id === selectedOrganization.id,\n )\n : undefined;\n await writeSiteOSAuthState({\n configHome: options.configHome,\n state: {\n ...loaded.state,\n session: {\n ...loaded.state.session,\n metadata: session,\n selectedOrganization,\n },\n },\n });\n return sessionResult(\n {\n ...session,\n organization: selectedOrganizationDetails\n ? sessionOrganization(selectedOrganizationDetails)\n : null,\n },\n options.json,\n session.status,\n );\n }\n return sessionResult(session, options.json, session.status);\n } catch (error) {\n if (!isDefinitiveInvalidSession(error)) throw error;\n await writeSiteOSAuthState({\n configHome: options.configHome,\n state: { ...loaded.state, session: undefined },\n });\n return signedOutResult(options.json);\n }\n } catch (error) {\n return formatError(error, options.json);\n }\n}\n\nasync function runOrganizations(options: {\n configHome: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: SiteOSAuthFetchLike;\n json: boolean;\n}): Promise<AuthCommandResult> {\n try {\n const context = await loadOrganizationContext(options);\n const selectedOrganization = reconcileSelectedOrganization(\n context.loaded.state.session.selectedOrganization,\n context.response.organizations,\n );\n const selectedOrganizationDetails = selectedOrganization\n ? context.response.organizations.find(\n (organization) => organization.id === selectedOrganization.id,\n )\n : undefined;\n await writeSiteOSAuthState({\n configHome: options.configHome,\n state: {\n ...context.loaded.state,\n session: {\n ...context.loaded.state.session,\n selectedOrganization,\n },\n },\n });\n return organizationsResult(\n context.response,\n selectedOrganizationDetails ?? null,\n options.json,\n );\n } catch (error) {\n return formatError(error, options.json);\n }\n}\n\nasync function runCreateOrganization(options: {\n configHome: string;\n displayName: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: SiteOSAuthFetchLike;\n json: boolean;\n}): Promise<AuthCommandResult> {\n try {\n const loaded = await loadSiteOSAuthState({\n configHome: options.configHome,\n });\n if (loaded.status === \"missing\" || !loaded.state.session) {\n throw new SiteOSAuthApiError({\n code: \"AUTH_SESSION_REQUIRED\",\n message: \"Authenticate the SiteOS CLI first.\",\n });\n }\n const response = await createClient(options).createOrganization({\n displayName: options.displayName,\n sessionCredential: loaded.state.session.credential,\n });\n await writeSiteOSAuthState({\n configHome: options.configHome,\n state: {\n ...loaded.state,\n session: {\n ...loaded.state.session,\n selectedOrganization: { id: response.organization.id },\n },\n },\n });\n return createdOrganizationResult(response.organization, options.json);\n } catch (error) {\n return formatError(error, options.json);\n }\n}\n\nasync function runSelectOrganization(options: {\n configHome: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: SiteOSAuthFetchLike;\n json: boolean;\n organization: string;\n}): Promise<AuthCommandResult> {\n try {\n const context = await loadOrganizationContext(options);\n const exactId = context.response.organizations.find(\n (organization) => organization.id === options.organization,\n );\n const selected = exactId;\n if (!selected) {\n return commandError(\n \"ORGANIZATION_NOT_FOUND\",\n \"The requested SiteOS Organization is not available.\",\n options.json,\n );\n }\n const selectedOrganization = { id: selected.id };\n await writeSiteOSAuthState({\n configHome: options.configHome,\n state: {\n ...context.loaded.state,\n session: {\n ...context.loaded.state.session,\n selectedOrganization,\n },\n },\n });\n return selectedOrganizationResult(selected, options.json);\n } catch (error) {\n return formatError(error, options.json);\n }\n}\n\nasync function loadOrganizationContext(options: {\n configHome: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: SiteOSAuthFetchLike;\n}): Promise<{\n loaded: {\n status: \"loaded\";\n state: SiteOSAuthState & {\n session: NonNullable<SiteOSAuthState[\"session\"]>;\n };\n };\n response: SiteOSAuthOrganizationsResponse;\n}> {\n const loaded = await loadSiteOSAuthState({ configHome: options.configHome });\n if (loaded.status === \"missing\" || !loaded.state.session) {\n throw new SiteOSAuthApiError({\n code: \"AUTH_SESSION_REQUIRED\",\n message: \"Authenticate the SiteOS CLI first.\",\n });\n }\n const authenticated = {\n status: \"loaded\" as const,\n state: { ...loaded.state, session: loaded.state.session },\n };\n try {\n const response = await createClient(options).organizations({\n sessionCredential: authenticated.state.session.credential,\n });\n return { loaded: authenticated, response };\n } catch (error) {\n if (isDefinitiveInvalidSession(error)) {\n await writeSiteOSAuthState({\n configHome: options.configHome,\n state: { ...loaded.state, session: undefined },\n });\n }\n throw error;\n }\n}\n\nfunction reconcileSelectedOrganization(\n current: SiteOSSelectedOrganization | undefined,\n organizations: SiteOSCliOrganization[],\n): SiteOSSelectedOrganization | undefined {\n if (organizations.length === 1) {\n return { id: organizations[0].id };\n }\n if (!current) return undefined;\n const currentMembership = organizations.find(\n (organization) => organization.id === current.id,\n );\n return currentMembership ? { id: currentMembership.id } : undefined;\n}\n\nfunction organizationsResult(\n response: SiteOSAuthOrganizationsResponse,\n selectedOrganization: SiteOSCliOrganization | null,\n json: boolean,\n): AuthCommandResult {\n if (json) {\n return {\n exitCode: 0,\n stdout: JSON.stringify(\n {\n ...response,\n selectedOrganization: selectedOrganization\n ? sessionOrganization(selectedOrganization)\n : null,\n },\n null,\n 2,\n ),\n };\n }\n if (response.organizations.length === 0) {\n return { exitCode: 0, stdout: \"No SiteOS Organizations are available.\" };\n }\n return {\n exitCode: 0,\n stdout: [\n \"SiteOS Organizations:\",\n ...response.organizations.map((organization) => {\n const marker = selectedOrganization?.id === organization.id ? \"*\" : \"-\";\n return `${marker} ${organization.displayName} (${organization.id}) — ${organization.membershipRole}`;\n }),\n ].join(\"\\n\"),\n };\n}\n\nfunction selectedOrganizationResult(\n organization: SiteOSCliOrganization,\n json: boolean,\n): AuthCommandResult {\n return {\n exitCode: 0,\n stdout: json\n ? JSON.stringify(\n { contractVersion: 1, status: \"selected\", organization },\n null,\n 2,\n )\n : `Selected SiteOS Organization: ${organization.displayName} (${organization.id}).`,\n };\n}\n\nfunction createdOrganizationResult(\n organization: SiteOSCliOrganization,\n json: boolean,\n): AuthCommandResult {\n return {\n exitCode: 0,\n stdout: json\n ? JSON.stringify(\n { contractVersion: 1, status: \"created\", organization },\n null,\n 2,\n )\n : `Created SiteOS Organization: ${organization.displayName} (${organization.id}).`,\n };\n}\n\nfunction sessionOrganization(organization: SiteOSCliOrganization): {\n displayName: string;\n id: string;\n} {\n return { id: organization.id, displayName: organization.displayName };\n}\n\nasync function runLogout(options: {\n configHome: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: SiteOSAuthFetchLike;\n json: boolean;\n}): Promise<AuthCommandResult> {\n try {\n const loaded = await loadSiteOSAuthState({\n configHome: options.configHome,\n });\n if (loaded.status === \"missing\") return signedOutResult(options.json);\n\n const withoutPending = { ...loaded.state, pending: undefined };\n if (!loaded.state.session) {\n await writeSiteOSAuthState({\n configHome: options.configHome,\n state: withoutPending,\n });\n return signedOutResult(options.json);\n }\n try {\n await createClient(options).revoke({\n sessionCredential: loaded.state.session.credential,\n });\n } catch (error) {\n if (!isDefinitiveInvalidSession(error)) {\n await writeSiteOSAuthState({\n configHome: options.configHome,\n state: withoutPending,\n });\n throw error;\n }\n }\n await writeSiteOSAuthState({\n configHome: options.configHome,\n state: { ...withoutPending, session: undefined },\n });\n return signedOutResult(options.json);\n } catch (error) {\n return formatError(error, options.json);\n }\n}\n\nfunction createClient(options: {\n env?: NodeJS.ProcessEnv;\n fetchImpl?: SiteOSAuthFetchLike;\n}) {\n if (!options.fetchImpl) {\n throw new SiteOSAuthApiError({\n code: \"AUTH_UNAVAILABLE\",\n message: \"SiteOS Auth access is unavailable in this runtime.\",\n });\n }\n return createSiteOSAuthApiClient({\n apiBaseUrl: resolveSiteOSAuthBaseUrl(options.env),\n fetchImpl: options.fetchImpl,\n });\n}\n\nfunction generateOpaqueValue(): string {\n return randomBytes(32).toString(\"base64url\");\n}\n\nexport function sha256Base64Url(value: string): string {\n return createHash(\"sha256\").update(value, \"utf-8\").digest(\"base64url\");\n}\n\nfunction sessionResult(\n session: SiteOSCliSessionStatus,\n json: boolean,\n status: SiteOSCliSessionStatus[\"status\"],\n): AuthCommandResult {\n if (json) {\n return { exitCode: 0, stdout: JSON.stringify(session, null, 2) };\n }\n if (status === \"expired\") {\n return { exitCode: 0, stdout: \"SiteOS CLI session is expired.\" };\n }\n if (status === \"revoked\") {\n return { exitCode: 0, stdout: \"SiteOS CLI session is revoked.\" };\n }\n return {\n exitCode: 0,\n stdout: [\n \"SiteOS CLI is authenticated.\",\n `User: ${session.user.email}`,\n session.organization\n ? `Organization: ${session.organization.displayName} (${session.organization.id})`\n : \"Organization: not selected\",\n `Expires: ${new Date(session.expiresAt * 1_000).toISOString()}`,\n ].join(\"\\n\"),\n };\n}\n\nfunction signedOutResult(json: boolean): AuthCommandResult {\n return {\n exitCode: 0,\n stdout: json\n ? JSON.stringify({ status: \"signed_out\" }, null, 2)\n : \"SiteOS CLI is signed out.\",\n };\n}\n\nfunction formatError(error: unknown, json: boolean): AuthCommandResult {\n if (error instanceof SiteOSAuthApiError) {\n return commandError(error.code, error.message, json);\n }\n if (error instanceof SiteOSAuthStateError) {\n return commandError(error.code, error.message, json);\n }\n return commandError(\n \"AUTH_COMMAND_FAILED\",\n \"The SiteOS Auth command failed.\",\n json,\n );\n}\n\nfunction commandError(\n code: string,\n message: string,\n json: boolean,\n): AuthCommandResult {\n return {\n exitCode: 1,\n stderr: json\n ? JSON.stringify({ error: { code, message } }, null, 2)\n : `SiteOS Auth error: ${message}`,\n };\n}\n\nfunction usageError(message: string, json: boolean): AuthCommandResult {\n return commandError(\"AUTH_USAGE_ERROR\", message, json);\n}\n\nfunction parseValueCommand(\n args: string[],\n valueFlag: \"--display-name\" | \"--email\" | \"--organization\" | \"--token\",\n):\n | { json: boolean; ok: true; value: string }\n | { error: string; json: boolean; ok: false } {\n let json = false;\n let value: string | undefined;\n\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index];\n if (arg === \"--json\") {\n if (json) return { error: \"--json may be used once.\", json, ok: false };\n json = true;\n continue;\n }\n if (arg === valueFlag) {\n const next = args[index + 1];\n if (value !== undefined) {\n return { error: `${valueFlag} may be used once.`, json, ok: false };\n }\n if (!next || next.startsWith(\"--\")) {\n return { error: `${valueFlag} requires a value.`, json, ok: false };\n }\n value = next;\n index += 1;\n continue;\n }\n return { error: `Unexpected argument: ${arg}`, json, ok: false };\n }\n if (!value) {\n return { error: `${valueFlag} is required.`, json, ok: false };\n }\n return { json, ok: true, value };\n}\n\nfunction parseJsonOnly(\n args: string[],\n): { json: boolean; ok: true } | { error: string; json: boolean; ok: false } {\n if (args.length === 0) return { json: false, ok: true };\n if (args.length === 1 && args[0] === \"--json\") {\n return { json: true, ok: true };\n }\n return {\n error: `Unexpected argument: ${args[0]}`,\n json: args.includes(\"--json\"),\n ok: false,\n };\n}\n","import type { CommandResult } from \"./command-result.js\";\n\nexport type CommandHandler = (\n args: string[],\n) => CommandResult | Promise<CommandResult>;\nexport type CommandRegistry = ReadonlyMap<string, CommandHandler>;\n\nexport function createCommandRegistry(\n handlers: Readonly<Record<string, CommandHandler>>,\n): CommandRegistry {\n return new Map(Object.entries(handlers));\n}\n\nexport async function dispatchCommand(\n registry: CommandRegistry,\n command: string,\n args: string[],\n): Promise<CommandResult | null> {\n const handler = registry.get(command);\n return handler ? handler(args) : null;\n}\n","export const CLI_EXIT_CODE = {\n success: 0,\n internal: 1,\n usage: 2,\n authorization: 3,\n conflict: 4,\n unavailable: 5,\n} as const;\n\nexport type CliExitCode = (typeof CLI_EXIT_CODE)[keyof typeof CLI_EXIT_CODE];\n\nexport type CommandResult = {\n exitCode: CliExitCode;\n stderr?: string;\n stdout?: string;\n};\n\nexport function normalizeCommandResult(result: {\n exitCode: number;\n stderr?: string;\n stdout?: string;\n}): CommandResult {\n return {\n ...result,\n exitCode: isCliExitCode(result.exitCode)\n ? result.exitCode\n : CLI_EXIT_CODE.internal,\n };\n}\n\nfunction isCliExitCode(value: number): value is CliExitCode {\n return Object.values(CLI_EXIT_CODE).some((exitCode) => exitCode === value);\n}\n","import {\n commonServiceContext,\n commonEnvironmentArguments,\n readLocalCommonProject,\n} from \"./projects/project-context.js\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { z } from \"zod\";\nimport { Ajv } from \"ajv\";\nimport addFormats from \"ajv-formats\";\n\nimport { createSiteOSServiceGrantProvider } from \"./auth/adapters/siteos-service-grant-provider.js\";\nimport type { ServiceGrantProvider } from \"./auth/application/service-grant-provider.js\";\nimport {\n NodeProjectBindingStore,\n ProjectBindingStoreError,\n} from \"./core/adapters/node-project-binding-store.js\";\nimport { RepositoryRootError } from \"./core/adapters/node-repository-root.js\";\nimport type { ProjectBindingStore } from \"./core/ports/project-binding-store.js\";\nimport {\n FormsProjectReferenceError,\n inspectFormsProjectReference,\n writeFormsProjectReference,\n} from \"./forms/project-reference.js\";\nimport { resolveSiteOSConfigHome } from \"./siteos-config.js\";\nimport {\n createSiteOSFormsApiClient,\n resolveSiteOSFormsBaseUrl,\n SiteOSFormsApiError,\n type SiteOSFormsProject,\n formsSubmissionStatusSchema,\n} from \"./siteos-forms-api.js\";\nimport { SiteOSAuthApiError } from \"./siteos-auth-api.js\";\nimport {\n prepareSiteOSFormsCredentialInstallation,\n SITEOS_FORMS_SUBMISSION_CREDENTIAL_ENV,\n SITEOS_FORMS_DEPLOYMENT_KEY_ENV,\n SiteOSFormsCredentialStorageError,\n type SiteOSFormsCredentialInstallation,\n} from \"./siteos-forms-credential.js\";\nimport { isValidEnvironmentSlug } from \"./environment-slug.js\";\nimport type { FetchLike } from \"./siteos-search-api.js\";\n\nconst HELP_FLAGS = new Set([\"--help\", \"-h\"]);\nconst JSON_FLAG = \"--json\";\nconst INPUT_FLAG = \"--input\";\nconst MANIFEST_FLAG = \"--manifest\";\nconst ENVIRONMENT_FLAG = \"--environment\";\nconst INSTALL_FLAG = \"--install\";\nconst NAME_FLAG = \"--name\";\nconst SLUG_FLAG = \"--slug\";\nconst CREDENTIAL_FLAG = \"--credential\";\nconst REPLACE_FLAG = \"--replace\";\n\nexport { SITEOS_FORMS_SUBMISSION_CREDENTIAL_ENV } from \"./siteos-forms-credential.js\";\n\nconst normalizedFieldOptionSchema = z.object({\n label: z.string().trim().min(1).max(255),\n value: z.string().trim().min(1).max(255),\n});\n\nconst normalizedFieldSchema = z\n .object({\n key: z.string().trim().min(1).max(255),\n kind: z.string().trim().min(1).max(64).optional(),\n label: z.string().trim().min(1).max(255).optional(),\n displayRole: z.enum([\"primary\", \"secondary\"]).optional(),\n multiple: z.boolean().optional(),\n options: z.array(normalizedFieldOptionSchema).max(500).optional(),\n })\n .strict();\n\nconst definitionSyncInputSchema = z\n .object({\n formKey: z.string().trim().min(1).max(255),\n name: z.string().trim().min(1).max(255),\n normalizedFieldsJson: z.array(normalizedFieldSchema).min(1).max(500),\n schemaJson: z.record(z.unknown()),\n sourceExportId: z.string().trim().min(1).max(255).optional(),\n sourcePagePath: z.string().trim().min(1).max(2048).optional(),\n })\n .strict()\n .superRefine((definition, context) => {\n const ajv = new Ajv({\n allErrors: true,\n removeAdditional: false,\n strict: true,\n });\n addFormats.default(ajv);\n try {\n ajv.compile(definition.schemaJson);\n } catch {\n context.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n \"schemaJson must be an executable JSON Schema supported by SiteOS Forms.\",\n path: [\"schemaJson\"],\n });\n }\n const fields = definition.normalizedFieldsJson;\n\n const duplicateKeys = fields\n .map((field) => field.key)\n .filter((key, index, keys) => keys.indexOf(key) !== index);\n for (const key of new Set(duplicateKeys)) {\n context.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Field key \"${key}\" is registered more than once.`,\n path: [\"normalizedFieldsJson\"],\n });\n }\n\n const primaryFields = fields.filter(\n (field) => field.displayRole === \"primary\",\n );\n if (primaryFields.length !== 1) {\n context.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Exactly one managed field must use the primary display role.\",\n path: [\"normalizedFieldsJson\"],\n });\n }\n\n const schemaProperties = definition.schemaJson.properties;\n if (!isRecord(schemaProperties)) {\n context.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"schemaJson.properties must define the managed form fields.\",\n path: [\"schemaJson\", \"properties\"],\n });\n return;\n }\n\n const metadataKeys = new Set(fields.map((field) => field.key));\n for (const key of Object.keys(schemaProperties)) {\n if (!metadataKeys.has(key)) {\n context.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Schema field \"${key}\" is missing managed field metadata.`,\n path: [\"normalizedFieldsJson\"],\n });\n }\n }\n\n for (const [index, field] of fields.entries()) {\n if (!Object.prototype.hasOwnProperty.call(schemaProperties, field.key)) {\n context.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Managed field \"${field.key}\" is missing from schemaJson.properties.`,\n path: [\"normalizedFieldsJson\", index, \"key\"],\n });\n }\n }\n\n const primaryField = primaryFields[0];\n const requiredFields = definition.schemaJson.required;\n if (\n primaryField &&\n (!Array.isArray(requiredFields) ||\n !requiredFields.includes(primaryField.key))\n ) {\n context.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Primary display field \"${primaryField.key}\" must be required by schemaJson.`,\n path: [\"schemaJson\", \"required\"],\n });\n }\n });\n\nconst definitionManifestSchema = z.object({\n version: z.literal(1),\n forms: z.array(z.string().trim().min(1)).min(1),\n});\n\nconst submitInputSchema = z\n .object({\n formKey: z.string().trim().min(1),\n idempotencyKey: z.string().trim().min(1),\n ipAddress: z.string().trim().min(1).optional(),\n payload: z.record(z.unknown()),\n sourceUrl: z.string().trim().min(1).optional(),\n userAgent: z.string().trim().min(1).optional(),\n })\n .passthrough();\n\nconst environmentNameSchema = z\n .string()\n .transform((value) => value.trim())\n .refine((value) => value.length >= 1 && value.length <= 255);\n\nconst projectSlugSchema = z\n .string()\n .trim()\n .min(1)\n .max(120)\n .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/);\n\nexport const FORMS_HELP = `Usage:\n siteos forms project list [--json]\n siteos forms project create --slug <slug> --name <name> [--json]\n siteos forms project use <slug> [--replace] [--json]\n siteos forms project status [--json]\n siteos forms environment list [--json]\n siteos forms environment create --slug <slug> --name <name> [--json]\n siteos forms definition sync --environment <slug> --input <path> [--json]\n siteos forms definition sync --environment <slug> --manifest <path> [--json]\n siteos forms definition list --environment <slug> [--status <active|inactive|all>] [--json]\n siteos forms definition read --environment <slug> --form <form-id> [--json]\n siteos forms definition archive --environment <slug> --form <form-id> --expected-revision <revision> [--json]\n siteos forms definition restore --environment <slug> --form <form-id> --expected-revision <revision> [--json]\n siteos forms definition delete --environment <slug> --form <form-id> [--apply --confirm <form-key> --expected-revision <revision> --expected-submissions <count>] [--json]\n siteos forms definition check --input <path> [--json]\n siteos forms definition check --manifest <path> [--json]\n siteos forms credential list --environment <slug> [--json]\n siteos forms credential issue --environment <slug> --install [--name <name>] [--json]\n siteos forms credential rotate --environment <slug> --install [--name <name>] [--json]\n siteos forms credential revoke --environment <slug> --credential <credential-id> [--json]\n siteos forms credentials issue --environment <slug> [--name <name>] [--json]\n siteos forms submissions list --environment <slug> --form <form-id> [--query <text>] [--status <status>] [--from <ISO>] [--to <ISO>] [--limit <1-100>] [--cursor <cursor>] [--json]\n siteos forms submissions read --environment <slug> --form <form-id> --submission <id> [--json]\n siteos forms submissions status --environment <slug> --form <form-id> --submission <id> --status <new|read|archived|spam> --expected-status <status> [--json]\n siteos forms deploy --manifest <path> [--json]\n siteos forms deployment-key issue --environment <slug> --install [--name <name>] [--json]\n siteos forms deployment-key list --environment <slug> [--json]\n siteos forms deployment-key revoke --environment <slug> --credential <id> [--json]\n siteos forms submit --input <path> [--json]\n\nManage SiteOS Forms Environments, definitions, credentials, and submission smoke tests.`;\n\nexport type FormsCommandResult = {\n exitCode: number;\n stderr?: string;\n stdout?: string;\n};\n\ntype FlagValue = boolean | string;\n\ntype ParsedFlags =\n | {\n flags: Map<string, FlagValue>;\n ok: true;\n positionals: string[];\n }\n | {\n error: string;\n ok: false;\n };\n\ntype SubmissionFormsContext =\n | {\n commonProjectId?: string;\n apiBaseUrl: string;\n ok: true;\n organization: {\n id?: string;\n name?: string;\n slug?: string;\n };\n project: {\n id?: string;\n name?: string;\n slug?: string;\n };\n credential: string;\n }\n | {\n error: FormsCommandResult;\n ok: false;\n };\n\ntype FormsManagementScope = \"forms:credential:manage\" | \"forms:workspace:write\";\n\ntype FormsManagementContext = {\n commonProjectId?: string;\n apiBaseUrl: string;\n client: ReturnType<typeof createSiteOSFormsApiClient>;\n grant: string;\n ok: true;\n organization: { id: string };\n project: { id: string; name: string; slug: string };\n rootDir: string;\n};\n\ntype FormDefinition = z.infer<typeof definitionSyncInputSchema>;\n\ntype LoadedFormDefinition = {\n path: string;\n value: FormDefinition;\n};\n\ntype DefinitionSource =\n | {\n path: string;\n type: \"input\";\n }\n | {\n path: string;\n type: \"manifest\";\n };\n\nexport async function runFormsCommand(options: {\n args: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n prepareCredentialInstallation?: typeof prepareSiteOSFormsCredentialInstallation;\n projectBindingStore?: ProjectBindingStore;\n serviceGrantProvider?: ServiceGrantProvider;\n}): Promise<FormsCommandResult> {\n let args = options.args;\n\n if (args.length === 0 || args.some((arg) => HELP_FLAGS.has(arg))) {\n return {\n exitCode: 0,\n stdout: FORMS_HELP,\n };\n }\n\n if (args[0] === \"deploy\")\n return runDeployment({ ...options, args: args.slice(1) });\n\n if (args[0] !== \"submit\" && args[0] !== \"project\") {\n try {\n args = await commonEnvironmentArguments(options, \"forms\", args);\n } catch (error) {\n return {\n exitCode: 1,\n stderr:\n error instanceof Error\n ? error.message\n : \"Environment could not be selected.\",\n };\n }\n }\n\n if (args[0] === \"submissions\")\n return runSubmissionsCommand({ ...options, args: args.slice(1) });\n\n if (args[0] === \"definition\") {\n return runDefinitionCommand({\n ...options,\n args: args.slice(1),\n });\n }\n\n if (args[0] === \"environment\") {\n return runEnvironmentCommand({\n ...options,\n args: args.slice(1),\n });\n }\n\n if (args[0] === \"project\") {\n return runProjectCommand({\n ...options,\n args: args.slice(1),\n });\n }\n\n if (args[0] === \"submit\") {\n return runSubmit({\n ...options,\n args: args.slice(1),\n });\n }\n\n if (args[0] === \"deployment-key\") {\n return runCredentialCommand({\n ...options,\n args: args.slice(1),\n deployment: true,\n });\n }\n\n if (args[0] === \"credential\") {\n return runCredentialCommand({\n ...options,\n args: args.slice(1),\n });\n }\n\n if (args[0] === \"credentials\" && args[1] === \"issue\") {\n const compatibilityArgs = args.slice(2);\n return runCredentialCommand({\n ...options,\n args: [\n \"issue\",\n ...compatibilityArgs,\n ...(compatibilityArgs.includes(INSTALL_FLAG) ? [] : [INSTALL_FLAG]),\n ],\n });\n }\n\n return usageError(\"Unknown SiteOS forms command.\");\n}\n\nasync function runSubmissionsCommand(\n options: Parameters<typeof runFormsCommand>[0],\n): Promise<FormsCommandResult> {\n const action = options.args[0];\n if (!action || ![\"list\", \"read\", \"status\"].includes(action))\n return usageError(\"Unknown Forms submissions command.\");\n const parsed = parseFlags(options.args.slice(1), {\n allowed: new Set([\n \"--environment\",\n \"--form\",\n \"--json\",\n ...(action === \"list\"\n ? [\"--query\", \"--status\", \"--from\", \"--to\", \"--limit\", \"--cursor\"]\n : [\n \"--submission\",\n ...(action === \"status\" ? [\"--status\", \"--expected-status\"] : []),\n ]),\n ]),\n boolean: new Set([\"--json\"]),\n rejectDuplicates: true,\n });\n if (!parsed.ok) return usageError(parsed.error);\n if (parsed.positionals.length)\n return usageError(\"Unexpected positional arguments.\");\n const value = (key: string) => readStringFlag(parsed.flags, `--${key}`);\n const environmentSlug = value(\"environment\");\n const formId = value(\"form\");\n const submissionId = value(\"submission\");\n if (\n !environmentSlug ||\n !isValidEnvironmentSlug(environmentSlug) ||\n !formId ||\n formId.length > 255\n )\n return usageError(\"Provide a valid --environment and --form.\");\n if (action !== \"list\" && (!submissionId || submissionId.length > 255))\n return usageError(\"Provide --submission.\");\n const status = formsSubmissionStatusSchema.safeParse(value(\"status\"));\n const expected = formsSubmissionStatusSchema.safeParse(\n value(\"expected-status\"),\n );\n if (\n (value(\"status\") && !status.success) ||\n (action === \"status\" && (!status.success || !expected.success))\n )\n return usageError(\n \"Use new, read, archived or spam for --status and --expected-status.\",\n );\n const filters = new URLSearchParams();\n for (const key of [\"query\", \"status\", \"from\", \"to\", \"limit\", \"cursor\"]) {\n const item = value(key);\n if (item) filters.set(key, item);\n }\n const limit = Number(value(\"limit\") ?? 50);\n if (!Number.isInteger(limit) || limit < 1 || limit > 100)\n return usageError(\"--limit must be between 1 and 100.\");\n if (\n (value(\"query\")?.length ?? 0) > 200 ||\n (value(\"cursor\")?.length ?? 0) > 2048\n )\n return usageError(\"The query or cursor is too long.\");\n for (const key of [\"from\", \"to\"])\n if (\n value(key) &&\n !z.string().datetime({ offset: true }).safeParse(value(key)).success\n )\n return usageError(\n `--${key} must be an ISO timestamp including a timezone.`,\n );\n if (\n value(\"from\") &&\n value(\"to\") &&\n Date.parse(value(\"from\")!) >= Date.parse(value(\"to\")!)\n )\n return usageError(\"--from must be earlier than --to (exclusive).\");\n const context = await loadFormsManagementContext(\n options,\n \"forms:workspace:write\",\n );\n if (!context.ok) return context.error;\n try {\n const { environments } = await context.client.listEnvironments({\n grant: context.grant,\n projectId: context.project.id,\n });\n requireEnvironmentProjectConvergence(environments, context.project.id);\n const environment = environments.find(\n (item) => item.slug === environmentSlug,\n );\n if (!environment)\n return usageError(\n \"The selected Forms Environment does not exist. Run forms environment list.\",\n );\n const input = {\n grant: context.grant,\n environmentId: environment.id,\n formId,\n };\n const response =\n action === \"list\"\n ? await context.client.listSubmissions({ ...input, filters })\n : action === \"read\"\n ? await context.client.readSubmission({\n ...input,\n submissionId: submissionId!,\n })\n : await context.client.updateSubmissionStatus({\n ...input,\n submissionId: submissionId!,\n status: status.data!,\n expectedStatus: expected.data!,\n });\n // Structured output preserves all answers and continuation cursors in either mode.\n return { exitCode: 0, stdout: stringifySafeJson(response) };\n } catch (error) {\n return formatApiError(error);\n }\n}\n\nasync function runProjectCommand(options: {\n args: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n projectBindingStore?: ProjectBindingStore;\n serviceGrantProvider?: ServiceGrantProvider;\n}): Promise<FormsCommandResult> {\n const action = options.args[0];\n if (!action || ![\"create\", \"list\", \"status\", \"use\"].includes(action)) {\n return usageError(\"Unknown SiteOS forms project command.\");\n }\n const parsed = parseProjectFlags(action, options.args.slice(1));\n if (!parsed.ok) return parsed.error;\n if (!options.fetchImpl) {\n return formatApiError(\n new SiteOSFormsApiError({\n code: \"FORMS_UNAVAILABLE\",\n message: \"SiteOS Forms access is unavailable in this runtime.\",\n }),\n );\n }\n\n try {\n const apiBaseUrl = resolveSiteOSFormsBaseUrl(options.env);\n const grant = await serviceGrantProvider(options).acquire({\n audience: \"siteos-forms\",\n scopes: [\"forms:workspace:write\"],\n });\n requireGrant(grant, \"forms:workspace:write\");\n const client = createSiteOSFormsApiClient({\n apiBaseUrl,\n fetchImpl: options.fetchImpl,\n });\n\n if (action === \"list\") {\n const response = await client.listProjects({ grant: grant.accessToken });\n requireProjectOrganization(response.projects, grant.grant.organizationId);\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson(response)\n : formatProjectListOutput(response.projects),\n };\n }\n\n if (action === \"create\") {\n const response = await client.createProject({\n grant: grant.accessToken,\n name: parsed.name!,\n slug: parsed.slug!,\n });\n requireProjectOrganization(\n [response.project],\n grant.grant.organizationId,\n );\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson(response)\n : [\n \"SiteOS Forms Project created.\",\n `Project: ${response.project.slug}`,\n `Name: ${response.project.name}`,\n \"Run `siteos forms project use \" +\n response.project.slug +\n \"` to select it for this repository.\",\n ].join(\"\\n\"),\n };\n }\n\n const reference = await inspectFormsProjectReference(\n options.cwd ?? process.cwd(),\n );\n const store = projectBindingStore(options);\n const locator = {\n apiOrigin: apiBaseUrl,\n repositoryRoot: reference.rootDir,\n service: \"forms\" as const,\n };\n\n if (action === \"use\") {\n const response = await client.listProjects({ grant: grant.accessToken });\n requireProjectOrganization(response.projects, grant.grant.organizationId);\n const matches = response.projects.filter(\n (project) => project.slug === parsed.slug,\n );\n if (matches.length !== 1) {\n throw new SiteOSFormsApiError({\n code: matches.length === 0 ? \"PROJECT_NOT_FOUND\" : \"INVALID_RESPONSE\",\n message:\n matches.length === 0\n ? \"The Forms Project was not found.\"\n : \"SiteOS Forms returned an invalid response.\",\n status: matches.length === 0 ? 404 : undefined,\n });\n }\n const project = matches[0]!;\n if (\n reference.status === \"loaded\" &&\n reference.reference.project.slug !== project.slug &&\n !parsed.replace\n ) {\n throw new FormsProjectReferenceError(\n \"FORMS_PROJECT_REFERENCE_CONFLICT\",\n \"A different Forms Project is already selected. Use --replace to replace it.\",\n );\n }\n\n const previousBinding = await store.read(locator);\n await store.write({\n ...locator,\n organizationId: grant.grant.organizationId,\n project: { id: project.id, slug: project.slug },\n });\n try {\n await writeFormsProjectReference({\n expectedChecksum:\n reference.status === \"loaded\" ? reference.checksum : null,\n project: { name: project.name, slug: project.slug },\n rootDir: reference.rootDir,\n });\n } catch (error) {\n if (previousBinding) await store.write(previousBinding);\n else await store.remove(locator);\n throw error;\n }\n\n const output = {\n apiOrigin: apiBaseUrl,\n organizationId: grant.grant.organizationId,\n project,\n referencePath: path.join(\n reference.rootDir,\n \".siteos\",\n \"forms\",\n \"project.json\",\n ),\n };\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson(output)\n : [\n \"SiteOS Forms Project selected.\",\n `Project: ${project.slug}`,\n `Reference: ${output.referencePath}`,\n ].join(\"\\n\"),\n };\n }\n\n if (reference.status === \"missing\") {\n throw new FormsProjectReferenceError(\n \"FORMS_PROJECT_REFERENCE_REQUIRED\",\n \"Select a Forms Project for this repository first.\",\n );\n }\n const binding = await store.read(locator);\n if (!binding) {\n throw new FormsProjectReferenceError(\n \"FORMS_PROJECT_REFERENCE_REQUIRED\",\n \"Select a Forms Project for this repository first.\",\n );\n }\n if (\n binding.organizationId !== grant.grant.organizationId ||\n binding.project.slug !== reference.reference.project.slug\n ) {\n throw new FormsProjectReferenceError(\n \"FORMS_PROJECT_REFERENCE_INVALID\",\n \"The Forms Project reference and private binding do not match.\",\n );\n }\n const projects = await client.listProjects({ grant: grant.accessToken });\n requireProjectOrganization(projects.projects, grant.grant.organizationId);\n const project = projects.projects.find(\n (candidate) => candidate.id === binding.project.id,\n );\n if (!project || project.slug !== binding.project.slug) {\n throw new SiteOSFormsApiError({\n code: \"PROJECT_NOT_FOUND\",\n message: \"The Forms Project was not found.\",\n status: 404,\n });\n }\n const output = {\n apiOrigin: apiBaseUrl,\n connected: true,\n organizationId: binding.organizationId,\n project,\n repositoryRoot: reference.rootDir,\n };\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson(output)\n : [\n \"SiteOS Forms Project connection is valid.\",\n `Project: ${project.slug}`,\n `Organization: ${binding.organizationId}`,\n `API: ${apiBaseUrl}`,\n ].join(\"\\n\"),\n };\n } catch (error) {\n return formatProjectError(error);\n }\n}\n\nasync function runEnvironmentCommand(options: {\n args: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n projectBindingStore?: ProjectBindingStore;\n serviceGrantProvider?: ServiceGrantProvider;\n}): Promise<FormsCommandResult> {\n const action = options.args[0];\n if (!action || ![\"create\", \"list\"].includes(action)) {\n return usageError(\"Unknown SiteOS forms environment command.\");\n }\n\n const parsed = parseEnvironmentFlags(action, options.args.slice(1));\n if (!parsed.ok) return parsed.error;\n const context = await loadFormsManagementContext(\n options,\n \"forms:workspace:write\",\n );\n if (!context.ok) return context.error;\n\n try {\n if (action === \"list\") {\n const response = await context.client.listEnvironments({\n grant: context.grant,\n projectId: context.project.id,\n });\n requireEnvironmentProjectConvergence(\n response.environments,\n context.project.id,\n );\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson(response)\n : formatEnvironmentListOutput(response.environments),\n };\n }\n\n const response = await context.client.createEnvironment({\n grant: context.grant,\n name: parsed.name!,\n projectId: context.project.id,\n slug: parsed.slug!,\n });\n requireEnvironmentProjectConvergence(\n [response.environment],\n context.project.id,\n );\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson(response)\n : [\n \"SiteOS Forms Environment created.\",\n `Environment: ${response.environment.slug}`,\n `Name: ${response.environment.name}`,\n `Project: ${response.environment.projectId}`,\n ].join(\"\\n\"),\n };\n } catch (error) {\n return formatApiError(error);\n }\n}\n\nasync function runCredentialCommand(options: {\n deployment?: boolean;\n args: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n prepareCredentialInstallation?: typeof prepareSiteOSFormsCredentialInstallation;\n projectBindingStore?: ProjectBindingStore;\n serviceGrantProvider?: ServiceGrantProvider;\n}): Promise<FormsCommandResult> {\n const action = options.args[0];\n if (!action || ![\"issue\", \"list\", \"revoke\", \"rotate\"].includes(action)) {\n return usageError(\"Unknown SiteOS forms credential command.\");\n }\n if (options.deployment && action === \"rotate\")\n return usageError(\n \"Issue a new deployment key, update the release secret, then revoke the old key.\",\n );\n const variable = options.deployment\n ? SITEOS_FORMS_DEPLOYMENT_KEY_ENV\n : SITEOS_FORMS_SUBMISSION_CREDENTIAL_ENV;\n const parsed = parseCredentialFlags(action, options.args.slice(1));\n if (!parsed.ok) return parsed.error;\n\n const context = await loadCredentialManagementContext({\n ...options,\n install: parsed.install,\n });\n if (!context.ok) return context.error;\n\n try {\n if (action === \"list\") {\n const response = await context.client.listCredentials({\n environmentSlug: parsed.environmentSlug,\n grant: context.grant,\n projectId: context.project.id,\n });\n const output = {\n credentials: response.tokens,\n environment: parsed.environmentSlug,\n };\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson(output)\n : formatCredentialListOutput(output),\n };\n }\n\n if (action === \"revoke\") {\n const credential = await context.client.revokeCredential({\n credentialId: parsed.credentialId!,\n environmentSlug: parsed.environmentSlug,\n grant: context.grant,\n projectId: context.project.id,\n });\n const output = {\n credential,\n environment: parsed.environmentSlug,\n revoked: true,\n };\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson(output)\n : `SiteOS Forms credential revoked.\\nCredential: ${credential.id}\\nEnvironment: ${parsed.environmentSlug}`,\n };\n }\n\n const previousCredentials =\n action === \"rotate\"\n ? (\n await context.client.listCredentials({\n environmentSlug: parsed.environmentSlug,\n grant: context.grant,\n projectId: context.project.id,\n })\n ).tokens.filter((credential) => credential.status === \"active\")\n : [];\n const exchange = await context.client.issueCredential({\n environmentSlug: parsed.environmentSlug,\n grant: context.grant,\n name: parsed.name,\n projectId: context.project.id,\n });\n await context.installation!.install(exchange.token);\n if (action === \"rotate\") {\n await Promise.all(\n previousCredentials.map((credential) =>\n context.client.revokeCredential({\n credentialId: credential.id,\n environmentSlug: parsed.environmentSlug,\n grant: context.grant,\n projectId: context.project.id,\n }),\n ),\n );\n }\n const { token: _token, ...credential } = exchange;\n const output = {\n credential,\n environment: parsed.environmentSlug,\n installed: {\n variable,\n },\n operation: action === \"issue\" ? \"issued\" : \"rotated\",\n };\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson(output)\n : [\n `SiteOS Forms credential ${output.operation} and installed.`,\n `Credential: ${credential.id}`,\n `Environment: ${parsed.environmentSlug}`,\n `Variable: ${variable}`,\n ].join(\"\\n\"),\n };\n } catch (error) {\n return formatCredentialError(error);\n }\n}\n\nasync function loadCredentialManagementContext(options: {\n deployment?: boolean;\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n install: boolean;\n prepareCredentialInstallation?: typeof prepareSiteOSFormsCredentialInstallation;\n projectBindingStore?: ProjectBindingStore;\n serviceGrantProvider?: ServiceGrantProvider;\n}): Promise<\n | {\n client: ReturnType<typeof createSiteOSFormsApiClient>;\n grant: string;\n installation?: SiteOSFormsCredentialInstallation;\n ok: true;\n project: { id: string; name: string; slug: string };\n }\n | { error: FormsCommandResult; ok: false }\n> {\n try {\n const local = await readLocalCommonProject(options);\n const rootDir =\n local?.rootDir ??\n (await requireFormsProjectReference(options.cwd ?? process.cwd()))\n .rootDir;\n const installation = options.install\n ? await (\n options.prepareCredentialInstallation ??\n prepareSiteOSFormsCredentialInstallation\n )({\n projectRoot: rootDir,\n ...(options.deployment ? { deployment: true } : {}),\n })\n : undefined;\n const context = await loadFormsManagementContext(\n options,\n \"forms:credential:manage\",\n );\n if (!context.ok) return context;\n return {\n client: options.deployment\n ? createSiteOSFormsApiClient({\n apiBaseUrl: context.apiBaseUrl,\n fetchImpl: options.fetchImpl ?? fetch,\n deploymentKeys: true,\n })\n : context.client,\n grant: context.grant,\n ...(installation ? { installation } : {}),\n ok: true,\n project: context.project,\n };\n } catch (error) {\n return { error: formatCredentialError(error), ok: false };\n }\n}\n\nasync function loadFormsManagementContext(\n options: {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n projectBindingStore?: ProjectBindingStore;\n serviceGrantProvider?: ServiceGrantProvider;\n },\n scope: FormsManagementScope,\n): Promise<FormsManagementContext | { error: FormsCommandResult; ok: false }> {\n try {\n const common = await commonServiceContext(options, \"forms\");\n if (common) {\n if (!options.fetchImpl)\n throw new SiteOSAuthApiError({\n code: \"AUTH_UNAVAILABLE\",\n message: \"SiteOS API access is unavailable.\",\n });\n const grant = await serviceGrantProvider(options).acquire({\n audience: \"siteos-forms\",\n scopes: [scope],\n });\n requireGrant(grant, scope);\n if (grant.grant.organizationId !== common.overview.project.organizationId)\n throw new SiteOSAuthApiError({\n code: \"PROJECT_ORGANIZATION_MISMATCH\",\n message:\n \"The Project and service grant belong to different organizations.\",\n });\n return {\n commonProjectId: common.overview.project.id,\n apiBaseUrl: common.api.origin,\n client: createSiteOSFormsApiClient({\n apiBaseUrl: common.api.origin,\n fetchImpl: options.fetchImpl,\n }),\n grant: grant.accessToken,\n ok: true,\n organization: { id: common.overview.project.organizationId },\n project: {\n id: common.resourceId,\n name: common.overview.project.name,\n slug: common.overview.project.slug,\n },\n rootDir: common.rootDir,\n };\n }\n\n const reference = await requireFormsProjectReference(\n options.cwd ?? process.cwd(),\n );\n if (!options.fetchImpl) {\n throw new SiteOSFormsApiError({\n code: \"FORMS_UNAVAILABLE\",\n message: \"SiteOS Forms access is unavailable in this runtime.\",\n });\n }\n const apiBaseUrl = resolveSiteOSFormsBaseUrl(options.env);\n\n const binding = await projectBindingStore(options).read({\n apiOrigin: apiBaseUrl,\n repositoryRoot: reference.rootDir,\n service: \"forms\",\n });\n if (!binding) {\n throw new FormsProjectReferenceError(\n \"FORMS_PROJECT_REFERENCE_REQUIRED\",\n \"Select a Forms Project for this repository first.\",\n );\n }\n\n const grant = await serviceGrantProvider(options).acquire({\n audience: \"siteos-forms\",\n scopes: [scope],\n });\n if (\n grant.grant.audience !== \"siteos-forms\" ||\n grant.grant.scopes.length !== 1 ||\n grant.grant.scopes[0] !== scope\n ) {\n throw new SiteOSAuthApiError({\n code: \"AUTH_INVALID_RESPONSE\",\n message: \"The SiteOS Auth service returned an invalid response.\",\n });\n }\n\n if (\n grant.grant.organizationId !== binding.organizationId ||\n binding.project.slug !== reference.reference.project.slug\n ) {\n throw new SiteOSAuthApiError({\n code: \"AUTH_INVALID_RESPONSE\",\n message:\n \"The selected Forms Project does not match this Auth Organization.\",\n });\n }\n return {\n apiBaseUrl,\n client: createSiteOSFormsApiClient({\n apiBaseUrl,\n fetchImpl: options.fetchImpl,\n }),\n grant: grant.accessToken,\n ok: true,\n organization: { id: binding.organizationId },\n project: {\n id: binding.project.id,\n name: reference.reference.project.name,\n slug: binding.project.slug,\n },\n rootDir: reference.rootDir,\n };\n } catch (error) {\n return { error: formatManagementContextError(error), ok: false };\n }\n}\n\nasync function requireFormsProjectReference(\n cwd: string,\n): Promise<\n Extract<\n Awaited<ReturnType<typeof inspectFormsProjectReference>>,\n { status: \"loaded\" }\n >\n> {\n const reference = await inspectFormsProjectReference(cwd);\n if (reference.status === \"missing\") {\n throw new FormsProjectReferenceError(\n \"FORMS_PROJECT_REFERENCE_REQUIRED\",\n \"Select a Forms Project for this repository first.\",\n );\n }\n return reference;\n}\n\nasync function runDefinitionCommand(options: {\n args: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n projectBindingStore?: ProjectBindingStore;\n serviceGrantProvider?: ServiceGrantProvider;\n}): Promise<FormsCommandResult> {\n if (\n [\"list\", \"read\", \"archive\", \"restore\", \"delete\"].includes(\n options.args[0] ?? \"\",\n )\n )\n return runDefinitionLifecycle(options);\n if (options.args[0] === \"sync\") {\n return runDefinitionSync({\n ...options,\n args: options.args.slice(1),\n });\n }\n\n if (options.args[0] === \"check\") {\n return runDefinitionCheck({\n ...options,\n args: options.args.slice(1),\n });\n }\n\n return usageError(\"Unknown SiteOS forms definition command.\");\n}\n\nasync function runDefinitionLifecycle(\n options: Parameters<typeof runFormsCommand>[0],\n): Promise<FormsCommandResult> {\n const action = options.args[0]!;\n const parsed = parseFlags(options.args.slice(1), {\n allowed: new Set([\n \"--environment\",\n \"--json\",\n ...(action === \"list\" ? [\"--status\"] : [\"--form\"]),\n ...([\"archive\", \"restore\", \"delete\"].includes(action)\n ? [\"--expected-revision\"]\n : []),\n ...(action === \"delete\"\n ? [\"--apply\", \"--confirm\", \"--expected-submissions\"]\n : []),\n ]),\n boolean: new Set([\"--json\", \"--apply\"]),\n rejectDuplicates: true,\n });\n if (!parsed.ok) return usageError(parsed.error);\n if (parsed.positionals.length)\n return usageError(\"Unexpected positional arguments.\");\n const value = (key: string) => readStringFlag(parsed.flags, `--${key}`);\n const environmentSlug = value(\"environment\");\n const formId = value(\"form\");\n if (\n !environmentSlug ||\n !isValidEnvironmentSlug(environmentSlug) ||\n (action !== \"list\" && (!formId || formId.length > 255))\n )\n return usageError(\"Provide a valid --environment and --form.\");\n const status = value(\"status\") ?? \"active\";\n if (![\"active\", \"inactive\", \"all\"].includes(status))\n return usageError(\"Use active, inactive or all for --status.\");\n const apply = parsed.flags.get(\"--apply\") === true;\n const revision = Number(value(\"expected-revision\"));\n const count = Number(value(\"expected-submissions\"));\n const confirmKey = value(\"confirm\");\n if (\n (action === \"archive\" || action === \"restore\" || apply) &&\n (!Number.isSafeInteger(revision) || revision < 1)\n )\n return usageError(\n \"Read the form first, then provide its --expected-revision.\",\n );\n if (\n apply &&\n (!confirmKey ||\n confirmKey.length > 255 ||\n !Number.isSafeInteger(count) ||\n count < 0)\n )\n return usageError(\n \"Deletion requires --confirm with the exact form key and --expected-submissions from the preview.\",\n );\n if (\n action === \"delete\" &&\n !apply &&\n [\"confirm\", \"expected-revision\", \"expected-submissions\"].some(\n (key) => value(key) !== undefined,\n )\n )\n return usageError(\n \"Delete is a read-only preview. Add --apply with all confirmation values to delete.\",\n );\n const context = await loadFormsManagementContext(\n options,\n \"forms:workspace:write\",\n );\n if (!context.ok) return context.error;\n try {\n const { environments } = await context.client.listEnvironments({\n grant: context.grant,\n projectId: context.project.id,\n });\n requireEnvironmentProjectConvergence(environments, context.project.id);\n const environment = environments.find(\n (item) => item.slug === environmentSlug,\n );\n if (!environment)\n return usageError(\n \"The selected Forms Environment does not exist. Run forms environment list.\",\n );\n const input = {\n grant: context.grant,\n environmentId: environment.id,\n formId: formId ?? \"\",\n };\n if (action === \"list\")\n return {\n exitCode: 0,\n stdout: stringifySafeJson(\n await context.client.listDefinitions({\n ...input,\n status: status as \"active\" | \"inactive\" | \"all\",\n }),\n ),\n };\n if (action === \"read\" || (action === \"delete\" && !apply)) {\n const preview = await context.client.readDefinition(input);\n if (\n preview.project.id !== context.project.id ||\n preview.environment.id !== environment.id ||\n preview.definition.id !== formId ||\n preview.definition.environmentId !== environment.id\n )\n throw new SiteOSFormsApiError({\n code: \"INVALID_RESPONSE\",\n message:\n \"The form does not match the selected Project and Environment.\",\n });\n return {\n exitCode: 0,\n stdout: stringifySafeJson(\n action === \"read\"\n ? preview\n : {\n ...preview,\n action: \"delete\",\n applied: false,\n warning:\n \"Permanently removes this form, all versions and all submitted answers. This cannot be undone. The form key remains reserved.\",\n confirmation: {\n confirmKey: preview.definition.formKey,\n expectedRevision: preview.revision,\n expectedSubmissionCount: preview.definition.submissionCount,\n },\n },\n ),\n };\n }\n const response = await context.client.changeDefinition({\n ...input,\n change:\n action === \"delete\"\n ? {\n action,\n confirmKey: confirmKey!,\n expectedRevision: revision,\n expectedSubmissionCount: count,\n }\n : {\n action: action as \"archive\" | \"restore\",\n expectedRevision: revision,\n },\n });\n return {\n exitCode: 0,\n stdout: stringifySafeJson({ ...response, action, applied: true }),\n };\n } catch (error) {\n return formatApiError(error);\n }\n}\n\nasync function runDefinitionSync(options: {\n args: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n projectBindingStore?: ProjectBindingStore;\n serviceGrantProvider?: ServiceGrantProvider;\n}): Promise<FormsCommandResult> {\n const parsed = parseDefinitionSourceFlags(options.args, {\n environmentRequired: true,\n usage:\n \"Usage: siteos forms definition sync --environment <slug> (--input <path> | --manifest <path>) [--json]\",\n });\n if (!parsed.ok) {\n return parsed.error;\n }\n\n const loaded = await loadFormDefinitions({\n cwd: options.cwd,\n source: parsed.source,\n });\n if (!loaded.ok) {\n return loaded.error;\n }\n\n const json = parsed.json;\n return runWithFormsManagementClient(\n options,\n \"forms:workspace:write\",\n async ({ client, context }) => {\n const definitions = [];\n for (const definition of loaded.definitions) {\n const response = await client.syncDefinition({\n body: definition.value,\n environmentSlug: parsed.environmentSlug!,\n grant: context.grant,\n projectId: context.project.id,\n });\n definitions.push({\n definition: response,\n formKey:\n readOutputString(response.formKey) ?? definition.value.formKey,\n path: definition.path,\n ui: createFormsUiOutput({\n context,\n }),\n });\n }\n\n const output =\n parsed.source.type === \"input\"\n ? {\n ...definitions[0],\n project: context.project,\n }\n : {\n definitions,\n manifest: parsed.source.path,\n project: context.project,\n };\n\n return {\n exitCode: 0,\n stdout: json\n ? stringifySafeJson(output)\n : formatDefinitionSyncOutput(definitions),\n };\n },\n );\n}\n\nasync function runDefinitionCheck(options: {\n args: string[];\n cwd?: string;\n}): Promise<FormsCommandResult> {\n const parsed = parseDefinitionSourceFlags(options.args, {\n usage:\n \"Usage: siteos forms definition check (--input <path> | --manifest <path>) [--json]\",\n });\n if (!parsed.ok) return parsed.error;\n\n const loaded = await loadFormDefinitions({\n cwd: options.cwd,\n source: parsed.source,\n });\n if (!loaded.ok) return loaded.error;\n\n const output = {\n count: loaded.definitions.length,\n forms: loaded.definitions.map((definition) => ({\n formKey: definition.value.formKey,\n path: definition.path,\n })),\n success: true,\n };\n\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson(output)\n : [\n \"SiteOS form definitions are valid.\",\n `Forms: ${output.count}`,\n ...output.forms.map((form) => `- ${form.formKey}: ${form.path}`),\n ].join(\"\\n\"),\n };\n}\n\nasync function runSubmit(options: {\n args: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n projectBindingStore?: ProjectBindingStore;\n}): Promise<FormsCommandResult> {\n const parsed = parseInputFlags(options.args, {\n usage: \"Usage: siteos forms submit --input <path> [--json]\",\n });\n if (!parsed.ok) {\n return parsed.error;\n }\n\n const input = await readInputFile({\n cwd: options.cwd,\n inputPath: parsed.inputPath,\n schema: submitInputSchema,\n });\n if (!input.ok) {\n return input.error;\n }\n\n const json = parsed.json;\n return runWithSubmissionClient(options, async ({ client, context }) => {\n const response = await client.submitForm({\n body: input.value,\n credential: context.credential,\n });\n const output = {\n formKey: input.value.formKey,\n project: context.project,\n submission: response,\n ui: createFormsUiOutput({\n context,\n }),\n };\n\n return {\n exitCode: 0,\n stdout: json\n ? stringifySafeJson(output)\n : [\n \"SiteOS form submission smoke test completed.\",\n `Form: ${input.value.formKey}`,\n readOutputString(response.submissionId)\n ? `Submission: ${readOutputString(response.submissionId)}`\n : undefined,\n readOutputString(response.receivedAt)\n ? `Received at: ${readOutputString(response.receivedAt)}`\n : undefined,\n output.ui\n ? `View submissions in SiteOS (optional): ${output.ui.url}`\n : undefined,\n ]\n .filter((line): line is string => Boolean(line))\n .join(\"\\n\"),\n };\n });\n}\n\nasync function runWithFormsManagementClient(\n options: {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n projectBindingStore?: ProjectBindingStore;\n serviceGrantProvider?: ServiceGrantProvider;\n },\n scope: FormsManagementScope,\n run: (input: {\n client: ReturnType<typeof createSiteOSFormsApiClient>;\n context: FormsManagementContext;\n }) => Promise<FormsCommandResult>,\n): Promise<FormsCommandResult> {\n const context = await loadFormsManagementContext(options, scope);\n if (!context.ok) {\n return context.error;\n }\n\n try {\n return await run({ client: context.client, context });\n } catch (error) {\n return formatApiError(error);\n }\n}\n\nasync function runWithSubmissionClient(\n options: {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n projectBindingStore?: ProjectBindingStore;\n },\n run: (input: {\n client: ReturnType<typeof createSiteOSFormsApiClient>;\n context: Extract<SubmissionFormsContext, { ok: true }>;\n }) => Promise<FormsCommandResult>,\n): Promise<FormsCommandResult> {\n const context = await loadSubmissionFormsContext(options);\n if (!context.ok) return context.error;\n\n if (!options.fetchImpl) {\n return {\n exitCode: 1,\n stderr: \"SiteOS API access is unavailable in this runtime.\",\n };\n }\n\n try {\n return await run({\n client: createSiteOSFormsApiClient({\n apiBaseUrl: context.apiBaseUrl,\n fetchImpl: options.fetchImpl,\n }),\n context,\n });\n } catch (error) {\n return formatApiError(error);\n }\n}\n\nasync function loadSubmissionFormsContext(options: {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n projectBindingStore?: ProjectBindingStore;\n}): Promise<SubmissionFormsContext> {\n const credential =\n options.env?.[SITEOS_FORMS_SUBMISSION_CREDENTIAL_ENV]?.trim();\n if (!credential) {\n return {\n error: {\n exitCode: 1,\n stderr: `No SiteOS Forms submission credential found. Set ${SITEOS_FORMS_SUBMISSION_CREDENTIAL_ENV}.`,\n },\n ok: false,\n };\n }\n\n try {\n const common = await readLocalCommonProject(options);\n if (common)\n return {\n apiBaseUrl: common.api.origin,\n commonProjectId: common.binding.project.id,\n ok: true,\n organization: { id: common.binding.organizationId },\n project: { slug: common.binding.project.slug },\n credential,\n };\n const reference = await requireFormsProjectReference(\n options.cwd ?? process.cwd(),\n );\n const apiBaseUrl = resolveSiteOSFormsBaseUrl(options.env);\n const binding = await projectBindingStore(options).read({\n apiOrigin: apiBaseUrl,\n repositoryRoot: reference.rootDir,\n service: \"forms\",\n });\n if (!binding || binding.project.slug !== reference.reference.project.slug) {\n throw new FormsProjectReferenceError(\n binding\n ? \"FORMS_PROJECT_REFERENCE_INVALID\"\n : \"FORMS_PROJECT_REFERENCE_REQUIRED\",\n binding\n ? \"The Forms Project reference and private binding do not match.\"\n : \"Select a Forms Project for this repository first.\",\n );\n }\n return {\n apiBaseUrl,\n ok: true,\n organization: { id: binding.organizationId },\n project: {\n id: binding.project.id,\n name: reference.reference.project.name,\n slug: binding.project.slug,\n },\n credential,\n };\n } catch (error) {\n return { error: formatManagementContextError(error), ok: false };\n }\n}\n\nfunction formatAuthError(\n error: unknown,\n): Extract<SubmissionFormsContext, { ok: false }> {\n if (error instanceof SiteOSAuthApiError) {\n return {\n error: {\n exitCode: 1,\n stderr: [\n \"SiteOS Auth request failed.\",\n error.status ? `Status: ${error.status}` : undefined,\n `Code: ${error.code}`,\n error.message,\n ]\n .filter((line): line is string => Boolean(line))\n .join(\"\\n\"),\n },\n ok: false,\n };\n }\n return {\n error: {\n exitCode: 1,\n stderr: \"SiteOS Auth request failed.\",\n },\n ok: false,\n };\n}\n\nfunction parseProjectFlags(\n action: string,\n args: string[],\n):\n | {\n json: boolean;\n name?: string;\n ok: true;\n replace: boolean;\n slug?: string;\n }\n | { error: FormsCommandResult; ok: false } {\n const creates = action === \"create\";\n const uses = action === \"use\";\n const parsed = parseFlags(args, {\n allowed: new Set([\n JSON_FLAG,\n ...(creates ? [NAME_FLAG, SLUG_FLAG] : []),\n ...(uses ? [REPLACE_FLAG] : []),\n ]),\n boolean: new Set([JSON_FLAG, REPLACE_FLAG]),\n rejectDuplicates: true,\n });\n if (!parsed.ok) return { error: usageError(parsed.error), ok: false };\n\n if (uses) {\n if (parsed.positionals.length !== 1) {\n return {\n error: usageError(\"Project use requires exactly one Project slug.\"),\n ok: false,\n };\n }\n const slug = projectSlugSchema.safeParse(parsed.positionals[0]);\n if (!slug.success) {\n return { error: usageError(\"Project slug is invalid.\"), ok: false };\n }\n return {\n json: parsed.flags.has(JSON_FLAG),\n ok: true,\n replace: parsed.flags.has(REPLACE_FLAG),\n slug: slug.data,\n };\n }\n\n if (parsed.positionals.length > 0) {\n return {\n error: usageError(`Unexpected argument: ${parsed.positionals[0]}`),\n ok: false,\n };\n }\n if (!creates) {\n return {\n json: parsed.flags.has(JSON_FLAG),\n ok: true,\n replace: false,\n };\n }\n\n const slug = projectSlugSchema.safeParse(\n readStringFlag(parsed.flags, SLUG_FLAG),\n );\n const name = environmentNameSchema.safeParse(\n readStringFlag(parsed.flags, NAME_FLAG),\n );\n if (!slug.success) {\n return {\n error: usageError(\"--slug is required and must be valid.\"),\n ok: false,\n };\n }\n if (!name.success) {\n return {\n error: usageError(\"--name is required and must be valid.\"),\n ok: false,\n };\n }\n return {\n json: parsed.flags.has(JSON_FLAG),\n name: name.data,\n ok: true,\n replace: false,\n slug: slug.data,\n };\n}\n\nfunction parseCredentialFlags(\n action: string,\n args: string[],\n):\n | {\n credentialId?: string;\n environmentSlug: string;\n install: boolean;\n json: boolean;\n name?: string;\n ok: true;\n }\n | { error: FormsCommandResult; ok: false } {\n const installs = action === \"issue\" || action === \"rotate\";\n const revokes = action === \"revoke\";\n const parsed = parseFlags(args, {\n allowed: new Set([\n ENVIRONMENT_FLAG,\n JSON_FLAG,\n ...(installs ? [INSTALL_FLAG, NAME_FLAG] : []),\n ...(revokes ? [CREDENTIAL_FLAG] : []),\n ]),\n boolean: new Set([JSON_FLAG, INSTALL_FLAG]),\n rejectDuplicates: true,\n });\n if (!parsed.ok) return { error: usageError(parsed.error), ok: false };\n if (parsed.positionals.length > 0) {\n return {\n error: usageError(`Unexpected argument: ${parsed.positionals[0]}`),\n ok: false,\n };\n }\n\n const environmentSlug = readStringFlag(parsed.flags, ENVIRONMENT_FLAG);\n if (!environmentSlug) {\n return {\n error: usageError(\"--environment is required.\"),\n ok: false,\n };\n }\n if (!isValidEnvironmentSlug(environmentSlug)) {\n return {\n error: usageError(\"--environment must be a valid environment slug.\"),\n ok: false,\n };\n }\n if (installs && !parsed.flags.has(INSTALL_FLAG)) {\n return {\n error: usageError(\"--install is required for issue and rotate.\"),\n ok: false,\n };\n }\n const credentialId = readStringFlag(parsed.flags, CREDENTIAL_FLAG);\n if (revokes && !credentialId) {\n return {\n error: usageError(\"--credential is required for revoke.\"),\n ok: false,\n };\n }\n const name = readStringFlag(parsed.flags, NAME_FLAG);\n if (credentialId && credentialId.length > 255) {\n return {\n error: usageError(\"--credential is invalid.\"),\n ok: false,\n };\n }\n if (name && name.length > 255) {\n return {\n error: usageError(\"--name is invalid.\"),\n ok: false,\n };\n }\n\n return {\n ...(credentialId ? { credentialId } : {}),\n environmentSlug,\n install: installs,\n json: parsed.flags.has(JSON_FLAG),\n ...(name ? { name } : {}),\n ok: true,\n };\n}\n\nfunction parseEnvironmentFlags(\n action: string,\n args: string[],\n):\n | {\n json: boolean;\n name?: string;\n ok: true;\n slug?: string;\n }\n | { error: FormsCommandResult; ok: false } {\n const creates = action === \"create\";\n const parsed = parseFlags(args, {\n allowed: new Set([JSON_FLAG, ...(creates ? [NAME_FLAG, SLUG_FLAG] : [])]),\n boolean: new Set([JSON_FLAG]),\n rejectDuplicates: true,\n });\n if (!parsed.ok) return { error: usageError(parsed.error), ok: false };\n if (parsed.positionals.length > 0) {\n return {\n error: usageError(`Unexpected argument: ${parsed.positionals[0]}`),\n ok: false,\n };\n }\n\n if (!creates) {\n return { json: parsed.flags.has(JSON_FLAG), ok: true };\n }\n\n const slug = readStringFlag(parsed.flags, SLUG_FLAG);\n if (!slug) {\n return { error: usageError(\"--slug is required.\"), ok: false };\n }\n if (!isValidEnvironmentSlug(slug)) {\n return {\n error: usageError(\"--slug must be a valid environment slug.\"),\n ok: false,\n };\n }\n const name = readStringFlag(parsed.flags, NAME_FLAG);\n if (!name) {\n return { error: usageError(\"--name is required.\"), ok: false };\n }\n const parsedName = environmentNameSchema.safeParse(name);\n if (!parsedName.success) {\n return { error: usageError(\"--name is invalid.\"), ok: false };\n }\n return {\n json: parsed.flags.has(JSON_FLAG),\n name: parsedName.data,\n ok: true,\n slug,\n };\n}\n\nfunction parseDefinitionSourceFlags(\n args: string[],\n options: {\n environmentRequired?: boolean;\n usage: string;\n },\n):\n | {\n json: boolean;\n environmentSlug?: string;\n ok: true;\n source: DefinitionSource;\n }\n | {\n error: FormsCommandResult;\n ok: false;\n } {\n const parsed = parseFlags(args, {\n allowed: new Set([\n INPUT_FLAG,\n MANIFEST_FLAG,\n JSON_FLAG,\n ...(options.environmentRequired ? [ENVIRONMENT_FLAG] : []),\n ]),\n boolean: new Set([JSON_FLAG]),\n });\n if (!parsed.ok) {\n return {\n error: usageError(parsed.error),\n ok: false,\n };\n }\n if (parsed.positionals.length > 0) {\n return {\n error: usageError(options.usage),\n ok: false,\n };\n }\n\n const inputPath = readStringFlag(parsed.flags, INPUT_FLAG);\n const manifestPath = readStringFlag(parsed.flags, MANIFEST_FLAG);\n const environmentSlug = readStringFlag(parsed.flags, ENVIRONMENT_FLAG);\n if (options.environmentRequired && !environmentSlug) {\n return {\n error: usageError(\"--environment is required for definition sync.\"),\n ok: false,\n };\n }\n if (environmentSlug && !isValidEnvironmentSlug(environmentSlug)) {\n return {\n error: usageError(\"--environment must be a valid environment slug.\"),\n ok: false,\n };\n }\n if (Boolean(inputPath) === Boolean(manifestPath)) {\n return {\n error: usageError(\n \"Provide exactly one of --input <path> or --manifest <path>.\",\n ),\n ok: false,\n };\n }\n\n return {\n ...(environmentSlug ? { environmentSlug } : {}),\n json: parsed.flags.has(JSON_FLAG),\n ok: true,\n source: inputPath\n ? { path: inputPath, type: \"input\" }\n : { path: manifestPath!, type: \"manifest\" },\n };\n}\n\nasync function loadFormDefinitions(options: {\n cwd?: string;\n source: DefinitionSource;\n}): Promise<\n | {\n definitions: LoadedFormDefinition[];\n ok: true;\n }\n | {\n error: FormsCommandResult;\n ok: false;\n }\n> {\n if (options.source.type === \"input\") {\n const definition = await readInputFile({\n cwd: options.cwd,\n inputPath: options.source.path,\n schema: definitionSyncInputSchema,\n });\n if (!definition.ok) return definition;\n\n return {\n definitions: [\n {\n path: options.source.path,\n value: definition.value,\n },\n ],\n ok: true,\n };\n }\n\n const manifestPath = path.resolve(\n options.cwd ?? process.cwd(),\n options.source.path,\n );\n const manifest = await readInputFile({\n cwd: options.cwd,\n inputPath: options.source.path,\n schema: definitionManifestSchema,\n });\n if (!manifest.ok) return manifest;\n\n const manifestDirectory = path.dirname(manifestPath);\n const definitions: LoadedFormDefinition[] = [];\n for (const definitionPath of manifest.value.forms) {\n if (path.isAbsolute(definitionPath)) {\n return {\n error: usageError(\n `Manifest definition paths must be relative: ${definitionPath}`,\n ),\n ok: false,\n };\n }\n\n const resolvedPath = path.resolve(manifestDirectory, definitionPath);\n const relativePath = path.relative(manifestDirectory, resolvedPath);\n if (relativePath.startsWith(`..${path.sep}`) || relativePath === \"..\") {\n return {\n error: usageError(\n `Manifest definition paths must stay inside the manifest directory: ${definitionPath}`,\n ),\n ok: false,\n };\n }\n\n const definition = await readInputFile({\n inputPath: resolvedPath,\n schema: definitionSyncInputSchema,\n });\n if (!definition.ok) return definition;\n\n definitions.push({\n path: definitionPath,\n value: definition.value,\n });\n }\n\n const duplicateKeys = definitions\n .map((definition) => definition.value.formKey)\n .filter((key, index, keys) => keys.indexOf(key) !== index);\n if (duplicateKeys.length > 0) {\n return {\n error: usageError(\n `Manifest contains duplicate form keys: ${[...new Set(duplicateKeys)].join(\", \")}`,\n ),\n ok: false,\n };\n }\n\n return {\n definitions,\n ok: true,\n };\n}\n\nfunction parseInputFlags(\n args: string[],\n options: {\n usage: string;\n },\n):\n | {\n inputPath: string;\n json: boolean;\n ok: true;\n }\n | {\n error: FormsCommandResult;\n ok: false;\n } {\n const parsed = parseFlags(args, {\n allowed: new Set([INPUT_FLAG, JSON_FLAG]),\n boolean: new Set([JSON_FLAG]),\n });\n if (!parsed.ok) {\n return {\n error: usageError(parsed.error),\n ok: false,\n };\n }\n if (parsed.positionals.length > 0) {\n return {\n error: usageError(options.usage),\n ok: false,\n };\n }\n\n const inputPath = readStringFlag(parsed.flags, INPUT_FLAG);\n if (!inputPath) {\n return {\n error: usageError(\"--input is required.\"),\n ok: false,\n };\n }\n\n return {\n inputPath,\n json: parsed.flags.has(JSON_FLAG),\n ok: true,\n };\n}\n\nasync function readInputFile<T>(options: {\n cwd?: string;\n inputPath: string;\n schema: z.ZodType<T>;\n}): Promise<\n | {\n ok: true;\n value: T;\n }\n | {\n error: FormsCommandResult;\n ok: false;\n }\n> {\n const resolvedInputPath = path.resolve(\n options.cwd ?? process.cwd(),\n options.inputPath,\n );\n const rawInput = await readFile(resolvedInputPath, \"utf-8\").catch(\n (error: unknown) => {\n const message = error instanceof Error ? error.message : String(error);\n return {\n error: usageError(`Could not read input file: ${message}`),\n ok: false as const,\n };\n },\n );\n\n if (typeof rawInput !== \"string\") {\n return rawInput;\n }\n\n let parsedJson: unknown;\n try {\n parsedJson = JSON.parse(rawInput);\n } catch (error) {\n return {\n error: usageError(\n `Input file is not valid JSON: ${error instanceof Error ? error.message : String(error)}`,\n ),\n ok: false,\n };\n }\n\n const parsedInput = options.schema.safeParse(parsedJson);\n if (!parsedInput.success) {\n return {\n error: usageError(\n `Input file does not match the SiteOS forms contract: ${parsedInput.error.issues\n .map(\n (issue) => `${issue.path.join(\".\") || \"input\"}: ${issue.message}`,\n )\n .join(\"; \")}`,\n ),\n ok: false,\n };\n }\n\n return {\n ok: true,\n value: parsedInput.data,\n };\n}\n\nfunction parseFlags(\n args: string[],\n options: {\n allowed: Set<string>;\n boolean: Set<string>;\n rejectDuplicates?: boolean;\n },\n): ParsedFlags {\n const flags = new Map<string, FlagValue>();\n const positionals: string[] = [];\n\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index];\n if (!arg.startsWith(\"--\")) {\n positionals.push(arg);\n continue;\n }\n\n const [flagName, inlineValue] = splitFlag(arg);\n if (!options.allowed.has(flagName)) {\n return {\n error: `Unexpected argument: ${flagName}`,\n ok: false,\n };\n }\n if (options.rejectDuplicates && flags.has(flagName)) {\n return {\n error: `Duplicate argument: ${flagName}`,\n ok: false,\n };\n }\n\n if (options.boolean.has(flagName)) {\n if (inlineValue !== undefined) {\n return {\n error: `${flagName} does not accept a value.`,\n ok: false,\n };\n }\n flags.set(flagName, true);\n continue;\n }\n\n const value = inlineValue ?? args[index + 1];\n if (!value || value.startsWith(\"--\")) {\n return {\n error: `${flagName} requires a value.`,\n ok: false,\n };\n }\n\n flags.set(flagName, value);\n if (inlineValue === undefined) {\n index += 1;\n }\n }\n\n return {\n flags,\n ok: true,\n positionals,\n };\n}\n\nfunction splitFlag(arg: string): [string, string | undefined] {\n const separatorIndex = arg.indexOf(\"=\");\n if (separatorIndex === -1) {\n return [arg, undefined];\n }\n\n return [arg.slice(0, separatorIndex), arg.slice(separatorIndex + 1)];\n}\n\nfunction readStringFlag(\n flags: Map<string, FlagValue>,\n flagName: string,\n): string | undefined {\n const value = flags.get(flagName);\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction usageError(message: string): FormsCommandResult {\n return {\n exitCode: 1,\n stderr: `${message}\\n\\n${FORMS_HELP}`,\n };\n}\n\nfunction formatApiError(error: unknown): FormsCommandResult {\n if (error instanceof SiteOSFormsApiError) {\n const details = [\n \"SiteOS forms API request failed.\",\n error.status ? `Status: ${error.status}` : undefined,\n `Code: ${error.code}`,\n error.message,\n error.status === 404 && error.code === \"NOT_FOUND\"\n ? \"Verify the selected Project, Environment and form ID. The server must support this command.\"\n : undefined,\n error.status === 409 && error.code === \"PROJECT_FORM_SUBMISSION_EXISTS\"\n ? \"The submission idempotency key was already used. Keep it for an unchanged retry and check the existing receipt before sending again.\"\n : undefined,\n ].filter((line): line is string => Boolean(line));\n\n return {\n exitCode: 1,\n stderr: details.join(\"\\n\"),\n };\n }\n\n return {\n exitCode: 1,\n stderr: \"SiteOS forms command failed.\",\n };\n}\n\nfunction formatCredentialError(error: unknown): FormsCommandResult {\n if (error instanceof SiteOSAuthApiError) {\n return formatAuthError(error).error;\n }\n if (error instanceof SiteOSFormsCredentialStorageError) {\n return {\n exitCode: 1,\n stderr: error.message,\n };\n }\n if (\n error instanceof FormsProjectReferenceError ||\n error instanceof ProjectBindingStoreError ||\n error instanceof RepositoryRootError\n ) {\n return {\n exitCode: 1,\n stderr: [\n \"SiteOS Forms Project access failed.\",\n `Code: ${error.code}`,\n error.message,\n ].join(\"\\n\"),\n };\n }\n if (error instanceof SiteOSFormsApiError) {\n return {\n exitCode: 1,\n stderr: [\n \"SiteOS Forms credential request failed.\",\n error.status ? `Status: ${error.status}` : undefined,\n `Code: ${error.code}`,\n ]\n .filter((line): line is string => Boolean(line))\n .join(\"\\n\"),\n };\n }\n return {\n exitCode: 1,\n stderr: \"SiteOS Forms credential request failed.\",\n };\n}\n\nfunction formatManagementContextError(error: unknown): FormsCommandResult {\n if (error instanceof SiteOSAuthApiError) {\n return formatAuthError(error).error;\n }\n if (\n error instanceof FormsProjectReferenceError ||\n error instanceof ProjectBindingStoreError ||\n error instanceof RepositoryRootError\n ) {\n return {\n exitCode: 1,\n stderr: [\n \"SiteOS Forms Project access failed.\",\n `Code: ${error.code}`,\n error.message,\n ]\n .filter((line): line is string => Boolean(line))\n .join(\"\\n\"),\n };\n }\n return formatApiError(error);\n}\n\nfunction formatProjectError(error: unknown): FormsCommandResult {\n if (error instanceof SiteOSAuthApiError) return formatAuthError(error).error;\n return formatManagementContextError(error);\n}\n\nfunction serviceGrantProvider(options: {\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n serviceGrantProvider?: ServiceGrantProvider;\n}): ServiceGrantProvider {\n return (\n options.serviceGrantProvider ??\n createSiteOSServiceGrantProvider({\n env: options.env,\n fetchImpl: options.fetchImpl,\n })\n );\n}\n\nfunction projectBindingStore(options: {\n env?: NodeJS.ProcessEnv;\n projectBindingStore?: ProjectBindingStore;\n}): ProjectBindingStore {\n return (\n options.projectBindingStore ??\n new NodeProjectBindingStore(\n path.join(\n resolveSiteOSConfigHome({ env: options.env }),\n \"project-bindings.json\",\n ),\n )\n );\n}\n\nfunction requireGrant(\n grant: Awaited<ReturnType<ServiceGrantProvider[\"acquire\"]>>,\n scope: FormsManagementScope,\n): void {\n if (\n grant.grant.audience !== \"siteos-forms\" ||\n grant.grant.scopes.length !== 1 ||\n grant.grant.scopes[0] !== scope\n ) {\n throw new SiteOSAuthApiError({\n code: \"AUTH_INVALID_RESPONSE\",\n message: \"The SiteOS Auth service returned an invalid response.\",\n });\n }\n}\n\nfunction requireProjectOrganization(\n projects: SiteOSFormsProject[],\n organizationId: string,\n): void {\n if (projects.some((project) => project.organizationId !== organizationId)) {\n throw new SiteOSFormsApiError({\n code: \"INVALID_RESPONSE\",\n message: \"SiteOS Forms returned an invalid response.\",\n });\n }\n}\n\nfunction formatProjectListOutput(projects: SiteOSFormsProject[]): string {\n return [\n \"SiteOS Forms Projects.\",\n `Projects: ${projects.length}`,\n ...projects.map(\n (project) => `- ${project.slug}: ${project.name} (${project.id})`,\n ),\n ].join(\"\\n\");\n}\n\nfunction formatCredentialListOutput(input: {\n credentials: Array<{ id: string; name: string; status: string }>;\n environment: string;\n}) {\n return [\n \"SiteOS Forms credentials.\",\n `Environment: ${input.environment}`,\n `Credentials: ${input.credentials.length}`,\n ...input.credentials.map(\n (credential) =>\n `- ${credential.id}: ${credential.name} (${credential.status})`,\n ),\n ].join(\"\\n\");\n}\n\nfunction formatEnvironmentListOutput(\n environments: Array<{ id: string; name: string; slug: string }>,\n) {\n return [\n \"SiteOS Forms Environments.\",\n `Environments: ${environments.length}`,\n ...environments.map(\n (environment) =>\n `- ${environment.slug}: ${environment.name} (${environment.id})`,\n ),\n ].join(\"\\n\");\n}\n\nfunction requireEnvironmentProjectConvergence(\n environments: Array<{ projectId: string }>,\n projectId: string,\n): void {\n if (environments.some((environment) => environment.projectId !== projectId)) {\n throw new SiteOSFormsApiError({\n code: \"INVALID_RESPONSE\",\n message: \"SiteOS Forms returned an invalid response.\",\n });\n }\n}\n\nfunction stringifySafeJson(value: unknown): string {\n return JSON.stringify(value, null, 2);\n}\n\nfunction formatDefinitionSyncOutput(\n definitions: Array<{\n definition: Record<string, unknown>;\n formKey: string;\n path: string;\n ui?: {\n url: string;\n };\n }>,\n): string {\n return [\n \"SiteOS form definition sync completed.\",\n `Forms: ${definitions.length}`,\n ...definitions.flatMap((output) => [\n `- ${output.formKey}`,\n typeof output.definition.version === \"number\" ||\n typeof output.definition.version === \"string\"\n ? ` Version: ${String(output.definition.version)}`\n : undefined,\n typeof output.definition.createdForm === \"boolean\"\n ? ` Created form: ${String(output.definition.createdForm)}`\n : undefined,\n typeof output.definition.createdVersion === \"boolean\"\n ? ` Created version: ${String(output.definition.createdVersion)}`\n : undefined,\n output.ui ? ` View in SiteOS (optional): ${output.ui.url}` : undefined,\n ]),\n ]\n .filter((line): line is string => Boolean(line))\n .join(\"\\n\");\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction readOutputString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction createFormsUiOutput(input: {\n context: {\n commonProjectId?: string;\n apiBaseUrl: string;\n organization: { id?: string; slug?: string };\n project: { id?: string; slug?: string };\n };\n}):\n | {\n url: string;\n }\n | undefined {\n const commonProjectId = input.context.commonProjectId;\n const projectId = commonProjectId ?? input.context.project.id;\n if (!projectId) {\n return undefined;\n }\n\n const url = new URL(\n commonProjectId\n ? `/projects/${encodeURIComponent(commonProjectId)}/forms`\n : `/forms/projects/${encodeURIComponent(projectId)}`,\n new URL(input.context.apiBaseUrl).origin,\n ).toString();\n return {\n url,\n };\n}\n\nasync function runDeployment(options: {\n args: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n}): Promise<FormsCommandResult> {\n const parsed = parseDefinitionSourceFlags(options.args, {\n environmentRequired: false,\n usage: \"Usage: siteos forms deploy --manifest <path> [--json]\",\n });\n if (!parsed.ok) return parsed.error;\n const loaded = await loadFormDefinitions({\n cwd: options.cwd,\n source: parsed.source,\n });\n if (!loaded.ok) return loaded.error;\n const env = options.env ?? process.env;\n const credential = env[SITEOS_FORMS_DEPLOYMENT_KEY_ENV]?.trim();\n const apiBaseUrl = env.SITEOS_FORMS_PUBLIC_URL?.trim();\n if (!credential || !/^pfd_[A-Za-z0-9_-]{43}$/.test(credential) || !apiBaseUrl)\n return {\n exitCode: 1,\n stderr:\n \"Configure SITEOS_FORMS_PUBLIC_URL and SITEOS_FORMS_DEPLOYMENT_KEY in the release environment.\",\n };\n try {\n const client = createSiteOSFormsApiClient({\n apiBaseUrl,\n fetchImpl: options.fetchImpl ?? fetch,\n });\n const result = await client.publishDefinitions({\n credential,\n definitions: loaded.definitions.map((item) => item.value),\n });\n const expected = new Map(\n loaded.definitions.map((item) => [\n item.value.formKey,\n item.value.sourceExportId,\n ]),\n );\n if (\n result.forms.length !== expected.size ||\n new Set(result.forms.map((item) => item.formKey)).size !==\n expected.size ||\n result.forms.some(\n (item) =>\n !expected.has(item.formKey) ||\n expected.get(item.formKey) !== item.contractVersion,\n )\n )\n return {\n exitCode: 1,\n stderr: \"The published Forms versions do not match this build.\",\n };\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson(result)\n : `Published ${result.forms.length} Forms contracts for Environment ${result.environmentId}.`,\n };\n } catch (error) {\n return formatApiError(error);\n }\n}\n","import { z } from \"zod\";\n\nimport type { FetchLike } from \"./siteos-search-api.js\";\n\nexport const DEFAULT_SITEOS_FORMS_BASE_URL = \"https://app.siteos.sh\";\nexport const SITEOS_FORMS_BASE_URL_ENV = \"SITEOS_FORMS_PUBLIC_URL\";\n\nconst opaqueIdentifierSchema = z.string().trim().min(1).max(255);\n\nconst formsProjectSchema = z\n .object({\n createdAt: z.string().datetime({ offset: true }),\n id: opaqueIdentifierSchema,\n name: z.string().trim().min(1).max(255),\n organizationId: opaqueIdentifierSchema,\n slug: z\n .string()\n .trim()\n .min(1)\n .max(120)\n .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),\n updatedAt: z.string().datetime({ offset: true }),\n })\n .strict();\n\nconst formsProjectListSchema = z\n .object({ projects: z.array(formsProjectSchema) })\n .strict();\nconst formsProjectResponseSchema = z\n .object({ project: formsProjectSchema })\n .strict();\n\nconst formsEnvironmentSchema = z\n .object({\n createdAt: z.string().datetime({ offset: true }),\n id: opaqueIdentifierSchema,\n name: z.string().trim().min(1).max(255),\n projectId: opaqueIdentifierSchema,\n slug: z\n .string()\n .trim()\n .min(1)\n .max(120)\n .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),\n updatedAt: z.string().datetime({ offset: true }),\n })\n .strict();\n\nconst formsEnvironmentListSchema = z\n .object({ environments: z.array(formsEnvironmentSchema) })\n .strict();\nconst formsEnvironmentResponseSchema = z\n .object({ environment: formsEnvironmentSchema })\n .strict();\n\nconst formDefinitionSyncResponseSchema = z\n .object({\n activeVersionId: opaqueIdentifierSchema,\n createdForm: z.boolean(),\n createdVersion: z.boolean(),\n formId: opaqueIdentifierSchema,\n formKey: opaqueIdentifierSchema,\n success: z.literal(true),\n version: z.number().int().positive(),\n })\n .strict();\n\nconst definitionSchema = z.object({\n id: opaqueIdentifierSchema,\n environmentId: opaqueIdentifierSchema,\n formKey: opaqueIdentifierSchema,\n name: z.string(),\n sourcePagePath: z.string().nullable(),\n activeVersion: z.number().int().positive(),\n activeVersionId: opaqueIdentifierSchema,\n status: z.enum([\"active\", \"inactive\"]),\n submissionCount: z.number().int().nonnegative(),\n lastSubmittedAt: z.string().datetime({ offset: true }).nullable(),\n createdAt: z.string().datetime({ offset: true }),\n updatedAt: z.string().datetime({ offset: true }),\n});\nconst definitionListSchema = z.object({\n definitions: z.array(definitionSchema),\n});\nconst definitionContextSchema = z.object({\n definition: definitionSchema,\n revision: z.number().int().positive(),\n canManage: z.boolean(),\n project: z.object({ id: opaqueIdentifierSchema, name: z.string() }),\n environment: z.object({\n id: opaqueIdentifierSchema,\n name: z.string(),\n slug: z.string(),\n }),\n});\nconst definitionChangeResponseSchema = z.object({\n deleted: z.boolean(),\n formId: opaqueIdentifierSchema,\n});\nexport type SiteOSFormsDefinitionChange =\n | { action: \"archive\" | \"restore\"; expectedRevision: number }\n | {\n action: \"delete\";\n expectedRevision: number;\n expectedSubmissionCount: number;\n confirmKey: string;\n };\n\nconst formSubmissionResponseSchema = z\n .object({\n formId: opaqueIdentifierSchema,\n receivedAt: z.string().datetime({ offset: true }),\n submissionId: opaqueIdentifierSchema,\n success: z.literal(true),\n })\n .strict();\n\nexport const formsSubmissionStatusSchema = z.enum([\n \"new\",\n \"read\",\n \"archived\",\n \"spam\",\n]);\nconst submissionSummarySchema = z.object({\n id: opaqueIdentifierSchema,\n formId: opaqueIdentifierSchema,\n normalized: z.record(\n z.union([z.string(), z.number(), z.boolean(), z.null()]),\n ),\n status: formsSubmissionStatusSchema,\n submittedAt: z.string().datetime({ offset: true }),\n});\nconst submissionDetailSchema = submissionSummarySchema.extend({\n payload: z.record(z.unknown()),\n fields: z.array(\n z.object({\n key: z.string(),\n label: z.string().optional(),\n kind: z.string().optional(),\n displayRole: z.enum([\"primary\", \"secondary\"]).optional(),\n multiple: z.boolean().optional(),\n options: z\n .array(z.object({ value: z.string(), label: z.string() }))\n .optional(),\n }),\n ),\n version: z.number().int().positive(),\n versionId: opaqueIdentifierSchema,\n});\nconst submissionPageSchema = z.object({\n submissions: z.array(submissionSummarySchema),\n total: z.number().int().nonnegative(),\n nextCursor: z.string().nullable(),\n});\nconst submissionDetailResponseSchema = z.object({\n submission: submissionDetailSchema,\n});\ntype InboxInput = { grant: string; environmentId: string; formId: string };\nexport type SiteOSFormsSubmissionStatus = z.infer<\n typeof formsSubmissionStatusSchema\n>;\n\nexport type SiteOSFormsEnvironment = z.infer<typeof formsEnvironmentSchema>;\nexport type SiteOSFormsProject = z.infer<typeof formsProjectSchema>;\nexport type SiteOSFormDefinitionSyncResponse = z.infer<\n typeof formDefinitionSyncResponseSchema\n>;\nexport type SiteOSFormSubmissionResponse = z.infer<\n typeof formSubmissionResponseSchema\n>;\n\nconst formsCredentialMetadataSchema = z\n .object({\n createdAt: z.string().datetime({ offset: true }),\n id: z.string().trim().min(1).max(255),\n lastUsedAt: z.string().datetime({ offset: true }).nullable(),\n name: z.string().trim().min(1).max(255),\n projectEnvironmentId: z.string().trim().min(1).max(255),\n revokedAt: z.string().datetime({ offset: true }).nullable(),\n status: z.enum([\"active\", \"revoked\"]),\n })\n .strict();\n\nconst formsCredentialListSchema = z\n .object({\n tokens: z.array(formsCredentialMetadataSchema),\n })\n .strict();\n\nconst formsCredentialExchangeSchema = formsCredentialMetadataSchema.extend({\n token: z.string().regex(/^pfs_[A-Za-z0-9_-]{22}$/),\n});\n\nexport type SiteOSFormsCredentialMetadata = z.infer<\n typeof formsCredentialMetadataSchema\n>;\nexport type SiteOSFormsCredentialExchange = z.infer<\n typeof formsCredentialExchangeSchema\n>;\n\nconst formsErrorCodeSchema = z.enum([\n \"AUTHENTICATION_REQUIRED\",\n \"FORBIDDEN\",\n \"CONFLICT\",\n \"INVALID_REQUEST\",\n \"INVALID_INPUT\",\n \"VALIDATION_FAILED\",\n \"API_KEY_INVALID\",\n \"UNAUTHORIZED\",\n \"IDENTITY_REQUIRED\",\n \"NOT_ALLOWED\",\n \"FORM_ARCHIVED\",\n \"FORM_DELETED\",\n \"NOT_FOUND\",\n \"PROJECT_NOT_FOUND\",\n \"PROJECT_CONFLICT\",\n \"PROJECT_FORM_SCHEMA_INVALID\",\n \"PROJECT_FORM_SUBMISSION_EXISTS\",\n \"ENVIRONMENT_NOT_FOUND\",\n \"ENVIRONMENT_CONFLICT\",\n \"ROUTE_NOT_FOUND\",\n \"SERVICE_UNAVAILABLE\",\n \"INTERNAL_ERROR\",\n]);\n\nconst safeFormsErrorMessages: Record<\n z.infer<typeof formsErrorCodeSchema>,\n string\n> = {\n AUTHENTICATION_REQUIRED:\n \"Sign in to SiteOS before reading Forms submissions.\",\n FORBIDDEN: \"Forms management access is denied.\",\n CONFLICT:\n \"The resource changed or this idempotency key belongs to different data. Read the current state before retrying.\",\n INVALID_REQUEST: \"The Forms request is invalid.\",\n INVALID_INPUT: \"Invalid input data.\",\n VALIDATION_FAILED: \"Validation failed.\",\n API_KEY_INVALID: \"Forms submission credential is invalid or revoked.\",\n UNAUTHORIZED: \"Forms management authorization is invalid.\",\n IDENTITY_REQUIRED: \"Forms browser identity is required.\",\n NOT_ALLOWED: \"Forms management access is denied.\",\n FORM_ARCHIVED:\n \"This form is archived. Restore it explicitly before syncing or sending new submissions.\",\n FORM_DELETED:\n \"This form was permanently deleted. Use a new form key for a new form.\",\n NOT_FOUND: \"The requested resource was not found.\",\n PROJECT_NOT_FOUND: \"The Forms Project was not found.\",\n PROJECT_CONFLICT: \"The Forms Project already exists.\",\n PROJECT_FORM_SCHEMA_INVALID: \"Stored Forms schema is invalid.\",\n PROJECT_FORM_SUBMISSION_EXISTS:\n \"A submission with this idempotency key already exists for this Environment.\",\n ENVIRONMENT_NOT_FOUND: \"The Forms Environment was not found.\",\n ENVIRONMENT_CONFLICT: \"The Forms Environment already exists.\",\n ROUTE_NOT_FOUND: \"The requested Forms resource was not found.\",\n SERVICE_UNAVAILABLE: \"The Forms service is unavailable.\",\n INTERNAL_ERROR: \"The Forms request could not be completed.\",\n};\n\nconst apiErrorResponseSchema = z\n .object({\n error: z\n .object({\n code: formsErrorCodeSchema,\n message: z.string().trim().min(1).max(240),\n })\n .strict(),\n })\n .strict();\n\nexport class SiteOSFormsApiError extends Error {\n readonly code: string;\n readonly status?: number;\n\n constructor(options: { code?: string; message: string; status?: number }) {\n super(options.message);\n this.name = \"SiteOSFormsApiError\";\n this.code = options.code ?? \"SITEOS_API_ERROR\";\n this.status = options.status;\n }\n}\n\nexport function resolveSiteOSFormsBaseUrl(\n env: NodeJS.ProcessEnv = process.env,\n): string {\n return normalizeFormsOrigin(\n env[SITEOS_FORMS_BASE_URL_ENV]?.trim() || DEFAULT_SITEOS_FORMS_BASE_URL,\n );\n}\n\nconst deploymentResponseSchema = z.object({\n environmentId: opaqueIdentifierSchema,\n forms: z.array(\n z.object({\n formKey: opaqueIdentifierSchema,\n formId: opaqueIdentifierSchema,\n contractVersion: z.string().regex(/^sha256:[a-f0-9]{64}$/),\n versionId: opaqueIdentifierSchema,\n version: z.number().int().positive(),\n }),\n ),\n});\n\nexport function createSiteOSFormsApiClient(options: {\n deploymentKeys?: boolean;\n apiBaseUrl: string;\n fetchImpl: FetchLike;\n}): {\n publishDefinitions: (input: {\n definitions: unknown[];\n credential: string;\n }) => Promise<z.infer<typeof deploymentResponseSchema>>;\n listDefinitions: (input: {\n grant: string;\n environmentId: string;\n status: \"active\" | \"inactive\" | \"all\";\n }) => Promise<z.infer<typeof definitionListSchema>>;\n readDefinition: (\n input: InboxInput,\n ) => Promise<z.infer<typeof definitionContextSchema>>;\n changeDefinition: (\n input: InboxInput & { change: SiteOSFormsDefinitionChange },\n ) => Promise<z.infer<typeof definitionChangeResponseSchema>>;\n listSubmissions: (\n input: InboxInput & { filters: URLSearchParams },\n ) => Promise<z.infer<typeof submissionPageSchema>>;\n readSubmission: (\n input: InboxInput & { submissionId: string },\n ) => Promise<z.infer<typeof submissionDetailResponseSchema>>;\n updateSubmissionStatus: (\n input: InboxInput & {\n submissionId: string;\n status: SiteOSFormsSubmissionStatus;\n expectedStatus: SiteOSFormsSubmissionStatus;\n },\n ) => Promise<z.infer<typeof submissionDetailResponseSchema>>;\n createProject: (input: {\n grant: string;\n name: string;\n slug: string;\n }) => Promise<{ project: SiteOSFormsProject }>;\n listProjects: (input: {\n grant: string;\n }) => Promise<{ projects: SiteOSFormsProject[] }>;\n issueCredential: (input: {\n environmentSlug: string;\n grant: string;\n name?: string;\n projectId: string;\n }) => Promise<SiteOSFormsCredentialExchange>;\n listCredentials: (input: {\n environmentSlug: string;\n grant: string;\n projectId: string;\n }) => Promise<{ tokens: SiteOSFormsCredentialMetadata[] }>;\n revokeCredential: (input: {\n credentialId: string;\n environmentSlug: string;\n grant: string;\n projectId: string;\n }) => Promise<SiteOSFormsCredentialMetadata>;\n rotateCredential: (input: {\n environmentSlug: string;\n grant: string;\n name?: string;\n projectId: string;\n }) => Promise<SiteOSFormsCredentialExchange>;\n createEnvironment: (input: {\n grant: string;\n name: string;\n projectId: string;\n slug: string;\n }) => Promise<{ environment: SiteOSFormsEnvironment }>;\n listEnvironments: (input: {\n grant: string;\n projectId: string;\n }) => Promise<{ environments: SiteOSFormsEnvironment[] }>;\n submitForm: (input: {\n body: unknown;\n credential: string;\n }) => Promise<SiteOSFormSubmissionResponse>;\n syncDefinition: (input: {\n body: unknown;\n environmentSlug: string;\n grant: string;\n projectId: string;\n }) => Promise<SiteOSFormDefinitionSyncResponse>;\n} {\n const apiBaseUrl = normalizeFormsOrigin(options.apiBaseUrl);\n const inboxPath = (input: InboxInput) =>\n `/api/v1/forms/environments/${encodeURIComponent(input.environmentId)}/forms/${encodeURIComponent(input.formId)}/submissions`;\n const definitionPath = (input: InboxInput) =>\n `/api/v1/forms/environments/${encodeURIComponent(input.environmentId)}/forms/${encodeURIComponent(input.formId)}`;\n const keyCollection = (\n input: Parameters<typeof credentialCollectionPath>[0],\n ) =>\n options.deploymentKeys\n ? `${environmentItemPath(input)}/deployment-keys`\n : credentialCollectionPath(input);\n return {\n publishDefinitions: (input) =>\n requestJson({\n apiBaseUrl,\n fetchImpl: options.fetchImpl,\n method: \"POST\",\n path: \"/api/forms/deployments\",\n body: { definitions: input.definitions },\n headers: { \"x-siteos-forms-deployment-key\": input.credential },\n responseSchema: deploymentResponseSchema,\n }),\n listDefinitions: (input) =>\n requestJson({\n apiBaseUrl,\n fetchImpl: options.fetchImpl,\n headers: managementHeaders(input),\n method: \"GET\",\n path: `/api/v1/forms/environments/${encodeURIComponent(input.environmentId)}/definitions?status=${input.status}`,\n responseSchema: definitionListSchema,\n }),\n readDefinition: (input) =>\n requestJson({\n apiBaseUrl,\n fetchImpl: options.fetchImpl,\n headers: managementHeaders(input),\n method: \"GET\",\n path: definitionPath(input),\n responseSchema: definitionContextSchema,\n }),\n changeDefinition: (input) =>\n requestJson({\n apiBaseUrl,\n fetchImpl: options.fetchImpl,\n headers: managementHeaders(input),\n method: \"PATCH\",\n path: definitionPath(input),\n body: input.change,\n responseSchema: definitionChangeResponseSchema,\n }),\n listSubmissions: (input) =>\n requestJson({\n apiBaseUrl,\n fetchImpl: options.fetchImpl,\n headers: managementHeaders(input),\n method: \"GET\",\n path: `${inboxPath(input)}?${input.filters}`,\n responseSchema: submissionPageSchema,\n }),\n readSubmission: (input) =>\n requestJson({\n apiBaseUrl,\n fetchImpl: options.fetchImpl,\n headers: managementHeaders(input),\n method: \"GET\",\n path: `${inboxPath(input)}/${encodeURIComponent(input.submissionId)}`,\n responseSchema: submissionDetailResponseSchema,\n }),\n updateSubmissionStatus: (input) =>\n requestJson({\n apiBaseUrl,\n fetchImpl: options.fetchImpl,\n headers: managementHeaders(input),\n method: \"PATCH\",\n path: `${inboxPath(input)}/${encodeURIComponent(input.submissionId)}`,\n body: { status: input.status, expectedStatus: input.expectedStatus },\n responseSchema: submissionDetailResponseSchema,\n }),\n createProject: (input) =>\n requestJson({\n apiBaseUrl,\n body: { name: input.name, slug: input.slug },\n fetchImpl: options.fetchImpl,\n headers: managementHeaders(input),\n method: \"POST\",\n path: \"/api/v1/forms/projects\",\n responseSchema: formsProjectResponseSchema,\n }),\n createEnvironment: (input) =>\n requestJson({\n apiBaseUrl,\n body: { name: input.name, slug: input.slug },\n fetchImpl: options.fetchImpl,\n headers: managementHeaders(input),\n method: \"POST\",\n path: environmentCollectionPath(input),\n responseSchema: formsEnvironmentResponseSchema,\n }),\n issueCredential: (input) =>\n requestJson({\n apiBaseUrl,\n body: input.name ? { name: input.name } : {},\n fetchImpl: options.fetchImpl,\n headers: managementHeaders(input),\n method: \"POST\",\n path: keyCollection(input),\n responseSchema: options.deploymentKeys\n ? formsCredentialExchangeSchema.extend({\n token: z.string().regex(/^pfd_[A-Za-z0-9_-]{43}$/),\n })\n : formsCredentialExchangeSchema,\n }),\n listEnvironments: (input) =>\n requestJson({\n apiBaseUrl,\n fetchImpl: options.fetchImpl,\n headers: managementHeaders(input),\n method: \"GET\",\n path: environmentCollectionPath(input),\n responseSchema: formsEnvironmentListSchema,\n }),\n listProjects: (input) =>\n requestJson({\n apiBaseUrl,\n fetchImpl: options.fetchImpl,\n headers: managementHeaders(input),\n method: \"GET\",\n path: \"/api/v1/forms/projects\",\n responseSchema: formsProjectListSchema,\n }),\n listCredentials: (input) =>\n requestJson({\n apiBaseUrl,\n fetchImpl: options.fetchImpl,\n headers: managementHeaders(input),\n method: \"GET\",\n path: keyCollection(input),\n responseSchema: formsCredentialListSchema,\n }),\n revokeCredential: (input) =>\n requestJson({\n apiBaseUrl,\n fetchImpl: options.fetchImpl,\n headers: managementHeaders(input),\n method: \"DELETE\",\n path: options.deploymentKeys\n ? `${keyCollection(input)}/${encodeURIComponent(input.credentialId)}`\n : credentialItemPath(input),\n responseSchema: formsCredentialMetadataSchema,\n }),\n rotateCredential: (input) =>\n requestJson({\n apiBaseUrl,\n body: input.name ? { name: input.name } : {},\n fetchImpl: options.fetchImpl,\n headers: managementHeaders(input),\n method: \"POST\",\n path: credentialRotatePath(input),\n responseSchema: options.deploymentKeys\n ? formsCredentialExchangeSchema.extend({\n token: z.string().regex(/^pfd_[A-Za-z0-9_-]{43}$/),\n })\n : formsCredentialExchangeSchema,\n }),\n submitForm: (input) =>\n requestJson({\n apiBaseUrl,\n body: input.body,\n fetchImpl: options.fetchImpl,\n headers: {\n \"x-siteos-project-forms-credential\": input.credential,\n },\n method: \"POST\",\n path: \"/api/forms/submissions\",\n responseSchema: formSubmissionResponseSchema,\n }),\n syncDefinition: (input) =>\n requestJson({\n apiBaseUrl,\n body: input.body,\n fetchImpl: options.fetchImpl,\n headers: managementHeaders(input),\n method: \"POST\",\n path: `${environmentItemPath(input)}/definitions`,\n responseSchema: formDefinitionSyncResponseSchema,\n }),\n };\n}\n\nasync function requestJson<T>(options: {\n apiBaseUrl: string;\n body?: unknown;\n fetchImpl: FetchLike;\n headers: Record<string, string>;\n method: \"DELETE\" | \"GET\" | \"POST\" | \"PATCH\";\n path: string;\n responseSchema: z.ZodType<T>;\n}): Promise<T> {\n let response: Awaited<ReturnType<FetchLike>>;\n try {\n response = await options.fetchImpl(buildApiUrl(options), {\n body:\n options.body === undefined ? undefined : JSON.stringify(options.body),\n headers: {\n Accept: \"application/json\",\n ...(options.body === undefined\n ? {}\n : { \"Content-Type\": \"application/json\" }),\n ...options.headers,\n },\n method: options.method,\n redirect: \"error\",\n signal: AbortSignal.timeout(30_000),\n });\n } catch {\n throw new SiteOSFormsApiError({\n code: \"REQUEST_FAILED\",\n message: \"SiteOS API request failed.\",\n });\n }\n\n const payload = await response.json().catch(() => undefined);\n\n if (!response.ok) {\n const parsedError = apiErrorResponseSchema.safeParse(payload);\n if (parsedError.success) {\n throw new SiteOSFormsApiError({\n code: parsedError.data.error.code,\n message: safeFormsErrorMessages[parsedError.data.error.code],\n status: response.status,\n });\n }\n throw new SiteOSFormsApiError({\n code: \"UNEXPECTED_RESPONSE\",\n message: \"SiteOS Forms returned an unexpected error response.\",\n status: response.status,\n });\n }\n\n const parsedPayload = options.responseSchema.safeParse(payload);\n if (!parsedPayload.success) {\n throw new SiteOSFormsApiError({\n code: \"INVALID_RESPONSE\",\n message: \"SiteOS Forms returned an invalid response.\",\n status: response.status,\n });\n }\n\n return parsedPayload.data;\n}\n\nfunction managementHeaders(input: { grant: string }): Record<string, string> {\n return {\n Authorization: `Bearer ${input.grant}`,\n };\n}\n\nfunction projectItemPath(input: { projectId: string }): string {\n return `/api/v1/forms/projects/${encodeURIComponent(input.projectId)}`;\n}\n\nfunction environmentCollectionPath(input: { projectId: string }): string {\n return `${projectItemPath(input)}/environments`;\n}\n\nfunction environmentItemPath(input: {\n environmentSlug: string;\n projectId: string;\n}): string {\n return `${environmentCollectionPath(input)}/${encodeURIComponent(input.environmentSlug)}`;\n}\n\nfunction credentialCollectionPath(input: {\n environmentSlug: string;\n projectId: string;\n}) {\n return `${environmentItemPath(input)}/tokens`;\n}\n\nfunction credentialItemPath(input: {\n credentialId: string;\n environmentSlug: string;\n projectId: string;\n}) {\n return `${credentialCollectionPath(input)}/${encodeURIComponent(input.credentialId)}`;\n}\n\nfunction credentialRotatePath(input: {\n environmentSlug: string;\n projectId: string;\n}) {\n return `${credentialCollectionPath(input)}/actions/rotate`;\n}\n\nfunction buildApiUrl(options: { apiBaseUrl: string; path: string }): string {\n return new URL(\n `${options.apiBaseUrl.replace(/\\/+$/, \"\")}${options.path}`,\n ).toString();\n}\n\nfunction normalizeFormsOrigin(rawUrl: string): string {\n try {\n const url = new URL(rawUrl);\n const loopback = [\"localhost\", \"127.0.0.1\", \"::1\", \"[::1]\"].includes(\n url.hostname,\n );\n if (\n ![\"http:\", \"https:\"].includes(url.protocol) ||\n url.username ||\n url.password ||\n url.pathname !== \"/\" ||\n url.search ||\n url.hash ||\n (url.protocol === \"http:\" && !loopback)\n ) {\n throw new Error(\"unsupported Forms URL\");\n }\n return url.origin;\n } catch {\n throw new SiteOSFormsApiError({\n code: \"INVALID_FORMS_BASE_URL\",\n message: \"The SiteOS Forms URL is invalid.\",\n });\n }\n}\n","import { spawn } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport {\n chmod,\n lstat,\n readFile,\n rename,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport const SITEOS_FORMS_SUBMISSION_CREDENTIAL_ENV =\n \"SITEOS_FORMS_SUBMISSION_CREDENTIAL\";\n\nexport const SITEOS_FORMS_DEPLOYMENT_KEY_ENV = \"SITEOS_FORMS_DEPLOYMENT_KEY\";\n\nexport class SiteOSFormsCredentialStorageError extends Error {\n readonly code:\n \"FORMS_CREDENTIAL_STORAGE_INVALID\" | \"FORMS_CREDENTIAL_STORAGE_UNAVAILABLE\";\n\n constructor(\n code:\n | \"FORMS_CREDENTIAL_STORAGE_INVALID\"\n | \"FORMS_CREDENTIAL_STORAGE_UNAVAILABLE\",\n ) {\n super(\n code === \"FORMS_CREDENTIAL_STORAGE_INVALID\"\n ? \"The project credential storage boundary is invalid.\"\n : \"The Forms credential could not be installed.\",\n );\n this.name = \"SiteOSFormsCredentialStorageError\";\n this.code = code;\n }\n}\n\nexport type SiteOSFormsCredentialInstallation = {\n install: (credential: string) => Promise<void>;\n};\n\nexport async function prepareSiteOSFormsCredentialInstallation(options: {\n projectRoot: string;\n deployment?: boolean;\n}): Promise<SiteOSFormsCredentialInstallation> {\n const variable = options.deployment\n ? SITEOS_FORMS_DEPLOYMENT_KEY_ENV\n : SITEOS_FORMS_SUBMISSION_CREDENTIAL_ENV;\n const credentialPattern = options.deployment\n ? /^pfd_[A-Za-z0-9_-]{43}$/\n : /^pfs_[A-Za-z0-9_-]{22}$/;\n const projectRoot = path.resolve(options.projectRoot);\n const dotenvPath = path.join(projectRoot, \".env\");\n\n try {\n await assertSafeProjectRoot(projectRoot);\n if (!(await isDotenvIgnored(projectRoot))) {\n throw new SiteOSFormsCredentialStorageError(\n \"FORMS_CREDENTIAL_STORAGE_INVALID\",\n );\n }\n await readSafeDotenv(dotenvPath);\n\n return {\n install: async (credential) => {\n if (!credentialPattern.test(credential)) {\n throw new SiteOSFormsCredentialStorageError(\n \"FORMS_CREDENTIAL_STORAGE_INVALID\",\n );\n }\n try {\n await assertSafeProjectRoot(projectRoot);\n if (!(await isDotenvIgnored(projectRoot))) {\n throw new SiteOSFormsCredentialStorageError(\n \"FORMS_CREDENTIAL_STORAGE_INVALID\",\n );\n }\n const currentContent = await readSafeDotenv(dotenvPath);\n await writeCredentialAtomically({\n content: setCredential(currentContent, credential, variable),\n dotenvPath,\n projectRoot,\n });\n } catch (error) {\n if (error instanceof SiteOSFormsCredentialStorageError) throw error;\n throw new SiteOSFormsCredentialStorageError(\n \"FORMS_CREDENTIAL_STORAGE_UNAVAILABLE\",\n );\n }\n },\n };\n } catch (error) {\n if (error instanceof SiteOSFormsCredentialStorageError) throw error;\n throw new SiteOSFormsCredentialStorageError(\n \"FORMS_CREDENTIAL_STORAGE_UNAVAILABLE\",\n );\n }\n}\n\nasync function assertSafeProjectRoot(projectRoot: string) {\n const projectStats = await lstat(projectRoot);\n if (!projectStats.isDirectory() || projectStats.isSymbolicLink()) {\n throw new SiteOSFormsCredentialStorageError(\n \"FORMS_CREDENTIAL_STORAGE_INVALID\",\n );\n }\n}\n\nasync function readSafeDotenv(dotenvPath: string) {\n const dotenvStats = await lstat(dotenvPath).catch((error: unknown) => {\n if (isNodeErrorCode(error, \"ENOENT\")) return undefined;\n throw error;\n });\n if (dotenvStats && !dotenvStats.isFile()) {\n throw new SiteOSFormsCredentialStorageError(\n \"FORMS_CREDENTIAL_STORAGE_INVALID\",\n );\n }\n const content = dotenvStats ? await readFile(dotenvPath, \"utf8\") : \"\";\n if (\n [\n SITEOS_FORMS_SUBMISSION_CREDENTIAL_ENV,\n SITEOS_FORMS_DEPLOYMENT_KEY_ENV,\n ].some((variable) => countCredentialEntries(content, variable) > 1)\n ) {\n throw new SiteOSFormsCredentialStorageError(\n \"FORMS_CREDENTIAL_STORAGE_INVALID\",\n );\n }\n return content;\n}\n\nasync function writeCredentialAtomically(options: {\n content: string;\n dotenvPath: string;\n projectRoot: string;\n}) {\n const temporaryPath = path.join(\n options.projectRoot,\n `.siteos-forms-credential.${process.pid}.${randomUUID()}.tmp`,\n );\n try {\n await writeFile(temporaryPath, options.content, {\n encoding: \"utf8\",\n flag: \"wx\",\n mode: 0o600,\n });\n await chmod(temporaryPath, 0o600);\n await rename(temporaryPath, options.dotenvPath);\n } catch {\n throw new SiteOSFormsCredentialStorageError(\n \"FORMS_CREDENTIAL_STORAGE_UNAVAILABLE\",\n );\n } finally {\n await rm(temporaryPath, { force: true }).catch(() => undefined);\n }\n}\n\nfunction setCredential(content: string, credential: string, variable: string) {\n const assignment = `${variable}=${credential}`;\n const existing = new RegExp(`^${variable}=[^\\\\r\\\\n]*(?=\\\\r?$)`, \"m\");\n if (existing.test(content)) return content.replace(existing, assignment);\n const newline = content.includes(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\n if (content.length === 0) return `${assignment}${newline}`;\n return `${content}${content.endsWith(\"\\n\") ? \"\" : newline}${assignment}${newline}`;\n}\n\nfunction countCredentialEntries(content: string, variable: string) {\n return content\n .split(/\\r?\\n/u)\n .filter((line) => line.startsWith(`${variable}=`)).length;\n}\n\nfunction isDotenvIgnored(projectRoot: string) {\n return new Promise<boolean>((resolve, reject) => {\n const child = spawn(\n \"git\",\n [\"check-ignore\", \"--quiet\", \"--no-index\", \"--\", \".env\"],\n {\n cwd: projectRoot,\n stdio: \"ignore\",\n },\n );\n child.once(\"error\", reject);\n child.once(\"exit\", (code) => {\n if (code === 0) resolve(true);\n else if (code === 1) resolve(false);\n else reject(new Error(\"Git ignore inspection failed.\"));\n });\n });\n}\n\nfunction isNodeErrorCode(error: unknown, code: string): boolean {\n return (\n error instanceof Error &&\n \"code\" in error &&\n (error as NodeJS.ErrnoException).code === code\n );\n}\n","const environmentSlugPattern = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\n\nexport function isValidEnvironmentSlug(value: string): boolean {\n return (\n value.length >= 2 &&\n value.length <= 30 &&\n environmentSlugPattern.test(value)\n );\n}\n","import { readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport type PackageMetadata = {\n name: string;\n version: string;\n};\n\nexport function readPackageMetadata(): PackageMetadata {\n const packageJsonPath = path.resolve(\n path.dirname(fileURLToPath(import.meta.url)),\n \"..\",\n \"package.json\",\n );\n const packageJson = JSON.parse(\n readFileSync(packageJsonPath, \"utf8\"),\n ) as Partial<PackageMetadata>;\n\n return {\n name: packageJson.name ?? \"@siteoshq/cli\",\n version: packageJson.version ?? \"0.0.0-development\",\n };\n}\n","import {\n commonServiceContext,\n readCommonProject,\n} from \"./projects/project-context.js\";\nimport path from \"node:path\";\nimport { parseArgs } from \"node:util\";\n\nimport { createSiteOSServiceGrantProvider } from \"./auth/adapters/siteos-service-grant-provider.js\";\nimport type { ServiceGrantProvider } from \"./auth/application/service-grant-provider.js\";\nimport {\n NodeProjectBindingStore,\n ProjectBindingStoreError,\n} from \"./core/adapters/node-project-binding-store.js\";\nimport {\n findRepositoryRoot,\n RepositoryRootError,\n} from \"./core/adapters/node-repository-root.js\";\nimport { CLI_EXIT_CODE, type CommandResult } from \"./core/command-result.js\";\nimport { commandError } from \"./core/errors.js\";\nimport type { ProjectBindingStore } from \"./core/ports/project-binding-store.js\";\nimport { createPulseApiClient, type PulseProject } from \"./pulse/api-client.js\";\nimport { migrateLegacyPulseBinding } from \"./pulse/binding-migration.js\";\nimport { createDeploymentBundle } from \"./pulse/bundle.js\";\nimport {\n CONFIG_FILE,\n loadChecksConfigFile,\n loadChecksConfigSnapshot,\n reconcileProjectSlug,\n} from \"./pulse/config.js\";\nimport {\n DEFAULT_SITEOS_PULSE_API_URL,\n normalizeApiUrl,\n} from \"./pulse/constants.js\";\nimport { CliError } from \"./pulse/errors.js\";\nimport { initializeProject } from \"./pulse/init.js\";\nimport { runSyncCli } from \"./pulse/interactive/sync.js\";\nimport { runProjectTests } from \"./pulse/playwright.js\";\nimport { inspectProjectSync, type SyncReport } from \"./pulse/sync.js\";\nimport { validateProject } from \"./pulse/validate.js\";\nimport { resolveSiteOSConfigHome } from \"./siteos-config.js\";\nimport { SiteOSAuthApiError } from \"./siteos-auth-api.js\";\n\nconst HELP_FLAGS = new Set([\"--help\", \"-h\"]);\nconst PULSE_SCOPE = \"pulse:workspace:write\";\n\nexport const PULSE_HELP = `Usage:\n siteos pulse project list [--json]\n siteos pulse project create --slug <slug> --name <name> [--json]\n siteos pulse project use <slug> [--replace] [--json]\n siteos pulse project status [--json]\n siteos pulse init [--project <slug>] [--suite <slug>] [--tests-dir <path>] [--base-url <url>]\n siteos pulse validate [--json]\n siteos pulse sync [--check] [--json]\n siteos pulse test [--headed] [--project <name>] [--base-url <url>] [-- <playwright-options>]\n siteos pulse deploy [--dry-run] [--output <path>] [--json]\n\nManage SiteOS Pulse projects, Playwright checks, local tests, and deployments.`;\n\nexport type PulseCommandOptions = {\n args: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: typeof fetch;\n homeDir?: string;\n legacyBindingsPath?: string;\n projectBindingStore?: ProjectBindingStore;\n runInteractiveSync?: typeof runSyncCli;\n runTests?: typeof runProjectTests;\n serviceGrantProvider?: ServiceGrantProvider;\n};\n\nexport async function runPulseCommand(\n options: PulseCommandOptions,\n): Promise<CommandResult> {\n if (\n options.args.length === 0 ||\n options.args.some((argument) => HELP_FLAGS.has(argument))\n ) {\n return { exitCode: CLI_EXIT_CODE.success, stdout: PULSE_HELP };\n }\n\n try {\n const [command, ...args] = options.args;\n if (command === \"project\")\n return await runProjectCommand({ ...options, args });\n if (command === \"init\") return await runInitCommand(options, args);\n if (command === \"validate\") return await runValidateCommand(options, args);\n if (command === \"sync\") return await runSyncCommand(options, args);\n if (command === \"test\") return await runTestCommand(options, args);\n if (command === \"deploy\") return await runDeployCommand(options, args);\n throw usageError(\"Unknown SiteOS Pulse command.\");\n } catch (error) {\n return formatPulseError(error, options.args.includes(\"--json\"));\n }\n}\n\nasync function runProjectCommand(\n options: PulseCommandOptions & { args: string[] },\n): Promise<CommandResult> {\n const [action, ...args] = options.args;\n if (!action || ![\"create\", \"list\", \"status\", \"use\"].includes(action)) {\n throw usageError(\"Unknown SiteOS Pulse project command.\");\n }\n const parsed = parseProjectArguments(action, args);\n const cwd = options.cwd ?? process.cwd();\n const root = action === \"list\" ? null : await findRepositoryRoot(cwd);\n const apiOrigin = await resolvePulseApiOrigin({\n cwd: root ?? cwd,\n env: options.env,\n requireConfig: action !== \"list\",\n });\n const grant = await acquirePulseGrant(options);\n const client = createPulseApiClient({\n apiOrigin,\n fetchImpl: options.fetchImpl,\n });\n\n if (action === \"list\") {\n const projects = await client.listProjects({ grant: grant.accessToken });\n return success(\n parsed.json,\n { apiOrigin, organizationId: grant.grant.organizationId, projects },\n formatProjectList(projects),\n );\n }\n\n const repositoryRoot = root!;\n const snapshot = await loadChecksConfigSnapshot(repositoryRoot);\n if (action === \"create\") {\n const baseUrl = snapshot.config.project.baseUrl;\n if (!baseUrl) {\n throw new CliError(\n \"PULSE_PROJECT_BASE_URL_REQUIRED\",\n \"Set project.baseUrl in siteos.config.json before creating the Pulse Project.\",\n );\n }\n const project = await client.createProject({\n baseUrl,\n grant: grant.accessToken,\n monitoringEnabled: snapshot.config.project.monitoringEnabled,\n name: parsed.name!,\n slug: parsed.slug!,\n });\n return success(\n parsed.json,\n { apiOrigin, project },\n [\n \"SiteOS Pulse Project created.\",\n `Project: ${project.slug}`,\n `Name: ${project.name}`,\n `Run \\`siteos pulse project use ${project.slug}\\` to select it for this repository.`,\n ].join(\"\\n\"),\n );\n }\n\n const store = projectBindingStore(options);\n const locator = { apiOrigin, repositoryRoot, service: \"pulse\" as const };\n if (action === \"use\") {\n const projects = await client.listProjects({ grant: grant.accessToken });\n const project = uniqueProjectBySlug(projects, parsed.slug!);\n const previous = await store.read(locator);\n const replacing =\n snapshot.config.project.slug !== project.slug ||\n (previous !== null && previous.project.id !== project.id);\n if (replacing && !parsed.replace) {\n throw new CliError(\n \"PULSE_PROJECT_REFERENCE_CONFLICT\",\n \"A different Pulse Project is already selected. Use --replace to replace it.\",\n );\n }\n\n await store.write({\n ...locator,\n organizationId: grant.grant.organizationId,\n project: { id: project.id, slug: project.slug },\n });\n try {\n await reconcileProjectSlug(repositoryRoot, project.slug, {\n expectedChecksum: snapshot.checksum,\n });\n } catch (error) {\n if (previous) await store.write(previous);\n else await store.remove(locator);\n throw error;\n }\n return success(\n parsed.json,\n {\n apiOrigin,\n organizationId: grant.grant.organizationId,\n project,\n referencePath: path.join(repositoryRoot, CONFIG_FILE),\n },\n [\n \"SiteOS Pulse Project selected.\",\n `Project: ${project.slug}`,\n `Reference: ${path.join(repositoryRoot, CONFIG_FILE)}`,\n ].join(\"\\n\"),\n );\n }\n\n const selected = await requireSelectedProject({\n options,\n apiOrigin,\n client,\n grant,\n legacyBindingsPath: options.legacyBindingsPath,\n projectBindingStore: store,\n projectSlug: snapshot.config.project.slug,\n repositoryRoot,\n });\n return success(\n parsed.json,\n {\n apiOrigin,\n connected: true,\n migration: selected.migration,\n organizationId: grant.grant.organizationId,\n project: selected.project,\n repositoryRoot,\n },\n [\n \"SiteOS Pulse Project connection is valid.\",\n `Project: ${selected.project.slug}`,\n `Organization: ${grant.grant.organizationId}`,\n `API: ${apiOrigin}`,\n ].join(\"\\n\"),\n );\n}\n\nasync function runInitCommand(\n options: PulseCommandOptions,\n args: string[],\n): Promise<CommandResult> {\n const { values } = parseArgs({\n args,\n options: {\n \"base-url\": { type: \"string\" },\n project: { type: \"string\" },\n suite: { type: \"string\" },\n \"tests-dir\": { type: \"string\" },\n },\n strict: true,\n });\n const common =\n !values[\"base-url\"] || !values.project\n ? await optionalProjectContext(options)\n : null;\n const result = await initializeProject({\n baseUrl: values[\"base-url\"] ?? common?.environment.url ?? undefined,\n project: values.project ?? common?.overview.project.slug,\n projectRoot: options.cwd ?? process.cwd(),\n suite: values.suite,\n testsDir: values[\"tests-dir\"],\n });\n return {\n exitCode: CLI_EXIT_CODE.success,\n stdout: [\n \"SiteOS Pulse project initialized.\",\n ...result.created.map((file) => `Created: ${file}`),\n ...result.updated.map((file) => `Updated: ${file}`),\n \"Next: run `siteos pulse validate`, then `siteos pulse test`.\",\n ].join(\"\\n\"),\n };\n}\n\nasync function runValidateCommand(\n options: PulseCommandOptions,\n args: string[],\n): Promise<CommandResult> {\n const { values } = parseArgs({\n args,\n options: { json: { default: false, type: \"boolean\" } },\n strict: true,\n });\n const report = await validateProject(options.cwd ?? process.cwd());\n return {\n exitCode: report.valid ? CLI_EXIT_CODE.success : CLI_EXIT_CODE.internal,\n stdout: values.json\n ? JSON.stringify(report, null, 2)\n : formatValidation(report),\n };\n}\n\nasync function runSyncCommand(\n options: PulseCommandOptions,\n args: string[],\n): Promise<CommandResult> {\n const { values } = parseArgs({\n args,\n options: {\n check: { default: false, type: \"boolean\" },\n json: { default: false, type: \"boolean\" },\n },\n strict: true,\n });\n const cwd = options.cwd ?? process.cwd();\n if (values.check || values.json) {\n const report = (await inspectProjectSync(cwd)).report;\n return {\n exitCode:\n report.hasDrift || report.blockers.length > 0\n ? CLI_EXIT_CODE.internal\n : CLI_EXIT_CODE.success,\n stdout: values.json\n ? JSON.stringify(report, null, 2)\n : formatSyncReport(report),\n };\n }\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n throw new CliError(\n \"INTERACTIVE_TERMINAL_REQUIRED\",\n \"Interactive synchronization requires a terminal. Use --check or --json in automation.\",\n );\n }\n const exitCode = await (options.runInteractiveSync ?? runSyncCli)({\n projectRoot: cwd,\n });\n return {\n exitCode: exitCode === 0 ? CLI_EXIT_CODE.success : CLI_EXIT_CODE.internal,\n };\n}\n\nasync function runTestCommand(\n options: PulseCommandOptions,\n args: string[],\n): Promise<CommandResult> {\n const separator = args.indexOf(\"--\");\n const commandArgs = separator === -1 ? args : args.slice(0, separator);\n const passthrough = separator === -1 ? [] : args.slice(separator + 1);\n const { values } = parseArgs({\n args: commandArgs,\n options: {\n \"base-url\": { type: \"string\" },\n headed: { default: false, type: \"boolean\" },\n project: { type: \"string\" },\n },\n strict: true,\n });\n const exitCode = await (options.runTests ?? runProjectTests)({\n baseUrl:\n values[\"base-url\"] ??\n (await optionalProjectContext(options))?.environment.url ??\n undefined,\n browserProject: values.project,\n headed: values.headed,\n passthrough,\n projectRoot: options.cwd ?? process.cwd(),\n });\n return {\n exitCode: exitCode === 0 ? CLI_EXIT_CODE.success : CLI_EXIT_CODE.internal,\n };\n}\n\nasync function optionalProjectContext(options: PulseCommandOptions) {\n const context = await readCommonProject(options).catch((cause) => {\n if (\n cause instanceof RepositoryRootError &&\n cause.code === \"REPOSITORY_ROOT_REQUIRED\"\n )\n return null;\n throw cause;\n });\n if (context && !context.environment.url)\n throw new CliError(\n \"PULSE_PROJECT_BINDING_INVALID\",\n \"Set the selected environment website URL in Project settings before using Pulse.\",\n );\n return context;\n}\n\nasync function runDeployCommand(\n options: PulseCommandOptions,\n args: string[],\n): Promise<CommandResult> {\n const { values } = parseArgs({\n args,\n options: {\n \"dry-run\": { default: false, type: \"boolean\" },\n json: { default: false, type: \"boolean\" },\n output: { type: \"string\" },\n },\n strict: true,\n });\n const repositoryRoot = await findRepositoryRoot(options.cwd ?? process.cwd());\n const common = await commonServiceContext(options, \"pulse\");\n if (common && (!common.environmentBinding?.slug || !common.environment.url))\n throw new CliError(\n \"PULSE_PROJECT_BINDING_INVALID\",\n \"Set the environment URL and connect Pulse in Project settings before deploying.\",\n );\n const manifest = await createDeploymentBundle({\n ...(common\n ? {\n projectOverride: {\n name: common.overview.project.name,\n slug: common.environmentBinding!.slug!,\n baseUrl: common.environment.url!,\n },\n }\n : {}),\n output: values.output,\n projectRoot: repositoryRoot,\n });\n if (values[\"dry-run\"]) {\n return success(\n values.json,\n { dryRun: true, manifest },\n [\n `Bundle: ${path.relative(repositoryRoot, manifest.archivePath)}`,\n `Checksum: ${manifest.checksum}`,\n `Files: ${manifest.fileCount}`,\n \"Dry run complete; nothing was uploaded.\",\n ].join(\"\\n\"),\n );\n }\n\n const apiOrigin = await resolvePulseApiOrigin({\n cwd: repositoryRoot,\n env: options.env,\n requireConfig: true,\n });\n const grant = await acquirePulseGrant(options);\n const client = createPulseApiClient({\n apiOrigin,\n fetchImpl: options.fetchImpl,\n });\n const snapshot = await loadChecksConfigSnapshot(repositoryRoot);\n const selected = await requireSelectedProject({\n options,\n apiOrigin,\n client,\n grant,\n legacyBindingsPath: options.legacyBindingsPath,\n projectBindingStore: projectBindingStore(options),\n projectSlug: snapshot.config.project.slug,\n repositoryRoot,\n });\n const deployment = await client.uploadDeployment({\n grant: grant.accessToken,\n manifest,\n projectId: selected.project.id,\n });\n if (deployment.projectId !== selected.project.id) {\n throw new CliError(\n \"API_INVALID_RESPONSE\",\n \"SiteOS Pulse deployed a different Project than the selected target.\",\n );\n }\n return success(\n values.json,\n { deployment, dryRun: false, manifest },\n [\n `Bundle: ${path.relative(repositoryRoot, manifest.archivePath)}`,\n `Checksum: ${manifest.checksum}`,\n `Files: ${manifest.fileCount}`,\n `Project ${deployment.projectId} deployed.`,\n ...deployment.checks.map(\n (check) =>\n `${check.slug}: deployment ${check.deploymentId} v${check.version}`,\n ),\n ...(deployment.dashboardUrl\n ? [`Dashboard: ${deployment.dashboardUrl}`]\n : []),\n ].join(\"\\n\"),\n );\n}\n\nasync function acquirePulseGrant(options: PulseCommandOptions) {\n const grant = await (\n options.serviceGrantProvider ??\n createSiteOSServiceGrantProvider({\n env: options.env,\n fetchImpl: options.fetchImpl,\n homeDir: options.homeDir,\n })\n ).acquire({ audience: \"siteos-pulse\", scopes: [PULSE_SCOPE] });\n if (\n grant.grant.audience !== \"siteos-pulse\" ||\n grant.grant.scopes.length !== 1 ||\n grant.grant.scopes[0] !== PULSE_SCOPE\n ) {\n throw new SiteOSAuthApiError({\n code: \"AUTH_INVALID_RESPONSE\",\n message: \"The SiteOS Auth service returned an invalid response.\",\n });\n }\n return grant;\n}\n\nasync function requireSelectedProject(input: {\n options: PulseCommandOptions;\n apiOrigin: string;\n client: ReturnType<typeof createPulseApiClient>;\n grant: Awaited<ReturnType<ServiceGrantProvider[\"acquire\"]>>;\n legacyBindingsPath?: string;\n projectBindingStore: ProjectBindingStore;\n projectSlug: string;\n repositoryRoot: string;\n}) {\n const common = await commonServiceContext(input.options, \"pulse\");\n if (common) {\n if (\n common.api.origin !== input.apiOrigin ||\n common.overview.project.organizationId !==\n input.grant.grant.organizationId\n ) {\n throw new CliError(\n \"PULSE_PROJECT_BINDING_INVALID\",\n \"The selected Project and Pulse deployment origin or organization do not match.\",\n );\n }\n const project = await input.client.getProject({\n grant: input.grant.accessToken,\n projectId: common.resourceId,\n });\n if (\n project.slug !== input.projectSlug &&\n common.overview.project.slug !== input.projectSlug\n )\n throw new CliError(\n \"PULSE_PROJECT_BINDING_INVALID\",\n `Set project.slug in siteos.config.json to ${common.overview.project.slug} before deploying checks to this Project.`,\n );\n return { migration: \"not-required\", project };\n }\n const migration = await migrateLegacyPulseBinding({\n apiOrigin: input.apiOrigin,\n legacyBindingsPath: input.legacyBindingsPath,\n organizationId: input.grant.grant.organizationId,\n projectBindingStore: input.projectBindingStore,\n projectSlug: input.projectSlug,\n repositoryRoot: input.repositoryRoot,\n });\n const binding = migration.binding;\n if (!binding) {\n throw new CliError(\n \"PULSE_PROJECT_BINDING_REQUIRED\",\n \"Select a Pulse Project for this repository first.\",\n { hint: `Run \\`siteos pulse project use ${input.projectSlug}\\`.` },\n );\n }\n if (\n binding.organizationId !== input.grant.grant.organizationId ||\n binding.project.slug !== input.projectSlug\n ) {\n throw new CliError(\n \"PULSE_PROJECT_BINDING_INVALID\",\n \"The Pulse Project configuration and private binding do not match.\",\n {\n hint: `Run \\`siteos pulse project use ${input.projectSlug} --replace\\`.`,\n },\n );\n }\n const project = await input.client.getProject({\n grant: input.grant.accessToken,\n projectId: binding.project.id,\n });\n if (project.slug !== binding.project.slug) {\n throw new CliError(\n \"PULSE_PROJECT_BINDING_STALE\",\n \"The selected Pulse Project is no longer valid.\",\n {\n hint: `Run \\`siteos pulse project use ${input.projectSlug} --replace\\`.`,\n },\n );\n }\n return { migration: migration.status, project };\n}\n\nasync function resolvePulseApiOrigin(input: {\n cwd: string;\n env?: NodeJS.ProcessEnv;\n requireConfig: boolean;\n}): Promise<string> {\n const configured = input.env?.SITEOS_PULSE_API_URL?.trim();\n if (configured) return normalizeApiUrl(configured);\n try {\n const config = await loadChecksConfigFile(input.cwd);\n if (config.apiUrl) return normalizeApiUrl(config.apiUrl);\n } catch (error) {\n if (\n input.requireConfig ||\n !(error instanceof CliError) ||\n error.code !== \"CONFIG_NOT_FOUND\"\n ) {\n throw error;\n }\n }\n return DEFAULT_SITEOS_PULSE_API_URL;\n}\n\nfunction projectBindingStore(\n options: PulseCommandOptions,\n): ProjectBindingStore {\n return (\n options.projectBindingStore ??\n new NodeProjectBindingStore(\n path.join(\n resolveSiteOSConfigHome({ env: options.env, homeDir: options.homeDir }),\n \"project-bindings.json\",\n ),\n )\n );\n}\n\nfunction parseProjectArguments(action: string, args: string[]) {\n const { positionals, values } = parseArgs({\n allowPositionals: true,\n args,\n options: {\n json: { default: false, type: \"boolean\" },\n ...(action === \"create\"\n ? {\n name: { type: \"string\" as const },\n slug: { type: \"string\" as const },\n }\n : {}),\n ...(action === \"use\"\n ? { replace: { default: false, type: \"boolean\" as const } }\n : {}),\n },\n strict: true,\n });\n if (\n action === \"create\" &&\n (!values.slug || !values.name || positionals.length > 0)\n ) {\n throw usageError(\n \"Usage: siteos pulse project create --slug <slug> --name <name> [--json]\",\n );\n }\n if (action === \"use\" && (positionals.length !== 1 || !positionals[0])) {\n throw usageError(\n \"Usage: siteos pulse project use <slug> [--replace] [--json]\",\n );\n }\n if ((action === \"list\" || action === \"status\") && positionals.length > 0) {\n throw usageError(\n `siteos pulse project ${action} does not accept positional arguments.`,\n );\n }\n return {\n json: Boolean(values.json),\n name: typeof values.name === \"string\" ? values.name : undefined,\n replace: Boolean(values.replace),\n slug:\n action === \"use\"\n ? positionals[0]\n : typeof values.slug === \"string\"\n ? values.slug\n : undefined,\n };\n}\n\nfunction uniqueProjectBySlug(\n projects: PulseProject[],\n slug: string,\n): PulseProject {\n const matches = projects.filter((project) => project.slug === slug);\n if (matches.length !== 1) {\n throw new CliError(\n matches.length === 0 ? \"PULSE_PROJECT_NOT_FOUND\" : \"API_INVALID_RESPONSE\",\n matches.length === 0\n ? \"The Pulse Project was not found.\"\n : \"SiteOS Pulse returned an ambiguous Project list.\",\n );\n }\n return matches[0]!;\n}\n\nfunction formatValidation(\n report: Awaited<ReturnType<typeof validateProject>>,\n): string {\n return [\n report.valid\n ? \"SiteOS Pulse project is valid.\"\n : \"SiteOS Pulse project is invalid.\",\n `Bundle inputs: ${report.files.length} files, ${report.totalBytes} bytes`,\n ...report.warnings.map((warning) => `Warning: ${warning}`),\n ...report.errors.map((error) => `Error: ${error}`),\n ].join(\"\\n\");\n}\n\nfunction formatSyncReport(report: SyncReport): string {\n return [\n report.hasDrift\n ? \"Synchronization drift detected.\"\n : \"Monitored tests are synchronized.\",\n ...report.added.map((entry) => `Added: ${entry.path}`),\n ...report.removed.map(\n (entry) => `Removed: ${entry.path} (Check: ${entry.checkSlug})`,\n ),\n ...report.unchanged.map(\n (entry) => `Unchanged: ${entry.path} (Check: ${entry.checkSlug})`,\n ),\n ...report.patternManaged.map(\n (entry) =>\n `Pattern-managed: ${entry.checkSlug} (${entry.matchedSpecs.length} matched spec${entry.matchedSpecs.length === 1 ? \"\" : \"s\"})`,\n ),\n ...report.supportingFiles.added.map(\n (file) => `Supporting file to add: ${file}`,\n ),\n ...(report.migrationRequired\n ? [\"Migration required: version 1 -> version 2\"]\n : []),\n ...report.blockers.map((blocker) => `Blocker: ${blocker.message}`),\n ].join(\"\\n\");\n}\n\nfunction formatProjectList(projects: PulseProject[]): string {\n return [\n \"SiteOS Pulse Projects.\",\n `Projects: ${projects.length}`,\n ...projects.map(\n (project) =>\n `- ${project.slug}: ${project.name} (${project.checkCount} Check${project.checkCount === 1 ? \"\" : \"s\"})`,\n ),\n ].join(\"\\n\");\n}\n\nfunction success(json: boolean, value: unknown, text: string): CommandResult {\n return {\n exitCode: CLI_EXIT_CODE.success,\n stdout: json ? JSON.stringify(value, null, 2) : text,\n };\n}\n\nfunction usageError(message: string): CliError {\n return new CliError(\"USAGE_ERROR\", message, {\n exitCode: CLI_EXIT_CODE.usage,\n });\n}\n\nfunction formatPulseError(error: unknown, json: boolean): CommandResult {\n if (\n error instanceof TypeError &&\n \"code\" in error &&\n error.code === \"ERR_PARSE_ARGS\"\n ) {\n return commandError({\n error: { code: \"USAGE_ERROR\", message: error.message, service: \"pulse\" },\n exitCode: CLI_EXIT_CODE.usage,\n json,\n });\n }\n const normalized = normalizePulseError(error);\n return commandError({\n error: {\n code: normalized.code,\n message: normalized.hint\n ? `${normalized.message}\\nHint: ${normalized.hint}`\n : normalized.message,\n service: \"pulse\",\n },\n exitCode: exitCodeForPulseError(normalized),\n json,\n });\n}\n\nfunction normalizePulseError(error: unknown): CliError {\n if (error instanceof CliError) return error;\n if (error instanceof SiteOSAuthApiError)\n return new CliError(error.code, error.message);\n if (\n error instanceof RepositoryRootError ||\n error instanceof ProjectBindingStoreError\n ) {\n return new CliError(error.code, error.message);\n }\n return new CliError(\n \"UNEXPECTED_ERROR\",\n error instanceof Error ? error.message : \"An unexpected error occurred.\",\n );\n}\n\nfunction exitCodeForPulseError(\n error: CliError,\n): Exclude<(typeof CLI_EXIT_CODE)[keyof typeof CLI_EXIT_CODE], 0> {\n if (error.exitCode === CLI_EXIT_CODE.usage || error.code === \"USAGE_ERROR\") {\n return CLI_EXIT_CODE.usage;\n }\n if (\n [\"UNAUTHORIZED\", \"FORBIDDEN\", \"SESSION_INVALID\", \"GRANT_DENIED\"].includes(\n error.code,\n )\n ) {\n return CLI_EXIT_CODE.authorization;\n }\n if (\n error.code.includes(\"CONFLICT\") ||\n error.code.includes(\"BINDING\") ||\n error.code.includes(\"CHANGED\") ||\n error.code.includes(\"NOT_FOUND\")\n ) {\n return CLI_EXIT_CODE.conflict;\n }\n if (error.code.includes(\"UNAVAILABLE\") || error.code === \"API_UNREACHABLE\") {\n return CLI_EXIT_CODE.unavailable;\n }\n return CLI_EXIT_CODE.internal;\n}\n","import {\n CLI_EXIT_CODE,\n type CliExitCode,\n type CommandResult,\n} from \"./command-result.js\";\n\nexport type SafeCliError = {\n code: string;\n message: string;\n service?: \"auth\" | \"forms\" | \"pulse\" | \"search\";\n};\n\nexport function commandError(input: {\n error: SafeCliError;\n exitCode?: Exclude<CliExitCode, 0>;\n json: boolean;\n}): CommandResult {\n return {\n exitCode: input.exitCode ?? CLI_EXIT_CODE.internal,\n stderr: input.json\n ? JSON.stringify({ ok: false, error: input.error }, null, 2)\n : input.error.message,\n };\n}\n","import { readFile } from \"node:fs/promises\";\n\nimport { z } from \"zod\";\n\nimport type { DeploymentManifest } from \"./bundle.js\";\nimport { CliError } from \"./errors.js\";\n\nconst projectSchema = z\n .object({\n baseUrl: z.string().url().nullable(),\n checkCount: z.number().int().min(0),\n id: z.string().trim().min(1).max(120),\n name: z.string().trim().min(1).max(120),\n slug: z\n .string()\n .trim()\n .min(1)\n .max(80)\n .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),\n })\n .strict();\n\nconst projectListSchema = z\n .object({ projects: z.array(projectSchema) })\n .strict();\nconst projectResponseSchema = z.object({ project: projectSchema }).strict();\nconst deploymentResponseSchema = z\n .object({\n checks: z.array(\n z\n .object({\n checkId: z.string().min(1),\n created: z.boolean(),\n deploymentId: z.string().min(1),\n slug: z.string().min(1),\n version: z.number().int().positive(),\n })\n .strict(),\n ),\n checksum: z.string().min(1),\n dashboardUrl: z.string().url().optional(),\n projectId: z.string().min(1),\n })\n .strict();\n\nexport type PulseProject = z.infer<typeof projectSchema>;\nexport type PulseDeploymentResponse = z.infer<typeof deploymentResponseSchema>;\n\ntype PulseApiErrorPayload = {\n error?: { code?: unknown; message?: unknown } | string;\n};\n\nexport function createPulseApiClient(input: {\n apiOrigin: string;\n fetchImpl?: typeof fetch;\n}) {\n const fetchImpl = input.fetchImpl ?? fetch;\n const request = async <T>(options: {\n body?: BodyInit;\n grant: string;\n method?: string;\n path: string;\n schema: z.ZodType<T>;\n }): Promise<T> => {\n const endpoint = new URL(options.path, input.apiOrigin);\n let response: Response;\n try {\n response = await fetchImpl(endpoint, {\n body: options.body,\n headers: {\n accept: \"application/json\",\n authorization: `Bearer ${options.grant}`,\n ...(typeof options.body === \"string\"\n ? { \"content-type\": \"application/json\" }\n : {}),\n },\n method: options.method,\n });\n } catch {\n throw new CliError(\n \"API_UNREACHABLE\",\n `Could not reach ${endpoint.origin}.`,\n {\n hint: \"Check SITEOS_PULSE_API_URL and the network connection.\",\n },\n );\n }\n\n const body = (await response.json().catch(() => null)) as\n PulseApiErrorPayload | T | null;\n if (!response.ok) throw pulseApiError(body, response.status);\n const parsed = options.schema.safeParse(body);\n if (!parsed.success) {\n throw new CliError(\n \"API_INVALID_RESPONSE\",\n \"SiteOS Pulse returned an invalid response.\",\n );\n }\n return parsed.data;\n };\n\n return {\n async createProject(options: {\n baseUrl: string;\n grant: string;\n monitoringEnabled: boolean;\n name: string;\n slug: string;\n }): Promise<PulseProject> {\n const result = await request({\n body: JSON.stringify({\n baseUrl: options.baseUrl,\n monitoringEnabled: options.monitoringEnabled,\n name: options.name,\n slug: options.slug,\n }),\n grant: options.grant,\n method: \"POST\",\n path: \"/api/cli/v1/projects\",\n schema: projectResponseSchema,\n });\n return result.project;\n },\n\n async getProject(options: {\n grant: string;\n projectId: string;\n }): Promise<PulseProject> {\n const result = await request({\n grant: options.grant,\n path: `/api/cli/v1/projects/${encodeURIComponent(options.projectId)}`,\n schema: projectResponseSchema,\n });\n return result.project;\n },\n\n async listProjects(options: { grant: string }): Promise<PulseProject[]> {\n const result = await request({\n grant: options.grant,\n path: \"/api/cli/v1/projects\",\n schema: projectListSchema,\n });\n return result.projects;\n },\n\n async uploadDeployment(options: {\n grant: string;\n manifest: DeploymentManifest;\n projectId: string;\n }): Promise<PulseDeploymentResponse> {\n const form = new FormData();\n const { archivePath: _archivePath, ...publicManifest } = options.manifest;\n form.set(\"manifest\", JSON.stringify(publicManifest));\n form.set(\n \"target\",\n JSON.stringify({\n version: 1,\n mode: \"update\",\n projectId: options.projectId,\n }),\n );\n form.set(\n \"bundle\",\n new Blob([await readFile(options.manifest.archivePath)], {\n type: \"application/gzip\",\n }),\n \"checks-bundle.tgz\",\n );\n return request({\n body: form,\n grant: options.grant,\n method: \"POST\",\n path: \"/api/cli/v1/deployments\",\n schema: deploymentResponseSchema,\n });\n },\n };\n}\n\nfunction pulseApiError(body: unknown, status: number): CliError {\n const payload = body as PulseApiErrorPayload | null;\n const candidate = payload?.error;\n const code =\n candidate &&\n typeof candidate === \"object\" &&\n typeof candidate.code === \"string\"\n ? candidate.code\n : status === 401\n ? \"UNAUTHORIZED\"\n : status === 403\n ? \"FORBIDDEN\"\n : status === 404\n ? \"NOT_FOUND\"\n : status === 409\n ? \"CONFLICT\"\n : \"API_REJECTED\";\n const message =\n typeof candidate === \"string\"\n ? candidate\n : candidate &&\n typeof candidate === \"object\" &&\n typeof candidate.message === \"string\"\n ? candidate.message\n : `SiteOS Pulse returned ${status}.`;\n return new CliError(code, message);\n}\n","import { createHash } from \"node:crypto\";\nimport { lstat, readFile, realpath } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nimport { z } from \"zod\";\n\nimport type { ProjectBindingStore } from \"../core/ports/project-binding-store.js\";\nimport { normalizeApiUrl } from \"./constants.js\";\nimport { CliError } from \"./errors.js\";\n\nconst legacyBindingSchema = z\n .object({\n apiUrl: z.string().url(),\n organizationId: z.string().trim().min(1).max(255),\n projectId: z.string().trim().min(1).max(255),\n projectRoot: z.string().refine(path.isAbsolute),\n projectSlug: z\n .string()\n .trim()\n .min(1)\n .max(80)\n .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),\n })\n .strict();\n\nconst legacyBindingsSchema = z\n .object({\n bindings: z.record(legacyBindingSchema),\n version: z.literal(2),\n })\n .strict();\n\nexport type PulseBindingMigrationResult =\n | {\n binding: Awaited<ReturnType<ProjectBindingStore[\"read\"]>>;\n status: \"already-current\";\n }\n | {\n binding: Awaited<ReturnType<ProjectBindingStore[\"read\"]>>;\n status: \"imported\";\n }\n | { binding: null; status: \"not-found\" };\n\nexport async function migrateLegacyPulseBinding(input: {\n apiOrigin: string;\n legacyBindingsPath?: string;\n organizationId: string;\n projectBindingStore: ProjectBindingStore;\n projectSlug: string;\n repositoryRoot: string;\n}): Promise<PulseBindingMigrationResult> {\n const apiOrigin = normalizeApiUrl(input.apiOrigin);\n const repositoryRoot = await realpath(path.resolve(input.repositoryRoot));\n const locator = { apiOrigin, repositoryRoot, service: \"pulse\" as const };\n const current = await input.projectBindingStore.read(locator);\n if (current) return { binding: current, status: \"already-current\" };\n\n const legacy = await readLegacyBindings(\n input.legacyBindingsPath ?? legacyPulseBindingsFilePath(),\n );\n if (!legacy) return { binding: null, status: \"not-found\" };\n const key = legacyBindingKey(apiOrigin, repositoryRoot);\n const candidate = legacy.bindings[key];\n if (\n !candidate ||\n candidate.apiUrl !== apiOrigin ||\n candidate.projectRoot !== repositoryRoot ||\n candidate.organizationId !== input.organizationId ||\n candidate.projectSlug !== input.projectSlug\n ) {\n return { binding: null, status: \"not-found\" };\n }\n\n const imported = await input.projectBindingStore.write({\n ...locator,\n organizationId: candidate.organizationId,\n project: { id: candidate.projectId, slug: candidate.projectSlug },\n });\n const readBack = await input.projectBindingStore.read(locator);\n if (!readBack || readBack.project.id !== imported.project.id) {\n throw new CliError(\n \"PROJECT_BINDING_MIGRATION_FAILED\",\n \"The migrated Pulse Project binding could not be verified.\",\n );\n }\n return { binding: readBack, status: \"imported\" };\n}\n\nexport function legacyPulseBindingsFilePath(\n input: {\n env?: NodeJS.ProcessEnv;\n homeDir?: string;\n } = {},\n): string {\n const env = input.env ?? process.env;\n const configRoot = env.XDG_CONFIG_HOME\n ? path.resolve(env.XDG_CONFIG_HOME)\n : path.join(input.homeDir ?? os.homedir(), \".config\");\n return path.join(configRoot, \"siteos\", \"pulse\", \"project-bindings.json\");\n}\n\nasync function readLegacyBindings(filePath: string) {\n try {\n const stats = await lstat(filePath);\n if (stats.isSymbolicLink() || !stats.isFile())\n throw new Error(\"unsafe file\");\n const parsed = legacyBindingsSchema.parse(\n JSON.parse(await readFile(filePath, \"utf8\")),\n );\n for (const [key, binding] of Object.entries(parsed.bindings)) {\n if (\n key !==\n legacyBindingKey(normalizeApiUrl(binding.apiUrl), binding.projectRoot)\n ) {\n throw new Error(\"binding key mismatch\");\n }\n }\n return parsed;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw new CliError(\n \"PROJECT_BINDINGS_INVALID\",\n \"The legacy Pulse Project bindings could not be read safely.\",\n {\n hint: \"Remove the legacy binding file, then run `siteos pulse project use <slug>`.\",\n },\n );\n }\n}\n\nfunction legacyBindingKey(apiUrl: string, projectRoot: string): string {\n return createHash(\"sha256\").update(`${apiUrl}\\0${projectRoot}`).digest(\"hex\");\n}\n","export const DEFAULT_SITEOS_PULSE_API_URL = \"https://app.siteos.sh\";\n\nexport function normalizeApiUrl(value: string): string {\n let url: URL;\n try {\n url = new URL(value);\n } catch {\n throw new Error(\n \"SiteOS Pulse API URL must be an absolute HTTP or HTTPS URL.\",\n );\n }\n if (url.protocol !== \"https:\" && url.protocol !== \"http:\") {\n throw new Error(\"SiteOS Pulse API URL must use HTTP or HTTPS.\");\n }\n return url.origin;\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport {\n access,\n mkdir,\n readFile,\n rename,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport path from \"node:path\";\nimport * as tar from \"tar\";\nimport {\n CONFIG_FILE,\n findChecksConfigFile,\n loadChecksConfig,\n type ChecksConfig,\n} from \"./config.js\";\nimport { CliError } from \"./errors.js\";\nimport { discoverProjectFiles, type ProjectFile } from \"./project-files.js\";\n\nexport type DeploymentManifest = {\n schemaVersion: 2;\n project: ChecksConfig[\"project\"];\n checks: ChecksConfig[\"checks\"];\n testsDir: string;\n playwrightConfig?: string;\n flowCount: number;\n checksum: string;\n archivePath: string;\n fileCount: number;\n totalBytes: number;\n files: ProjectFile[];\n createdAt: string;\n};\n\nasync function hashArchive(archivePath: string): Promise<string> {\n return createHash(\"sha256\")\n .update(await readFile(archivePath))\n .digest(\"hex\");\n}\n\nexport async function createDeploymentBundle(input: {\n projectRoot: string;\n output?: string;\n projectOverride?: Pick<ChecksConfig[\"project\"], \"name\" | \"slug\" | \"baseUrl\">;\n}): Promise<DeploymentManifest> {\n const projectRoot = path.resolve(input.projectRoot);\n const config = await loadChecksConfig(projectRoot);\n const configFile = (await findChecksConfigFile(projectRoot)) ?? CONFIG_FILE;\n const report = await discoverProjectFiles(projectRoot, config);\n if (!report.valid) {\n throw new CliError(\n \"PROJECT_INVALID\",\n `Project validation failed: ${report.errors.join(\"; \")}`,\n {\n hint: \"Run `siteos pulse validate` for the full report.\",\n },\n );\n }\n\n const outputDirectory = input.output\n ? path.dirname(path.resolve(projectRoot, input.output))\n : path.join(projectRoot, \".siteos\", \"pulse\", \"deployments\");\n await mkdir(outputDirectory, { recursive: true });\n const temporaryPath = path.join(\n outputDirectory,\n `.siteos-pulse-${randomUUID()}.tgz`,\n );\n const archiveFiles = [\n ...new Set([configFile, ...report.files.map((file) => file.path)]),\n ].sort();\n\n await tar.create(\n {\n cwd: projectRoot,\n file: temporaryPath,\n gzip: true,\n portable: true,\n noMtime: true,\n follow: false,\n },\n archiveFiles,\n );\n\n const checksum = await hashArchive(temporaryPath);\n const archivePath = input.output\n ? path.resolve(projectRoot, input.output)\n : path.join(outputDirectory, `siteos-pulse-${checksum.slice(0, 16)}.tgz`);\n try {\n await access(archivePath);\n if (input.output) {\n await rm(temporaryPath, { force: true });\n throw new CliError(\n \"OUTPUT_EXISTS\",\n `Refusing to overwrite ${archivePath}.`,\n );\n }\n await rm(temporaryPath, { force: true });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\")\n await rename(temporaryPath, archivePath);\n else throw error;\n }\n\n const manifest: DeploymentManifest = {\n schemaVersion: 2,\n project: { ...config.project, ...input.projectOverride },\n checks: config.checks,\n testsDir: config.testsDir,\n playwrightConfig: config.playwrightConfig,\n flowCount: report.testFileCount,\n checksum,\n archivePath,\n fileCount: report.files.length,\n totalBytes: report.totalBytes,\n files: report.files,\n createdAt: new Date().toISOString(),\n };\n await writeFile(\n `${archivePath}.json`,\n `${JSON.stringify(manifest, null, 2)}\\n`,\n \"utf8\",\n );\n return manifest;\n}\n","import { createHash } from \"node:crypto\";\nimport { lstat, readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport fg from \"fast-glob\";\nimport type { ChecksConfig } from \"./config.js\";\n\nexport const MAX_BUNDLE_FILES = 5_000;\nexport const MAX_BUNDLE_BYTES = 50 * 1024 * 1024;\nexport const MAX_FILE_BYTES = 10 * 1024 * 1024;\n\nconst TEST_FILE_PATTERN = /\\.(?:spec|test)\\.(?:[cm]?[jt]sx?)$/;\nconst SENSITIVE_SEGMENTS = new Set([\n \".git\",\n \"node_modules\",\n \".checks\",\n \".siteos\",\n]);\nconst SENSITIVE_FILES = [\n /^\\.env(?:\\..+)?$/,\n /^\\.npmrc$/,\n /(?:^|[-_.])(secret|credentials?)(?:[-_.]|$)/i,\n];\n\nexport type ProjectFile = { path: string; size: number; checksum: string };\n\nexport type ValidationReport = {\n valid: boolean;\n errors: string[];\n warnings: string[];\n files: ProjectFile[];\n totalBytes: number;\n testFileCount: number;\n};\n\nfunction isSensitive(relativePath: string): boolean {\n const segments = relativePath.split(\"/\");\n if (segments.some((segment) => SENSITIVE_SEGMENTS.has(segment))) return true;\n return SENSITIVE_FILES.some((pattern) => pattern.test(segments.at(-1) ?? \"\"));\n}\n\nasync function hashFile(filePath: string): Promise<string> {\n return createHash(\"sha256\")\n .update(await readFile(filePath))\n .digest(\"hex\");\n}\n\nexport async function discoverProjectFiles(\n projectRoot: string,\n config: ChecksConfig,\n): Promise<ValidationReport> {\n const errors: string[] = [];\n const warnings: string[] = [];\n const includePatterns = [\n ...config.checks.flatMap((check) => check.include),\n ...(config.bundle?.include ?? []),\n ...(config.playwrightConfig ? [config.playwrightConfig] : []),\n ];\n const matches = await fg(includePatterns, {\n cwd: projectRoot,\n onlyFiles: true,\n unique: true,\n dot: true,\n followSymbolicLinks: false,\n ignore: [\n \"**/node_modules/**\",\n \"**/.git/**\",\n \"**/.checks/**\",\n \"**/.siteos/**\",\n ],\n });\n const relativeFiles = [\n ...new Set(matches.map((file) => file.replaceAll(\"\\\\\", \"/\"))),\n ].sort();\n\n if (relativeFiles.length === 0)\n errors.push(\"The include patterns did not match any files.\");\n if (relativeFiles.length > MAX_BUNDLE_FILES) {\n errors.push(\n `The bundle contains ${relativeFiles.length} files; the limit is ${MAX_BUNDLE_FILES}.`,\n );\n }\n\n const selectedTestFiles = new Set<string>();\n\n for (const check of config.checks) {\n const checkTestFiles = await fg(check.include, {\n cwd: projectRoot,\n onlyFiles: true,\n unique: true,\n followSymbolicLinks: false,\n ignore: [\n \"**/node_modules/**\",\n \"**/.git/**\",\n \"**/.checks/**\",\n \"**/.siteos/**\",\n ],\n });\n if (checkTestFiles.length === 0) {\n errors.push(`Check ${check.slug} does not match any bundled files.`);\n continue;\n }\n const runnable = checkTestFiles\n .map((file) => file.replaceAll(\"\\\\\", \"/\"))\n .filter((file) => TEST_FILE_PATTERN.test(file));\n if (runnable.length === 0) {\n errors.push(\n `Check ${check.slug} does not match a Playwright spec or test file.`,\n );\n continue;\n }\n runnable.forEach((file) => selectedTestFiles.add(file));\n const supporting = checkTestFiles.length - runnable.length;\n if (supporting > 0) {\n warnings.push(\n `Check ${check.slug} includes ${supporting} supporting file${supporting === 1 ? \"\" : \"s\"}; move them to bundle.include.`,\n );\n }\n }\n\n const files: ProjectFile[] = [];\n let totalBytes = 0;\n for (const relativePath of relativeFiles) {\n if (isSensitive(relativePath)) {\n errors.push(`Sensitive path cannot be included: ${relativePath}`);\n continue;\n }\n const absolutePath = path.resolve(projectRoot, relativePath);\n const relativeToRoot = path.relative(projectRoot, absolutePath);\n if (relativeToRoot.startsWith(\"..\") || path.isAbsolute(relativeToRoot)) {\n errors.push(`Included path escapes the project root: ${relativePath}`);\n continue;\n }\n const stats = await lstat(absolutePath);\n if (!stats.isFile()) continue;\n if (stats.size > MAX_FILE_BYTES) {\n errors.push(`File exceeds the 10 MiB limit: ${relativePath}`);\n continue;\n }\n totalBytes += stats.size;\n files.push({\n path: relativePath,\n size: stats.size,\n checksum: await hashFile(absolutePath),\n });\n }\n if (totalBytes > MAX_BUNDLE_BYTES)\n errors.push(\"The bundle exceeds the 50 MiB size limit.\");\n\n try {\n const packageSource = await readFile(\n path.join(projectRoot, \"package.json\"),\n \"utf8\",\n );\n const packageJson = JSON.parse(packageSource) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n if (\n !packageJson.dependencies?.[\"@playwright/test\"] &&\n !packageJson.devDependencies?.[\"@playwright/test\"]\n ) {\n errors.push(\"@playwright/test is not declared in package.json.\");\n }\n } catch {\n errors.push(\"A readable package.json is required.\");\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n files,\n totalBytes,\n testFileCount: selectedTestFiles.size,\n };\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n ChecksConfigV2Schema,\n CONFIG_FILE,\n findChecksConfigFile,\n projectDisplayName,\n projectSlug,\n type ChecksConfig,\n} from \"./config.js\";\nimport { DEFAULT_SITEOS_PULSE_API_URL } from \"./constants.js\";\nimport { CliError } from \"./errors.js\";\n\nexport const SITEOS_PLAYWRIGHT_CONFIG = \"siteos.playwright.config.ts\";\nconst PULSE_CACHE_DIRECTORY = \".siteos/pulse/\";\n\nasync function exists(filePath: string): Promise<boolean> {\n try {\n await readFile(filePath);\n return true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return false;\n throw error;\n }\n}\n\nfunction pulsePlaywrightConfigSource(input: {\n testsDir: string;\n baseUrl?: string;\n}): string {\n const testsDir = input.testsDir.replaceAll(\"\\\\\", \"/\");\n return `import { defineConfig, devices } from \"@playwright/test\";\n\nexport default defineConfig({\n testDir: ${JSON.stringify(testsDir === \".\" ? \".\" : `./${testsDir}`)},\n fullyParallel: false,\n forbidOnly: true,\n workers: 1,\n retries: 0,\n projects: [\n {\n name: \"chromium\",\n use: { ...devices[\"Desktop Chrome\"] },\n },\n ],\n use: {\n baseURL:\n process.env.PLAYWRIGHT_BASE_URL ??\n ${JSON.stringify(input.baseUrl ?? \"http://localhost:3000\")},\n screenshot: \"only-on-failure\",\n trace: \"retain-on-failure\",\n video: \"retain-on-failure\",\n },\n});\n`;\n}\n\nasync function createPulsePlaywrightConfig(input: {\n projectRoot: string;\n testsDir: string;\n baseUrl?: string;\n}): Promise<void> {\n const configPath = path.join(input.projectRoot, SITEOS_PLAYWRIGHT_CONFIG);\n if (await exists(configPath)) {\n throw new CliError(\n \"PULSE_PLAYWRIGHT_CONFIG_EXISTS\",\n `${SITEOS_PLAYWRIGHT_CONFIG} already exists.`,\n {\n hint: \"Keep the file and create siteos.config.json manually, or rename it before running `siteos pulse init`.\",\n },\n );\n }\n await writeFile(configPath, pulsePlaywrightConfigSource(input), {\n encoding: \"utf8\",\n flag: \"wx\",\n });\n}\n\nexport async function detectPackageName(projectRoot: string): Promise<string> {\n try {\n const contents = await readFile(\n path.join(projectRoot, \"package.json\"),\n \"utf8\",\n );\n const parsed = JSON.parse(contents) as { name?: unknown };\n return typeof parsed.name === \"string\"\n ? parsed.name\n : path.basename(projectRoot);\n } catch {\n return path.basename(projectRoot);\n }\n}\n\nasync function ensureGitignore(projectRoot: string): Promise<boolean> {\n const gitignorePath = path.join(projectRoot, \".gitignore\");\n let contents = \"\";\n try {\n contents = await readFile(gitignorePath, \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n }\n if (contents.split(/\\r?\\n/).includes(PULSE_CACHE_DIRECTORY)) return false;\n const prefix = contents.length > 0 && !contents.endsWith(\"\\n\") ? \"\\n\" : \"\";\n await writeFile(\n gitignorePath,\n `${contents}${prefix}${PULSE_CACHE_DIRECTORY}\\n`,\n \"utf8\",\n );\n return true;\n}\n\nexport type InitResult = { created: string[]; updated: string[] };\n\nexport async function initializeExistingProject(input: {\n projectRoot: string;\n project: string;\n baseUrl: string;\n testsDir: string;\n supportingFiles: string[];\n checks: ChecksConfig[\"checks\"];\n}): Promise<InitResult> {\n const projectRoot = path.resolve(input.projectRoot);\n const existingConfig = await findChecksConfigFile(projectRoot);\n if (existingConfig) {\n throw new CliError(\"CONFIG_EXISTS\", `${existingConfig} already exists.`, {\n hint: \"Edit the existing file or run `siteos pulse validate`.\",\n });\n }\n const configPath = path.join(projectRoot, CONFIG_FILE);\n const config = ChecksConfigV2Schema.parse({\n version: 2,\n project: {\n slug: projectSlug(input.project),\n name: projectDisplayName(input.project),\n baseUrl: input.baseUrl,\n monitoringEnabled: true,\n },\n testsDir: input.testsDir,\n playwrightConfig: SITEOS_PLAYWRIGHT_CONFIG,\n bundle: input.supportingFiles.length\n ? { include: input.supportingFiles }\n : undefined,\n checks: input.checks,\n apiUrl: DEFAULT_SITEOS_PULSE_API_URL,\n });\n const created = [CONFIG_FILE];\n await createPulsePlaywrightConfig({\n projectRoot,\n testsDir: input.testsDir,\n baseUrl: input.baseUrl,\n });\n created.push(SITEOS_PLAYWRIGHT_CONFIG);\n await writeFile(configPath, `${JSON.stringify(config, null, 2)}\\n`, {\n encoding: \"utf8\",\n flag: \"wx\",\n });\n const updated = (await ensureGitignore(projectRoot)) ? [\".gitignore\"] : [];\n return { created, updated };\n}\n\nexport async function initializeProject(input: {\n projectRoot: string;\n project?: string;\n suite?: string;\n testsDir?: string;\n baseUrl?: string;\n}): Promise<InitResult> {\n const projectRoot = path.resolve(input.projectRoot);\n const existingConfig = await findChecksConfigFile(projectRoot);\n if (existingConfig) {\n throw new CliError(\"CONFIG_EXISTS\", `${existingConfig} already exists.`, {\n hint: \"Edit the existing file or run `siteos pulse validate`.\",\n });\n }\n const configPath = path.join(projectRoot, CONFIG_FILE);\n\n const created: string[] = [];\n const updated: string[] = [];\n const testsDir = input.testsDir ?? \"tests/siteos\";\n const packageName = await detectPackageName(projectRoot);\n const projectName = projectDisplayName(input.project ?? packageName);\n const checkSlug = projectSlug(input.suite ?? \"homepage\");\n const exampleTest = path.posix.join(\n testsDir.replaceAll(\"\\\\\", \"/\"),\n `${checkSlug}.spec.ts`,\n );\n const parsedConfig = ChecksConfigV2Schema.safeParse({\n version: 2,\n project: {\n slug: projectSlug(input.project ?? packageName),\n name: projectName,\n baseUrl: input.baseUrl,\n monitoringEnabled: true,\n },\n testsDir,\n apiUrl: DEFAULT_SITEOS_PULSE_API_URL,\n playwrightConfig: SITEOS_PLAYWRIGHT_CONFIG,\n checks: [\n {\n slug: checkSlug,\n name: projectDisplayName(input.suite ?? \"homepage\"),\n include: [exampleTest],\n active: true,\n schedule: { mode: \"scheduled\", cadenceSeconds: 300 },\n },\n ],\n });\n if (!parsedConfig.success) {\n throw new CliError(\n \"INIT_OPTIONS_INVALID\",\n parsedConfig.error.issues.map((issue) => issue.message).join(\"; \"),\n );\n }\n const config = parsedConfig.data;\n\n await createPulsePlaywrightConfig({\n projectRoot,\n testsDir,\n baseUrl: input.baseUrl,\n });\n created.push(SITEOS_PLAYWRIGHT_CONFIG);\n\n const testDirectory = path.join(projectRoot, testsDir);\n await mkdir(testDirectory, { recursive: true });\n if (!(await exists(path.join(projectRoot, exampleTest)))) {\n await writeFile(\n path.join(projectRoot, exampleTest),\n `import { expect, test } from \"@playwright/test\";\\n\\ntest(${JSON.stringify(`${projectDisplayName(input.suite ?? \"homepage\")} is reachable`)}, async ({ page }) => {\\n await page.goto(\"/\");\\n await expect(page.locator(\"body\")).toBeVisible();\\n});\\n`,\n { encoding: \"utf8\", flag: \"wx\" },\n );\n created.push(exampleTest);\n }\n\n await writeFile(configPath, `${JSON.stringify(config, null, 2)}\\n`, {\n encoding: \"utf8\",\n flag: \"wx\",\n });\n created.unshift(CONFIG_FILE);\n\n if (await ensureGitignore(projectRoot)) updated.push(\".gitignore\");\n return { created, updated };\n}\n","import fg from \"fast-glob\";\n\nimport {\n ChecksConfigV2Schema,\n loadChecksConfigSnapshot,\n saveChecksConfig,\n type ChecksConfig,\n type ChecksConfigSnapshot,\n} from \"./config.js\";\nimport { CliError } from \"./errors.js\";\nimport {\n discoverPlaywrightSelectorMatches,\n discoverPlaywrightSpecs,\n} from \"./interactive/discovery.js\";\nimport { buildSyncPlan, type SyncPlan } from \"./sync-plan.js\";\nimport { analyzeTestImports, type ImportAnalysis } from \"./test-imports.js\";\n\nconst PLAYWRIGHT_SPEC_FILE = /\\.(?:spec|test)\\.(?:[cm]?[jt]sx?)$/;\n\nexport type SyncBlocker = {\n code: \"unsupported-dependency\" | \"compatibility-issue\";\n message: string;\n};\n\nexport type SyncReport = SyncPlan & {\n supportingFiles: {\n configured: string[];\n required: string[];\n added: string[];\n };\n environmentVariables: string[];\n blockers: SyncBlocker[];\n};\n\nexport type SyncInspection = {\n report: SyncReport;\n snapshot: ChecksConfigSnapshot;\n};\n\nexport type PreparedProjectSync = {\n config: ChecksConfig;\n changed: boolean;\n addedChecks: Array<{ path: string; checkSlug: string }>;\n removedSelectors: Array<{ path: string; checkSlug: string }>;\n supportingFilesAdded: string[];\n migrationRequired: boolean;\n};\n\nexport type ProjectSyncResult = Omit<PreparedProjectSync, \"config\">;\n\nfunction sortedUnique(values: string[]): string[] {\n return [...new Set(values)].sort();\n}\n\nfunction exactManagedSpecs(config: ChecksConfig): string[] {\n return sortedUnique(\n config.checks.flatMap((check) => {\n if (check.include.some((selector) => fg.isDynamicPattern(selector)))\n return [];\n return check.include.filter((selector) =>\n PLAYWRIGHT_SPEC_FILE.test(selector),\n );\n }),\n );\n}\n\nfunction blockersFromAnalysis(analysis: ImportAnalysis): SyncBlocker[] {\n const dependencyBlockers = analysis.externalPackages.map((dependency) => {\n const importedBy =\n analysis.externalImporters[dependency]?.join(\", \") ?? \"managed specs\";\n return {\n code: \"unsupported-dependency\" as const,\n message: `${dependency} is imported by ${importedBy}.`,\n };\n });\n return [\n ...dependencyBlockers,\n ...analysis.compatibilityIssues.map((message) => ({\n code: \"compatibility-issue\" as const,\n message,\n })),\n ];\n}\n\nasync function analyzeManagedSpecs(\n projectRoot: string,\n configOrEntryFiles: ChecksConfig | string[],\n): Promise<ImportAnalysis> {\n const entryFiles = Array.isArray(configOrEntryFiles)\n ? sortedUnique(configOrEntryFiles)\n : exactManagedSpecs(configOrEntryFiles);\n if (entryFiles.length === 0) {\n return {\n supportingFiles: [],\n externalPackages: [],\n externalImporters: {},\n environmentVariables: [],\n compatibilityIssues: [],\n };\n }\n return analyzeTestImports({ projectRoot, entryFiles });\n}\n\nexport async function inspectProjectSync(\n projectRoot: string,\n): Promise<SyncInspection> {\n const snapshot = await loadChecksConfigSnapshot(projectRoot);\n const discoveredSpecs = await discoverPlaywrightSpecs(\n projectRoot,\n snapshot.config.testsDir,\n );\n const patternChecks = snapshot.config.checks.filter((check) =>\n check.include.some((selector) => fg.isDynamicPattern(selector)),\n );\n const patternEntries = await Promise.all(\n patternChecks.map(async (check) => [\n check.slug,\n await discoverPlaywrightSelectorMatches(\n projectRoot,\n check.include,\n snapshot.config.testsDir,\n ),\n ]),\n );\n const plan = buildSyncPlan({\n config: snapshot.config,\n discoveredSpecs,\n patternMatchesByCheck: Object.fromEntries(patternEntries),\n migrationRequired: snapshot.migrationRequired,\n });\n const analysis = await analyzeManagedSpecs(\n projectRoot,\n plan.unchanged.map((entry) => entry.path),\n );\n const configuredSupportingFiles = sortedUnique(\n snapshot.config.bundle?.include ?? [],\n );\n const supportingFilesAdded = analysis.supportingFiles.filter(\n (file) => !configuredSupportingFiles.includes(file),\n );\n\n return {\n snapshot,\n report: {\n ...plan,\n hasDrift: plan.hasDrift || supportingFilesAdded.length > 0,\n supportingFiles: {\n configured: configuredSupportingFiles,\n required: analysis.supportingFiles,\n added: supportingFilesAdded,\n },\n environmentVariables: analysis.environmentVariables,\n blockers: blockersFromAnalysis(analysis),\n },\n };\n}\n\nfunction uniqueSlug(base: string, used: Set<string>): string {\n let candidate = base;\n let suffix = 2;\n while (used.has(candidate)) {\n candidate = `${base.slice(0, Math.max(1, 80 - String(suffix).length - 1))}-${suffix}`;\n suffix += 1;\n }\n used.add(candidate);\n return candidate;\n}\n\nfunction assertReviewedSelections(input: {\n inspection: SyncInspection;\n selectedAdded: string[];\n selectedRemoved: Array<{ path: string; checkSlug: string }>;\n}): void {\n const reviewedAdded = new Set(\n input.inspection.report.added.map((entry) => entry.path),\n );\n const reviewedRemoved = new Set(\n input.inspection.report.removed.map(\n (entry) => `${entry.checkSlug}\\0${entry.path}`,\n ),\n );\n const invalidAdded = input.selectedAdded.find(\n (spec) => !reviewedAdded.has(spec),\n );\n const invalidRemoved = input.selectedRemoved.find(\n (entry) => !reviewedRemoved.has(`${entry.checkSlug}\\0${entry.path}`),\n );\n if (invalidAdded || invalidRemoved) {\n throw new CliError(\n \"SYNC_SELECTION_INVALID\",\n \"The synchronization selection contains a change that was not part of the reviewed plan.\",\n {\n hint: \"Run `siteos pulse sync` again and review the current project state.\",\n },\n );\n }\n}\n\nfunction throwForBlockers(analysis: ImportAnalysis): void {\n const dependency = analysis.externalPackages[0];\n if (dependency) {\n const importedBy =\n analysis.externalImporters[dependency]?.join(\", \") ?? \"managed specs\";\n throw new CliError(\n \"SYNC_UNSUPPORTED_DEPENDENCY\",\n `Cannot synchronize ${dependency}; it is imported by ${importedBy}.`,\n { hint: \"Use local helpers or a dedicated Check without that package.\" },\n );\n }\n const compatibilityIssue = analysis.compatibilityIssues[0];\n if (compatibilityIssue) {\n throw new CliError(\"SYNC_COMPATIBILITY_ISSUE\", compatibilityIssue, {\n hint: \"Use a dedicated Pulse Playwright configuration without webServer imports.\",\n });\n }\n}\n\nexport async function prepareProjectSync(input: {\n projectRoot: string;\n inspection: SyncInspection;\n selectedAdded: string[];\n selectedRemoved?: Array<{ path: string; checkSlug: string }>;\n}): Promise<PreparedProjectSync> {\n const selectedAdded = sortedUnique(input.selectedAdded);\n const selectedRemoved =\n input.selectedRemoved ?? input.inspection.report.removed;\n assertReviewedSelections({\n inspection: input.inspection,\n selectedAdded,\n selectedRemoved,\n });\n\n const removedKeys = new Set(\n selectedRemoved.map((entry) => `${entry.checkSlug}\\0${entry.path}`),\n );\n const checks = input.inspection.snapshot.config.checks\n .map((check) => ({\n ...check,\n include: check.include.filter(\n (selector) => !removedKeys.has(`${check.slug}\\0${selector}`),\n ),\n }))\n .filter((check) => check.include.length > 0);\n const usedSlugs = new Set(checks.map((check) => check.slug));\n const addedChecks: PreparedProjectSync[\"addedChecks\"] = [];\n for (const specPath of selectedAdded) {\n const addition = input.inspection.report.added.find(\n (entry) => entry.path === specPath,\n )!;\n const checkSlug = uniqueSlug(addition.defaultSlug, usedSlugs);\n checks.push({\n slug: checkSlug,\n name: addition.defaultName,\n include: [specPath],\n active: true,\n schedule: { mode: \"manual\" },\n });\n addedChecks.push({ path: specPath, checkSlug });\n }\n if (checks.length === 0) {\n throw new CliError(\n \"NO_MONITORED_CHECKS\",\n \"Synchronization would remove every monitored Check.\",\n {\n hint: \"Select at least one discovered spec before applying synchronization.\",\n },\n );\n }\n\n const candidate = ChecksConfigV2Schema.parse({\n ...input.inspection.snapshot.config,\n checks,\n });\n const analysis = await analyzeManagedSpecs(input.projectRoot, candidate);\n throwForBlockers(analysis);\n const configuredSupportingFiles = candidate.bundle?.include ?? [];\n const supportingFilesAdded = analysis.supportingFiles.filter(\n (file) => !configuredSupportingFiles.includes(file),\n );\n const mergedSupportingFiles = sortedUnique([\n ...configuredSupportingFiles,\n ...analysis.supportingFiles,\n ]);\n const config = ChecksConfigV2Schema.parse({\n ...candidate,\n bundle:\n mergedSupportingFiles.length > 0\n ? { include: mergedSupportingFiles }\n : candidate.bundle,\n });\n\n return {\n config,\n changed:\n addedChecks.length > 0 ||\n selectedRemoved.length > 0 ||\n supportingFilesAdded.length > 0 ||\n input.inspection.snapshot.migrationRequired,\n addedChecks,\n removedSelectors: selectedRemoved,\n supportingFilesAdded,\n migrationRequired: input.inspection.snapshot.migrationRequired,\n };\n}\n\nexport async function writeProjectSync(input: {\n projectRoot: string;\n inspection: SyncInspection;\n prepared: PreparedProjectSync;\n}): Promise<ProjectSyncResult> {\n if (input.prepared.changed) {\n await saveChecksConfig(input.projectRoot, input.prepared.config, {\n expectedChecksum: input.inspection.snapshot.checksum,\n });\n }\n const { config: _config, ...result } = input.prepared;\n return result;\n}\n\nexport async function applyProjectSync(input: {\n projectRoot: string;\n inspection: SyncInspection;\n selectedAdded: string[];\n selectedRemoved?: Array<{ path: string; checkSlug: string }>;\n}): Promise<ProjectSyncResult> {\n const prepared = await prepareProjectSync(input);\n return writeProjectSync({\n projectRoot: input.projectRoot,\n inspection: input.inspection,\n prepared,\n });\n}\n","import { readFile } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\n\nimport fg from \"fast-glob\";\n\nimport {\n loadRootPlaywrightConfig,\n type RootPlaywrightConfig,\n} from \"./playwright-config.js\";\n\nconst PLAYWRIGHT_CONFIG_PATTERNS = [\n \"playwright.config.{js,cjs,mjs,ts,cts,mts}\",\n \"**/playwright.config.{js,cjs,mjs,ts,cts,mts}\",\n \"*.playwright.config.{js,cjs,mjs,ts,cts,mts}\",\n \"**/*.playwright.config.{js,cjs,mjs,ts,cts,mts}\",\n];\nconst PLAYWRIGHT_SPEC_PATTERN =\n \"**/*.{spec,test}.{js,cjs,mjs,ts,cts,mts,jsx,tsx}\";\nconst IGNORE = [\n \"**/node_modules/**\",\n \"**/.git/**\",\n \"**/.checks/**\",\n \"**/.siteos/**\",\n \"**/.output/**\",\n \"**/dist/**\",\n \"**/build/**\",\n \"**/output/**\",\n \"**/test-results/**\",\n \"**/playwright-report/**\",\n];\n\nexport async function discoverPlaywrightSpecs(\n projectRoot: string,\n testsDir: string,\n): Promise<string[]> {\n const normalizedTestsDir = testsDir\n .replaceAll(\"\\\\\", \"/\")\n .replace(/^\\.\\//, \"\");\n const specPaths = await fg(PLAYWRIGHT_SPEC_PATTERN, {\n cwd: projectRoot,\n onlyFiles: true,\n unique: true,\n followSymbolicLinks: false,\n ignore: IGNORE,\n });\n return specPaths\n .map((value) => value.replaceAll(\"\\\\\", \"/\"))\n .filter(\n (specPath) =>\n normalizedTestsDir === \".\" ||\n specPath.startsWith(`${normalizedTestsDir}/`),\n )\n .sort();\n}\n\nexport async function discoverPlaywrightSelectorMatches(\n projectRoot: string,\n selectors: string[],\n testsDir: string,\n): Promise<string[]> {\n if (selectors.length === 0) return [];\n const discovered = new Set(\n await discoverPlaywrightSpecs(projectRoot, testsDir),\n );\n const matches = await fg(selectors, {\n cwd: projectRoot,\n onlyFiles: true,\n unique: true,\n followSymbolicLinks: false,\n ignore: IGNORE,\n });\n return matches\n .map((value) => value.replaceAll(\"\\\\\", \"/\"))\n .filter((value) => discovered.has(value))\n .sort();\n}\n\nexport type PlaywrightDiscovery = {\n hasPlaywright: boolean;\n configs: string[];\n rootConfig: RootPlaywrightConfig | null;\n specs: Array<{ path: string; group: string }>;\n};\n\nfunction declaredDependencies(source: unknown): Record<string, unknown> {\n if (!source || typeof source !== \"object\" || Array.isArray(source)) return {};\n const record = source as Record<string, unknown>;\n return {\n ...(record.dependencies && typeof record.dependencies === \"object\"\n ? (record.dependencies as Record<string, unknown>)\n : {}),\n ...(record.devDependencies && typeof record.devDependencies === \"object\"\n ? (record.devDependencies as Record<string, unknown>)\n : {}),\n };\n}\n\nfunction specGroup(specPath: string): string {\n const directory = path.posix.dirname(specPath);\n return directory === \".\" ? \"Project root\" : directory;\n}\n\nfunction playwrightIsResolvable(projectRoot: string): boolean {\n try {\n createRequire(path.join(projectRoot, \"package.json\")).resolve(\n \"@playwright/test\",\n );\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function discoverPlaywrightProject(\n projectRoot: string,\n): Promise<PlaywrightDiscovery> {\n let packageJson: unknown = null;\n try {\n packageJson = JSON.parse(\n await readFile(path.join(projectRoot, \"package.json\"), \"utf8\"),\n );\n } catch {\n // The existing initialization flow reports a missing or invalid package.json during validation.\n }\n const dependencies = declaredDependencies(packageJson);\n const [rawConfigs, allSpecPaths] = await Promise.all([\n fg(PLAYWRIGHT_CONFIG_PATTERNS, {\n cwd: projectRoot,\n onlyFiles: true,\n unique: true,\n followSymbolicLinks: false,\n ignore: IGNORE,\n }),\n discoverPlaywrightSpecs(projectRoot, \".\"),\n ]);\n const configs = rawConfigs.map((value) => value.replaceAll(\"\\\\\", \"/\")).sort();\n const rootConfig = await loadRootPlaywrightConfig(projectRoot, configs);\n const normalizedSpecPaths = allSpecPaths\n .map((value) => value.replaceAll(\"\\\\\", \"/\"))\n .sort();\n const scopedSpecPaths = rootConfig\n ? normalizedSpecPaths.filter(\n (specPath) =>\n rootConfig.testDir === \".\" ||\n specPath.startsWith(`${rootConfig.testDir}/`),\n )\n : normalizedSpecPaths;\n\n return {\n hasPlaywright:\n \"@playwright/test\" in dependencies || playwrightIsResolvable(projectRoot),\n configs,\n rootConfig,\n specs: scopedSpecPaths.map((specPath) => ({\n path: specPath,\n group: specGroup(specPath),\n })),\n };\n}\n\nexport function commonTestsDirectory(files: string[]): string {\n if (files.length === 0) return \"tests\";\n const directories = files.map((file) => path.posix.dirname(file).split(\"/\"));\n const common: string[] = [];\n for (let index = 0; index < directories[0]!.length; index += 1) {\n const segment = directories[0]![index];\n if (\n !segment ||\n directories.some((directory) => directory[index] !== segment)\n )\n break;\n common.push(segment);\n }\n return common.join(\"/\") || \".\";\n}\n\nexport function checkNameFromSpec(specPath: string): string {\n const basename = path.posix\n .basename(specPath)\n .replace(/\\.(?:spec|test)\\.[^.]+$/, \"\");\n return (\n basename\n .split(/[^A-Za-z0-9]+/)\n .filter(Boolean)\n .map((word) => `${word.charAt(0).toUpperCase()}${word.slice(1)}`)\n .join(\" \") || \"Smoke\"\n );\n}\n","import { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { CliError } from \"../errors.js\";\n\nconst ROOT_PLAYWRIGHT_CONFIG_CANDIDATES = [\n \"playwright.config.ts\",\n \"playwright.config.mts\",\n \"playwright.config.cts\",\n \"playwright.config.js\",\n \"playwright.config.mjs\",\n \"playwright.config.cjs\",\n] as const;\n\ntype Token = {\n kind: \"identifier\" | \"punctuation\" | \"spread\" | \"string\" | \"other\";\n value: string;\n};\n\nexport type RootPlaywrightConfig = {\n path: string;\n testDir: string;\n};\n\nfunction isIdentifierStart(character: string): boolean {\n return /[A-Za-z_$]/.test(character);\n}\n\nfunction isIdentifierPart(character: string): boolean {\n return /[A-Za-z0-9_$]/.test(character);\n}\n\nfunction decodeEscape(\n source: string,\n index: number,\n): { value: string; nextIndex: number } {\n const escaped = source[index];\n if (escaped === undefined) return { value: \"\", nextIndex: index };\n const simpleEscapes: Record<string, string> = {\n \"0\": \"\\0\",\n b: \"\\b\",\n f: \"\\f\",\n n: \"\\n\",\n r: \"\\r\",\n t: \"\\t\",\n v: \"\\v\",\n };\n if (escaped in simpleEscapes) {\n return { value: simpleEscapes[escaped]!, nextIndex: index + 1 };\n }\n if (escaped === \"\\n\") return { value: \"\", nextIndex: index + 1 };\n if (escaped === \"\\r\" && source[index + 1] === \"\\n\") {\n return { value: \"\", nextIndex: index + 2 };\n }\n if (escaped === \"x\") {\n const hex = source.slice(index + 1, index + 3);\n if (/^[0-9A-Fa-f]{2}$/.test(hex)) {\n return {\n value: String.fromCodePoint(Number.parseInt(hex, 16)),\n nextIndex: index + 3,\n };\n }\n }\n if (escaped === \"u\") {\n const hex = source.slice(index + 1, index + 5);\n if (/^[0-9A-Fa-f]{4}$/.test(hex)) {\n return {\n value: String.fromCodePoint(Number.parseInt(hex, 16)),\n nextIndex: index + 5,\n };\n }\n }\n return { value: escaped, nextIndex: index + 1 };\n}\n\nfunction readStringToken(\n source: string,\n start: number,\n): { token: Token; nextIndex: number } {\n const quote = source[start]!;\n let value = \"\";\n let dynamicTemplate = false;\n let index = start + 1;\n while (index < source.length) {\n const character = source[index]!;\n if (character === quote) {\n return {\n token: {\n kind: quote === \"`\" && dynamicTemplate ? \"other\" : \"string\",\n value,\n },\n nextIndex: index + 1,\n };\n }\n if (quote === \"`\" && character === \"$\" && source[index + 1] === \"{\") {\n dynamicTemplate = true;\n }\n if (character === \"\\\\\") {\n const decoded = decodeEscape(source, index + 1);\n value += decoded.value;\n index = decoded.nextIndex;\n continue;\n }\n value += character;\n index += 1;\n }\n return { token: { kind: \"other\", value }, nextIndex: source.length };\n}\n\nfunction readRegexToken(source: string, start: number): number {\n let escaped = false;\n let characterClass = false;\n for (let index = start + 1; index < source.length; index += 1) {\n const character = source[index]!;\n if (escaped) {\n escaped = false;\n continue;\n }\n if (character === \"\\\\\") {\n escaped = true;\n continue;\n }\n if (character === \"[\") {\n characterClass = true;\n continue;\n }\n if (character === \"]\") {\n characterClass = false;\n continue;\n }\n if (character === \"/\" && !characterClass) {\n index += 1;\n while (/[A-Za-z]/.test(source[index] ?? \"\")) index += 1;\n return index;\n }\n }\n return source.length;\n}\n\nfunction tokenize(source: string): Token[] {\n const tokens: Token[] = [];\n let index = 0;\n while (index < source.length) {\n const character = source[index]!;\n if (/\\s/.test(character)) {\n index += 1;\n continue;\n }\n if (character === \"/\" && source[index + 1] === \"/\") {\n index = source.indexOf(\"\\n\", index + 2);\n if (index === -1) break;\n continue;\n }\n if (character === \"/\" && source[index + 1] === \"*\") {\n const end = source.indexOf(\"*/\", index + 2);\n index = end === -1 ? source.length : end + 2;\n continue;\n }\n if (\n character === \"/\" &&\n source[index + 1] !== \"/\" &&\n source[index + 1] !== \"*\"\n ) {\n index = readRegexToken(source, index);\n tokens.push({ kind: \"other\", value: \"/\" });\n continue;\n }\n if (character === '\"' || character === \"'\" || character === \"`\") {\n const result = readStringToken(source, index);\n tokens.push(result.token);\n index = result.nextIndex;\n continue;\n }\n if (source.startsWith(\"...\", index)) {\n tokens.push({ kind: \"spread\", value: \"...\" });\n index += 3;\n continue;\n }\n if (isIdentifierStart(character)) {\n let end = index + 1;\n while (end < source.length && isIdentifierPart(source[end]!)) end += 1;\n tokens.push({ kind: \"identifier\", value: source.slice(index, end) });\n index = end;\n continue;\n }\n if (\"{}():,;[]\".includes(character)) {\n tokens.push({ kind: \"punctuation\", value: character });\n index += 1;\n continue;\n }\n tokens.push({ kind: \"other\", value: character });\n index += 1;\n }\n return tokens;\n}\n\nfunction findConfigObjectStart(tokens: Token[]): number | null {\n for (let index = 0; index < tokens.length; index += 1) {\n if (\n tokens[index]?.kind === \"identifier\" &&\n tokens[index]?.value === \"defineConfig\" &&\n tokens[index + 1]?.value === \"(\"\n ) {\n for (\n let candidateIndex = index + 2;\n candidateIndex < tokens.length;\n candidateIndex += 1\n ) {\n const candidate = tokens[candidateIndex]!;\n if (candidate.value === \"{\") return candidateIndex;\n if (candidate.value === \")\" || candidate.value === \";\") break;\n }\n }\n if (\n tokens[index]?.kind === \"identifier\" &&\n tokens[index]?.value === \"export\" &&\n tokens[index + 1]?.kind === \"identifier\" &&\n tokens[index + 1]?.value === \"default\" &&\n tokens[index + 2]?.value === \"{\"\n ) {\n return index + 2;\n }\n }\n return null;\n}\n\nfunction staticTestDir(\n source: string,\n): { kind: \"literal\"; value: string } | { kind: \"omitted\" } {\n const tokens = tokenize(source);\n const objectStart = findConfigObjectStart(tokens);\n if (objectStart === null) {\n throw new CliError(\n \"PLAYWRIGHT_TEST_DIR_UNSUPPORTED\",\n \"The root Playwright configuration cannot be inspected safely.\",\n {\n hint: 'Export defineConfig({ testDir: \"./tests\" }) with a literal testDir, or create dedicated monitoring tests.',\n },\n );\n }\n\n let depth = 0;\n let resolvedLiteral: string | null = null;\n let unresolvedAfterLiteral = false;\n for (let index = objectStart; index < tokens.length; index += 1) {\n const token = tokens[index]!;\n if (token.value === \"{\") {\n depth += 1;\n continue;\n }\n if (token.value === \"}\") {\n depth -= 1;\n if (depth === 0) break;\n continue;\n }\n if (depth !== 1) continue;\n if (token.kind === \"spread\") {\n unresolvedAfterLiteral = true;\n continue;\n }\n if (\n token.value !== \"testDir\" ||\n (token.kind !== \"identifier\" && token.kind !== \"string\")\n ) {\n continue;\n }\n if (tokens[index + 1]?.value !== \":\") {\n throw new CliError(\n \"PLAYWRIGHT_TEST_DIR_UNSUPPORTED\",\n \"The root Playwright testDir must be a string literal.\",\n {\n hint: 'Set testDir directly, for example testDir: \"./tests\", or create dedicated monitoring tests.',\n },\n );\n }\n const value = tokens[index + 2];\n if (value?.kind !== \"string\") {\n throw new CliError(\n \"PLAYWRIGHT_TEST_DIR_UNSUPPORTED\",\n \"The root Playwright testDir must be a string literal.\",\n {\n hint: 'Set testDir directly, for example testDir: \"./tests\", or create dedicated monitoring tests.',\n },\n );\n }\n resolvedLiteral = value.value;\n unresolvedAfterLiteral = false;\n }\n\n if (unresolvedAfterLiteral) {\n throw new CliError(\n \"PLAYWRIGHT_TEST_DIR_UNSUPPORTED\",\n \"The root Playwright testDir may be supplied by a dynamic configuration spread.\",\n {\n hint: \"Set testDir directly in the root config, or create dedicated monitoring tests.\",\n },\n );\n }\n if (resolvedLiteral !== null)\n return { kind: \"literal\", value: resolvedLiteral };\n return { kind: \"omitted\" };\n}\n\nfunction projectRelativeTestDir(\n projectRoot: string,\n configPath: string,\n configured: string,\n): string {\n const absoluteProjectRoot = path.resolve(projectRoot);\n const configDirectory = path.dirname(\n path.join(absoluteProjectRoot, configPath),\n );\n const portableConfiguredPath = configured.replaceAll(\"\\\\\", path.sep);\n const absoluteTestDir = path.resolve(configDirectory, portableConfiguredPath);\n const relative = path.relative(absoluteProjectRoot, absoluteTestDir);\n if (\n relative === \"..\" ||\n relative.startsWith(`..${path.sep}`) ||\n path.isAbsolute(relative)\n ) {\n throw new CliError(\n \"PLAYWRIGHT_TEST_DIR_OUTSIDE_PROJECT\",\n `The root Playwright testDir resolves outside the project: ${configured}.`,\n {\n hint: \"Keep monitored tests inside the project, or create dedicated monitoring tests.\",\n },\n );\n }\n return relative ? relative.replaceAll(path.sep, \"/\") : \".\";\n}\n\nexport async function loadRootPlaywrightConfig(\n projectRoot: string,\n discoveredConfigs: string[],\n): Promise<RootPlaywrightConfig | null> {\n const configPath =\n ROOT_PLAYWRIGHT_CONFIG_CANDIDATES.find((candidate) =>\n discoveredConfigs.includes(candidate),\n ) ?? null;\n if (!configPath) return null;\n\n let source: string;\n try {\n source = await readFile(path.join(projectRoot, configPath), \"utf8\");\n } catch {\n throw new CliError(\n \"PLAYWRIGHT_CONFIG_UNREADABLE\",\n `The root Playwright configuration could not be read: ${configPath}.`,\n { hint: \"Check the file permissions and try again.\" },\n );\n }\n const resolved = staticTestDir(source);\n return {\n path: configPath,\n testDir: projectRelativeTestDir(\n projectRoot,\n configPath,\n resolved.kind === \"literal\" ? resolved.value : \".\",\n ),\n };\n}\n","import path from \"node:path\";\n\nimport fg from \"fast-glob\";\n\nimport { projectSlug, type ChecksConfig } from \"./config.js\";\n\nconst PLAYWRIGHT_SPEC_FILE = /\\.(?:spec|test)\\.(?:[cm]?[jt]sx?)$/;\n\nexport type SyncPlan = {\n added: Array<{ path: string; defaultName: string; defaultSlug: string }>;\n removed: Array<{ path: string; checkSlug: string }>;\n unchanged: Array<{ path: string; checkSlug: string }>;\n patternManaged: Array<{\n checkSlug: string;\n selectors: string[];\n matchedSpecs: string[];\n }>;\n migrationRequired: boolean;\n hasDrift: boolean;\n};\n\nfunction defaultNameFromSpec(specPath: string): string {\n const basename = path.posix\n .basename(specPath)\n .replace(/\\.(?:spec|test)\\.[^.]+$/, \"\");\n return (\n basename\n .split(/[^A-Za-z0-9]+/)\n .filter(Boolean)\n .map((word) => `${word.charAt(0).toUpperCase()}${word.slice(1)}`)\n .join(\" \") || \"Smoke\"\n );\n}\n\nfunction normalizedPaths(paths: string[]): string[] {\n return [...new Set(paths.map((value) => value.replaceAll(\"\\\\\", \"/\")))].sort();\n}\n\nexport function buildSyncPlan(input: {\n config: ChecksConfig;\n discoveredSpecs: string[];\n patternMatchesByCheck: Record<string, string[]>;\n migrationRequired: boolean;\n}): SyncPlan {\n const discovered = normalizedPaths(input.discoveredSpecs);\n const discoveredSet = new Set(discovered);\n const exactConfigured = new Set<string>();\n const patternCovered = new Set<string>();\n const removed: SyncPlan[\"removed\"] = [];\n const unchanged: SyncPlan[\"unchanged\"] = [];\n const patternManaged: SyncPlan[\"patternManaged\"] = [];\n\n for (const check of input.config.checks) {\n const selectors = normalizedPaths(check.include);\n if (selectors.some((selector) => fg.isDynamicPattern(selector))) {\n const matchedSpecs = normalizedPaths(\n input.patternMatchesByCheck[check.slug] ?? [],\n );\n matchedSpecs.forEach((spec) => patternCovered.add(spec));\n patternManaged.push({ checkSlug: check.slug, selectors, matchedSpecs });\n continue;\n }\n\n for (const selector of selectors.filter((value) =>\n PLAYWRIGHT_SPEC_FILE.test(value),\n )) {\n exactConfigured.add(selector);\n if (discoveredSet.has(selector))\n unchanged.push({ path: selector, checkSlug: check.slug });\n else removed.push({ path: selector, checkSlug: check.slug });\n }\n }\n\n const added = discovered\n .filter((spec) => !exactConfigured.has(spec) && !patternCovered.has(spec))\n .map((spec) => {\n const defaultName = defaultNameFromSpec(spec);\n return { path: spec, defaultName, defaultSlug: projectSlug(defaultName) };\n });\n\n removed.sort((left, right) =>\n left.path === right.path\n ? left.checkSlug.localeCompare(right.checkSlug)\n : left.path.localeCompare(right.path),\n );\n unchanged.sort((left, right) =>\n left.path === right.path\n ? left.checkSlug.localeCompare(right.checkSlug)\n : left.path.localeCompare(right.path),\n );\n patternManaged.sort((left, right) =>\n left.checkSlug.localeCompare(right.checkSlug),\n );\n\n return {\n added,\n removed,\n unchanged,\n patternManaged,\n migrationRequired: input.migrationRequired,\n hasDrift: added.length > 0 || removed.length > 0 || input.migrationRequired,\n };\n}\n","import { builtinModules } from \"node:module\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { build } from \"esbuild\";\n\nimport { CliError } from \"./errors.js\";\n\nconst ALLOWED_PACKAGES = new Set([\"@playwright/test\"]);\nconst BUILTINS = new Set([\n ...builtinModules,\n ...builtinModules.map((name) => `node:${name}`),\n]);\nconst ENVIRONMENT_PATTERN = /\\bprocess\\.env\\.([A-Z][A-Z0-9_]*)\\b/g;\n\nexport type ImportAnalysis = {\n supportingFiles: string[];\n externalPackages: string[];\n externalImporters: Record<string, string[]>;\n environmentVariables: string[];\n compatibilityIssues: string[];\n};\n\nfunction packageName(importPath: string): string {\n if (importPath.startsWith(\"@\"))\n return importPath.split(\"/\").slice(0, 2).join(\"/\");\n return importPath.split(\"/\")[0] ?? importPath;\n}\n\nfunction normalizedRelativePath(\n projectRoot: string,\n inputPath: string,\n): string {\n const absolute = path.isAbsolute(inputPath)\n ? inputPath\n : path.resolve(projectRoot, inputPath);\n const relative = path.relative(projectRoot, absolute).replaceAll(\"\\\\\", \"/\");\n if (!relative || relative.startsWith(\"../\") || path.isAbsolute(relative)) {\n throw new CliError(\n \"IMPORT_OUTSIDE_PROJECT\",\n `A selected test imports outside the project: ${inputPath}`,\n );\n }\n return relative;\n}\n\nexport async function analyzeTestImports(input: {\n projectRoot: string;\n entryFiles: string[];\n}): Promise<ImportAnalysis> {\n const projectRoot = path.resolve(input.projectRoot);\n const entryFiles = [\n ...new Set(\n input.entryFiles.map((file) => normalizedRelativePath(projectRoot, file)),\n ),\n ];\n let result: Awaited<ReturnType<typeof build>>;\n try {\n result = await build({\n absWorkingDir: projectRoot,\n entryPoints: entryFiles,\n outdir: \".siteos-pulse-analysis\",\n bundle: true,\n write: false,\n metafile: true,\n platform: \"node\",\n format: \"esm\",\n packages: \"external\",\n logLevel: \"silent\",\n sourcemap: false,\n });\n } catch (error) {\n throw new CliError(\n \"IMPORT_ANALYSIS_FAILED\",\n error instanceof Error\n ? error.message\n : \"Selected Playwright imports could not be analyzed.\",\n {\n hint: \"Use a dedicated Pulse suite or simplify imports used by the selected specs.\",\n },\n );\n }\n\n const inputs = Object.keys(result.metafile?.inputs ?? {}).map((file) =>\n normalizedRelativePath(projectRoot, file),\n );\n const entrySet = new Set(entryFiles);\n const externalPackages = new Set<string>();\n const externalImporters = new Map<string, Set<string>>();\n for (const [sourceFile, inputMetadata] of Object.entries(\n result.metafile?.inputs ?? {},\n )) {\n for (const imported of inputMetadata.imports) {\n if (!imported.external || BUILTINS.has(imported.path)) continue;\n const dependency = packageName(imported.path);\n if (ALLOWED_PACKAGES.has(dependency)) continue;\n const importers = externalImporters.get(dependency) ?? new Set<string>();\n importers.add(normalizedRelativePath(projectRoot, sourceFile));\n externalImporters.set(dependency, importers);\n }\n }\n for (const output of Object.values(result.metafile?.outputs ?? {})) {\n for (const imported of output.imports) {\n if (!imported.external || BUILTINS.has(imported.path)) continue;\n const dependency = packageName(imported.path);\n if (!ALLOWED_PACKAGES.has(dependency)) externalPackages.add(dependency);\n }\n }\n\n const environmentVariables = new Set<string>();\n const compatibilityIssues = new Set<string>();\n await Promise.all(\n inputs.map(async (file) => {\n const source = await readFile(path.join(projectRoot, file), \"utf8\").catch(\n () => \"\",\n );\n for (const match of source.matchAll(ENVIRONMENT_PATTERN)) {\n if (match[1] && match[1] !== \"PLAYWRIGHT_BASE_URL\") {\n environmentVariables.add(match[1]);\n }\n }\n if (\n /playwright\\.config\\.[^.]+$/.test(file) &&\n /\\bwebServer\\s*:/.test(source)\n ) {\n compatibilityIssues.add(\n `${file} defines webServer, which cannot start the repository application in the isolated runner.`,\n );\n }\n }),\n );\n\n return {\n supportingFiles: inputs.filter((file) => !entrySet.has(file)).sort(),\n externalPackages: [...externalPackages].sort(),\n externalImporters: Object.fromEntries(\n [...externalImporters.entries()]\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([dependency, importers]) => [dependency, [...importers].sort()]),\n ),\n environmentVariables: [...environmentVariables].sort(),\n compatibilityIssues: [...compatibilityIssues].sort(),\n };\n}\n","import { createInterface, type Interface } from \"node:readline/promises\";\n\nexport type SelectOption<T extends string> = { label: string; value: T };\n\nexport interface PromptPort {\n pause(message: string): Promise<void>;\n input(input: {\n message: string;\n defaultValue?: string;\n validate?: (value: string) => string | null;\n }): Promise<string>;\n confirm(input: { message: string; defaultValue: boolean }): Promise<boolean>;\n select<T extends string>(input: {\n message: string;\n options: Array<SelectOption<T>>;\n }): Promise<T>;\n multiSelect<T extends string>(input: {\n message: string;\n options: Array<SelectOption<T>>;\n allowEmpty?: boolean;\n }): Promise<T[]>;\n close(): void;\n}\n\nexport class TerminalPrompt implements PromptPort {\n readonly #readline: Interface;\n\n constructor() {\n this.#readline = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n }\n\n async pause(message: string): Promise<void> {\n await this.#readline.question(`${message} `);\n }\n\n async input(input: {\n message: string;\n defaultValue?: string;\n validate?: (value: string) => string | null;\n }): Promise<string> {\n while (true) {\n const suffix = input.defaultValue ? ` (${input.defaultValue})` : \"\";\n const answer = (\n await this.#readline.question(`${input.message}${suffix}: `)\n ).trim();\n const value = answer || input.defaultValue || \"\";\n const validationError = input.validate?.(value) ?? null;\n if (!validationError) return value;\n console.error(validationError);\n }\n }\n\n async confirm(input: {\n message: string;\n defaultValue: boolean;\n }): Promise<boolean> {\n const suffix = input.defaultValue ? \" (Y/n)\" : \" (y/N)\";\n const answer = (\n await this.#readline.question(`${input.message}${suffix}: `)\n )\n .trim()\n .toLowerCase();\n if (!answer) return input.defaultValue;\n return answer === \"y\" || answer === \"yes\";\n }\n\n async select<T extends string>(input: {\n message: string;\n options: Array<SelectOption<T>>;\n }): Promise<T> {\n console.log(input.message);\n input.options.forEach((option, index) =>\n console.log(` ${index + 1}. ${option.label}`),\n );\n while (true) {\n const answer = (\n await this.#readline.question(\"Choose an option: \")\n ).trim();\n const index = Number(answer) - 1;\n const option = input.options[index];\n if (option) return option.value;\n console.error(`Enter a number from 1 to ${input.options.length}.`);\n }\n }\n\n async multiSelect<T extends string>(input: {\n message: string;\n options: Array<SelectOption<T>>;\n allowEmpty?: boolean;\n }): Promise<T[]> {\n console.log(input.message);\n input.options.forEach((option, index) =>\n console.log(` ${index + 1}. ${option.label}`),\n );\n while (true) {\n const answer = (\n await this.#readline.question(\n input.allowEmpty\n ? \"Choose options (comma-separated, or press Enter for none): \"\n : \"Choose one or more options (comma-separated): \",\n )\n ).trim();\n if (!answer && input.allowEmpty) return [];\n const indexes = [\n ...new Set(\n answer\n .split(\",\")\n .map((value) => Number(value.trim()) - 1)\n .filter((value) => Number.isInteger(value)),\n ),\n ];\n const options = indexes\n .map((index) => input.options[index])\n .filter(Boolean) as Array<SelectOption<T>>;\n if (options.length === indexes.length && options.length > 0) {\n return options.map((option) => option.value);\n }\n console.error(\n `Enter one or more numbers from 1 to ${input.options.length}.`,\n );\n }\n }\n\n close(): void {\n this.#readline.close();\n }\n}\n","import {\n inspectProjectSync,\n prepareProjectSync,\n writeProjectSync,\n type PreparedProjectSync,\n type ProjectSyncResult,\n type SyncInspection,\n} from \"../sync.js\";\nimport type { PromptPort } from \"./prompt.js\";\nimport { TerminalPrompt } from \"./prompt.js\";\n\nexport interface SyncOutput {\n log(message: string): void;\n error(message: string): void;\n}\n\nexport interface SyncWorkflowDependencies {\n inspect(projectRoot: string): Promise<SyncInspection>;\n prepare(input: {\n projectRoot: string;\n inspection: SyncInspection;\n selectedAdded: string[];\n }): Promise<PreparedProjectSync>;\n write(input: {\n projectRoot: string;\n inspection: SyncInspection;\n prepared: PreparedProjectSync;\n }): Promise<ProjectSyncResult>;\n}\n\nexport type SyncWorkflowResult = {\n changed: boolean;\n cancelled: boolean;\n};\n\nconst defaultDependencies: SyncWorkflowDependencies = {\n inspect: inspectProjectSync,\n prepare: prepareProjectSync,\n write: writeProjectSync,\n};\n\nfunction printSection(\n output: SyncOutput,\n title: string,\n values: string[],\n): void {\n output.log(`${title} (${values.length})`);\n values.forEach((value) => output.log(` ${value}`));\n}\n\nfunction printInspection(output: SyncOutput, inspection: SyncInspection): void {\n const { report } = inspection;\n printSection(\n output,\n \"Added\",\n report.added.map((entry) => entry.path),\n );\n printSection(\n output,\n \"Removed\",\n report.removed.map((entry) => `${entry.path} (Check: ${entry.checkSlug})`),\n );\n printSection(\n output,\n \"Unchanged\",\n report.unchanged.map(\n (entry) => `${entry.path} (Check: ${entry.checkSlug})`,\n ),\n );\n printSection(\n output,\n \"Pattern-managed\",\n report.patternManaged.map(\n (entry) =>\n `${entry.checkSlug}: ${entry.selectors.join(\", \")} (${entry.matchedSpecs.length} matched)`,\n ),\n );\n printSection(output, \"Supporting files to add\", report.supportingFiles.added);\n if (report.migrationRequired)\n output.log(\"Configuration migration: version 1 -> version 2\");\n for (const blocker of report.blockers)\n output.error(`Blocker: ${blocker.message}`);\n}\n\nfunction printPrepared(\n output: SyncOutput,\n prepared: PreparedProjectSync,\n): void {\n output.log(\"Changes to apply:\");\n prepared.addedChecks.forEach((entry) =>\n output.log(` Add Check ${entry.checkSlug}: ${entry.path}`),\n );\n prepared.removedSelectors.forEach((entry) =>\n output.log(` Remove from ${entry.checkSlug}: ${entry.path}`),\n );\n prepared.supportingFilesAdded.forEach((file) =>\n output.log(` Add supporting file: ${file}`),\n );\n if (prepared.migrationRequired)\n output.log(\" Upgrade configuration to version 2\");\n}\n\nexport async function runSyncWorkflow(input: {\n projectRoot: string;\n prompt: PromptPort;\n output: SyncOutput;\n dependencies?: SyncWorkflowDependencies;\n}): Promise<SyncWorkflowResult> {\n const dependencies = input.dependencies ?? defaultDependencies;\n const inspection = await dependencies.inspect(input.projectRoot);\n printInspection(input.output, inspection);\n if (!inspection.report.hasDrift) {\n input.output.log(\"Monitored tests are already synchronized.\");\n return { changed: false, cancelled: false };\n }\n\n const selectedAdded = inspection.report.added.length\n ? await input.prompt.multiSelect({\n message: \"Select new specs to monitor (each becomes one manual Check):\",\n options: inspection.report.added.map((entry) => ({\n label: `${entry.path} — ${entry.defaultName}`,\n value: entry.path,\n })),\n allowEmpty: true,\n })\n : [];\n const prepared = await dependencies.prepare({\n projectRoot: input.projectRoot,\n inspection,\n selectedAdded,\n });\n if (!prepared.changed) {\n input.output.log(\"No synchronization changes were selected.\");\n return { changed: false, cancelled: false };\n }\n printPrepared(input.output, prepared);\n const confirmed = await input.prompt.confirm({\n message: \"Apply these changes to siteos.config.json?\",\n defaultValue: true,\n });\n if (!confirmed) {\n input.output.log(\"Synchronization cancelled; no files changed.\");\n return { changed: false, cancelled: true };\n }\n\n await dependencies.write({\n projectRoot: input.projectRoot,\n inspection,\n prepared,\n });\n input.output.log(\"Updated: siteos.config.json\");\n return { changed: true, cancelled: false };\n}\n\nexport async function runSyncCli(input: {\n projectRoot: string;\n prompt?: PromptPort;\n output?: SyncOutput;\n}): Promise<number> {\n const prompt = input.prompt ?? new TerminalPrompt();\n const ownsPrompt = !input.prompt;\n try {\n await runSyncWorkflow({\n projectRoot: input.projectRoot,\n prompt,\n output: input.output ?? {\n log: (message) => console.log(message),\n error: (message) => console.error(message),\n },\n });\n return 0;\n } finally {\n if (ownsPrompt) prompt.close();\n }\n}\n","import { spawn } from \"node:child_process\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { loadChecksConfig } from \"./config.js\";\nimport { CliError } from \"./errors.js\";\nimport {\n detectPackageManager,\n playwrightBrowserInstallCommand,\n} from \"./package-manager.js\";\nimport { discoverProjectFiles } from \"./project-files.js\";\n\nexport type ProcessExecution = { exitCode: number; outputTail: string };\n\nexport type ProcessRunner = (input: {\n command: string;\n args: string[];\n cwd: string;\n env: NodeJS.ProcessEnv;\n}) => Promise<ProcessExecution>;\n\nconst MAX_DIAGNOSTIC_OUTPUT = 64 * 1024;\n\nfunction appendDiagnostic(output: string, chunk: Buffer): string {\n return `${output}${chunk.toString(\"utf8\")}`.slice(-MAX_DIAGNOSTIC_OUTPUT);\n}\n\nexport const runProcess: ProcessRunner = ({ command, args, cwd, env }) =>\n new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n cwd,\n env,\n stdio: [\"inherit\", \"pipe\", \"pipe\"],\n });\n let outputTail = \"\";\n child.stdout.on(\"data\", (chunk: Buffer) => {\n process.stdout.write(chunk);\n outputTail = appendDiagnostic(outputTail, chunk);\n });\n child.stderr.on(\"data\", (chunk: Buffer) => {\n process.stderr.write(chunk);\n outputTail = appendDiagnostic(outputTail, chunk);\n });\n child.once(\"error\", reject);\n child.once(\"close\", (code, signal) => {\n if (signal)\n reject(\n new CliError(\n \"TEST_INTERRUPTED\",\n `Playwright stopped with ${signal}.`,\n ),\n );\n else resolve({ exitCode: code ?? 1, outputTail });\n });\n });\n\nexport function isMissingBrowserDiagnostic(output: string): boolean {\n return (\n /executable doesn't exist(?: at)?/i.test(output) &&\n /playwright install/i.test(output)\n );\n}\n\nexport function resolvePlaywrightCli(projectRoot: string): string {\n try {\n const requireFromProject = createRequire(\n path.join(projectRoot, \"package.json\"),\n );\n const packageJson = requireFromProject.resolve(\n \"@playwright/test/package.json\",\n );\n return path.join(path.dirname(packageJson), \"cli.js\");\n } catch {\n throw new CliError(\n \"PLAYWRIGHT_NOT_INSTALLED\",\n \"The project cannot resolve @playwright/test.\",\n {\n hint: \"Install @playwright/test in the project and run `npx playwright install chromium`.\",\n },\n );\n }\n}\n\nexport async function runProjectTests(input: {\n projectRoot: string;\n headed?: boolean;\n browserProject?: string;\n baseUrl?: string;\n passthrough?: string[];\n processRunner?: ProcessRunner;\n playwrightCli?: string;\n}): Promise<number> {\n const projectRoot = path.resolve(input.projectRoot);\n const config = await loadChecksConfig(projectRoot);\n const report = await discoverProjectFiles(projectRoot, config);\n if (!report.valid) {\n throw new CliError(\n \"PROJECT_INVALID\",\n `Project validation failed: ${report.errors.join(\"; \")}`,\n {\n hint: \"Run `siteos pulse validate` before running the suite.\",\n },\n );\n }\n\n const selectors = [\n ...new Set(\n config.checks\n .filter((check) => check.active)\n .flatMap((check) => check.include),\n ),\n ];\n if (selectors.length === 0) {\n throw new CliError(\n \"NO_ACTIVE_CHECKS\",\n \"No active Check selectors are configured.\",\n {\n hint: \"Enable at least one Check before running local monitoring tests.\",\n },\n );\n }\n const args = [\n input.playwrightCli ?? resolvePlaywrightCli(projectRoot),\n \"test\",\n ...selectors,\n ];\n if (config.playwrightConfig) args.push(\"--config\", config.playwrightConfig);\n if (input.headed) args.push(\"--headed\");\n if (input.browserProject) args.push(\"--project\", input.browserProject);\n args.push(...(input.passthrough ?? []));\n\n const execution = await (input.processRunner ?? runProcess)({\n command: process.execPath,\n args,\n cwd: projectRoot,\n env: {\n ...process.env,\n ...(input.baseUrl ? { PLAYWRIGHT_BASE_URL: input.baseUrl } : {}),\n },\n });\n if (\n execution.exitCode !== 0 &&\n isMissingBrowserDiagnostic(execution.outputTail)\n ) {\n const packageManager = await detectPackageManager(projectRoot);\n const installCommand = playwrightBrowserInstallCommand(packageManager);\n throw new CliError(\n \"PLAYWRIGHT_BROWSER_NOT_INSTALLED\",\n \"Chromium is not installed for the project's Playwright version.\",\n { hint: `Run \\`${installCommand}\\`, then run SiteOS Pulse again.` },\n );\n }\n return execution.exitCode;\n}\n","import { spawn } from \"node:child_process\";\nimport { access, readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { CliError } from \"./errors.js\";\n\nexport type PackageManager = \"npm\" | \"pnpm\" | \"yarn\" | \"bun\";\n\nexport type PackageManagerCommand = {\n command: string;\n args: string[];\n};\n\nexport type InstallProcessRunner = (input: {\n command: string;\n args: string[];\n cwd: string;\n}) => Promise<number>;\n\nconst LOCKFILES: Array<{\n packageManager: PackageManager;\n filenames: string[];\n}> = [\n { packageManager: \"pnpm\", filenames: [\"pnpm-lock.yaml\"] },\n { packageManager: \"yarn\", filenames: [\"yarn.lock\"] },\n { packageManager: \"bun\", filenames: [\"bun.lock\", \"bun.lockb\"] },\n {\n packageManager: \"npm\",\n filenames: [\"package-lock.json\", \"npm-shrinkwrap.json\"],\n },\n];\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath);\n return true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return false;\n throw error;\n }\n}\n\nasync function declaredPackageManager(\n projectRoot: string,\n): Promise<PackageManager | null> {\n let contents: string;\n try {\n contents = await readFile(path.join(projectRoot, \"package.json\"), \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n }\n\n let packageJson: { packageManager?: unknown };\n try {\n packageJson = JSON.parse(contents) as { packageManager?: unknown };\n } catch {\n throw new CliError(\n \"PACKAGE_JSON_INVALID\",\n \"package.json is not valid JSON.\",\n {\n hint: \"Fix package.json before running SiteOS Pulse setup.\",\n },\n );\n }\n if (packageJson.packageManager === undefined) return null;\n if (typeof packageJson.packageManager !== \"string\") {\n throw new CliError(\n \"PACKAGE_MANAGER_INVALID\",\n \"The packageManager field in package.json must be a string.\",\n { hint: \"Use a value such as `pnpm@10.11.0` or remove the field.\" },\n );\n }\n\n const name = packageJson.packageManager.split(\"@\", 1)[0];\n if (name === \"npm\" || name === \"pnpm\" || name === \"yarn\" || name === \"bun\")\n return name;\n throw new CliError(\n \"PACKAGE_MANAGER_UNSUPPORTED\",\n `SiteOS Pulse does not support the declared package manager: ${packageJson.packageManager}.`,\n {\n hint: \"Use npm, pnpm, Yarn, or Bun to install @playwright/test manually.\",\n },\n );\n}\n\nexport async function detectPackageManager(\n projectRoot: string,\n): Promise<PackageManager> {\n const root = path.resolve(projectRoot);\n const declared = await declaredPackageManager(root);\n if (declared) return declared;\n\n const matches = (\n await Promise.all(\n LOCKFILES.map(async ({ packageManager, filenames }) => ({\n packageManager,\n filenames: (\n await Promise.all(\n filenames.map(async (filename) => ({\n filename,\n exists: await fileExists(path.join(root, filename)),\n })),\n )\n )\n .filter((entry) => entry.exists)\n .map((entry) => entry.filename),\n })),\n )\n ).filter((entry) => entry.filenames.length > 0);\n\n if (matches.length === 0) return \"npm\";\n if (matches.length === 1) return matches[0]!.packageManager;\n\n const filenames = matches.flatMap((entry) => entry.filenames).sort();\n throw new CliError(\n \"PACKAGE_MANAGER_AMBIGUOUS\",\n `Multiple package-manager lockfiles were found: ${filenames.join(\", \")}.`,\n {\n hint: \"Remove stale lockfiles or declare the intended package manager in package.json.\",\n },\n );\n}\n\nexport function playwrightDependencyInstallCommand(\n packageManager: PackageManager,\n): PackageManagerCommand {\n if (packageManager === \"pnpm\") {\n return { command: \"pnpm\", args: [\"add\", \"--save-dev\", \"@playwright/test\"] };\n }\n if (packageManager === \"yarn\") {\n return { command: \"yarn\", args: [\"add\", \"--dev\", \"@playwright/test\"] };\n }\n if (packageManager === \"bun\") {\n return { command: \"bun\", args: [\"add\", \"--dev\", \"@playwright/test\"] };\n }\n return {\n command: \"npm\",\n args: [\"install\", \"--save-dev\", \"@playwright/test\"],\n };\n}\n\nexport function playwrightBrowserInstallCommand(\n packageManager: PackageManager,\n): string {\n if (packageManager === \"pnpm\") return \"pnpm exec playwright install chromium\";\n if (packageManager === \"yarn\") return \"yarn playwright install chromium\";\n if (packageManager === \"bun\") return \"bunx playwright install chromium\";\n return \"npx playwright install chromium\";\n}\n\nexport function formatPackageManagerCommand(\n command: PackageManagerCommand,\n): string {\n return [command.command, ...command.args].join(\" \");\n}\n\nexport const runInstallProcess: InstallProcessRunner = ({\n command,\n args,\n cwd,\n}) =>\n new Promise((resolve, reject) => {\n const displayCommand = formatPackageManagerCommand({ command, args });\n const child = spawn(command, args, { cwd, stdio: \"inherit\" });\n child.once(\"error\", () => {\n reject(\n new CliError(\n \"PACKAGE_MANAGER_UNAVAILABLE\",\n `SiteOS Pulse could not start the ${command} package manager.`,\n {\n hint: `Install ${command}, then run \\`${displayCommand}\\` manually and restart SiteOS Pulse.`,\n },\n ),\n );\n });\n child.once(\"close\", (code, signal) => {\n if (signal) {\n reject(\n new CliError(\n \"PLAYWRIGHT_INSTALL_INTERRUPTED\",\n `Playwright dependency installation stopped with ${signal}.`,\n {\n hint: `Run \\`${displayCommand}\\` manually, then restart SiteOS Pulse.`,\n },\n ),\n );\n } else {\n resolve(code ?? 1);\n }\n });\n });\n\nexport async function installPlaywrightDependency(input: {\n projectRoot: string;\n packageManager: PackageManager;\n processRunner?: InstallProcessRunner;\n}): Promise<number> {\n const installCommand = playwrightDependencyInstallCommand(\n input.packageManager,\n );\n return (input.processRunner ?? runInstallProcess)({\n ...installCommand,\n cwd: path.resolve(input.projectRoot),\n });\n}\n","import path from \"node:path\";\nimport { loadChecksConfig } from \"./config.js\";\nimport {\n discoverProjectFiles,\n type ValidationReport,\n} from \"./project-files.js\";\n\nexport async function validateProject(\n projectRoot: string,\n): Promise<ValidationReport> {\n const root = path.resolve(projectRoot);\n const config = await loadChecksConfig(root);\n return discoverProjectFiles(root, config);\n}\n","import {\n commonServiceContext,\n commonEnvironmentArguments,\n readLocalCommonProject,\n} from \"./projects/project-context.js\";\nimport path from \"node:path\";\n\nimport { createSiteOSServiceGrantProvider } from \"./auth/adapters/siteos-service-grant-provider.js\";\nimport type { ServiceGrantProvider } from \"./auth/application/service-grant-provider.js\";\nimport {\n NodeProjectBindingStore,\n ProjectBindingStoreError,\n} from \"./core/adapters/node-project-binding-store.js\";\nimport { RepositoryRootError } from \"./core/adapters/node-repository-root.js\";\nimport type { ProjectBindingStore } from \"./core/ports/project-binding-store.js\";\nimport {\n inspectSearchProjectReference,\n SearchProjectReferenceError,\n writeSearchProjectReference,\n} from \"./search/project-reference.js\";\nimport { resolveSiteOSConfigHome } from \"./siteos-config.js\";\nimport {\n createSiteOSSearchApiClient,\n resolveSiteOSSearchBaseUrl,\n SiteOSSearchApiError,\n type FetchLike,\n type SiteOSSearchProject,\n} from \"./siteos-search-api.js\";\nimport { SiteOSAuthApiError } from \"./siteos-auth-api.js\";\nimport { isValidEnvironmentSlug } from \"./environment-slug.js\";\nimport {\n prepareSiteOSSearchIndexingCredentialInstallation,\n prepareSiteOSSearchCredentialInstallation,\n SITEOS_SEARCH_ENVIRONMENT_ENV,\n SITEOS_SEARCH_INDEXING_CREDENTIAL_ENV,\n SITEOS_SEARCH_QUERY_CREDENTIAL_ENV,\n SiteOSSearchCredentialStorageError,\n type SiteOSSearchCredentialInstallation,\n} from \"./siteos-search-credential.js\";\nimport type { SiteOSSearchCredentialMetadata } from \"./siteos-search-api.js\";\n\nconst HELP_FLAGS = new Set([\"--help\", \"-h\"]);\nconst JSON_FLAG = \"--json\";\nconst ENVIRONMENT_FLAG = \"--environment\";\nconst CREDENTIAL_FLAG = \"--credential\";\nconst INSTALL_FLAG = \"--install\";\nconst NAME_FLAG = \"--name\";\nconst SLUG_FLAG = \"--slug\";\nconst SOURCE_FLAG = \"--source\";\nconst REPLACE_FLAG = \"--replace\";\n\nexport const SEARCH_HELP = `Usage:\n siteos search project list [--json]\n siteos search project create --slug <slug> --name <name> [--json]\n siteos search project use <slug> [--replace] [--json]\n siteos search project status [--json]\n siteos search environment list [--json]\n siteos search environment create --slug <slug> --name <name> [--json]\n siteos search environment update --environment <slug> --name <name> [--json]\n siteos search environment fork --source <slug> --slug <slug> --name <name> [--json]\n siteos search environment delete --environment <slug> [--json]\n siteos search analytics --environment <slug> [--json]\n siteos search diagnostics --environment <slug> [--json]\n siteos search doctor --environment <slug> [--json]\n siteos search reindex --environment <slug> [--json]\n siteos search credential list --environment <slug> [--json]\n siteos search credential issue --environment <slug> --install [--name <name>] [--json]\n siteos search credential rotate --environment <slug> --install [--name <name>] [--json]\n siteos search credential revoke --environment <slug> --credential <credential-id> [--json]\n siteos search indexing-credential list --environment <slug> [--json]\n siteos search indexing-credential issue --environment <slug> --install [--name <name>] [--json]\n siteos search indexing-credential rotate --environment <slug> --install [--name <name>] [--json]\n siteos search indexing-credential revoke --environment <slug> --credential <credential-id> [--json]\n\nManage SiteOS search operations for one explicit project environment.`;\n\nexport {\n SITEOS_SEARCH_ENVIRONMENT_ENV,\n SITEOS_SEARCH_INDEXING_CREDENTIAL_ENV,\n SITEOS_SEARCH_QUERY_CREDENTIAL_ENV,\n} from \"./siteos-search-credential.js\";\n\nexport type SearchCommandResult = {\n exitCode: number;\n stderr?: string;\n stdout?: string;\n};\n\ntype SearchContext =\n | {\n apiBaseUrl: string;\n credential: string;\n ok: true;\n project: { id: string; name: string; slug: string };\n projectId: string;\n rootDir: string;\n }\n | { error: SearchCommandResult; ok: false };\n\nexport async function runSearchCommand(options: {\n args: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n prepareCredentialInstallation?: typeof prepareSiteOSSearchCredentialInstallation;\n prepareIndexingCredentialInstallation?: typeof prepareSiteOSSearchIndexingCredentialInstallation;\n projectBindingStore?: ProjectBindingStore;\n serviceGrantProvider?: ServiceGrantProvider;\n}): Promise<SearchCommandResult> {\n if (\n options.args.length === 0 ||\n options.args.some((arg) => HELP_FLAGS.has(arg))\n ) {\n return { exitCode: 0, stdout: SEARCH_HELP };\n }\n if (options.args.some((arg) => splitFlag(arg)[0] === \"--env\")) {\n return usageError(\"Use --environment for SiteOS search environments.\");\n }\n\n if (options.args[0] !== \"project\") {\n try {\n options = {\n ...options,\n args: await commonEnvironmentArguments(options, \"search\", options.args),\n };\n } catch (error) {\n return {\n exitCode: 1,\n stderr:\n error instanceof Error\n ? error.message\n : \"Environment could not be selected.\",\n };\n }\n }\n const [subcommand, ...args] = options.args;\n if (subcommand === \"project\") {\n return runProjectCommand({ ...options, args });\n }\n if (subcommand === \"environment\") {\n return runEnvironmentCommand({ ...options, args });\n }\n if (subcommand === \"credential\") {\n return runCredentialCommand({ ...options, args, credentialKind: \"query\" });\n }\n if (subcommand === \"indexing-credential\") {\n return runCredentialCommand({\n ...options,\n args,\n credentialKind: \"indexing\",\n });\n }\n if (\n subcommand === \"analytics\" ||\n subcommand === \"diagnostics\" ||\n subcommand === \"doctor\" ||\n subcommand === \"reindex\"\n ) {\n return runSearchOperation({ ...options, args, operation: subcommand });\n }\n return usageError(\"Unknown SiteOS search command.\");\n}\n\nasync function runProjectCommand(options: {\n args: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n projectBindingStore?: ProjectBindingStore;\n serviceGrantProvider?: ServiceGrantProvider;\n}): Promise<SearchCommandResult> {\n const action = options.args[0];\n if (!action || ![\"create\", \"list\", \"status\", \"use\"].includes(action)) {\n return usageError(\"Unknown SiteOS search project command.\");\n }\n const parsed = parseProjectFlags(action, options.args.slice(1));\n if (!parsed.ok) return parsed.error;\n if (!options.fetchImpl) {\n return {\n exitCode: 1,\n stderr: \"SiteOS API access is unavailable in this runtime.\",\n };\n }\n\n try {\n const apiBaseUrl = resolveSiteOSSearchBaseUrl(options.env);\n const grant = await serviceGrantProvider(options).acquire({\n audience: \"siteos-search\",\n scopes: [\"search:workspace:write\"],\n });\n requireGrant(grant, \"search:workspace:write\");\n const client = createSiteOSSearchApiClient({\n apiBaseUrl,\n fetchImpl: options.fetchImpl,\n });\n\n if (action === \"list\") {\n const projects = await client.listProjects({ token: grant.accessToken });\n requireProjectOrganization(projects, grant.grant.organizationId);\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson({ projects })\n : formatProjectListOutput(projects),\n };\n }\n\n if (action === \"create\") {\n const project = await client.createProject({\n name: parsed.name!,\n slug: parsed.slug!,\n token: grant.accessToken,\n });\n requireProjectOrganization([project], grant.grant.organizationId);\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson({ project })\n : [\n \"SiteOS Search Project created.\",\n `Project: ${project.slug}`,\n `Name: ${project.name}`,\n `Run \\`siteos search project use ${project.slug}\\` to select it for this repository.`,\n ].join(\"\\n\"),\n };\n }\n\n const reference = await inspectSearchProjectReference(\n options.cwd ?? process.cwd(),\n );\n const store = projectBindingStore(options);\n const locator = {\n apiOrigin: apiBaseUrl,\n repositoryRoot: reference.rootDir,\n service: \"search\" as const,\n };\n\n if (action === \"use\") {\n const projects = await client.listProjects({ token: grant.accessToken });\n requireProjectOrganization(projects, grant.grant.organizationId);\n const matches = projects.filter(\n (project) => project.slug === parsed.slug,\n );\n if (matches.length !== 1) {\n throw new SiteOSSearchApiError({\n code: matches.length === 0 ? \"PROJECT_NOT_FOUND\" : \"INVALID_RESPONSE\",\n message:\n matches.length === 0\n ? \"The Search Project was not found.\"\n : \"SiteOS Search returned an invalid response.\",\n status: matches.length === 0 ? 404 : undefined,\n });\n }\n const project = matches[0]!;\n if (\n reference.status === \"loaded\" &&\n reference.reference.project.slug !== project.slug &&\n !parsed.replace\n ) {\n throw new SearchProjectReferenceError(\n \"SEARCH_PROJECT_REFERENCE_CONFLICT\",\n \"A different Search Project is already selected. Use --replace to replace it.\",\n );\n }\n\n const previousBinding = await store.read(locator);\n await store.write({\n ...locator,\n organizationId: grant.grant.organizationId,\n project: { id: project.id, slug: project.slug },\n });\n try {\n await writeSearchProjectReference({\n expectedChecksum:\n reference.status === \"loaded\" ? reference.checksum : null,\n project: { name: project.name, slug: project.slug },\n rootDir: reference.rootDir,\n });\n } catch (error) {\n if (previousBinding) await store.write(previousBinding);\n else await store.remove(locator);\n throw error;\n }\n const output = {\n apiOrigin: apiBaseUrl,\n organizationId: grant.grant.organizationId,\n project,\n referencePath: path.join(\n reference.rootDir,\n \".siteos\",\n \"search\",\n \"project.json\",\n ),\n };\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson(output)\n : [\n \"SiteOS Search Project selected.\",\n `Project: ${project.slug}`,\n `Reference: ${output.referencePath}`,\n ].join(\"\\n\"),\n };\n }\n\n if (reference.status === \"missing\") {\n throw new SearchProjectReferenceError(\n \"SEARCH_PROJECT_REFERENCE_REQUIRED\",\n \"Select a Search Project for this repository first.\",\n );\n }\n const binding = await store.read(locator);\n if (\n !binding ||\n binding.organizationId !== grant.grant.organizationId ||\n binding.project.slug !== reference.reference.project.slug\n ) {\n throw new SearchProjectReferenceError(\n binding\n ? \"SEARCH_PROJECT_REFERENCE_INVALID\"\n : \"SEARCH_PROJECT_REFERENCE_REQUIRED\",\n binding\n ? \"The Search Project reference and private binding do not match.\"\n : \"Select a Search Project for this repository first.\",\n );\n }\n const projects = await client.listProjects({ token: grant.accessToken });\n requireProjectOrganization(projects, grant.grant.organizationId);\n const project = projects.find(\n (candidate) => candidate.id === binding.project.id,\n );\n if (!project || project.slug !== binding.project.slug) {\n throw new SiteOSSearchApiError({\n code: \"PROJECT_NOT_FOUND\",\n message: \"The Search Project was not found.\",\n status: 404,\n });\n }\n const output = {\n apiOrigin: apiBaseUrl,\n connected: true,\n organizationId: binding.organizationId,\n project,\n repositoryRoot: reference.rootDir,\n };\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson(output)\n : [\n \"SiteOS Search Project connection is valid.\",\n `Project: ${project.slug}`,\n `Organization: ${binding.organizationId}`,\n `API: ${apiBaseUrl}`,\n ].join(\"\\n\"),\n };\n } catch (error) {\n return formatProjectError(error);\n }\n}\n\nasync function runEnvironmentCommand(options: {\n args: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n projectBindingStore?: ProjectBindingStore;\n serviceGrantProvider?: ServiceGrantProvider;\n}): Promise<SearchCommandResult> {\n const [action, ...args] = options.args;\n if (\n !action ||\n ![\"list\", \"create\", \"update\", \"fork\", \"delete\"].includes(action)\n ) {\n return usageError(\"Unknown SiteOS search environment command.\");\n }\n const parsed = parseEnvironmentFlags(action, args);\n if (!parsed.ok) return parsed.error;\n return runWithSearchClient(options, async ({ client, context }) => {\n const authorization = {\n projectId: context.projectId,\n token: context.credential,\n };\n if (action === \"list\") {\n const environments = await client.listEnvironments(authorization);\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson({ environments })\n : [\n \"SiteOS Search Environments.\",\n `Environments: ${environments.length}`,\n ...environments.map(({ slug, name }) => `- ${slug}: ${name}`),\n ].join(\"\\n\"),\n };\n }\n const environment =\n action === \"create\"\n ? await client.createEnvironment({\n ...authorization,\n slug: parsed.slug!,\n name: parsed.name!,\n })\n : action === \"update\"\n ? await client.updateEnvironment({\n ...authorization,\n environmentSlug: parsed.environmentSlug!,\n name: parsed.name!,\n })\n : action === \"fork\"\n ? await client.forkEnvironment({\n ...authorization,\n sourceEnvironmentSlug: parsed.sourceSlug!,\n slug: parsed.slug!,\n name: parsed.name!,\n })\n : undefined;\n if (action === \"delete\") {\n const result = await client.deleteEnvironment({\n ...authorization,\n environmentSlug: parsed.environmentSlug!,\n });\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson({ environment: parsed.environmentSlug, result })\n : `SiteOS Search Environment ${parsed.environmentSlug} deleted.`,\n };\n }\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson({ environment })\n : `SiteOS Search Environment ${environment!.slug} ${action === \"fork\" ? \"forked\" : action === \"create\" ? \"created\" : \"updated\"}.`,\n };\n });\n}\n\nfunction parseEnvironmentFlags(\n action: string,\n args: string[],\n):\n | {\n environmentSlug?: string;\n json: boolean;\n name?: string;\n ok: true;\n slug?: string;\n sourceSlug?: string;\n }\n | { error: SearchCommandResult; ok: false } {\n const required =\n action === \"create\"\n ? [SLUG_FLAG, NAME_FLAG]\n : action === \"update\"\n ? [ENVIRONMENT_FLAG, NAME_FLAG]\n : action === \"fork\"\n ? [SOURCE_FLAG, SLUG_FLAG, NAME_FLAG]\n : action === \"delete\"\n ? [ENVIRONMENT_FLAG]\n : [];\n const allowed = new Set([JSON_FLAG, ...required]);\n const flags = new Map<string, string | true>();\n for (let index = 0; index < args.length; index += 1) {\n const [flag, inlineValue] = splitFlag(args[index]);\n if (!allowed.has(flag) || flags.has(flag)) {\n return { error: usageError(`Unexpected argument: ${flag}`), ok: false };\n }\n if (flag === JSON_FLAG) {\n if (inlineValue !== undefined) {\n return {\n error: usageError(\"--json does not accept a value.\"),\n ok: false,\n };\n }\n flags.set(flag, true);\n continue;\n }\n const value = inlineValue ?? args[index + 1];\n if (!value || value.startsWith(\"--\")) {\n return { error: usageError(`${flag} requires a value.`), ok: false };\n }\n flags.set(flag, value.trim());\n if (inlineValue === undefined) index += 1;\n }\n for (const flag of required) {\n if (!flags.has(flag))\n return { error: usageError(`${flag} is required.`), ok: false };\n }\n const environmentSlug = readCredentialStringFlag(flags, ENVIRONMENT_FLAG);\n const sourceSlug = readCredentialStringFlag(flags, SOURCE_FLAG);\n const slug = readCredentialStringFlag(flags, SLUG_FLAG);\n if (\n [environmentSlug, sourceSlug, slug].some(\n (value) => value && !isValidEnvironmentSlug(value),\n )\n ) {\n return { error: usageError(\"Environment slugs must be valid.\"), ok: false };\n }\n const name = readCredentialStringFlag(flags, NAME_FLAG);\n if (name && name.length > 255)\n return { error: usageError(\"--name is invalid.\"), ok: false };\n return {\n ...(environmentSlug ? { environmentSlug } : {}),\n json: flags.has(JSON_FLAG),\n ...(name ? { name } : {}),\n ok: true,\n ...(slug ? { slug } : {}),\n ...(sourceSlug ? { sourceSlug } : {}),\n };\n}\n\nasync function runCredentialCommand(options: {\n args: string[];\n credentialKind: \"indexing\" | \"query\";\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n prepareCredentialInstallation?: typeof prepareSiteOSSearchCredentialInstallation;\n prepareIndexingCredentialInstallation?: typeof prepareSiteOSSearchIndexingCredentialInstallation;\n projectBindingStore?: ProjectBindingStore;\n serviceGrantProvider?: ServiceGrantProvider;\n}): Promise<SearchCommandResult> {\n const action = options.args[0];\n if (!action || ![\"issue\", \"list\", \"revoke\", \"rotate\"].includes(action)) {\n return usageError(\n `Unknown SiteOS search ${options.credentialKind === \"query\" ? \"credential\" : \"indexing-credential\"} command.`,\n );\n }\n const parsed = parseCredentialFlags(\n action,\n options.args.slice(1),\n options.credentialKind,\n );\n if (!parsed.ok) return parsed.error;\n\n const context = await loadCredentialManagementContext({\n ...options,\n install: parsed.install,\n });\n if (!context.ok) return context.error;\n\n try {\n if (action === \"list\") {\n const credentials =\n options.credentialKind === \"query\"\n ? (\n await context.client.listCredentials({\n environmentSlug: parsed.environmentSlug,\n projectId: context.projectId,\n token: context.grant,\n })\n ).tokens\n : (\n await context.client.listIndexingCredentials({\n environmentSlug: parsed.environmentSlug,\n projectId: context.projectId,\n token: context.grant,\n })\n ).credentials;\n const output = {\n credentials,\n environment: parsed.environmentSlug,\n };\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson(output)\n : formatCredentialListOutput({\n ...output,\n credentialKind: options.credentialKind,\n }),\n };\n }\n\n if (action === \"revoke\") {\n const credential =\n options.credentialKind === \"query\"\n ? await context.client.revokeCredential({\n credentialId: parsed.credentialId!,\n environmentSlug: parsed.environmentSlug,\n projectId: context.projectId,\n token: context.grant,\n })\n : await context.client.revokeIndexingCredential({\n credentialId: parsed.credentialId!,\n environmentSlug: parsed.environmentSlug,\n projectId: context.projectId,\n token: context.grant,\n });\n const output = {\n credential,\n environment: parsed.environmentSlug,\n revoked: true,\n };\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson(output)\n : `SiteOS Search ${credentialKindLabel(options.credentialKind)} credential revoked.\\nCredential: ${credential.id}\\nEnvironment: ${parsed.environmentSlug}`,\n };\n }\n\n if (options.credentialKind === \"query\") {\n const previousCredentials =\n action === \"rotate\"\n ? (\n await context.client.listCredentials({\n environmentSlug: parsed.environmentSlug,\n projectId: context.projectId,\n token: context.grant,\n })\n ).tokens.filter((credential) => credential.status === \"active\")\n : [];\n const exchange = await context.client.issueCredential({\n environmentSlug: parsed.environmentSlug,\n name: parsed.name,\n projectId: context.projectId,\n token: context.grant,\n });\n const { token, ...credential } = exchange;\n const result = await completeCredentialInstallation({\n action,\n credential,\n credentialKind: options.credentialKind,\n environmentSlug: parsed.environmentSlug,\n installation: context.installation!,\n json: parsed.json,\n secret: token,\n searchOrigin: context.apiBaseUrl,\n });\n if (action === \"rotate\") {\n await Promise.all(\n previousCredentials.map((previousCredential) =>\n context.client.revokeCredential({\n credentialId: previousCredential.id,\n environmentSlug: parsed.environmentSlug,\n projectId: context.projectId,\n token: context.grant,\n }),\n ),\n );\n }\n return result;\n }\n\n const previousCredentials =\n action === \"rotate\"\n ? (\n await context.client.listIndexingCredentials({\n environmentSlug: parsed.environmentSlug,\n projectId: context.projectId,\n token: context.grant,\n })\n ).credentials.filter((credential) => credential.status === \"active\")\n : [];\n const exchange = await context.client.issueIndexingCredential({\n environmentSlug: parsed.environmentSlug,\n name: parsed.name,\n projectId: context.projectId,\n token: context.grant,\n });\n const { credential: secret, ...credential } = exchange;\n const result = await completeCredentialInstallation({\n action,\n credential,\n credentialKind: options.credentialKind,\n environmentSlug: parsed.environmentSlug,\n installation: context.installation!,\n json: parsed.json,\n secret,\n searchOrigin: context.apiBaseUrl,\n });\n if (action === \"rotate\") {\n await Promise.all(\n previousCredentials.map((previousCredential) =>\n context.client.revokeIndexingCredential({\n credentialId: previousCredential.id,\n environmentSlug: parsed.environmentSlug,\n projectId: context.projectId,\n token: context.grant,\n }),\n ),\n );\n }\n return result;\n } catch (error) {\n return formatCredentialError(error);\n }\n}\n\nasync function completeCredentialInstallation(options: {\n action: string;\n credential: SiteOSSearchCredentialMetadata;\n credentialKind: \"indexing\" | \"query\";\n environmentSlug: string;\n installation: SiteOSSearchCredentialInstallation;\n json: boolean;\n searchOrigin: string;\n secret: string;\n}): Promise<SearchCommandResult> {\n await options.installation.install({\n credential: options.secret,\n environmentSlug: options.environmentSlug,\n searchOrigin: options.searchOrigin,\n });\n const credentialVariable =\n options.credentialKind === \"query\"\n ? SITEOS_SEARCH_QUERY_CREDENTIAL_ENV\n : SITEOS_SEARCH_INDEXING_CREDENTIAL_ENV;\n const installed = {\n credentialVariable,\n ...(options.credentialKind === \"query\"\n ? { environmentVariable: SITEOS_SEARCH_ENVIRONMENT_ENV }\n : {}),\n };\n const output = {\n credential: options.credential,\n environment: options.environmentSlug,\n installed,\n operation: options.action === \"issue\" ? \"issued\" : \"rotated\",\n };\n return {\n exitCode: 0,\n stdout: options.json\n ? stringifySafeJson(output)\n : [\n `SiteOS Search ${credentialKindLabel(options.credentialKind)} credential ${output.operation} and installed.`,\n `Credential: ${options.credential.id}`,\n `Environment: ${options.environmentSlug}`,\n `Credential variable: ${credentialVariable}`,\n options.credentialKind === \"query\"\n ? `Environment variable: ${SITEOS_SEARCH_ENVIRONMENT_ENV}`\n : undefined,\n ]\n .filter((line): line is string => Boolean(line))\n .join(\"\\n\"),\n };\n}\n\nasync function loadCredentialManagementContext(options: {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n install: boolean;\n credentialKind: \"indexing\" | \"query\";\n prepareCredentialInstallation?: typeof prepareSiteOSSearchCredentialInstallation;\n prepareIndexingCredentialInstallation?: typeof prepareSiteOSSearchIndexingCredentialInstallation;\n projectBindingStore?: ProjectBindingStore;\n serviceGrantProvider?: ServiceGrantProvider;\n}): Promise<\n | {\n apiBaseUrl: string;\n client: ReturnType<typeof createSiteOSSearchApiClient>;\n grant: string;\n installation?: SiteOSSearchCredentialInstallation;\n ok: true;\n projectId: string;\n }\n | { error: SearchCommandResult; ok: false }\n> {\n try {\n const local = await readLocalCommonProject(options);\n let rootDir = local?.rootDir;\n if (!rootDir) {\n const reference = await inspectSearchProjectReference(\n options.cwd ?? process.cwd(),\n );\n if (reference.status === \"missing\")\n throw new SearchProjectReferenceError(\n \"SEARCH_PROJECT_REFERENCE_REQUIRED\",\n \"Select a Search Project for this repository first.\",\n );\n rootDir = reference.rootDir;\n }\n const installation = options.install\n ? await (\n options.credentialKind === \"query\"\n ? (options.prepareCredentialInstallation ??\n prepareSiteOSSearchCredentialInstallation)\n : (options.prepareIndexingCredentialInstallation ??\n prepareSiteOSSearchIndexingCredentialInstallation)\n )({ projectRoot: rootDir })\n : undefined;\n const context = await loadSearchContext(options, \"search:credential:issue\");\n if (!context.ok) return context;\n return {\n apiBaseUrl: context.apiBaseUrl,\n client: createSiteOSSearchApiClient({\n apiBaseUrl: context.apiBaseUrl,\n fetchImpl: options.fetchImpl!,\n }),\n grant: context.credential,\n ...(installation ? { installation } : {}),\n ok: true,\n projectId: context.projectId,\n };\n } catch (error) {\n return { error: formatCredentialError(error), ok: false };\n }\n}\n\nasync function runSearchOperation(options: {\n args: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n projectBindingStore?: ProjectBindingStore;\n serviceGrantProvider?: ServiceGrantProvider;\n operation: \"analytics\" | \"diagnostics\" | \"doctor\" | \"reindex\";\n}): Promise<SearchCommandResult> {\n const parsed = parseFlags(options.args);\n if (!parsed.ok) return usageError(parsed.error);\n if (parsed.positionals.length > 0) {\n return usageError(\n `Usage: siteos search ${options.operation} --environment <slug> [--json]`,\n );\n }\n const environmentSlug = parsed.flags.get(ENVIRONMENT_FLAG);\n if (!environmentSlug) return usageError(\"--environment is required.\");\n if (!isValidEnvironmentSlug(environmentSlug)) {\n return usageError(\"--environment must be a valid environment slug.\");\n }\n\n return runWithSearchClient(options, async ({ client, context }) => {\n const response =\n options.operation === \"reindex\"\n ? await client.reindex({\n environmentSlug,\n projectId: context.projectId,\n token: context.credential,\n })\n : options.operation === \"analytics\"\n ? await client.analytics({\n environmentSlug,\n projectId: context.projectId,\n token: context.credential,\n })\n : await client.diagnostics({\n environmentSlug,\n projectId: context.projectId,\n token: context.credential,\n });\n const output = {\n environment: environmentSlug,\n project: context.project,\n ...(options.operation === \"reindex\"\n ? { result: response }\n : options.operation === \"analytics\"\n ? { analytics: response }\n : { diagnostics: response }),\n };\n return {\n exitCode: 0,\n stdout: parsed.json\n ? stringifySafeJson(output)\n : [\n options.operation === \"reindex\"\n ? \"SiteOS search reindex submitted.\"\n : `SiteOS search ${options.operation} completed.`,\n `Environment: ${environmentSlug}`,\n context.project.slug\n ? `Project: ${context.project.slug}`\n : undefined,\n ]\n .filter((line): line is string => Boolean(line))\n .join(\"\\n\"),\n };\n });\n}\n\nasync function runWithSearchClient(\n options: {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n projectBindingStore?: ProjectBindingStore;\n serviceGrantProvider?: ServiceGrantProvider;\n },\n run: (input: {\n client: ReturnType<typeof createSiteOSSearchApiClient>;\n context: Extract<SearchContext, { ok: true }>;\n }) => Promise<SearchCommandResult>,\n): Promise<SearchCommandResult> {\n const context = await loadSearchContext(options);\n if (!context.ok) return context.error;\n if (!options.fetchImpl)\n return {\n exitCode: 1,\n stderr: \"SiteOS API access is unavailable in this runtime.\",\n };\n try {\n return await run({\n client: createSiteOSSearchApiClient({\n apiBaseUrl: context.apiBaseUrl,\n fetchImpl: options.fetchImpl,\n }),\n context,\n });\n } catch (error) {\n return error instanceof SiteOSSearchApiError\n ? { exitCode: 1, stderr: `SiteOS API error: ${error.message}` }\n : { exitCode: 1, stderr: \"SiteOS search command failed.\" };\n }\n}\n\nasync function loadSearchContext(\n options: {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n projectBindingStore?: ProjectBindingStore;\n serviceGrantProvider?: ServiceGrantProvider;\n },\n requiredScope = \"search:workspace:write\",\n): Promise<SearchContext> {\n if (!options.fetchImpl) {\n return {\n error: {\n exitCode: 1,\n stderr: \"SiteOS API access is unavailable in this runtime.\",\n },\n ok: false,\n };\n }\n try {\n const common = await commonServiceContext(options, \"search\");\n if (common) {\n const grant = await serviceGrantProvider(options).acquire({\n audience: \"siteos-search\",\n scopes: [requiredScope],\n });\n requireGrant(grant, requiredScope);\n if (grant.grant.organizationId !== common.overview.project.organizationId)\n throw new SiteOSAuthApiError({\n code: \"PROJECT_ORGANIZATION_MISMATCH\",\n message:\n \"The Project and service grant belong to different organizations.\",\n });\n return {\n apiBaseUrl: common.api.origin,\n credential: grant.accessToken,\n ok: true,\n project: {\n id: common.resourceId,\n name: common.overview.project.name,\n slug: common.overview.project.slug,\n },\n projectId: common.resourceId,\n rootDir: common.rootDir,\n };\n }\n\n const reference = await inspectSearchProjectReference(\n options.cwd ?? process.cwd(),\n );\n if (reference.status === \"missing\") {\n throw new SearchProjectReferenceError(\n \"SEARCH_PROJECT_REFERENCE_REQUIRED\",\n \"Select a Search Project for this repository first.\",\n );\n }\n const apiBaseUrl = resolveSiteOSSearchBaseUrl(options.env);\n const binding = await projectBindingStore(options).read({\n apiOrigin: apiBaseUrl,\n repositoryRoot: reference.rootDir,\n service: \"search\",\n });\n if (!binding) {\n throw new SearchProjectReferenceError(\n \"SEARCH_PROJECT_REFERENCE_REQUIRED\",\n \"Select a Search Project for this repository first.\",\n );\n }\n const grant = await serviceGrantProvider(options).acquire({\n audience: \"siteos-search\",\n scopes: [requiredScope],\n });\n requireGrant(grant, requiredScope);\n if (\n grant.grant.organizationId !== binding.organizationId ||\n binding.project.slug !== reference.reference.project.slug\n ) {\n throw new SearchProjectReferenceError(\n \"SEARCH_PROJECT_REFERENCE_INVALID\",\n \"The Search Project reference, private binding, and Auth Organization do not match.\",\n );\n }\n return {\n apiBaseUrl,\n credential: grant.accessToken,\n ok: true,\n project: {\n id: binding.project.id,\n name: reference.reference.project.name,\n slug: binding.project.slug,\n },\n projectId: binding.project.id,\n rootDir: reference.rootDir,\n };\n } catch (error) {\n if (error instanceof SiteOSAuthApiError) return formatAuthError(error);\n return { error: formatProjectError(error), ok: false };\n }\n}\n\nfunction formatAuthError(\n error: unknown,\n): Extract<SearchContext, { ok: false }> {\n if (error instanceof SiteOSAuthApiError) {\n return {\n error: {\n exitCode: 1,\n stderr: [\n \"SiteOS Auth request failed.\",\n error.status ? `Status: ${error.status}` : undefined,\n `Code: ${error.code}`,\n error.message,\n ]\n .filter((line): line is string => Boolean(line))\n .join(\"\\n\"),\n },\n ok: false,\n };\n }\n return {\n error: {\n exitCode: 1,\n stderr: \"SiteOS Auth request failed.\",\n },\n ok: false,\n };\n}\n\nfunction parseProjectFlags(\n action: string,\n args: string[],\n):\n | {\n json: boolean;\n name?: string;\n ok: true;\n replace: boolean;\n slug?: string;\n }\n | { error: SearchCommandResult; ok: false } {\n const flags = new Map<string, string | true>();\n const positionals: string[] = [];\n const allowed = new Set([\n JSON_FLAG,\n ...(action === \"create\" ? [NAME_FLAG, SLUG_FLAG] : []),\n ...(action === \"use\" ? [REPLACE_FLAG] : []),\n ]);\n const boolean = new Set([JSON_FLAG, REPLACE_FLAG]);\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index]!;\n if (!arg.startsWith(\"--\")) {\n positionals.push(arg);\n continue;\n }\n const [flag, inlineValue] = splitFlag(arg);\n if (!allowed.has(flag) || flags.has(flag)) {\n return { error: usageError(`Unexpected argument: ${flag}`), ok: false };\n }\n if (boolean.has(flag)) {\n if (inlineValue !== undefined) {\n return {\n error: usageError(`${flag} does not accept a value.`),\n ok: false,\n };\n }\n flags.set(flag, true);\n continue;\n }\n const value = inlineValue ?? args[index + 1];\n if (!value || value.startsWith(\"--\")) {\n return { error: usageError(`${flag} requires a value.`), ok: false };\n }\n flags.set(flag, value.trim());\n if (inlineValue === undefined) index += 1;\n }\n\n if (action === \"use\") {\n if (positionals.length !== 1 || !isValidProjectSlug(positionals[0]!)) {\n return {\n error: usageError(\n \"Project use requires exactly one valid Project slug.\",\n ),\n ok: false,\n };\n }\n return {\n json: flags.has(JSON_FLAG),\n ok: true,\n replace: flags.has(REPLACE_FLAG),\n slug: positionals[0],\n };\n }\n if (positionals.length > 0) {\n return {\n error: usageError(`Unexpected argument: ${positionals[0]}`),\n ok: false,\n };\n }\n if (action !== \"create\") {\n return { json: flags.has(JSON_FLAG), ok: true, replace: false };\n }\n const slug = readCredentialStringFlag(flags, SLUG_FLAG);\n const name = readCredentialStringFlag(flags, NAME_FLAG);\n if (!slug || !isValidProjectSlug(slug)) {\n return {\n error: usageError(\"--slug is required and must be valid.\"),\n ok: false,\n };\n }\n if (!name || name.length > 255) {\n return {\n error: usageError(\"--name is required and must be valid.\"),\n ok: false,\n };\n }\n return {\n json: flags.has(JSON_FLAG),\n name,\n ok: true,\n replace: false,\n slug,\n };\n}\n\nfunction isValidProjectSlug(value: string): boolean {\n return (\n value.length >= 1 &&\n value.length <= 120 &&\n /^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(value)\n );\n}\n\nfunction parseCredentialFlags(\n action: string,\n args: string[],\n credentialKind: \"indexing\" | \"query\",\n):\n | {\n credentialId?: string;\n environmentSlug: string;\n install: boolean;\n json: boolean;\n name?: string;\n ok: true;\n }\n | { error: SearchCommandResult; ok: false } {\n const installs = action === \"issue\" || action === \"rotate\";\n const revokes = action === \"revoke\";\n const allowed = new Set([\n ENVIRONMENT_FLAG,\n JSON_FLAG,\n ...(installs ? [INSTALL_FLAG, NAME_FLAG] : []),\n ...(revokes ? [CREDENTIAL_FLAG] : []),\n ]);\n const booleanFlags = new Set([JSON_FLAG, INSTALL_FLAG]);\n const flags = new Map<string, string | true>();\n const positionals: string[] = [];\n\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index];\n if (!arg.startsWith(\"--\")) {\n positionals.push(arg);\n continue;\n }\n const [flagName, inlineValue] = splitFlag(arg);\n if (!allowed.has(flagName)) {\n return {\n error: usageError(`Unexpected argument: ${flagName}`),\n ok: false,\n };\n }\n if (flags.has(flagName)) {\n return {\n error: usageError(`Duplicate argument: ${flagName}`),\n ok: false,\n };\n }\n if (booleanFlags.has(flagName)) {\n if (inlineValue !== undefined) {\n return {\n error: usageError(`${flagName} does not accept a value.`),\n ok: false,\n };\n }\n flags.set(flagName, true);\n continue;\n }\n const value = inlineValue ?? args[index + 1];\n if (!value || value.startsWith(\"--\")) {\n return {\n error: usageError(`${flagName} requires a value.`),\n ok: false,\n };\n }\n flags.set(flagName, value);\n if (inlineValue === undefined) index += 1;\n }\n\n if (positionals.length > 0) {\n return {\n error: usageError(`Unexpected argument: ${positionals[0]}`),\n ok: false,\n };\n }\n const environmentSlug = readCredentialStringFlag(flags, ENVIRONMENT_FLAG);\n if (!environmentSlug) {\n return {\n error: usageError(\"--environment is required.\"),\n ok: false,\n };\n }\n if (!isValidEnvironmentSlug(environmentSlug)) {\n return {\n error: usageError(\"--environment must be a valid environment slug.\"),\n ok: false,\n };\n }\n if (installs && !flags.has(INSTALL_FLAG)) {\n return {\n error: usageError(\"--install is required for issue and rotate.\"),\n ok: false,\n };\n }\n const credentialId = readCredentialStringFlag(flags, CREDENTIAL_FLAG);\n if (revokes && !credentialId) {\n return {\n error: usageError(\"--credential is required for revoke.\"),\n ok: false,\n };\n }\n const name = readCredentialStringFlag(flags, NAME_FLAG);\n if (credentialId && credentialId.length > 255) {\n return {\n error: usageError(\"--credential is invalid.\"),\n ok: false,\n };\n }\n if (name && name.length > (credentialKind === \"indexing\" ? 100 : 255)) {\n return {\n error: usageError(\"--name is invalid.\"),\n ok: false,\n };\n }\n\n return {\n ...(credentialId ? { credentialId } : {}),\n environmentSlug,\n install: installs,\n json: flags.has(JSON_FLAG),\n ...(name ? { name } : {}),\n ok: true,\n };\n}\n\nfunction readCredentialStringFlag(\n flags: Map<string, string | true>,\n flagName: string,\n): string | undefined {\n const value = flags.get(flagName);\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction formatCredentialError(error: unknown): SearchCommandResult {\n if (error instanceof SiteOSAuthApiError) {\n return formatAuthError(error).error;\n }\n if (error instanceof SiteOSSearchCredentialStorageError) {\n return { exitCode: 1, stderr: error.message };\n }\n if (error instanceof SiteOSSearchApiError) {\n return {\n exitCode: 1,\n stderr: [\n \"SiteOS Search credential request failed.\",\n error.status ? `Status: ${error.status}` : undefined,\n `Code: ${error.code}`,\n ]\n .filter((line): line is string => Boolean(line))\n .join(\"\\n\"),\n };\n }\n return {\n exitCode: 1,\n stderr: \"SiteOS Search credential request failed.\",\n };\n}\n\nfunction formatProjectError(error: unknown): SearchCommandResult {\n if (error instanceof SiteOSAuthApiError) return formatAuthError(error).error;\n if (error instanceof SiteOSSearchApiError) {\n return {\n exitCode: 1,\n stderr: [\n \"SiteOS Search Project request failed.\",\n error.status ? `Status: ${error.status}` : undefined,\n `Code: ${error.code}`,\n ]\n .filter((line): line is string => Boolean(line))\n .join(\"\\n\"),\n };\n }\n if (\n error instanceof SearchProjectReferenceError ||\n error instanceof ProjectBindingStoreError ||\n error instanceof RepositoryRootError\n ) {\n return {\n exitCode: 1,\n stderr: [\n \"SiteOS Search Project access failed.\",\n `Code: ${error.code}`,\n error.message,\n ].join(\"\\n\"),\n };\n }\n return { exitCode: 1, stderr: \"SiteOS Search Project request failed.\" };\n}\n\nfunction serviceGrantProvider(options: {\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n serviceGrantProvider?: ServiceGrantProvider;\n}): ServiceGrantProvider {\n return (\n options.serviceGrantProvider ??\n createSiteOSServiceGrantProvider({\n env: options.env,\n fetchImpl: options.fetchImpl,\n })\n );\n}\n\nfunction projectBindingStore(options: {\n env?: NodeJS.ProcessEnv;\n projectBindingStore?: ProjectBindingStore;\n}): ProjectBindingStore {\n return (\n options.projectBindingStore ??\n new NodeProjectBindingStore(\n path.join(\n resolveSiteOSConfigHome({ env: options.env }),\n \"project-bindings.json\",\n ),\n )\n );\n}\n\nfunction requireGrant(\n grant: Awaited<ReturnType<ServiceGrantProvider[\"acquire\"]>>,\n scope: string,\n): void {\n if (\n grant.grant.audience !== \"siteos-search\" ||\n grant.grant.scopes.length !== 1 ||\n grant.grant.scopes[0] !== scope\n ) {\n throw new SiteOSAuthApiError({\n code: \"AUTH_INVALID_RESPONSE\",\n message: \"The SiteOS Auth service returned an invalid response.\",\n });\n }\n}\n\nfunction requireProjectOrganization(\n projects: SiteOSSearchProject[],\n organizationId: string,\n): void {\n if (projects.some((project) => project.organizationId !== organizationId)) {\n throw new SiteOSSearchApiError({\n code: \"INVALID_RESPONSE\",\n message: \"SiteOS Search returned an invalid response.\",\n });\n }\n}\n\nfunction formatProjectListOutput(projects: SiteOSSearchProject[]): string {\n return [\n \"SiteOS Search Projects.\",\n `Projects: ${projects.length}`,\n ...projects.map(\n (project) => `- ${project.slug}: ${project.name} (${project.id})`,\n ),\n ].join(\"\\n\");\n}\n\nfunction formatCredentialListOutput(input: {\n credentialKind: \"indexing\" | \"query\";\n credentials: Array<{ id: string; name: string; status: string }>;\n environment: string;\n}) {\n return [\n `SiteOS Search ${credentialKindLabel(input.credentialKind)} credentials.`,\n `Environment: ${input.environment}`,\n `Credentials: ${input.credentials.length}`,\n ...input.credentials.map(\n (credential) =>\n `- ${credential.id}: ${credential.name} (${credential.status})`,\n ),\n ].join(\"\\n\");\n}\n\nfunction credentialKindLabel(credentialKind: \"indexing\" | \"query\") {\n return credentialKind === \"query\" ? \"query\" : \"indexing\";\n}\n\nfunction parseFlags(args: string[]):\n | {\n flags: Map<string, string>;\n json: boolean;\n ok: true;\n positionals: string[];\n }\n | { error: string; ok: false } {\n const flags = new Map<string, string>();\n const positionals: string[] = [];\n let json = false;\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index];\n if (!arg.startsWith(\"--\")) {\n positionals.push(arg);\n continue;\n }\n const [flagName, inlineValue] = splitFlag(arg);\n if (flagName === JSON_FLAG) {\n if (inlineValue !== undefined)\n return { error: \"--json does not accept a value.\", ok: false };\n json = true;\n continue;\n }\n if (flagName !== ENVIRONMENT_FLAG)\n return { error: `Unexpected argument: ${flagName}`, ok: false };\n const value = inlineValue ?? args[index + 1];\n if (!value || value.startsWith(\"--\"))\n return { error: \"--environment requires a value.\", ok: false };\n flags.set(flagName, value);\n if (inlineValue === undefined) index += 1;\n }\n return { flags, json, ok: true, positionals };\n}\n\nfunction splitFlag(arg: string): [string, string | undefined] {\n const separatorIndex = arg.indexOf(\"=\");\n return separatorIndex === -1\n ? [arg, undefined]\n : [arg.slice(0, separatorIndex), arg.slice(separatorIndex + 1)];\n}\n\nfunction stringifySafeJson(value: unknown): string {\n return JSON.stringify(redactSensitiveFields(value), null, 2);\n}\n\nfunction redactSensitiveFields(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(redactSensitiveFields);\n if (typeof value !== \"object\" || value === null) return value;\n return Object.fromEntries(\n Object.entries(value).flatMap(([key, nestedValue]) =>\n [\"token\", \"apikey\", \"api_key\", \"authorization\"].includes(\n key.toLowerCase(),\n )\n ? []\n : [[key, redactSensitiveFields(nestedValue)]],\n ),\n );\n}\n\nfunction usageError(message: string): SearchCommandResult {\n return { exitCode: 1, stderr: `${message}\\n\\n${SEARCH_HELP}` };\n}\n","import { z } from \"zod\";\n\nexport const DEFAULT_SITEOS_SEARCH_BASE_URL = \"https://app.siteos.sh\";\nexport const SITEOS_SEARCH_BASE_URL_ENV = \"SITEOS_SEARCH_PUBLIC_URL\";\n\nexport type FetchLike = (\n input: string,\n init?: {\n body?: string;\n headers?: Record<string, string>;\n method?: string;\n redirect?: \"error\";\n signal?: AbortSignal;\n },\n) => Promise<{ json: () => Promise<unknown>; ok: boolean; status: number }>;\n\nexport type SiteOSSearchDiagnosticsResponse = Record<string, unknown>;\nexport type SiteOSSearchAnalyticsResponse = Record<string, unknown>;\nexport type SiteOSSearchActionResponse = Record<string, unknown>;\n\nconst permissiveObjectSchema = z.record(z.unknown());\nconst environmentSlugSchema = z\n .string()\n .min(2)\n .max(30)\n .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/);\nconst searchProjectSchema = z\n .object({\n createdAt: z.string().datetime({ offset: true }),\n id: z.string().trim().min(1).max(255),\n name: z.string().trim().min(1).max(255),\n organizationId: z.string().trim().min(1).max(255),\n slug: z\n .string()\n .trim()\n .min(1)\n .max(120)\n .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),\n updatedAt: z.string().datetime({ offset: true }),\n })\n .strict();\nconst searchProjectListResponseSchema = z\n .object({ projects: z.array(searchProjectSchema), success: z.literal(true) })\n .strict();\nconst searchProjectResponseSchema = z\n .object({ project: searchProjectSchema, success: z.literal(true) })\n .strict();\nconst searchEnvironmentSchema = z\n .object({\n createdAt: z.string().datetime({ offset: true }),\n id: z.string().trim().min(1).max(255),\n name: z.string().trim().min(1).max(255),\n projectId: z.string().trim().min(1).max(255),\n slug: environmentSlugSchema,\n updatedAt: z.string().datetime({ offset: true }),\n })\n .strict();\nconst searchEnvironmentListResponseSchema = z\n .object({\n environments: z.array(searchEnvironmentSchema),\n success: z.literal(true),\n })\n .strict();\nconst searchEnvironmentResponseSchema = z\n .object({ environment: searchEnvironmentSchema, success: z.literal(true) })\n .passthrough();\nconst searchCredentialMetadataSchema = z\n .object({\n createdAt: z.string().datetime({ offset: true }),\n id: z.string().trim().min(1).max(255),\n lastUsedAt: z.string().datetime({ offset: true }).nullable(),\n name: z.string().trim().min(1).max(255),\n projectEnvironmentId: z.string().trim().min(1).max(255),\n revokedAt: z.string().datetime({ offset: true }).nullable(),\n status: z.enum([\"active\", \"revoked\"]),\n })\n .strict();\nconst searchCredentialListResponseSchema = z\n .object({\n environmentSlug: environmentSlugSchema,\n success: z.literal(true),\n tokens: z.array(searchCredentialMetadataSchema),\n })\n .strict();\nconst searchCredentialExchangeResponseSchema = z\n .object({\n environmentSlug: environmentSlugSchema,\n success: z.literal(true),\n token: searchCredentialMetadataSchema.extend({\n token: z.string().regex(/^psq_[A-Za-z0-9_-]{22}$/),\n }),\n })\n .strict();\nconst searchCredentialRevokeResponseSchema = z\n .object({\n environmentSlug: environmentSlugSchema,\n success: z.literal(true),\n token: searchCredentialMetadataSchema,\n })\n .strict();\nconst searchIndexingCredentialListResponseSchema = z\n .object({\n credentials: z.array(searchCredentialMetadataSchema),\n environmentSlug: environmentSlugSchema,\n success: z.literal(true),\n })\n .strict();\nconst searchIndexingCredentialExchangeResponseSchema = z\n .object({\n credential: searchCredentialMetadataSchema\n .extend({\n credential: z.string().regex(/^psi_[A-Za-z0-9_-]{22}$/),\n })\n .strict(),\n environmentSlug: environmentSlugSchema,\n success: z.literal(true),\n })\n .strict();\nconst searchIndexingCredentialRevokeResponseSchema = z\n .object({\n credential: searchCredentialMetadataSchema,\n environmentSlug: environmentSlugSchema,\n success: z.literal(true),\n })\n .strict();\nconst nestedApiErrorResponseSchema = z\n .object({\n error: z.object({\n code: z.string().trim().min(1).optional(),\n message: z.string().trim().min(1),\n nextActions: z.array(z.string()).optional(),\n }),\n })\n .passthrough();\nconst directApiErrorResponseSchema = z\n .object({\n code: z.string().trim().min(1).optional(),\n message: z.string().trim().min(1).optional(),\n status: z.number().int().optional(),\n })\n .passthrough();\n\nexport class SiteOSSearchApiError extends Error {\n readonly code: string;\n readonly nextActions?: string[];\n readonly status?: number;\n\n constructor(options: {\n code?: string;\n message: string;\n nextActions?: string[];\n status?: number;\n }) {\n super(options.message);\n this.name = \"SiteOSSearchApiError\";\n this.code = options.code ?? \"SITEOS_API_ERROR\";\n this.nextActions = options.nextActions;\n this.status = options.status;\n }\n}\n\nexport type SiteOSSearchCredentialMetadata = z.infer<\n typeof searchCredentialMetadataSchema\n>;\nexport type SiteOSSearchCredentialExchange = z.infer<\n typeof searchCredentialExchangeResponseSchema\n>[\"token\"];\nexport type SiteOSSearchIndexingCredentialExchange = z.infer<\n typeof searchIndexingCredentialExchangeResponseSchema\n>[\"credential\"];\nexport type SiteOSSearchEnvironment = z.infer<typeof searchEnvironmentSchema>;\nexport type SiteOSSearchProject = z.infer<typeof searchProjectSchema>;\n\nexport function resolveSiteOSSearchBaseUrl(\n env: NodeJS.ProcessEnv = process.env,\n): string {\n return normalizeSearchOrigin(\n env[SITEOS_SEARCH_BASE_URL_ENV]?.trim() || DEFAULT_SITEOS_SEARCH_BASE_URL,\n );\n}\n\nexport function createSiteOSSearchApiClient(options: {\n apiBaseUrl: string;\n fetchImpl: FetchLike;\n}): {\n createProject: (input: {\n name: string;\n slug: string;\n token: string;\n }) => Promise<SiteOSSearchProject>;\n listProjects: (input: { token: string }) => Promise<SiteOSSearchProject[]>;\n diagnostics: (input: {\n environmentSlug: string;\n projectId: string;\n token: string;\n }) => Promise<SiteOSSearchDiagnosticsResponse>;\n analytics: (input: {\n environmentSlug: string;\n projectId: string;\n token: string;\n }) => Promise<SiteOSSearchAnalyticsResponse>;\n reindex: (input: {\n environmentSlug: string;\n projectId: string;\n token: string;\n }) => Promise<SiteOSSearchActionResponse>;\n listEnvironments: (input: {\n projectId: string;\n token: string;\n }) => Promise<SiteOSSearchEnvironment[]>;\n createEnvironment: (input: {\n slug: string;\n name: string;\n projectId: string;\n token: string;\n }) => Promise<SiteOSSearchEnvironment>;\n updateEnvironment: (input: {\n environmentSlug: string;\n name: string;\n projectId: string;\n token: string;\n }) => Promise<SiteOSSearchEnvironment>;\n forkEnvironment: (input: {\n sourceEnvironmentSlug: string;\n slug: string;\n name: string;\n projectId: string;\n token: string;\n }) => Promise<SiteOSSearchEnvironment>;\n deleteEnvironment: (input: {\n environmentSlug: string;\n projectId: string;\n token: string;\n }) => Promise<SiteOSSearchActionResponse>;\n issueCredential: (input: {\n environmentSlug: string;\n name?: string;\n projectId: string;\n token: string;\n }) => Promise<SiteOSSearchCredentialExchange>;\n listCredentials: (input: {\n environmentSlug: string;\n projectId: string;\n token: string;\n }) => Promise<{ tokens: SiteOSSearchCredentialMetadata[] }>;\n revokeCredential: (input: {\n credentialId: string;\n environmentSlug: string;\n projectId: string;\n token: string;\n }) => Promise<SiteOSSearchCredentialMetadata>;\n rotateCredential: (input: {\n environmentSlug: string;\n name?: string;\n projectId: string;\n token: string;\n }) => Promise<SiteOSSearchCredentialExchange>;\n issueIndexingCredential: (input: {\n environmentSlug: string;\n name?: string;\n projectId: string;\n token: string;\n }) => Promise<SiteOSSearchIndexingCredentialExchange>;\n listIndexingCredentials: (input: {\n environmentSlug: string;\n projectId: string;\n token: string;\n }) => Promise<{ credentials: SiteOSSearchCredentialMetadata[] }>;\n revokeIndexingCredential: (input: {\n credentialId: string;\n environmentSlug: string;\n projectId: string;\n token: string;\n }) => Promise<SiteOSSearchCredentialMetadata>;\n rotateIndexingCredential: (input: {\n environmentSlug: string;\n name?: string;\n projectId: string;\n token: string;\n }) => Promise<SiteOSSearchIndexingCredentialExchange>;\n} {\n return {\n createProject: async (input) => {\n const response = await requestJson({\n apiBaseUrl: options.apiBaseUrl,\n authToken: input.token,\n body: { name: input.name, slug: input.slug },\n fetchImpl: options.fetchImpl,\n method: \"POST\",\n path: \"/api/v1/search/projects\",\n responseSchema: searchProjectResponseSchema,\n });\n return response.project;\n },\n listProjects: async (input) => {\n const response = await requestJson({\n apiBaseUrl: options.apiBaseUrl,\n authToken: input.token,\n fetchImpl: options.fetchImpl,\n method: \"GET\",\n path: \"/api/v1/search/projects\",\n responseSchema: searchProjectListResponseSchema,\n });\n return response.projects;\n },\n listEnvironments: async (input) => {\n const response = await requestJson({\n apiBaseUrl: options.apiBaseUrl,\n authToken: input.token,\n fetchImpl: options.fetchImpl,\n method: \"GET\",\n path: environmentCollectionPath(input.projectId),\n responseSchema: searchEnvironmentListResponseSchema,\n });\n return response.environments;\n },\n createEnvironment: async (input) => {\n const response = await requestJson({\n apiBaseUrl: options.apiBaseUrl,\n authToken: input.token,\n body: { slug: input.slug, name: input.name },\n fetchImpl: options.fetchImpl,\n method: \"POST\",\n path: environmentCollectionPath(input.projectId),\n responseSchema: searchEnvironmentResponseSchema,\n });\n return response.environment;\n },\n updateEnvironment: async (input) => {\n const response = await requestJson({\n apiBaseUrl: options.apiBaseUrl,\n authToken: input.token,\n body: { name: input.name },\n fetchImpl: options.fetchImpl,\n method: \"PATCH\",\n path: environmentPath(input.projectId, input.environmentSlug),\n responseSchema: searchEnvironmentResponseSchema,\n });\n return response.environment;\n },\n forkEnvironment: async (input) => {\n const response = await requestJson({\n apiBaseUrl: options.apiBaseUrl,\n authToken: input.token,\n body: { slug: input.slug, name: input.name },\n fetchImpl: options.fetchImpl,\n method: \"POST\",\n path: `${environmentPath(input.projectId, input.sourceEnvironmentSlug)}/actions/fork`,\n responseSchema: searchEnvironmentResponseSchema,\n });\n return response.environment;\n },\n deleteEnvironment: (input) =>\n requestJson({\n apiBaseUrl: options.apiBaseUrl,\n authToken: input.token,\n fetchImpl: options.fetchImpl,\n method: \"DELETE\",\n path: environmentPath(input.projectId, input.environmentSlug),\n }),\n analytics: (input) =>\n requestJson({\n apiBaseUrl: options.apiBaseUrl,\n authToken: input.token,\n fetchImpl: options.fetchImpl,\n method: \"GET\",\n path: `${projectPath(input.projectId)}/analytics`,\n query: {\n environmentSlug: input.environmentSlug,\n },\n }),\n diagnostics: (input) =>\n requestJson({\n apiBaseUrl: options.apiBaseUrl,\n authToken: input.token,\n fetchImpl: options.fetchImpl,\n method: \"GET\",\n path: `${projectPath(input.projectId)}/diagnostics`,\n query: {\n environmentSlug: input.environmentSlug,\n },\n }),\n reindex: (input) =>\n requestJson({\n apiBaseUrl: options.apiBaseUrl,\n authToken: input.token,\n body: {},\n fetchImpl: options.fetchImpl,\n method: \"POST\",\n path: `${environmentPath(input.projectId, input.environmentSlug)}/actions/reindex`,\n }),\n issueCredential: async (input) => {\n const response = await requestJson({\n apiBaseUrl: options.apiBaseUrl,\n authToken: input.token,\n body: input.name ? { name: input.name } : {},\n fetchImpl: options.fetchImpl,\n method: \"POST\",\n path: credentialCollectionPath(input.projectId, input.environmentSlug),\n responseSchema: searchCredentialExchangeResponseSchema,\n });\n assertResponseEnvironment(\n response.environmentSlug,\n input.environmentSlug,\n );\n return response.token;\n },\n listCredentials: async (input) => {\n const response = await requestJson({\n apiBaseUrl: options.apiBaseUrl,\n authToken: input.token,\n fetchImpl: options.fetchImpl,\n method: \"GET\",\n path: credentialCollectionPath(input.projectId, input.environmentSlug),\n responseSchema: searchCredentialListResponseSchema,\n });\n assertResponseEnvironment(\n response.environmentSlug,\n input.environmentSlug,\n );\n return { tokens: response.tokens };\n },\n revokeCredential: async (input) => {\n const response = await requestJson({\n apiBaseUrl: options.apiBaseUrl,\n authToken: input.token,\n fetchImpl: options.fetchImpl,\n method: \"DELETE\",\n path: `${credentialCollectionPath(input.projectId, input.environmentSlug)}/${encodeURIComponent(input.credentialId)}`,\n responseSchema: searchCredentialRevokeResponseSchema,\n });\n assertResponseEnvironment(\n response.environmentSlug,\n input.environmentSlug,\n );\n return response.token;\n },\n rotateCredential: async (input) => {\n const response = await requestJson({\n apiBaseUrl: options.apiBaseUrl,\n authToken: input.token,\n body: input.name ? { name: input.name } : {},\n fetchImpl: options.fetchImpl,\n method: \"POST\",\n path: `${credentialCollectionPath(input.projectId, input.environmentSlug)}/actions/rotate`,\n responseSchema: searchCredentialExchangeResponseSchema,\n });\n assertResponseEnvironment(\n response.environmentSlug,\n input.environmentSlug,\n );\n return response.token;\n },\n issueIndexingCredential: async (input) => {\n const response = await requestJson({\n apiBaseUrl: options.apiBaseUrl,\n authToken: input.token,\n body: input.name ? { name: input.name } : {},\n fetchImpl: options.fetchImpl,\n method: \"POST\",\n path: indexingCredentialCollectionPath(\n input.projectId,\n input.environmentSlug,\n ),\n responseSchema: searchIndexingCredentialExchangeResponseSchema,\n });\n assertResponseEnvironment(\n response.environmentSlug,\n input.environmentSlug,\n );\n return response.credential;\n },\n listIndexingCredentials: async (input) => {\n const response = await requestJson({\n apiBaseUrl: options.apiBaseUrl,\n authToken: input.token,\n fetchImpl: options.fetchImpl,\n method: \"GET\",\n path: indexingCredentialCollectionPath(\n input.projectId,\n input.environmentSlug,\n ),\n responseSchema: searchIndexingCredentialListResponseSchema,\n });\n assertResponseEnvironment(\n response.environmentSlug,\n input.environmentSlug,\n );\n return { credentials: response.credentials };\n },\n revokeIndexingCredential: async (input) => {\n const response = await requestJson({\n apiBaseUrl: options.apiBaseUrl,\n authToken: input.token,\n fetchImpl: options.fetchImpl,\n method: \"DELETE\",\n path: `${indexingCredentialCollectionPath(input.projectId, input.environmentSlug)}/${encodeURIComponent(input.credentialId)}`,\n responseSchema: searchIndexingCredentialRevokeResponseSchema,\n });\n assertResponseEnvironment(\n response.environmentSlug,\n input.environmentSlug,\n );\n return response.credential;\n },\n rotateIndexingCredential: async (input) => {\n const response = await requestJson({\n apiBaseUrl: options.apiBaseUrl,\n authToken: input.token,\n body: input.name ? { name: input.name } : {},\n fetchImpl: options.fetchImpl,\n method: \"POST\",\n path: `${indexingCredentialCollectionPath(input.projectId, input.environmentSlug)}/actions/rotate`,\n responseSchema: searchIndexingCredentialExchangeResponseSchema,\n });\n assertResponseEnvironment(\n response.environmentSlug,\n input.environmentSlug,\n );\n return response.credential;\n },\n };\n}\n\nasync function requestJson<T extends Record<string, unknown>>(options: {\n apiBaseUrl: string;\n authToken: string;\n body?: unknown;\n fetchImpl: FetchLike;\n method: \"DELETE\" | \"GET\" | \"PATCH\" | \"POST\";\n path: string;\n query?: Record<string, string>;\n responseSchema?: z.ZodType<T>;\n}): Promise<T> {\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n Authorization: `Bearer ${options.authToken}`,\n };\n const body =\n options.body === undefined ? undefined : JSON.stringify(options.body);\n if (body) headers[\"Content-Type\"] = \"application/json\";\n\n let response: Awaited<ReturnType<FetchLike>>;\n try {\n response = await options.fetchImpl(buildApiUrl(options), {\n body,\n headers,\n method: options.method,\n });\n } catch {\n throw new SiteOSSearchApiError({\n code: \"REQUEST_FAILED\",\n message: \"SiteOS API request failed.\",\n });\n }\n\n const payload = await response.json().catch(() => undefined);\n if (!response.ok) {\n const nestedError = nestedApiErrorResponseSchema.safeParse(payload);\n if (nestedError.success) {\n throw new SiteOSSearchApiError({\n code: nestedError.data.error.code,\n message: nestedError.data.error.message,\n nextActions: nestedError.data.error.nextActions,\n status: response.status,\n });\n }\n const directError = directApiErrorResponseSchema.safeParse(payload);\n if (\n directError.success &&\n (directError.data.code || directError.data.message)\n ) {\n throw new SiteOSSearchApiError({\n code: directError.data.code,\n message:\n directError.data.message ?? \"SiteOS API returned an error response.\",\n status: directError.data.status ?? response.status,\n });\n }\n throw new SiteOSSearchApiError({\n code: \"UNEXPECTED_RESPONSE\",\n message: \"SiteOS API returned an unexpected error response.\",\n status: response.status,\n });\n }\n\n const parsedPayload = (\n options.responseSchema ?? (permissiveObjectSchema as z.ZodType<T>)\n ).safeParse(payload);\n if (!parsedPayload.success) {\n throw new SiteOSSearchApiError({\n code: \"INVALID_RESPONSE\",\n message: \"SiteOS API returned an invalid response.\",\n status: response.status,\n });\n }\n return parsedPayload.data as T;\n}\n\nfunction projectPath(projectId: string): string {\n return `/api/v1/search/projects/${encodeURIComponent(projectId)}`;\n}\n\nfunction environmentCollectionPath(projectId: string): string {\n return `${projectPath(projectId)}/environments`;\n}\n\nfunction environmentPath(projectId: string, environmentSlug: string): string {\n return `${environmentCollectionPath(projectId)}/${encodeURIComponent(environmentSlug)}`;\n}\n\nfunction credentialCollectionPath(\n projectId: string,\n environmentSlug: string,\n): string {\n return `${environmentPath(projectId, environmentSlug)}/tokens`;\n}\n\nfunction indexingCredentialCollectionPath(\n projectId: string,\n environmentSlug: string,\n): string {\n return `${environmentPath(projectId, environmentSlug)}/indexing-credentials`;\n}\n\nfunction assertResponseEnvironment(actual: string, expected: string): void {\n if (actual !== expected) {\n throw new SiteOSSearchApiError({\n code: \"INVALID_RESPONSE\",\n message: \"SiteOS API returned an invalid response.\",\n });\n }\n}\n\nfunction buildApiUrl(options: {\n apiBaseUrl: string;\n path: string;\n query?: Record<string, string>;\n}): string {\n const url = new URL(\n `${options.apiBaseUrl.replace(/\\/+$/, \"\")}${options.path}`,\n );\n for (const [key, value] of Object.entries(options.query ?? {})) {\n url.searchParams.set(key, value);\n }\n return url.toString();\n}\n\nfunction normalizeSearchOrigin(value: string): string {\n try {\n const url = new URL(value);\n const loopback = [\"localhost\", \"127.0.0.1\", \"[::1]\", \"::1\"].includes(\n url.hostname,\n );\n if (\n url.username ||\n url.password ||\n url.pathname !== \"/\" ||\n url.search ||\n url.hash ||\n (url.protocol !== \"https:\" && !(url.protocol === \"http:\" && loopback))\n ) {\n throw new Error(\"invalid Search origin\");\n }\n return url.origin;\n } catch {\n throw new SiteOSSearchApiError({\n code: \"INVALID_SEARCH_BASE_URL\",\n message: \"The SiteOS Search URL is invalid.\",\n });\n }\n}\n","import { spawn } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport {\n chmod,\n lstat,\n readFile,\n rename,\n rm,\n writeFile,\n} from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { isValidEnvironmentSlug } from \"./environment-slug.js\";\n\nexport const SITEOS_SEARCH_QUERY_CREDENTIAL_ENV = \"SITEOS_SEARCH_TOKEN\";\nexport const SITEOS_SEARCH_ENVIRONMENT_ENV = \"SITEOS_SEARCH_ENV\";\nexport const SITEOS_SEARCH_INDEXING_CREDENTIAL_ENV =\n \"SITEOS_SEARCH_INDEXING_CREDENTIAL\";\nexport const SITEOS_SEARCH_PUBLIC_URL_ENV = \"SITEOS_SEARCH_PUBLIC_URL\";\n\nconst queryCredentialPattern = /^psq_[A-Za-z0-9_-]{22}$/;\nconst indexingCredentialPattern = /^psi_[A-Za-z0-9_-]{22}$/;\n\nexport class SiteOSSearchCredentialStorageError extends Error {\n readonly code:\n | \"SEARCH_CREDENTIAL_STORAGE_INVALID\"\n | \"SEARCH_CREDENTIAL_STORAGE_UNAVAILABLE\";\n\n constructor(\n code:\n | \"SEARCH_CREDENTIAL_STORAGE_INVALID\"\n | \"SEARCH_CREDENTIAL_STORAGE_UNAVAILABLE\",\n ) {\n super(\n code === \"SEARCH_CREDENTIAL_STORAGE_INVALID\"\n ? \"The Search credential storage boundary is invalid.\"\n : \"The Search credential could not be installed.\",\n );\n this.name = \"SiteOSSearchCredentialStorageError\";\n this.code = code;\n }\n}\n\nexport type SiteOSSearchCredentialInstallation = {\n install: (input: {\n credential: string;\n environmentSlug: string;\n searchOrigin: string;\n }) => Promise<void>;\n};\n\nexport async function prepareSiteOSSearchCredentialInstallation(options: {\n projectRoot: string;\n}): Promise<SiteOSSearchCredentialInstallation> {\n const projectRoot = path.resolve(options.projectRoot);\n const dotenvPath = path.join(projectRoot, \".env\");\n\n try {\n await assertSafeProjectRoot(projectRoot);\n if (!(await isDotenvIgnored(projectRoot))) {\n throw new SiteOSSearchCredentialStorageError(\n \"SEARCH_CREDENTIAL_STORAGE_INVALID\",\n );\n }\n await readSafeDotenv(dotenvPath, [\n SITEOS_SEARCH_QUERY_CREDENTIAL_ENV,\n SITEOS_SEARCH_ENVIRONMENT_ENV,\n SITEOS_SEARCH_PUBLIC_URL_ENV,\n ]);\n\n return {\n install: async ({ credential, environmentSlug, searchOrigin }) => {\n if (\n !queryCredentialPattern.test(credential) ||\n !isValidEnvironmentSlug(environmentSlug) ||\n !isSafeSearchOrigin(searchOrigin)\n ) {\n throw new SiteOSSearchCredentialStorageError(\n \"SEARCH_CREDENTIAL_STORAGE_INVALID\",\n );\n }\n try {\n await assertSafeProjectRoot(projectRoot);\n if (!(await isDotenvIgnored(projectRoot))) {\n throw new SiteOSSearchCredentialStorageError(\n \"SEARCH_CREDENTIAL_STORAGE_INVALID\",\n );\n }\n const currentContent = await readSafeDotenv(dotenvPath, [\n SITEOS_SEARCH_QUERY_CREDENTIAL_ENV,\n SITEOS_SEARCH_ENVIRONMENT_ENV,\n SITEOS_SEARCH_PUBLIC_URL_ENV,\n ]);\n await writeCredentialAtomically({\n content: setRuntimeContext(\n currentContent,\n credential,\n environmentSlug,\n searchOrigin,\n ),\n dotenvPath,\n projectRoot,\n });\n } catch (error) {\n if (error instanceof SiteOSSearchCredentialStorageError) throw error;\n throw new SiteOSSearchCredentialStorageError(\n \"SEARCH_CREDENTIAL_STORAGE_UNAVAILABLE\",\n );\n }\n },\n };\n } catch (error) {\n if (error instanceof SiteOSSearchCredentialStorageError) throw error;\n throw new SiteOSSearchCredentialStorageError(\n \"SEARCH_CREDENTIAL_STORAGE_UNAVAILABLE\",\n );\n }\n}\n\nexport async function prepareSiteOSSearchIndexingCredentialInstallation(options: {\n projectRoot: string;\n}): Promise<SiteOSSearchCredentialInstallation> {\n const projectRoot = path.resolve(options.projectRoot);\n const dotenvPath = path.join(projectRoot, \".env\");\n\n try {\n await assertSafeProjectRoot(projectRoot);\n if (!(await isDotenvIgnored(projectRoot))) {\n throw new SiteOSSearchCredentialStorageError(\n \"SEARCH_CREDENTIAL_STORAGE_INVALID\",\n );\n }\n await readSafeDotenv(dotenvPath, [\n SITEOS_SEARCH_INDEXING_CREDENTIAL_ENV,\n SITEOS_SEARCH_PUBLIC_URL_ENV,\n ]);\n\n return {\n install: async ({ credential, environmentSlug, searchOrigin }) => {\n if (\n !indexingCredentialPattern.test(credential) ||\n !isValidEnvironmentSlug(environmentSlug) ||\n !isSafeSearchOrigin(searchOrigin)\n ) {\n throw new SiteOSSearchCredentialStorageError(\n \"SEARCH_CREDENTIAL_STORAGE_INVALID\",\n );\n }\n try {\n await assertSafeProjectRoot(projectRoot);\n if (!(await isDotenvIgnored(projectRoot))) {\n throw new SiteOSSearchCredentialStorageError(\n \"SEARCH_CREDENTIAL_STORAGE_INVALID\",\n );\n }\n const currentContent = await readSafeDotenv(dotenvPath, [\n SITEOS_SEARCH_INDEXING_CREDENTIAL_ENV,\n SITEOS_SEARCH_PUBLIC_URL_ENV,\n ]);\n await writeCredentialAtomically({\n content: setAssignment(\n setAssignment(\n currentContent,\n SITEOS_SEARCH_INDEXING_CREDENTIAL_ENV,\n credential,\n ),\n SITEOS_SEARCH_PUBLIC_URL_ENV,\n searchOrigin,\n ),\n dotenvPath,\n projectRoot,\n });\n } catch (error) {\n if (error instanceof SiteOSSearchCredentialStorageError) throw error;\n throw new SiteOSSearchCredentialStorageError(\n \"SEARCH_CREDENTIAL_STORAGE_UNAVAILABLE\",\n );\n }\n },\n };\n } catch (error) {\n if (error instanceof SiteOSSearchCredentialStorageError) throw error;\n throw new SiteOSSearchCredentialStorageError(\n \"SEARCH_CREDENTIAL_STORAGE_UNAVAILABLE\",\n );\n }\n}\n\nasync function assertSafeProjectRoot(projectRoot: string) {\n const projectStats = await lstat(projectRoot);\n if (!projectStats.isDirectory() || projectStats.isSymbolicLink()) {\n throw new SiteOSSearchCredentialStorageError(\n \"SEARCH_CREDENTIAL_STORAGE_INVALID\",\n );\n }\n}\n\nasync function readSafeDotenv(\n dotenvPath: string,\n managedEnvironmentNames: string[],\n) {\n const dotenvStats = await lstat(dotenvPath).catch((error: unknown) => {\n if (isNodeErrorCode(error, \"ENOENT\")) return undefined;\n throw error;\n });\n if (dotenvStats && !dotenvStats.isFile()) {\n throw new SiteOSSearchCredentialStorageError(\n \"SEARCH_CREDENTIAL_STORAGE_INVALID\",\n );\n }\n const content = dotenvStats ? await readFile(dotenvPath, \"utf8\") : \"\";\n if (\n managedEnvironmentNames.some(\n (name) => countManagedEntries(content, name) > 1,\n )\n ) {\n throw new SiteOSSearchCredentialStorageError(\n \"SEARCH_CREDENTIAL_STORAGE_INVALID\",\n );\n }\n return content;\n}\n\nasync function writeCredentialAtomically(options: {\n content: string;\n dotenvPath: string;\n projectRoot: string;\n}) {\n const temporaryPath = path.join(\n options.projectRoot,\n `.siteos-search-credential.${process.pid}.${randomUUID()}.tmp`,\n );\n try {\n await writeFile(temporaryPath, options.content, {\n encoding: \"utf8\",\n flag: \"wx\",\n mode: 0o600,\n });\n await chmod(temporaryPath, 0o600);\n await rename(temporaryPath, options.dotenvPath);\n } catch {\n throw new SiteOSSearchCredentialStorageError(\n \"SEARCH_CREDENTIAL_STORAGE_UNAVAILABLE\",\n );\n } finally {\n await rm(temporaryPath, { force: true }).catch(() => undefined);\n }\n}\n\nfunction setRuntimeContext(\n content: string,\n credential: string,\n environmentSlug: string,\n searchOrigin: string,\n) {\n return setAssignment(\n setAssignment(\n setAssignment(content, SITEOS_SEARCH_QUERY_CREDENTIAL_ENV, credential),\n SITEOS_SEARCH_ENVIRONMENT_ENV,\n environmentSlug,\n ),\n SITEOS_SEARCH_PUBLIC_URL_ENV,\n searchOrigin,\n );\n}\n\nfunction isSafeSearchOrigin(value: string): boolean {\n try {\n const url = new URL(value);\n return (\n !url.username &&\n !url.password &&\n !url.search &&\n !url.hash &&\n url.pathname === \"/\" &&\n (url.protocol === \"https:\" ||\n (url.protocol === \"http:\" &&\n [\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(url.hostname)))\n );\n } catch {\n return false;\n }\n}\n\nfunction setAssignment(content: string, name: string, value: string) {\n const assignment = `${name}=${value}`;\n const existing = new RegExp(`^${name}=[^\\\\r\\\\n]*(?=\\\\r?$)`, \"m\");\n if (existing.test(content)) return content.replace(existing, assignment);\n const newline = content.includes(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\n if (content.length === 0) return `${assignment}${newline}`;\n return `${content}${content.endsWith(\"\\n\") ? \"\" : newline}${assignment}${newline}`;\n}\n\nfunction countManagedEntries(content: string, name: string) {\n return content.split(/\\r?\\n/u).filter((line) => line.startsWith(`${name}=`))\n .length;\n}\n\nfunction isDotenvIgnored(projectRoot: string) {\n return new Promise<boolean>((resolve, reject) => {\n const child = spawn(\n \"git\",\n [\"check-ignore\", \"--quiet\", \"--no-index\", \"--\", \".env\"],\n {\n cwd: projectRoot,\n stdio: \"ignore\",\n },\n );\n child.once(\"error\", reject);\n child.once(\"exit\", (code) => {\n if (code === 0) resolve(true);\n else if (code === 1) resolve(false);\n else reject(new Error(\"Git ignore inspection failed.\"));\n });\n });\n}\n\nfunction isNodeErrorCode(error: unknown, code: string): boolean {\n return (\n error instanceof Error &&\n \"code\" in error &&\n (error as NodeJS.ErrnoException).code === code\n );\n}\n","import { parseArgs } from \"node:util\";\nimport { findRepositoryRoot } from \"../core/adapters/node-repository-root.js\";\nimport type { CommandResult } from \"../core/command-result.js\";\nimport { SiteOSAuthApiError } from \"../siteos-auth-api.js\";\nimport {\n commonProjectRuntime,\n readCommonProject,\n type ProjectCommandOptions,\n} from \"./project-context.js\";\nimport {\n PROJECT_SERVICES,\n type CommonProject,\n type ProjectService,\n} from \"./project-api.js\";\n\nexport const PROJECT_HELP = `One Project for your website and all its services.\n\nUsage:\n siteos project list [--json]\n siteos project create --name <name> --slug <slug> [--url <url>] [--domain <domain>] [--json]\n siteos project use <id-or-slug> [--json]\n siteos project update [--name <name>] [--slug <slug>] [--url <production-url>] [--json]\n siteos project status [--json]\n siteos project connect <pulse|cookie|forms|search|trace|seo|analytics> [--resource <id>] [--json]\n siteos project environment list [--json]\n siteos project environment create --name <name> --slug <slug> [--url <url>] [--json]\n siteos project environment use <slug> [--json]\n siteos project environment update <slug> [--name <name>] [--url <url>] [--json]\n siteos project environment resources <pulse|cookie|forms|search|trace|seo|analytics> [--json]\n siteos project environment connect <pulse|cookie|forms|search|trace|seo|analytics> --environment <slug> [--resource <id>] [--json]\n\nSelect a Project once per repository. Service commands use its configured resources.\nConnect creates a draft workspace, or explicitly attaches an existing resource.\nIt does not publish a banner, install a script, send a notification or deploy checks.`;\n\nexport async function runProjectCommand(\n options: ProjectCommandOptions & { args: string[] },\n): Promise<CommandResult> {\n if (\n !options.args.length ||\n options.args.some((arg) => arg === \"--help\" || arg === \"-h\")\n )\n return { exitCode: 0, stdout: PROJECT_HELP };\n try {\n const [action, ...args] = options.args;\n if (action === \"environment\")\n return await runEnvironmentCommand({ ...options, args });\n if (\n ![\"list\", \"create\", \"use\", \"status\", \"connect\", \"update\"].includes(\n action!,\n )\n )\n throw new Error(\"Unknown Project command.\");\n const parsed = parseArgs({\n args,\n allowPositionals: true,\n strict: true,\n options: {\n json: { type: \"boolean\" },\n ...(action === \"create\" || action === \"update\"\n ? {\n name: { type: \"string\" as const },\n slug: { type: \"string\" as const },\n url: { type: \"string\" as const },\n ...(action === \"create\"\n ? { domain: { type: \"string\" as const, multiple: true } }\n : {}),\n }\n : {}),\n ...(action === \"connect\"\n ? { resource: { type: \"string\" as const } }\n : {}),\n },\n });\n if (\n parsed.positionals.length !==\n (action === \"use\" || action === \"connect\" ? 1 : 0)\n )\n throw new Error(\"Unexpected Project arguments.\");\n const { api, store } = commonProjectRuntime(options);\n let result: unknown;\n let message: string;\n if (action === \"list\") {\n const projects = await api.list();\n result = { projects };\n message = projects.length\n ? projects\n .map((project) => `${project.slug}\\t${project.name}\\t${project.id}`)\n .join(\"\\n\")\n : \"No Projects yet. Create one with `siteos project create`.\";\n } else if (action === \"create\") {\n if (!parsed.values.name || !parsed.values.slug)\n throw new Error(\"Project create requires --name and --slug.\");\n const project = await api.create({\n name: parsed.values.name as string,\n slug: parsed.values.slug as string,\n ...(parsed.values.url\n ? { websiteUrl: parsed.values.url as string }\n : {}),\n domains: Array.isArray(parsed.values.domain)\n ? parsed.values.domain\n : [],\n });\n result = { project };\n message = `Created ${project.name}.\\nSelect it with \\`siteos project use ${project.slug}\\`.`;\n } else if (action === \"use\") {\n const matches = (await api.list()).filter(\n (project) =>\n project.id === parsed.positionals[0] ||\n project.slug === parsed.positionals[0],\n );\n if (matches.length !== 1)\n throw new Error(\n matches.length\n ? \"Use the exact Project ID to disambiguate this selection.\"\n : \"Project not found in the active organization.\",\n );\n const project = matches[0]!;\n await store.write({\n apiOrigin: api.origin,\n repositoryRoot: await findRepositoryRoot(options.cwd ?? process.cwd()),\n service: \"project\",\n organizationId: project.organizationId,\n project: { id: project.id, slug: project.slug },\n });\n result = { project };\n message = `Selected ${project.name} for this repository.\\nRun \\`siteos project status\\` to inspect its services.`;\n } else {\n const context = await readCommonProject(options);\n if (!context)\n throw new Error(\n \"Select a Project first with `siteos project use <id-or-slug>`.\",\n );\n let overview = context.overview;\n if (action === \"update\") {\n if (\n !parsed.values.name &&\n !parsed.values.slug &&\n parsed.values.url === undefined\n )\n throw new Error(\"Choose --name, --slug or --url to update.\");\n const project = overview.project;\n await api.update(project.id, {\n name: (parsed.values.name as string) ?? project.name,\n slug: (parsed.values.slug as string) ?? project.slug,\n domains: project.domains,\n websiteUrl:\n parsed.values.url === undefined\n ? project.environments.find((item) => item.slug === \"production\")\n ?.url\n : (parsed.values.url as string) || null,\n });\n overview = await api.get(project.id, context.environment.slug);\n await context.store.write({\n ...context.binding,\n project: { id: overview.project.id, slug: overview.project.slug },\n });\n }\n if (action === \"connect\") {\n const service = parsed.positionals[0] as ProjectService;\n if (!PROJECT_SERVICES.includes(service))\n throw new Error(\n \"Choose pulse, cookie, forms, search, trace, seo or analytics. Organization connections use `siteos integrations`. \",\n );\n overview = await api.connect(\n overview.project.id,\n service,\n parsed.values.resource as string | undefined,\n context.environment.slug,\n );\n }\n result = overview;\n message = `${projectLabel(overview.project)} · ${context.environment.name}\\n${overview.services.map((service) => `${service.service}: ${service.observation?.summary ?? \"Not configured\"}`).join(\"\\n\")}`;\n }\n return {\n exitCode: 0,\n stdout: parsed.values.json ? JSON.stringify(result, null, 2) : message,\n };\n } catch (cause) {\n return {\n exitCode: cause instanceof SiteOSAuthApiError ? 1 : 2,\n stderr:\n cause instanceof Error ? cause.message : \"The Project command failed.\",\n };\n }\n}\nfunction projectLabel(project: CommonProject) {\n return `${project.name} (${project.slug})`;\n}\n\nasync function runEnvironmentCommand(\n options: ProjectCommandOptions & { args: string[] },\n): Promise<CommandResult> {\n const [action, ...args] = options.args;\n if (\n ![\"list\", \"create\", \"connect\", \"resources\", \"use\", \"update\"].includes(\n action!,\n )\n )\n throw new Error(\"Unknown Project environment command.\");\n const { positionals, values } = parseArgs({\n args,\n allowPositionals: true,\n strict: true,\n options: {\n json: { type: \"boolean\" },\n ...(action === \"create\" || action === \"update\"\n ? {\n name: { type: \"string\" as const },\n ...(action === \"create\"\n ? { slug: { type: \"string\" as const } }\n : {}),\n url: { type: \"string\" as const },\n }\n : {}),\n ...(action === \"connect\"\n ? {\n environment: { type: \"string\" as const },\n resource: { type: \"string\" as const },\n }\n : {}),\n },\n });\n if (\n positionals.length !==\n (action === \"connect\" ||\n action === \"resources\" ||\n action === \"use\" ||\n action === \"update\"\n ? 1\n : 0)\n )\n throw new Error(\"Unexpected Project environment arguments.\");\n if (action === \"create\" && (!values.name || !values.slug))\n throw new Error(\"Environment create requires --name and --slug.\");\n const service = positionals[0] as ProjectService;\n if (\n (action === \"connect\" || action === \"resources\") &&\n !PROJECT_SERVICES.includes(service)\n )\n throw new Error(\n \"Choose pulse, cookie, forms, search, trace, seo or analytics.\",\n );\n if (action === \"connect\" && !values.environment)\n throw new Error(\"Choose a Project environment with --environment <slug>.\");\n const context = await readCommonProject(\n options,\n action === \"use\" ? \"production\" : undefined,\n );\n if (!context)\n throw new Error(\"Select a Project with `siteos project use` first.\");\n const { project } = context.overview;\n let result: unknown;\n if (action === \"use\") {\n const environment = project.environments.find(\n (item) => item.slug === positionals[0],\n );\n if (!environment)\n throw new Error(\n \"Environment not found. Run `siteos project environment list`.\",\n );\n await context.store.write({\n ...context.binding,\n environmentSlug: environment.slug,\n });\n result = { project: { id: project.id, name: project.name }, environment };\n } else if (action === \"update\") {\n const environment = project.environments.find(\n (item) => item.slug === positionals[0],\n );\n if (!environment)\n throw new Error(\n \"Environment not found. Run `siteos project environment list`.\",\n );\n if (!values.name && values.url === undefined)\n throw new Error(\"Choose --name or --url to update.\");\n result = {\n project: await context.api.updateEnvironment(project.id, environment.id, {\n name: (values.name as string) ?? environment.name,\n url:\n values.url === undefined\n ? (environment.url ?? null)\n : (values.url as string) || null,\n }),\n };\n } else if (action === \"list\")\n result = {\n environments: project.environments,\n services: context.overview.services.map(({ service, attachment }) => ({\n service,\n environments: attachment?.environments ?? [],\n })),\n };\n else if (action === \"create\")\n result = {\n project: await context.api.createEnvironment(project.id, {\n name: values.name as string,\n slug: values.slug as string,\n ...(values.url ? { url: values.url as string } : {}),\n }),\n };\n else if (action === \"resources\")\n result = {\n environments: await context.api.availableEnvironments(\n project.id,\n service,\n ),\n };\n else {\n const environment = project.environments.find(\n (item) => item.slug === values.environment,\n );\n if (!environment)\n throw new Error(\n \"Project environment not found. Run `siteos project environment list`.\",\n );\n result = await context.api.connectEnvironment(\n project.id,\n service,\n environment.id,\n values.resource as string | undefined,\n );\n }\n return { exitCode: 0, stdout: JSON.stringify(result, null, 2) };\n}\n","import { readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { parseArgs } from \"node:util\";\nimport { z } from \"zod\";\nimport type { CommandResult } from \"../core/command-result.js\";\nimport type { SiteOSServiceAudience } from \"../auth/application/service-grant-provider.js\";\nimport { SiteOSAuthApiError } from \"../siteos-auth-api.js\";\nimport {\n TRACE_EXPLORER_FLAGS,\n traceExplorerSuffix,\n tracePublicationVersion,\n} from \"./trace-explorer-command.js\";\nimport {\n commonProjectRuntime,\n commonServiceContext,\n type ProjectCommandOptions,\n} from \"../projects/project-context.js\";\n\ntype Service = \"cookie\" | \"trace\" | \"integrations\";\n\nexport const SERVICE_HELP: Record<Service, string> = {\n cookie: `Manage Cookie for the selected SiteOS Project.\n\nUsage:\n siteos cookie status [--json]\n siteos cookie installation [--json]\n siteos cookie schema [--json]\n siteos cookie validate --input <draft.json> [--json]\n siteos cookie regions resolve [--country <ISO>] [--subdivision <code>] [--source <draft|published>] [--json]\n siteos cookie verify [--url <same-origin-url>] [--browser <chromium|webkit>] [--json]\n siteos cookie restore --input <restore.json> [--json]\n siteos cookie draft get [--json]\n siteos cookie draft save --input <draft.json> [--json]\n siteos cookie publish --input <publication.json> [--json]\n siteos cookie analytics [--range-days <7|30|90>] [--json]\n\nStart with siteos project use, then siteos project connect cookie.\nDraft get returns the complete save payload including expectedDraftVersion.\nPublish input: {\"expectedDraftVersion\":1,\"idempotencyKey\":\"a-unique-request-key\"}.\nSaving a draft has no public effect. Publish activates the reviewed banner at Cookie Edge.`,\n trace: `Manage Trace for the selected SiteOS Project.\n\nUsage:\n siteos trace status [--json]\n siteos trace environments [--json]\n siteos trace report [--environment <slug>] [--json]\n siteos trace destinations [--environment <slug>] [--period <24h|7d>] [--cursor <cursor>] [--json]\n siteos trace events [--environment <slug>] [--provider <provider>] [--event <name>] [--search <text>] [--state <all|new|issues|tracked|ignored>] [--period <24h|7d>] [--cursor <cursor>] [--json]\n siteos trace properties [--environment <slug>] [--provider <provider>] [--event <name>] [--property <name>] [--search <text>] [--period <24h|7d>] [--cursor <cursor>] [--json]\n siteos trace issues [--environment <slug>] [--provider <provider>] [--event <name>] [--state <all|active|snoozed|resolved|new>] [--rule <rule>] [--search <text>] [--period <24h|7d>] [--cursor <cursor>] [--json]\n siteos trace observations [--environment <slug>] [--provider <provider>] [--event <name>] [--kind <kind>] [--page-view <uuid>] [--search <text>] [--period <24h|7d>] [--cursor <cursor>] [--json]\n siteos trace issue show --id <uuid> [--environment <slug>] [--cursor <finding-cursor>] [--json]\n siteos trace observation show --batch-id <uuid> --event-id <uuid> [--environment <slug>] [--json]\n siteos trace installation <show|ensure|save|publish> [--environment <slug>] [--input <draft.json>] [--json]\n siteos trace tracking-plan <show|ensure|save|publish> [--environment <slug>] [--input <plan.json>] [--json]\n siteos trace tracking-plan publish --expected-draft-version <number> [--environment <slug>] [--json]\n\nStart with siteos project use, then siteos project connect trace.\nCommands use the selected Project environment. Save requires --input with expectedDraftVersion.\nEnsure creates a draft; publish activates the reviewed configuration.\nUse --expected-draft-version when publishing a reviewed tracking plan; a conflict needs a fresh review.\nExplorer commands require the matching Trace server. They read one page and return nextCursor.\nReuse the same filters with that cursor; omit it to start a fresh time window.\nProviders: siteos_analytics, ga4, google_ads, hubspot, meta, custom (data layer source).\nKinds: data_layer, fetch, xhr, beacon, resource, consent, heartbeat, runtime_diagnostic.\nLists also accept --provider, --event, --property, --page-view, --search, --state, --rule and --kind.\nDestinations are observed analytics services; a data layer event alone does not prove delivery.`,\n integrations: `Manage shared Organization connections and notification destinations.\n\nUsage:\n siteos integrations status [--json]\n siteos integrations connect [--json]\n siteos integrations channels [--query <name>] [--cursor <cursor>] [--json]\n siteos integrations destination create --channel <provider-channel-id> [--json]\n\nConnect returns the SiteOS page for completing Slack authorization in your browser.\nDestination creation makes a channel available for service notification settings.\nIt does not send a message or subscribe every Project.`,\n};\n\nexport async function runServiceCommand(\n service: Service,\n options: ProjectCommandOptions & { args: string[] },\n): Promise<CommandResult> {\n if (\n !options.args.length ||\n options.args.includes(\"--help\") ||\n options.args.includes(\"-h\")\n )\n return { exitCode: 0, stdout: SERVICE_HELP[service] };\n try {\n const { positionals, values } = parseArgs({\n args: options.args,\n allowPositionals: true,\n strict: true,\n options: {\n json: { type: \"boolean\" },\n input: { type: \"string\" },\n environment: { type: \"string\" },\n \"range-days\": { type: \"string\" },\n query: { type: \"string\" },\n cursor: { type: \"string\" },\n channel: { type: \"string\" },\n country: { type: \"string\" },\n subdivision: { type: \"string\" },\n source: { type: \"string\" },\n url: { type: \"string\" },\n browser: { type: \"string\" },\n provider: { type: \"string\" },\n event: { type: \"string\" },\n property: { type: \"string\" },\n \"page-view\": { type: \"string\" },\n search: { type: \"string\" },\n state: { type: \"string\" },\n rule: { type: \"string\" },\n kind: { type: \"string\" },\n period: { type: \"string\" },\n id: { type: \"string\" },\n \"batch-id\": { type: \"string\" },\n \"event-id\": { type: \"string\" },\n \"expected-draft-version\": { type: \"string\" },\n },\n });\n const [action, subaction] = positionals;\n const route = positionals.join(\" \");\n const allowed: Record<Service, Record<string, string[]>> = {\n cookie: {\n status: [],\n installation: [],\n schema: [],\n validate: [\"input\"],\n \"regions resolve\": [\"country\", \"subdivision\", \"source\"],\n verify: [\"url\", \"browser\"],\n restore: [\"input\"],\n \"draft get\": [],\n \"draft save\": [\"input\"],\n publish: [\"input\"],\n analytics: [\"range-days\"],\n },\n trace: {\n status: [],\n environments: [],\n report: [\"environment\"],\n ...TRACE_EXPLORER_FLAGS,\n ...Object.fromEntries(\n [\"installation\", \"tracking-plan\"].flatMap((section) =>\n [\"show\", \"ensure\", \"save\", \"publish\"].map((operation) => [\n `${section} ${operation}`,\n operation === \"save\" ? [\"environment\", \"input\"] : [\"environment\"],\n ]),\n ),\n ),\n \"tracking-plan publish\": [\"environment\", \"expected-draft-version\"],\n },\n integrations: {\n status: [],\n connect: [],\n channels: [\"query\", \"cursor\"],\n \"destination create\": [\"channel\"],\n },\n };\n const flags = allowed[service][route];\n if (!flags)\n throw new Error(\n `Unknown ${service} operation. Run \\`siteos ${service} --help\\`.`,\n );\n if (\n Object.keys(values).some(\n (flag) => flag !== \"json\" && !flags.includes(flag),\n )\n )\n throw new Error(\"This flag does not apply to the selected operation.\");\n if (flags.includes(\"input\") && !values.input)\n throw new Error(\"This operation requires --input <json-file>.\");\n if (flags.includes(\"channel\") && !values.channel)\n throw new Error(\n \"Destination creation requires --channel <provider-channel-id>.\",\n );\n const explorerSuffix =\n service === \"trace\" ? traceExplorerSuffix(route, values) : null;\n const expectedDraftVersion = tracePublicationVersion(\n values[\"expected-draft-version\"],\n );\n const runtime = commonProjectRuntime(options);\n const common =\n service === \"integrations\"\n ? null\n : await commonServiceContext(\n options,\n service,\n values.environment as string | undefined,\n );\n if (service !== \"integrations\" && !common)\n throw new Error(\n \"Select a SiteOS Project with `siteos project use` first.\",\n );\n const audience = `siteos-${service}` as SiteOSServiceAudience;\n async function request(\n suffix: string,\n method = \"GET\",\n body?: unknown,\n scope?: string,\n ): Promise<unknown> {\n const required =\n scope ?? `${service}:workspace:${method === \"GET\" ? \"read\" : \"write\"}`;\n const grant = await runtime.grants.acquire({\n audience,\n scopes: [required],\n });\n if (\n grant.grant.audience !== audience ||\n grant.grant.scopes.length !== 1 ||\n grant.grant.scopes[0] !== required ||\n (common &&\n grant.grant.organizationId !== common.overview.project.organizationId)\n )\n throw new SiteOSAuthApiError({\n code: \"AUTH_INVALID_RESPONSE\",\n message:\n \"The service grant does not match this Project and operation.\",\n });\n if (!options.fetchImpl)\n throw new Error(\"SiteOS API access is unavailable.\");\n const response = await options.fetchImpl(\n `${runtime.api.origin}/api/${service}/v1${suffix}`,\n {\n method,\n headers: {\n Accept: \"application/json\",\n Authorization: `Bearer ${grant.accessToken}`,\n ...(body === undefined\n ? {}\n : { \"Content-Type\": \"application/json\" }),\n },\n ...(body === undefined ? {} : { body: JSON.stringify(body) }),\n signal: AbortSignal.timeout(30_000),\n },\n );\n const result = await response.json();\n if (!response.ok) {\n const error = z\n .object({\n error: z.object({ code: z.string(), message: z.string().max(500) }),\n })\n .safeParse(result);\n throw new SiteOSAuthApiError({\n code: error.success\n ? error.data.error.code\n : \"SERVICE_REQUEST_FAILED\",\n message: error.success\n ? error.data.error.message\n : \"The service request failed.\",\n status: response.status,\n });\n }\n return result;\n }\n async function inputFile() {\n if (!values.input)\n throw new Error(\"This operation requires --input <json-file>.\");\n const filename = path.resolve(options.cwd ?? process.cwd(), values.input);\n const info = await stat(filename);\n if (!info.isFile() || info.size > 512 * 1024)\n throw new Error(\"Use a JSON file smaller than 512 KB.\");\n return JSON.parse(await readFile(filename, \"utf8\")) as unknown;\n }\n const site = common\n ? `/sites/${encodeURIComponent(common.resourceId)}`\n : \"\";\n let result: unknown;\n if (service === \"cookie\") {\n if (action === \"status\" && positionals.length === 1)\n result = await request(site);\n else if (action === \"schema\") result = await request(`${site}/schema`);\n else if (action === \"validate\") {\n result = await request(\n `${site}/validate`,\n \"POST\",\n await inputFile(),\n \"cookie:workspace:read\",\n );\n const validation = z\n .object({\n valid: z.boolean(),\n draftVersionMatches: z.boolean().optional(),\n })\n .parse(result);\n if (!validation.valid || validation.draftVersionMatches === false)\n return { exitCode: 2, stdout: JSON.stringify(result, null, 2) };\n } else if (action === \"restore\")\n result = await request(`${site}/restore`, \"POST\", await inputFile());\n else if (action === \"regions\") {\n const query = new URLSearchParams();\n for (const key of [\"country\", \"subdivision\", \"source\"] as const)\n if (values[key]) query.set(key, values[key]);\n result = await request(`${site}/regions?${query}`);\n } else if (action === \"verify\") {\n const {\n VerificationInstallation,\n verificationTarget,\n verifyCookieWebsite,\n } = await import(\"./cookie-verification.js\");\n const browserName = values.browser ?? \"chromium\";\n if (browserName !== \"chromium\" && browserName !== \"webkit\")\n throw new Error(\"Choose chromium or webkit.\");\n if (!common!.environment.url)\n throw new Error(\n \"Set the selected Project environment URL before verification.\",\n );\n const url = verificationTarget(common!.environment.url, values.url);\n result = await verifyCookieWebsite({\n installation: VerificationInstallation.parse(\n await request(`${site}/installation`),\n ),\n url,\n browserName,\n });\n return {\n exitCode: (result as { status: string }).status === \"passed\" ? 0 : 1,\n stdout: JSON.stringify(result, null, 2),\n };\n } else if (action === \"installation\")\n result = await request(`${site}/installation`);\n else if (\n action === \"draft\" &&\n subaction === \"get\" &&\n positionals.length === 2\n ) {\n const response = z\n .object({\n name: z.string(),\n hostname: z.string(),\n draftVersion: z.number(),\n draft: z.unknown(),\n })\n .parse(await request(site));\n result = {\n name: response.name,\n hostname: response.hostname,\n expectedDraftVersion: response.draftVersion,\n draft: response.draft,\n };\n } else if (\n action === \"draft\" &&\n subaction === \"save\" &&\n positionals.length === 2\n )\n result = await request(site, \"PATCH\", await inputFile());\n else if (action === \"publish\" && positionals.length === 1)\n result = await request(\n `${site}/publish`,\n \"POST\",\n await inputFile(),\n \"cookie:publication:write\",\n );\n else if (action === \"analytics\" && positionals.length === 1) {\n const range = values[\"range-days\"] ?? \"30\";\n if (![\"7\", \"30\", \"90\"].includes(range))\n throw new Error(\"Choose a range of 7, 30 or 90 days.\");\n result = await request(`${site}/analytics?rangeDays=${range}`);\n } else\n throw new Error(\n \"Unknown Cookie operation. Run `siteos cookie --help`.\",\n );\n } else if (service === \"trace\") {\n if (action === \"status\" && positionals.length === 1)\n result = await request(site);\n else if (action === \"environments\" && positionals.length === 1)\n result = await request(`${site}/environments`);\n else if (\n action === \"report\" ||\n action === \"installation\" ||\n action === \"tracking-plan\" ||\n explorerSuffix !== null\n ) {\n const response = z\n .object({\n environments: z.array(\n z.object({ id: z.string(), slug: z.string() }),\n ),\n })\n .parse(await request(`${site}/environments`));\n const environment = common!.overview.project.environments.find(\n (item) =>\n item.slug === (values.environment ?? common!.environment.slug),\n );\n const attachment = common!.overview.services.find(\n (item) => item.service === \"trace\",\n )!.attachment!;\n const binding = attachment.environments.find(\n (item) => item.environmentId === environment?.id,\n );\n if (!binding)\n throw new Error(\n \"Connect this environment with `siteos project environment connect trace` first.\",\n );\n const matches = response.environments.filter(\n (environment) => environment.id === binding.resourceId,\n );\n if (matches.length !== 1)\n throw new Error(\n \"Choose an environment from `siteos trace environments`.\",\n );\n const base = `/environments/${encodeURIComponent(matches[0]!.id)}`;\n if (explorerSuffix !== null) {\n result = await request(`${base}${explorerSuffix}`);\n } else if (action === \"report\" && positionals.length === 1) {\n const detail = z\n .object({\n site: z.object({\n id: z.literal(common!.resourceId),\n environments: z.array(\n z.object({ id: z.string(), evidence: z.unknown() }),\n ),\n }),\n })\n .parse(await request(site));\n const environment = detail.site.environments.find(\n (item) => item.id === matches[0]!.id,\n );\n if (!environment)\n throw new Error(\"Trace returned an invalid environment report.\");\n result = environment.evidence;\n } else if (positionals.length === 2 && subaction === \"show\")\n result = await request(`${base}/${action}`);\n else if (positionals.length === 2 && subaction === \"save\")\n result = await request(\n `${base}/${action}`,\n \"PATCH\",\n await inputFile(),\n );\n else if (\n positionals.length === 2 &&\n (subaction === \"ensure\" || subaction === \"publish\")\n )\n result = await request(\n `${base}/${action}/${subaction}`,\n \"POST\",\n expectedDraftVersion === undefined ? {} : { expectedDraftVersion },\n subaction === \"publish\" ? \"trace:publication:write\" : undefined,\n );\n else\n throw new Error(\n \"Unknown Trace operation. Run `siteos trace --help`.\",\n );\n } else\n throw new Error(\"Unknown Trace operation. Run `siteos trace --help`.\");\n } else {\n const base = \"/connections/slack\";\n if (action === \"status\" && positionals.length === 1)\n result = await request(base);\n else if (action === \"connect\" && positionals.length === 1)\n result = {\n url: `${runtime.api.origin}/integrations`,\n nextStep:\n \"Open this page, select your Organization, and connect Slack in SiteOS.\",\n };\n else if (action === \"channels\" && positionals.length === 1) {\n const query = new URLSearchParams();\n if (values.query) query.set(\"query\", values.query);\n if (values.cursor) query.set(\"cursor\", values.cursor);\n result = await request(`${base}/channels?${query}`);\n } else if (\n action === \"destination\" &&\n subaction === \"create\" &&\n positionals.length === 2 &&\n values.channel\n )\n result = await request(`${base}/destinations`, \"POST\", {\n providerChannelId: values.channel,\n });\n else\n throw new Error(\n \"Unknown Integrations operation. Run `siteos integrations --help`.\",\n );\n }\n return { exitCode: 0, stdout: JSON.stringify(result, null, 2) };\n } catch (cause) {\n return {\n exitCode: cause instanceof SiteOSAuthApiError ? 1 : 2,\n stderr:\n cause instanceof SiteOSAuthApiError ||\n (!(cause instanceof z.ZodError) && cause instanceof Error)\n ? cause.message\n : \"The service returned an invalid response.\",\n };\n }\n}\n","import { z } from \"zod\";\n\nconst filters = [\n \"environment\",\n \"provider\",\n \"event\",\n \"property\",\n \"page-view\",\n \"search\",\n \"state\",\n \"rule\",\n \"kind\",\n \"period\",\n \"cursor\",\n];\nexport const TRACE_EXPLORER_FLAGS: Record<string, string[]> = {\n destinations: filters,\n events: filters,\n properties: filters,\n issues: filters,\n observations: filters,\n \"issue show\": [\"environment\", \"id\", \"cursor\"],\n \"observation show\": [\"environment\", \"batch-id\", \"event-id\"],\n};\n\nconst FilterValues = z.object({\n provider: z\n .enum([\n \"siteos_analytics\",\n \"ga4\",\n \"google_ads\",\n \"hubspot\",\n \"meta\",\n \"custom\",\n ])\n .optional(),\n event: z.string().min(1).max(160).optional(),\n property: z.string().min(1).max(160).optional(),\n \"page-view\": z.string().uuid().optional(),\n search: z.string().max(160).optional(),\n state: z\n .enum([\n \"all\",\n \"active\",\n \"snoozed\",\n \"resolved\",\n \"new\",\n \"issues\",\n \"tracked\",\n \"ignored\",\n ])\n .optional(),\n rule: z.string().min(1).max(80).optional(),\n kind: z\n .enum([\n \"data_layer\",\n \"fetch\",\n \"xhr\",\n \"beacon\",\n \"resource\",\n \"consent\",\n \"heartbeat\",\n \"runtime_diagnostic\",\n ])\n .optional(),\n period: z.enum([\"24h\", \"7d\"]).optional(),\n cursor: z.string().min(1).max(4096).optional(),\n});\n\n/** Validate before acquiring a grant; never turn a malformed filter into an unfiltered read. */\nexport function traceExplorerSuffix(\n route: string,\n values: Record<string, string | boolean | undefined>,\n): string | null {\n if (!TRACE_EXPLORER_FLAGS[route]) return null;\n const query = new URLSearchParams();\n if (route === \"issue show\" || route === \"observation show\") {\n const keys = route === \"issue show\" ? [\"id\"] : [\"batch-id\", \"event-id\"];\n for (const key of keys) {\n if (!z.string().uuid().safeParse(values[key]).success)\n throw new Error(`Use --${key} with the UUID returned by Trace.`);\n }\n if (values.cursor !== undefined) {\n if (!z.string().uuid().safeParse(values.cursor).success)\n throw new Error(\n \"Use --cursor with the nextCursor returned by this issue.\",\n );\n query.set(\"cursor\", values.cursor as string);\n }\n const suffix =\n route === \"issue show\"\n ? `/issues/${encodeURIComponent(values.id as string)}`\n : `/observations/${encodeURIComponent(values[\"batch-id\"] as string)}/${encodeURIComponent(values[\"event-id\"] as string)}`;\n return `${suffix}${query.size ? `?${query}` : \"\"}`;\n }\n const parsed = FilterValues.safeParse(values);\n if (!parsed.success) {\n const flag = parsed.error.issues[0]?.path[0];\n throw new Error(\n `Invalid --${String(flag)} filter. Run \\`siteos trace --help\\`.`,\n );\n }\n for (const [key, value] of Object.entries(parsed.data)) {\n if (value !== undefined)\n query.set(key === \"page-view\" ? \"pageView\" : key, value);\n }\n return `/${route}${query.size ? `?${query}` : \"\"}`;\n}\n\nexport function tracePublicationVersion(\n value: string | undefined,\n): number | undefined {\n if (value === undefined) return undefined;\n if (!/^[1-9]\\d*$/u.test(value) || !Number.isSafeInteger(Number(value)))\n throw new Error(\n \"Use --expected-draft-version with a positive integer from the reviewed plan.\",\n );\n return Number(value);\n}\n","import { readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { parseArgs } from \"node:util\";\nimport { z } from \"zod\";\nimport type { CommandResult } from \"../core/command-result.js\";\nimport {\n commonProjectRuntime,\n commonServiceContext,\n type ProjectCommandOptions,\n} from \"../projects/project-context.js\";\nimport { SiteOSAuthApiError } from \"../siteos-auth-api.js\";\n\nexport const ANALYTICS_HELP = `Set up website Analytics in the selected Project environment.\n\nUsage:\n siteos analytics status [--environment <slug>] [--json]\n siteos analytics installation [--environment <slug>] [--json]\n siteos analytics report [--days <1|7|28>] [--event <name>] [--country <ISO|unknown>] [--campaign <id>] [--environment <slug>] [--json]\n siteos analytics realtime [--country <ISO|unknown>] [--campaign <id>] [--environment <slug>] [--json]\n siteos analytics settings show [--environment <slug>] [--json]\n siteos analytics settings set --revision <number> [--enabled <true|false>] [--cookie-events <true|false>] [--minimal-realtime <true|false>] [--environment <slug>] [--json]\n siteos analytics events list [--environment <slug>] [--json]\n siteos analytics events create --file <event.json> [--environment <slug>] [--json]\n siteos analytics events snippet <name> [--environment <slug>] [--json]\n siteos analytics campaigns list [--environment <slug>] [--json]\n siteos analytics campaigns create --file <campaign.json> [--environment <slug>] [--json]\n siteos analytics goals list [--environment <slug>] [--json]\n siteos analytics goals create --file <goal.json> [--environment <slug>] [--json]\n siteos analytics goals archive <id> [--environment <slug>] [--json]\n siteos analytics funnels list [--environment <slug>] [--json]\n siteos analytics funnels create --file <funnel.json> [--environment <slug>] [--json]\n siteos analytics funnels archive <id> [--environment <slug>] [--json]\n siteos analytics monitoring prepare [--environment <slug>] [--json]\n\nConnect first: siteos project connect analytics. Cookie and Trace are optional.\nUse project environment use <slug> to select an environment; no resource fallback is allowed.\nAnalytics starts independently. Consent control is configured and published in Cookie.\nAn external CMP can gate its loader explicitly; privacy opt-outs still apply.\nSettings require an owner/admin, the current revision and at least one change.\nCatalog files are bounded JSON using the documented event/campaign/goal/funnel contracts.\nMonitoring preparation creates a Trace draft only; publication remains a separate operation.\nAnalytics is Unlimited during early access. No synthetic events are sent by these commands.`;\n\nconst EventInput = z\n .object({\n name: z\n .string()\n .regex(/^[a-z][a-z0-9_]{0,63}$/u)\n .refine((v) => v !== \"pageview\" && !v.startsWith(\"cookie_\")),\n label: z.string().trim().min(1).max(80),\n properties: z\n .record(\n z.string().regex(/^[a-z][a-z0-9_]{0,39}$/u),\n z\n .array(\n z\n .string()\n .min(1)\n .max(80)\n .regex(/^[a-zA-Z0-9 _./:-]+$/u),\n )\n .min(1)\n .max(20),\n )\n .refine((v) => Object.keys(v).length <= 8),\n })\n .strict();\nconst Resource = z.object({\n id: z.string(),\n organizationId: z.string(),\n name: z.string(),\n slug: z.string(),\n origin: z.string().url(),\n publicKey: z.string(),\n revision: z.number().int().positive(),\n enabled: z.boolean(),\n cookieEvents: z.boolean(),\n minimalRealtime: z.boolean(),\n});\nconst readKeys = [\n \"days\",\n \"from\",\n \"to\",\n \"totals\",\n \"trend\",\n \"pages\",\n \"sources\",\n \"countries\",\n \"countryDetectionConfigured\",\n \"countryFilter\",\n \"campaignFilter\",\n \"eventCounts\",\n \"recent\",\n \"lastReceivedAt\",\n \"campaigns\",\n \"goals\",\n \"funnels\",\n \"convertedVisits\",\n] as const;\nconst liveKeys = [\n \"at\",\n \"from\",\n \"activeSince\",\n \"collectionEnabled\",\n \"countryFilter\",\n \"campaignFilter\",\n \"activeVisitors\",\n \"visitors\",\n \"pageviews\",\n \"events\",\n \"trend\",\n \"pages\",\n \"sources\",\n \"countries\",\n \"eventCounts\",\n \"minimal\",\n] as const;\nconst pick = (value: Record<string, unknown>, keys: readonly string[]) =>\n Object.fromEntries(\n keys\n .filter((key) => Object.hasOwn(value, key))\n .map((key) => [key, value[key]]),\n );\n\nexport async function runAnalyticsCommand(\n options: ProjectCommandOptions & { args: string[] },\n): Promise<CommandResult> {\n if (\n !options.args.length ||\n options.args.some((v) => [\"--help\", \"-h\"].includes(v))\n )\n return { exitCode: 0, stdout: ANALYTICS_HELP };\n const json = options.args.includes(\"--json\");\n try {\n const { positionals, values } = parseArgs({\n args: options.args,\n strict: true,\n allowPositionals: true,\n options: {\n json: { type: \"boolean\" },\n environment: { type: \"string\" },\n days: { type: \"string\" },\n event: { type: \"string\" },\n country: { type: \"string\" },\n campaign: { type: \"string\" },\n revision: { type: \"string\" },\n enabled: { type: \"string\" },\n \"cookie-events\": { type: \"string\" },\n \"minimal-realtime\": { type: \"string\" },\n file: { type: \"string\" },\n },\n });\n const route = positionals.slice(0, 2).join(\" \"),\n action = positionals[0]!;\n const operations: Record<\n string,\n { args: number; flags: string[]; scope?: string }\n > = {\n status: { args: 1, flags: [] },\n installation: { args: 1, flags: [] },\n report: { args: 1, flags: [\"days\", \"event\", \"country\", \"campaign\"] },\n realtime: { args: 1, flags: [\"country\", \"campaign\"] },\n \"settings show\": { args: 2, flags: [] },\n \"settings set\": {\n args: 2,\n flags: [\"revision\", \"enabled\", \"cookie-events\", \"minimal-realtime\"],\n scope: \"analytics:workspace:write\",\n },\n \"events list\": { args: 2, flags: [] },\n \"events snippet\": { args: 3, flags: [] },\n \"events create\": {\n args: 2,\n flags: [\"file\"],\n scope: \"analytics:events:write\",\n },\n \"campaigns list\": { args: 2, flags: [] },\n \"campaigns create\": {\n args: 2,\n flags: [\"file\"],\n scope: \"analytics:reports:write\",\n },\n \"goals list\": { args: 2, flags: [] },\n \"goals create\": {\n args: 2,\n flags: [\"file\"],\n scope: \"analytics:reports:write\",\n },\n \"goals archive\": { args: 3, flags: [], scope: \"analytics:reports:write\" },\n \"funnels list\": { args: 2, flags: [] },\n \"funnels create\": {\n args: 2,\n flags: [\"file\"],\n scope: \"analytics:reports:write\",\n },\n \"funnels archive\": {\n args: 3,\n flags: [],\n scope: \"analytics:reports:write\",\n },\n \"monitoring prepare\": {\n args: 2,\n flags: [],\n scope: \"analytics:monitoring:write\",\n },\n };\n const operation = operations[route];\n if (\n !operation ||\n positionals.length !== operation.args ||\n Object.keys(values).some(\n (key) => ![\"json\", \"environment\", ...operation.flags].includes(key),\n )\n )\n throw new Error(\n \"Invalid Analytics operation or flags. Run `siteos analytics --help`.\",\n );\n if (values.days && ![\"1\", \"7\", \"28\"].includes(values.days))\n throw new Error(\"Use --days 1, 7 or 28.\");\n if (values.country && !/^(?:[A-Z]{2}|unknown)$/u.test(values.country))\n throw new Error(\"Use an uppercase ISO country code or unknown.\");\n if (values.campaign) z.string().uuid().parse(values.campaign);\n const setting = route === \"settings set\",\n creating = positionals[1] === \"create\",\n archive = positionals[1] === \"archive\";\n let body: Record<string, unknown> | undefined;\n if (setting) {\n if (!/^[1-9]\\d{0,8}$/u.test(values.revision ?? \"\"))\n throw new Error(\n \"Read settings first and supply the current positive --revision.\",\n );\n body = { revision: Number(values.revision) };\n for (const [flag, key] of [\n [\"enabled\", \"enabled\"],\n [\"cookie-events\", \"cookieEvents\"],\n [\"minimal-realtime\", \"minimalRealtime\"],\n ] as const) {\n if (values[flag] === undefined) continue;\n if (![\"true\", \"false\"].includes(values[flag]!))\n throw new Error(`Use --${flag} true|false.`);\n body[key] = values[flag] === \"true\";\n }\n if (Object.keys(body).length < 2)\n throw new Error(\"Provide at least one setting to change.\");\n } else if (creating) {\n if (!values.file)\n throw new Error(\"Creation requires --file with a JSON definition.\");\n const filename = path.resolve(options.cwd ?? process.cwd(), values.file);\n if ((await stat(filename)).size > 16384)\n throw new Error(\"The definition must not exceed 16 KiB.\");\n const text = await readFile(filename, \"utf8\");\n if (Buffer.byteLength(text) > 16384)\n throw new Error(\"The definition must not exceed 16 KiB.\");\n let definition: unknown;\n try {\n definition = JSON.parse(text);\n } catch {\n throw new Error(\"The definition must contain valid JSON.\");\n }\n body = z.record(z.unknown()).parse(definition);\n if (action === \"events\") body = EventInput.parse(body);\n } else if (archive) body = { id: z.string().uuid().parse(positionals[2]) };\n const context = await commonServiceContext(\n options,\n \"analytics\",\n values.environment,\n );\n if (!context)\n throw new Error(\n \"Select a SiteOS Project with `siteos project use` first.\",\n );\n const runtime = commonProjectRuntime(options),\n scope = operation.scope ?? \"analytics:workspace:read\";\n const grant = await runtime.grants.acquire({\n audience: \"siteos-analytics\",\n scopes: [scope],\n });\n if (\n grant.grant.audience !== \"siteos-analytics\" ||\n grant.grant.scopes.length !== 1 ||\n grant.grant.scopes[0] !== scope ||\n grant.grant.organizationId !== context.overview.project.organizationId\n )\n throw new SiteOSAuthApiError({\n code: \"AUTH_INVALID_RESPONSE\",\n message:\n \"The Analytics grant does not match this Project and operation.\",\n });\n const query = new URLSearchParams();\n for (const key of [\"days\", \"event\", \"country\", \"campaign\"] as const)\n if (values[key]) query.set(key, values[key]);\n const suffix =\n action === \"realtime\"\n ? `/realtime?${query}`\n : setting\n ? \"/settings\"\n : creating || archive\n ? `/${action}`\n : route === \"monitoring prepare\"\n ? \"/monitoring\"\n : `?${query}`;\n if (!options.fetchImpl)\n throw new Error(\"SiteOS API access is unavailable.\");\n const response = await options.fetchImpl(\n `${runtime.api.origin}/api/analytics/v1/resources/${encodeURIComponent(context.resourceId)}${suffix}`,\n {\n method: setting\n ? \"PATCH\"\n : archive\n ? \"DELETE\"\n : operation.scope\n ? \"POST\"\n : \"GET\",\n headers: {\n Accept: \"application/json\",\n Authorization: `Bearer ${grant.accessToken}`,\n ...(body ? { \"Content-Type\": \"application/json\" } : {}),\n },\n ...(body ? { body: JSON.stringify(body) } : {}),\n signal: AbortSignal.timeout(30000),\n },\n );\n const value: unknown = await response.json();\n if (!response.ok) {\n const error = z\n .object({\n error: z.object({ code: z.string(), message: z.string().max(500) }),\n })\n .safeParse(value);\n throw new SiteOSAuthApiError({\n code: error.success\n ? error.data.error.code\n : \"ANALYTICS_REQUEST_FAILED\",\n message: error.success\n ? error.data.error.message\n : \"The Analytics request failed.\",\n status: response.status,\n });\n }\n const record = z\n .object({\n contractVersion: z.literal(1),\n resourceId: z.literal(context.resourceId),\n })\n .passthrough()\n .parse(value);\n let output: unknown;\n if (setting) {\n const saved = Resource.parse(record);\n if (\n saved.id !== context.resourceId ||\n saved.organizationId !== context.overview.project.organizationId ||\n saved.revision !== Number(values.revision) + 1 ||\n Object.entries(body!).some(\n ([key, val]) =>\n key !== \"revision\" && saved[key as keyof typeof saved] !== val,\n )\n )\n throw new Error(\"The saved settings do not match this change.\");\n output = saved;\n } else if (creating) {\n if (action === \"events\") {\n output = EventInput.parse(\n pick(record, [\"name\", \"label\", \"properties\"]),\n );\n if (JSON.stringify(output) !== JSON.stringify(body))\n throw new Error(\"The saved event does not match this definition.\");\n } else\n output = {\n id: z.string().uuid().parse(record.id),\n ...pick(\n record,\n action === \"campaigns\"\n ? [\"label\", \"source\", \"medium\", \"campaign\"]\n : action === \"goals\"\n ? [\"label\", \"match\"]\n : [\"label\", \"steps\"],\n ),\n };\n } else if (archive)\n output = { archived: z.literal(true).parse(record.archived) };\n else if (route === \"monitoring prepare\")\n output = { state: z.literal(\"prepared\").parse(record.state) };\n else if (action === \"realtime\") output = pick(record, liveKeys);\n else {\n const resource = Resource.parse(record.resource);\n if (\n resource.id !== context.resourceId ||\n resource.organizationId !== context.overview.project.organizationId\n )\n throw new Error(\n \"The Analytics response belongs to a different resource.\",\n );\n if (action === \"status\")\n output = {\n resource,\n lastReceivedAt: record.lastReceivedAt,\n consentSource: z\n .object({\n consentSource: z.enum([\n \"cookie\",\n \"external\",\n \"waiting_for_cookie\",\n \"not_required\",\n ]),\n })\n .parse(record.configuration).consentSource,\n };\n else if (route === \"settings show\") output = resource;\n else if (action === \"installation\")\n output = {\n resource,\n installation: z.string().parse(record.installation),\n configuration: record.configuration,\n };\n else if (action === \"events\") {\n const definitions = z.array(EventInput).parse(record.definitions);\n if (route === \"events snippet\") {\n const definition = definitions.find((d) => d.name === positionals[2]);\n if (!definition)\n throw new Error(\n \"Create the event definition before requesting its snippet.\",\n );\n output = {\n name: definition.name,\n javascript: `window.SiteOSAnalytics?.track(${JSON.stringify(definition.name)}, ${JSON.stringify(Object.fromEntries(Object.entries(definition.properties).map(([key, values]) => [key, values[0]])))});`,\n guidance:\n \"Trigger only after the business action succeeds; substitute declared categorical values.\",\n };\n } else output = { definitions, eventCounts: record.eventCounts };\n } else\n output =\n action === \"report\"\n ? pick(record, readKeys)\n : { [action]: z.array(z.unknown()).parse(record[action]) };\n }\n return { exitCode: 0, stdout: JSON.stringify(output, null, 2) };\n } catch (cause) {\n const error =\n cause instanceof SiteOSAuthApiError\n ? { code: cause.code, message: cause.message }\n : {\n code: \"ANALYTICS_COMMAND_FAILED\",\n message:\n cause instanceof z.ZodError\n ? \"The Analytics input or response does not match the supported contract.\"\n : cause instanceof Error\n ? cause.message\n : \"The Analytics command failed.\",\n };\n return {\n exitCode: cause instanceof SiteOSAuthApiError ? 1 : 2,\n ...(json\n ? { stdout: JSON.stringify({ error }) }\n : { stderr: error.message }),\n };\n }\n}\n","import { writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { parseArgs } from \"node:util\";\nimport { z } from \"zod\";\nimport type { CommandResult } from \"../core/command-result.js\";\nimport {\n commonProjectRuntime,\n commonServiceContext,\n type ProjectCommandOptions,\n} from \"../projects/project-context.js\";\nimport { SiteOSAuthApiError } from \"../siteos-auth-api.js\";\nimport {\n PERFORMANCE_HELP,\n runSeoPerformanceCommand,\n} from \"./seo-performance-command.js\";\nexport const SEO_HELP = `Audit public HTML in the selected Project environment.\n\nUsage:\n siteos seo status [--environment <slug>] [--json]\n siteos seo audit run [--environment <slug>] [--json]\n siteos seo audit list [--environment <slug>] [--json]\n siteos seo audit show <id> [--environment <slug>] [--json]\n siteos seo audit cancel <id> [--environment <slug>] [--json]\n siteos seo pages [--audit <id>] [--query <text>] [--url <url>] [--page <number>] [--environment <slug>] [--json]\n siteos seo issues [--audit <id>] [--rule <id>] [--page <number>] [--environment <slug>] [--json]\n siteos seo changes [--audit <id>] [--state <new|reopened|still_present|resolved|not_rechecked>] [--page <number>] [--environment <slug>] [--json]\n siteos seo recheck --audit <id> --url <url> [--environment <slug>] [--json]\n siteos seo issue <ignore|restore> --audit <id> --url <url> --rule <id> --reason <text> --revision <number> [--environment <slug>] [--json]\n siteos seo schedule show [--environment <slug>] [--json]\n siteos seo schedule set --enabled <true|false> --weekday <1-7> --time <HH:mm> --timezone <IANA> --revision <number> [--environment <slug>] [--json]\n siteos seo notifications retry <notification-id> [--environment <slug>] [--json]\n siteos seo notifications show [--environment <slug>] [--json]\n siteos seo notifications destinations [--environment <slug>] [--json]\n siteos seo notifications set --enabled <true|false> [--destination <candidate-id>] --severity <error|warning> --failures <true|false> --revision <number> [--environment <slug>] [--json]\n siteos seo export --audit <id> --kind <pages|issues|changes> --format <csv|json> --output <new-file> [--query <text>] [--rule <id>] [--severity <error|warning|notice>] [--state <page-or-change-state>] [--environment <slug>] [--json]\n${PERFORMANCE_HELP.trim().split(\"\\n\\n\")[0]}\n\nSchedule and notification writes require an owner/admin and the saved revision (initially 0).\nExport writes all matching rows to a new file; existing files are never overwritten.\nRuns are queued. Read audit show until terminal; an accepted run is not a completed check.\nRecheck accepts a URL observed in the source audit. Cross-page rules require a full audit.\nRead the current disposition revision before ignore/restore; use 0 if no decision exists.\nSetup: siteos project connect seo. No crawl runs during setup.\n${PERFORMANCE_HELP.trim().split(\"\\n\\n\").slice(1).join(\"\\n\\n\")}`;\n\nexport async function runSeoCommand(\n options: ProjectCommandOptions & { args: string[] },\n): Promise<CommandResult> {\n if (\n !options.args.length ||\n options.args.some((arg) => [\"--help\", \"-h\"].includes(arg))\n )\n return { exitCode: 0, stdout: SEO_HELP };\n if (options.args[0] === \"performance\")\n return runSeoPerformanceCommand(options);\n const json = options.args.includes(\"--json\");\n try {\n const { positionals, values } = parseArgs({\n args: options.args,\n strict: true,\n allowPositionals: true,\n options: {\n json: { type: \"boolean\" },\n environment: { type: \"string\" },\n audit: { type: \"string\" },\n url: { type: \"string\" },\n rule: { type: \"string\" },\n reason: { type: \"string\" },\n revision: { type: \"string\" },\n query: { type: \"string\" },\n page: { type: \"string\" },\n state: { type: \"string\" },\n enabled: { type: \"string\" },\n weekday: { type: \"string\" },\n time: { type: \"string\" },\n timezone: { type: \"string\" },\n destination: { type: \"string\" },\n severity: { type: \"string\" },\n failures: { type: \"string\" },\n kind: { type: \"string\" },\n format: { type: \"string\" },\n output: { type: \"string\" },\n },\n });\n const route = positionals.slice(0, 2).join(\" \");\n const action = positionals[0];\n const operations: Record<string, { flags: string[]; args: number }> = {\n status: { flags: [], args: 1 },\n \"schedule show\": { flags: [], args: 2 },\n \"schedule set\": {\n flags: [\"enabled\", \"weekday\", \"time\", \"timezone\", \"revision\"],\n args: 2,\n },\n \"notifications retry\": { flags: [], args: 3 },\n \"notifications show\": { flags: [], args: 2 },\n \"notifications destinations\": { flags: [], args: 2 },\n \"notifications set\": {\n flags: [\"enabled\", \"destination\", \"severity\", \"failures\", \"revision\"],\n args: 2,\n },\n export: {\n flags: [\n \"audit\",\n \"kind\",\n \"format\",\n \"output\",\n \"query\",\n \"rule\",\n \"severity\",\n \"state\",\n ],\n args: 1,\n },\n \"audit run\": { flags: [], args: 2 },\n \"audit list\": { flags: [], args: 2 },\n \"audit show\": { flags: [], args: 3 },\n \"audit cancel\": { flags: [], args: 3 },\n pages: { flags: [\"audit\", \"url\", \"query\", \"page\"], args: 1 },\n issues: { flags: [\"audit\", \"rule\", \"page\"], args: 1 },\n changes: { flags: [\"audit\", \"state\", \"page\"], args: 1 },\n recheck: { flags: [\"audit\", \"url\"], args: 1 },\n \"issue ignore\": {\n flags: [\"audit\", \"url\", \"rule\", \"reason\", \"revision\"],\n args: 2,\n },\n \"issue restore\": {\n flags: [\"audit\", \"url\", \"rule\", \"reason\", \"revision\"],\n args: 2,\n },\n };\n const operation = operations[route];\n if (\n !operation ||\n positionals.length !== operation.args ||\n Object.keys(values).some(\n (key) => ![\"json\", \"environment\", ...operation.flags].includes(key),\n )\n )\n throw new Error(\n \"Invalid SEO operation or flags. Run `siteos seo --help`.\",\n );\n if (action === \"recheck\" && (!values.audit || !values.url))\n throw new Error(\"Recheck requires --audit and --url.\");\n if (\n action === \"issue\" &&\n [\"audit\", \"url\", \"rule\", \"reason\", \"revision\"].some(\n (key) => !values[key as keyof typeof values],\n )\n )\n throw new Error(\n \"Issue decisions require --audit, --url, --rule, --reason and --revision.\",\n );\n if (values.page && !/^[1-9]\\d{0,5}$/u.test(values.page))\n throw new Error(\"Use a positive page number.\");\n if (values.revision && !/^\\d{1,9}$/u.test(values.revision))\n throw new Error(\"Use a non-negative revision.\");\n if (\n values.reason &&\n (values.reason.trim().length < 3 || values.reason.length > 500)\n )\n throw new Error(\"Use a reason between 3 and 500 characters.\");\n const pageStateFilter = action === \"export\" && values.kind !== \"changes\";\n if (\n values.state &&\n !(\n pageStateFilter\n ? [\"analyzed\", \"unavailable\", \"excluded\", \"non_html\"]\n : [\"new\", \"reopened\", \"still_present\", \"resolved\", \"not_rechecked\"]\n ).includes(values.state)\n )\n throw new Error(\"Use a documented page or change state for this export.\");\n const automation = [\"schedule\", \"notifications\"].includes(action ?? \"\");\n const setting = automation && positionals[1] === \"set\";\n if (\n setting &&\n (!values.revision || ![\"true\", \"false\"].includes(values.enabled ?? \"\"))\n )\n throw new Error(\"Settings require --enabled true|false and --revision.\");\n if (route === \"schedule set\") {\n if (\n !/^[1-7]$/u.test(values.weekday ?? \"\") ||\n !/^([01]\\d|2[0-3]):[0-5]\\d$/u.test(values.time ?? \"\") ||\n !values.timezone\n )\n throw new Error(\"Use weekday 1–7, HH:mm and an IANA time zone.\");\n try {\n new Intl.DateTimeFormat(\"en\", { timeZone: values.timezone });\n } catch {\n throw new Error(\"Use a valid IANA time zone.\");\n }\n }\n if (\n route === \"notifications set\" &&\n (![\"error\", \"warning\"].includes(values.severity ?? \"\") ||\n ![\"true\", \"false\"].includes(values.failures ?? \"\") ||\n (values.enabled === \"true\" && !values.destination))\n )\n throw new Error(\n \"Notifications require --severity, --failures and an available --destination when enabled.\",\n );\n if (\n action === \"export\" &&\n (!values.audit ||\n ![\"pages\", \"issues\", \"changes\"].includes(values.kind ?? \"\") ||\n ![\"csv\", \"json\"].includes(values.format ?? \"\") ||\n !values.output)\n )\n throw new Error(\n \"Export requires --audit, --kind, --format and --output.\",\n );\n if (\n values.severity &&\n ![\"error\", \"warning\", \"notice\"].includes(values.severity)\n )\n throw new Error(\"Use a documented severity.\");\n const context = await commonServiceContext(\n options,\n \"seo\",\n values.environment,\n );\n if (!context)\n throw new Error(\n \"Select a SiteOS Project with `siteos project use` first.\",\n );\n const runtime = commonProjectRuntime(options);\n const retryNotification = route === \"notifications retry\";\n const writing =\n retryNotification ||\n setting ||\n [\n \"audit run\",\n \"audit cancel\",\n \"recheck\",\n \"issue ignore\",\n \"issue restore\",\n ].includes(route);\n const scope = retryNotification\n ? \"seo:notifications:write\"\n : setting\n ? action === \"schedule\"\n ? \"seo:schedule:write\"\n : \"seo:notifications:write\"\n : !writing\n ? \"seo:workspace:read\"\n : action === \"issue\"\n ? \"seo:issues:write\"\n : \"seo:audits:write\";\n const grant = await runtime.grants.acquire({\n audience: \"siteos-seo\",\n scopes: [scope],\n });\n if (\n grant.grant.audience !== \"siteos-seo\" ||\n grant.grant.scopes.length !== 1 ||\n grant.grant.scopes[0] !== scope ||\n grant.grant.organizationId !== context.overview.project.organizationId\n )\n throw new SiteOSAuthApiError({\n code: \"AUTH_INVALID_RESPONSE\",\n message: \"The SEO grant does not match this Project and operation.\",\n });\n const query = new URLSearchParams();\n for (const [flag, name] of [\n [\"audit\", \"audit\"],\n [\"rule\", \"rule\"],\n [\"query\", \"q\"],\n [\"url\", \"pageUrl\"],\n [\"page\", \"page\"],\n [\"state\", \"change\"],\n [\"kind\", \"kind\"],\n [\"format\", \"format\"],\n [\"severity\", \"severity\"],\n ] as const)\n if (values[flag] && !writing) query.set(name, values[flag]);\n if (pageStateFilter && values.state) {\n query.delete(\"change\");\n query.set(\"state\", values.state);\n }\n if (route === \"audit show\") query.set(\"audit\", positionals[2]!);\n const suffix = retryNotification\n ? \"/notification-retries\"\n : automation\n ? setting\n ? `/${action}`\n : route === \"notifications destinations\"\n ? \"/destinations\"\n : \"/automation\"\n : action === \"export\"\n ? `/export?${query}`\n : route === \"audit run\"\n ? \"/audits\"\n : route === \"audit cancel\"\n ? `/audits/${encodeURIComponent(positionals[2]!)}/cancel`\n : action === \"recheck\"\n ? \"/rechecks\"\n : action === \"issue\"\n ? \"/dispositions\"\n : `?${query}`;\n const body = retryNotification\n ? { notificationId: positionals[2] }\n : route === \"schedule set\"\n ? {\n enabled: values.enabled === \"true\",\n weekday: Number(values.weekday),\n time: values.time,\n timeZone: values.timezone,\n expectedRevision: Number(values.revision),\n }\n : route === \"notifications set\"\n ? {\n enabled: values.enabled === \"true\",\n candidateId: values.destination ?? null,\n minimumSeverity: values.severity,\n includeFailures: values.failures === \"true\",\n expectedRevision: Number(values.revision),\n }\n : action === \"recheck\"\n ? { auditId: values.audit, urls: [values.url] }\n : action === \"issue\"\n ? {\n auditId: values.audit,\n url: values.url,\n ruleId: values.rule,\n reason: values.reason,\n expectedRevision: Number(values.revision),\n ignored: positionals[1] === \"ignore\",\n }\n : undefined;\n if (!options.fetchImpl)\n throw new Error(\"SiteOS API access is unavailable.\");\n const response = await options.fetchImpl(\n `${runtime.api.origin}/api/seo/v1/resources/${encodeURIComponent(context.resourceId)}${suffix}`,\n {\n method: setting ? \"PATCH\" : writing ? \"POST\" : \"GET\",\n headers: {\n Accept: \"application/json\",\n Authorization: `Bearer ${grant.accessToken}`,\n ...(body ? { \"Content-Type\": \"application/json\" } : {}),\n },\n ...(body ? { body: JSON.stringify(body) } : {}),\n signal: AbortSignal.timeout(30000),\n },\n );\n if (action === \"export\" && response.ok) {\n if (!(response instanceof Response))\n throw new Error(\"The API transport does not support file exports.\");\n const mime = values.format === \"csv\" ? \"text/csv\" : \"application/json\";\n const rows = Number(response.headers.get(\"X-SEO-Export-Rows\"));\n if (\n response.headers.get(\"X-SEO-Audit-Id\") !== values.audit ||\n !response.headers.get(\"Content-Type\")?.startsWith(mime) ||\n !response.headers.has(\"X-SEO-Export-Rows\") ||\n !Number.isSafeInteger(rows) ||\n rows < 0\n )\n throw new Error(\n \"The export response does not match the requested audit.\",\n );\n const text = await response.text();\n if (values.format === \"json\")\n z.object({\n contractVersion: z.literal(1),\n audit: z.object({\n id: z.literal(values.audit!),\n resourceId: z.literal(context.resourceId),\n }),\n kind: z.literal(values.kind!),\n totalRows: z.literal(rows),\n rows: z.array(z.unknown()).length(rows),\n }).parse(JSON.parse(text));\n const output = path.resolve(options.cwd ?? process.cwd(), values.output!);\n await writeFile(output, text, { flag: \"wx\", mode: 0o600 });\n return {\n exitCode: 0,\n stdout: JSON.stringify(\n {\n auditId: values.audit,\n kind: values.kind,\n format: values.format,\n rows,\n output,\n },\n null,\n 2,\n ),\n };\n }\n const data: unknown = await response.json();\n if (!response.ok) {\n const result = z\n .object({\n error: z.object({ code: z.string(), message: z.string().max(500) }),\n })\n .safeParse(data);\n throw new SiteOSAuthApiError({\n code: result.success ? result.data.error.code : \"SEO_REQUEST_FAILED\",\n message: result.success\n ? result.data.error.message\n : \"The SEO request failed.\",\n status: response.status,\n });\n }\n const record = z\n .object({ contractVersion: z.literal(1) })\n .passthrough()\n .parse(data);\n if (automation) {\n z.literal(context.resourceId).parse(record.resourceId);\n const schedule = z.object({\n enabled: z.boolean(),\n weekday: z.number().int().min(1).max(7),\n time: z.string(),\n timeZone: z.string(),\n revision: z.number().int().min(0),\n nextRunAt: z.string().nullable(),\n });\n const notificationRoute = z.object({\n enabled: z.boolean(),\n minimumSeverity: z.enum([\"error\", \"warning\"]),\n includeFailures: z.boolean(),\n revision: z.number().int().min(0),\n destinationId: z.string().nullable(),\n });\n if (retryNotification) {\n z.literal(true).parse(record.retryQueued);\n z.literal(positionals[2]!).parse(record.notificationId);\n } else if (route === \"notifications destinations\")\n z.object({\n candidates: z.array(\n z.object({\n candidateId: z.string(),\n label: z.string(),\n availability: z.literal(\"available\"),\n }),\n ),\n }).parse(record);\n else if (setting) {\n const value =\n action === \"schedule\"\n ? schedule.parse(record.schedule)\n : notificationRoute.parse(record.route);\n if (\n value.revision !== Number(values.revision) + 1 ||\n value.enabled !== (values.enabled === \"true\")\n )\n throw new Error(\"The saved settings do not match this change.\");\n } else {\n schedule.parse(record.schedule);\n notificationRoute.parse(record.route);\n }\n } else if (!writing) {\n const validated = z\n .object({\n resource: z.object({\n id: z.literal(context.resourceId),\n organizationId: z.literal(context.overview.project.organizationId),\n }),\n audits: z.array(z.object({ id: z.string() }).passthrough()),\n audit: z\n .object({\n id: z.string(),\n resourceId: z.literal(context.resourceId),\n })\n .passthrough()\n .nullable(),\n pages: z.array(z.unknown()),\n issues: z.array(z.unknown()),\n changes: z.array(z.unknown()),\n totalChanges: z.number(),\n dispositions: z.array(z.unknown()),\n })\n .passthrough()\n .parse(record);\n const selected = query.get(\"audit\");\n if (selected && validated.audit?.id !== selected)\n throw new Error(\"The SEO response does not match the requested audit.\");\n } else if (record.audit)\n z.object({\n id: z.string(),\n resourceId: z.literal(context.resourceId),\n organizationId: z.literal(context.overview.project.organizationId),\n state: z.literal(\"queued\"),\n }).parse(record.audit);\n else if (route === \"audit cancel\") z.literal(true).parse(record.cancelled);\n else if (action === \"issue\")\n z.object({\n url: z.literal(values.url!),\n ruleId: z.literal(values.rule!),\n ignored: z.literal(positionals[1] === \"ignore\"),\n revision: z.literal(Number(values.revision) + 1),\n }).parse(record.disposition);\n else throw new Error(\"The SEO service returned an invalid response.\");\n return { exitCode: 0, stdout: JSON.stringify(record, null, 2) };\n } catch (cause) {\n const error = {\n code:\n cause instanceof SiteOSAuthApiError ? cause.code : \"SEO_COMMAND_FAILED\",\n message:\n cause instanceof z.ZodError\n ? \"The SEO service returned an invalid response.\"\n : cause instanceof Error\n ? cause.message\n : \"The SEO command failed.\",\n };\n return {\n exitCode: cause instanceof SiteOSAuthApiError ? 1 : 2,\n ...(json\n ? { stdout: JSON.stringify({ error }) }\n : { stderr: error.message }),\n };\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport { writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { setTimeout } from \"node:timers/promises\";\nimport { parseArgs } from \"node:util\";\nimport { z } from \"zod\";\nimport type { CommandResult } from \"../core/command-result.js\";\nimport {\n commonProjectRuntime,\n commonServiceContext,\n type ProjectCommandOptions,\n} from \"../projects/project-context.js\";\nimport { SiteOSAuthApiError } from \"../siteos-auth-api.js\";\n\nexport const PERFORMANCE_HELP = `\n siteos seo performance run --audit <id> --url <url> [--url <url>...] [--device <mobile|desktop>] [--idempotency-key <key>] [--environment <slug>] [--json]\n siteos seo performance list [--device <mobile|desktop>] [--environment <slug>] [--json]\n siteos seo performance show <id> [--url <url>] [--environment <slug>] [--json]\n siteos seo performance wait <id> [--timeout <seconds>] [--environment <slug>] [--json]\n siteos seo performance cancel <id> [--environment <slug>] [--json]\n siteos seo performance history --url <url> [--device <mobile|desktop>] [--environment <slug>] [--json]\n siteos seo performance export <id> --format <csv|json> --output <new-file> [--environment <slug>] [--json]\n\nPerformance checks use up to 10 explicitly selected URLs from a saved full HTML audit.\nMobile is the default for a new run. Scores are Lighthouse lab data, not real-user Core Web Vitals.\nReuse the returned idempotency key after an uncertain run response. Wait defaults to 120 seconds (maximum 900).\n`;\nexport async function runSeoPerformanceCommand(\n options: ProjectCommandOptions & { args: string[] },\n): Promise<CommandResult> {\n let idempotencyKey: string | undefined;\n try {\n const { values, positionals } = parseArgs({\n args: options.args.slice(1),\n strict: true,\n allowPositionals: true,\n options: {\n json: { type: \"boolean\" },\n environment: { type: \"string\" },\n audit: { type: \"string\" },\n url: { type: \"string\", multiple: true },\n device: { type: \"string\" },\n \"idempotency-key\": { type: \"string\" },\n timeout: { type: \"string\" },\n format: { type: \"string\" },\n output: { type: \"string\" },\n },\n });\n const action = positionals[0] ?? \"\";\n const id = positionals[1];\n const operations: Record<string, { args: number; flags: string[] }> = {\n run: { args: 1, flags: [\"audit\", \"url\", \"device\", \"idempotency-key\"] },\n list: { args: 1, flags: [\"device\"] },\n show: { args: 2, flags: [\"url\"] },\n wait: { args: 2, flags: [\"timeout\"] },\n cancel: { args: 2, flags: [] },\n history: { args: 1, flags: [\"url\", \"device\"] },\n export: { args: 2, flags: [\"format\", \"output\"] },\n };\n const operation = operations[action];\n if (\n !operation ||\n positionals.length !== operation.args ||\n Object.keys(values).some(\n (key) => ![\"environment\", \"json\", ...operation.flags].includes(key),\n )\n )\n throw new Error(\n \"Invalid performance operation or flags. Run siteos seo --help.\",\n );\n if (values.device && ![\"mobile\", \"desktop\"].includes(values.device))\n throw new Error(\"Use --device mobile or desktop.\");\n if (\n action === \"run\" &&\n (!values.audit || !values.url?.length || values.url.length > 10)\n )\n throw new Error(\n \"Choose a source --audit and between 1 and 10 --url values.\",\n );\n if (\n (action === \"history\" && values.url?.length !== 1) ||\n (action === \"show\" && values.url && values.url.length !== 1)\n )\n throw new Error(\"Use one --url for page evidence or history.\");\n for (const value of values.url ?? []) {\n const url = new URL(value);\n if (\n ![\"http:\", \"https:\"].includes(url.protocol) ||\n url.username ||\n url.password ||\n url.port ||\n value.length > 2048\n )\n throw new Error(\"Use eligible public HTTP(S) URLs.\");\n }\n const timeout = Number(values.timeout ?? 120);\n if (!Number.isInteger(timeout) || timeout < 1 || timeout > 900)\n throw new Error(\"Use a wait timeout between 1 and 900 seconds.\");\n if (\n action === \"export\" &&\n (!values.output || ![\"csv\", \"json\"].includes(values.format ?? \"\"))\n )\n throw new Error(\n \"Export requires --format csv|json and --output for a new file.\",\n );\n if (action === \"run\") {\n idempotencyKey = values[\"idempotency-key\"] ?? randomUUID();\n if (!/^[a-zA-Z0-9_-]{16,100}$/u.test(idempotencyKey))\n throw new Error(\n \"Use an idempotency key of 16 to 100 letters, digits, underscores or hyphens.\",\n );\n }\n const context = await commonServiceContext(\n options,\n \"seo\",\n values.environment,\n );\n if (!context)\n throw new Error(\"Select a SiteOS Project with siteos project use first.\");\n const runtime = commonProjectRuntime(options);\n const writing = [\"run\", \"cancel\"].includes(action);\n const scope = writing ? \"seo:audits:write\" : \"seo:workspace:read\";\n const batchSchema = z\n .object({\n id: z.string(),\n resourceId: z.literal(context.resourceId),\n organizationId: z.literal(context.overview.project.organizationId),\n sourceAuditId: z.string(),\n state: z.enum([\n \"queued\",\n \"running\",\n \"completed\",\n \"partial\",\n \"failed\",\n \"cancelled\",\n ]),\n device: z.enum([\"mobile\", \"desktop\"]),\n urls: z.array(z.string()).min(1).max(10),\n })\n .passthrough();\n const query = new URLSearchParams();\n if (values.device) query.set(\"device\", values.device);\n if (!writing && values.url?.[0]) query.set(\"pageUrl\", values.url[0]);\n const suffix = id\n ? `/${encodeURIComponent(id)}${action === \"cancel\" ? \"/cancel\" : action === \"export\" ? \"/export\" : \"\"}`\n : \"\";\n if (action === \"export\") query.set(\"format\", values.format!);\n const deadline = Date.now() + timeout * 1000;\n while (true) {\n const grant = await runtime.grants.acquire({\n audience: \"siteos-seo\",\n scopes: [scope],\n });\n if (\n grant.grant.audience !== \"siteos-seo\" ||\n grant.grant.organizationId !==\n context.overview.project.organizationId ||\n grant.grant.scopes.length !== 1 ||\n grant.grant.scopes[0] !== scope\n )\n throw new Error(\n \"The SEO grant does not match this Project and operation.\",\n );\n if (!options.fetchImpl)\n throw new Error(\"SiteOS API access is unavailable.\");\n const response = await options.fetchImpl(\n `${runtime.api.origin}/api/seo/v1/resources/${encodeURIComponent(context.resourceId)}/browser-checks${suffix}?${query}`,\n {\n method: writing ? \"POST\" : \"GET\",\n headers: {\n Accept: \"application/json\",\n Authorization: `Bearer ${grant.accessToken}`,\n ...(action === \"run\" ? { \"Content-Type\": \"application/json\" } : {}),\n },\n ...(action === \"run\"\n ? {\n body: JSON.stringify({\n auditId: values.audit,\n urls: values.url,\n device: values.device ?? \"mobile\",\n idempotencyKey,\n }),\n }\n : {}),\n signal: AbortSignal.timeout(30000),\n },\n );\n if (action === \"export\" && response.ok) {\n if (\n !(response instanceof Response) ||\n response.headers.get(\"X-SEO-Browser-Id\") !== id ||\n !response.headers\n .get(\"Content-Type\")\n ?.startsWith(\n values.format === \"csv\" ? \"text/csv\" : \"application/json\",\n )\n )\n throw new Error(\n \"The export response does not match the selected check.\",\n );\n const text = await response.text();\n if (values.format === \"json\") {\n const parsed = z\n .object({\n contractVersion: z.literal(1),\n batch: batchSchema,\n pages: z.array(z.unknown()),\n })\n .parse(JSON.parse(text));\n if (parsed.batch.id !== id)\n throw new Error(\n \"The export response does not match the selected check.\",\n );\n }\n const output = path.resolve(\n options.cwd ?? process.cwd(),\n values.output!,\n );\n await writeFile(output, text, { flag: \"wx\", mode: 0o600 });\n return {\n exitCode: 0,\n stdout: JSON.stringify(\n { batchId: id, output, format: values.format },\n null,\n 2,\n ),\n };\n }\n const data: unknown = await response.json();\n if (!response.ok) {\n const error = z\n .object({\n error: z.object({ code: z.string(), message: z.string().max(500) }),\n })\n .safeParse(data);\n throw new SiteOSAuthApiError({\n code: error.success ? error.data.error.code : \"SEO_REQUEST_FAILED\",\n message: error.success\n ? error.data.error.message\n : \"The performance request failed.\",\n status: response.status,\n });\n }\n const record = z\n .object({ contractVersion: z.literal(1) })\n .passthrough()\n .parse(data);\n if (action === \"cancel\") z.literal(true).parse(record.cancelled);\n else if (action === \"run\") {\n const accepted = batchSchema.parse(record.batch);\n const normalize = (url: string) => {\n const value = new URL(url);\n value.hash = \"\";\n return value.href;\n };\n if (\n accepted.sourceAuditId !== values.audit ||\n accepted.device !== (values.device ?? \"mobile\") ||\n JSON.stringify([...new Set(accepted.urls.map(normalize))].sort()) !==\n JSON.stringify([...new Set(values.url!.map(normalize))].sort())\n )\n throw new Error(\n \"The queued check does not match the requested source, device and URLs.\",\n );\n } else {\n z.literal(context.resourceId).parse(record.resourceId);\n z.array(batchSchema).parse(record.batches);\n const selected = batchSchema.nullable().parse(record.batch);\n if (id && selected?.id !== id)\n throw new Error(\n \"The response does not match the selected performance check.\",\n );\n }\n const batch = record.batch ? batchSchema.parse(record.batch) : null;\n if (\n action !== \"wait\" ||\n !batch ||\n ![\"queued\", \"running\"].includes(batch.state)\n )\n return {\n exitCode: 0,\n stdout: JSON.stringify(\n { ...record, ...(idempotencyKey ? { idempotencyKey } : {}) },\n null,\n 2,\n ),\n };\n if (Date.now() >= deadline)\n return {\n exitCode: 3,\n stdout: JSON.stringify({ ...record, timedOut: true }, null, 2),\n };\n await setTimeout(Math.min(3000, Math.max(0, deadline - Date.now())));\n }\n } catch (cause) {\n const error = {\n code:\n cause instanceof SiteOSAuthApiError ? cause.code : \"SEO_COMMAND_FAILED\",\n message:\n cause instanceof z.ZodError\n ? \"The SEO service returned an invalid response.\"\n : cause instanceof Error\n ? cause.message\n : \"The performance command failed.\",\n };\n return {\n exitCode: cause instanceof SiteOSAuthApiError ? 1 : 2,\n ...(options.args.includes(\"--json\")\n ? {\n stdout: JSON.stringify({\n error,\n ...(idempotencyKey ? { idempotencyKey } : {}),\n }),\n }\n : {\n stderr: `${error.message}${idempotencyKey ? ` Retry key: ${idempotencyKey}` : \"\"}`,\n }),\n };\n }\n}\n","#!/usr/bin/env node\nimport { createHealthCheckResult } from \"./health-check.js\";\nimport { runAuthCommand } from \"./auth-command.js\";\nimport {\n createCommandRegistry,\n dispatchCommand,\n} from \"./core/command-registry.js\";\nimport {\n CLI_EXIT_CODE,\n normalizeCommandResult,\n type CommandResult,\n} from \"./core/command-result.js\";\nimport { runFormsCommand } from \"./forms-command.js\";\nimport { readPackageMetadata } from \"./package-metadata.js\";\nimport { runPulseCommand } from \"./pulse-command.js\";\nimport { runSearchCommand } from \"./search-command.js\";\nimport { runProjectCommand } from \"./projects/project-command.js\";\nimport { runServiceCommand } from \"./services/service-command.js\";\nimport { runAnalyticsCommand } from \"./services/analytics-command.js\";\nimport { runSeoCommand } from \"./services/seo-command.js\";\nimport type { FetchLike } from \"./siteos-search-api.js\";\n\nconst [command, ...args] = process.argv.slice(2);\nconst HELP_FLAGS = new Set([\"--help\", \"-h\"]);\nconst VERSION_FLAGS = new Set([\"--version\", \"-v\"]);\nconst REJECTED_LEGACY_COMMANDS = new Set([\n [\"ai\", \"setup\"].join(\"-\"),\n \"environment\",\n \"org\",\n \"pull\",\n \"ui\",\n]);\n\nif (!command || command === \"--help\" || command === \"-h\") {\n printRootHelp();\n process.exitCode = 0;\n} else if (VERSION_FLAGS.has(command)) {\n console.log(readPackageMetadata().version);\n process.exitCode = 0;\n} else {\n const result = await dispatchCommand(rootCommandRegistry(), command, args);\n if (result) {\n printCommandResult(result);\n } else if (\n REJECTED_LEGACY_COMMANDS.has(command) ||\n looksLikeApiKeyInit(command)\n ) {\n printUnsupportedLegacyCommand();\n process.exitCode = CLI_EXIT_CODE.usage;\n } else {\n console.error(\"Unknown SiteOS command.\");\n console.error(\"\");\n printRootHelp();\n process.exitCode = CLI_EXIT_CODE.usage;\n }\n}\n\nfunction rootCommandRegistry() {\n return createCommandRegistry({\n analytics: (args) =>\n runAnalyticsCommand({\n args,\n cwd: process.cwd(),\n env: process.env,\n fetchImpl: globalThis.fetch,\n }),\n seo: (args) =>\n runSeoCommand({\n args,\n cwd: process.cwd(),\n env: process.env,\n fetchImpl: globalThis.fetch,\n }),\n \"health-check\": runHealthCheck,\n project: (args) =>\n runProjectCommand({\n args,\n cwd: process.cwd(),\n env: process.env,\n fetchImpl: globalThis.fetch,\n }),\n cookie: (args) =>\n runServiceCommand(\"cookie\", {\n args,\n cwd: process.cwd(),\n env: process.env,\n fetchImpl: globalThis.fetch,\n }),\n trace: (args) =>\n runServiceCommand(\"trace\", {\n args,\n cwd: process.cwd(),\n env: process.env,\n fetchImpl: globalThis.fetch,\n }),\n integrations: (args) =>\n runServiceCommand(\"integrations\", {\n args,\n cwd: process.cwd(),\n env: process.env,\n fetchImpl: globalThis.fetch,\n }),\n auth: async (args) =>\n normalizeCommandResult(\n await runAuthCommand({\n args,\n env: process.env,\n fetchImpl: globalThis.fetch,\n }),\n ),\n forms: async (args) =>\n normalizeCommandResult(\n await runFormsCommand({\n args,\n cwd: process.cwd(),\n env: process.env,\n fetchImpl: globalThis.fetch as FetchLike | undefined,\n }),\n ),\n pulse: async (args) =>\n normalizeCommandResult(\n await runPulseCommand({\n args,\n cwd: process.cwd(),\n env: process.env,\n fetchImpl: globalThis.fetch,\n }),\n ),\n search: async (args) =>\n normalizeCommandResult(\n await runSearchCommand({\n args,\n cwd: process.cwd(),\n env: process.env,\n fetchImpl: globalThis.fetch as FetchLike | undefined,\n }),\n ),\n });\n}\n\nasync function runHealthCheck(args: string[]): Promise<CommandResult> {\n if (args.some((arg) => HELP_FLAGS.has(arg))) {\n return { exitCode: CLI_EXIT_CODE.success, stdout: healthCheckHelp() };\n }\n\n const unsupportedArgs = args.filter((arg) => arg !== \"--json\");\n if (unsupportedArgs.length > 0) {\n return {\n exitCode: CLI_EXIT_CODE.usage,\n stderr: `health-check only accepts --json.\\n\\n${healthCheckHelp()}`,\n };\n }\n\n const result = createHealthCheckResult({\n cwd: process.cwd(),\n env: process.env,\n packageMetadata: readPackageMetadata(),\n });\n\n return {\n exitCode: CLI_EXIT_CODE.success,\n stdout: JSON.stringify(await result, null, 2),\n };\n}\n\nfunction printCommandResult(result: CommandResult): void {\n if (result.stdout) {\n console.log(result.stdout);\n }\n\n if (result.stderr) {\n console.error(result.stderr);\n }\n\n process.exitCode = result.exitCode;\n}\n\nfunction looksLikeApiKeyInit(commandName: string): boolean {\n return (\n /^sos_[a-zA-Z0-9]+/.test(commandName) ||\n /^p[a-z]+_[a-zA-Z0-9]+/.test(commandName)\n );\n}\n\nfunction printUnsupportedLegacyCommand(): void {\n console.error(\"This legacy flow is not supported by the SiteOS CLI.\");\n console.error(\"\");\n printRootHelp();\n}\n\nfunction printRootHelp(): void {\n console.log(`SiteOS CLI\n\nUsage:\n siteos health-check [--json]\n siteos auth --help\n siteos project --help\n siteos cookie --help\n siteos trace --help\n siteos analytics --help\n siteos seo --help\n siteos integrations --help\n siteos pulse --help\n siteos search --help\n siteos forms --help\n\nCommands:\n health-check Print SiteOS local readiness diagnostics.\n auth Authenticate the SiteOS CLI with central Auth.\n project Select one Project and configure its services and environments.\n cookie Configure, publish, and inspect the Project’s cookie banner.\n trace Configure analytics observation and inspect evidence.\n analytics Configure website Analytics, events and realtime reports.\n seo Audit HTML, inspect changes and verify fixes.\n integrations Manage Organization connections and destinations.\n pulse Manage monitoring checks, tests, and deployments.\n search Run SiteOS search operations for a project environment.\n forms Sync SiteOS form definitions and run submission smoke tests.\n`);\n}\n\nfunction healthCheckHelp(): string {\n return `Usage:\n siteos health-check [--json]\n\nPrint SiteOS local readiness diagnostics as JSON.`;\n}\n"],"mappings":";;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAS,KAAAA,WAAS;AA0FX,SAAS,mBACd,YACA,WACQ;AACR,QAAM,UAAU,IAAI,IAAI,UAAU;AAClC,QAAM,SAAS,IAAI,IAAI,aAAa,YAAY,OAAO;AACvD,MACE,OAAO,WAAW,QAAQ,UAC1B,OAAO,YACP,OAAO,YACP,OAAO,QACP,CAAC,CAAC,UAAU,OAAO,EAAE,SAAS,OAAO,QAAQ;AAE7C,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AACF,SAAO,OAAO,SAAS;AACzB;AACA,SAAS,YACP,OACA,OACS;AACT,SAAO;AAAA,IACL,UACC,MAAM,MAAM,SAAS,KAAK,KACzB,MAAM,SAAS,KAAK,CAAC,WAAW,MAAM,WAAW,MAAM,CAAC;AAAA,EAC5D;AACF;AAEO,SAAS,yBAAyB,OAMtC;AACD,QAAM,SAAkB,CAAC;AACzB,QAAM,iBAAiB,oBAAI,IAAY;AACvC,QAAM,iBAAiB,oBAAI,IAAY;AACvC,QAAM,WAAW,MAAM,SAAS,OAAO;AACvC,aAAW,WAAW,MAAM,UAAU;AACpC,UAAM,UAAU,SAAS;AAAA,MACvB,CAAC,YACC,QAAQ,aACR;AAAA,QACE,GAAG,QAAQ,UAAU;AAAA,QACrB,GAAG,QAAQ,UAAU;AAAA,QACrB,GAAG,QAAQ,UAAU;AAAA,MACvB,EAAE,KAAK,CAAC,QAAQ,IAAI,IAAI,GAAG,EAAE,WAAW,QAAQ,MAAM;AAAA,IAC1D;AACA,UAAM,QAAQ,MAAM,aAAa;AAAA,MAC/B,CAAC,SAAS,KAAK,aAAa,QAAQ;AAAA,IACtC,GAAG;AACH,QAAI,QAAQ,QAAQ;AAClB,YAAM,UAAU,QAAQ;AAAA,QACtB,CAAC,YACC,OAAO,SAAS,KAAK,CAAC,SAAS,KAAK,QAAQ,QAAQ,GAAG,GAAG;AAAA,MAC9D;AACA,YAAM,iBACJ,MAAM,SAAS,OAAO,aAAa,sBAAsB,cACzD,QAAQ;AAAA,QAAM,CAAC,YACb,CAAC,oBAAoB,YAAY,EAAE,SAAS,QAAQ,GAAG;AAAA,MACzD;AACF,UAAI,CAAC,WAAW,CAAC;AACf,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,UAAU,QAAQ;AAAA,UAClB,QAAQ,QAAQ;AAAA,QAClB,CAAC;AAAA,IACL,WACE,QAAQ,WAAW,MAAM,oBACzB,CAAC,MAAM,gBAAgB,SAAS,QAAQ,MAAM;AAE9C,qBAAe,IAAI,QAAQ,MAAM;AAAA,EACrC;AACA,aAAW,eAAe,MAAM,cAAc;AAC5C,eAAW,WAAW,UAAU;AAC9B,YAAM,UAAU,YAAY,MAAM,SAAS;AAAA,QACzC,CAAC,SAAS,KAAK,QAAQ,QAAQ;AAAA,MACjC,GAAG;AACH,YAAM,SACJ,YAAY,QAAQ;AAAA,QAAK,CAAC,SACxB,YAAY,MAAM,QAAQ,WAAW,iBAAiB;AAAA,MACxD,KACA,YAAY,aAAa;AAAA,QAAK,CAAC,SAC7B,YAAY,MAAM,QAAQ,WAAW,YAAY;AAAA,MACnD;AACF,UAAI,CAAC,WAAW;AACd,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,UAAU,YAAY;AAAA,UACtB,QAAQ,QAAQ;AAAA,QAClB,CAAC;AAAA,IACL;AACA,eAAW,QAAQ,YAAY,SAAS;AACtC,UACE,SAAS,oBACT,CAAC,SAAS;AAAA,QAAK,CAAC,YACd,YAAY,MAAM,QAAQ,WAAW,iBAAiB;AAAA,MACxD;AAEA,uBAAe,IAAI,UAAU,IAAI,EAAE;AAAA,IACvC;AACA,eAAW,QAAQ,YAAY,cAAc;AAC3C,UACE,CAAC,KAAK,WAAW,gBAAgB,KACjC,CAAC,SAAS;AAAA,QAAK,CAAC,YACd,YAAY,MAAM,QAAQ,WAAW,YAAY;AAAA,MACnD;AAEA,uBAAe,IAAI,gBAAgB,IAAI,EAAE;AAAA,IAC7C;AAAA,EACF;AACA,SAAO;AAAA,IACL;AAAA,IACA,gBAAgB,CAAC,GAAG,cAAc,EAAE,KAAK;AAAA,IACzC,gBAAgB,CAAC,GAAG,cAAc,EAAE,KAAK;AAAA,EAC3C;AACF;AAGA,eAAsB,oBAAoB,OAKvC;AACD,QAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AACzC,QAAM,SAAkB,CAAC;AACzB,QAAM,WAA8B,CAAC;AACrC,QAAM,eAA8B,CAAC;AACrC,MAAI,WAA4C;AAChD,MAAI,WAAW;AACf,MAAI,WAAW;AACf,QAAM,eAAe,MAAM;AAC3B,QAAM,UAAU,OACd,MAAM,WACL,YAAY;AACX,UAAM,aAAa,MAAM,OAAO,YAAY;AAC5C,QAAI;AACF,aAAO,MAAM,WAAW,MAAM,WAAW,EAAE,OAAO,EAAE,UAAU,KAAK,CAAC;AAAA,IACtE,QAAQ;AACN,YAAM,IAAI;AAAA,QACR,OAAO,MAAM,WAAW,8DAA8D,MAAM,WAAW;AAAA,MACzG;AAAA,IACF;AAAA,EACF,IACA;AACF,QAAM,YAAY,OAAO,SACvB,MAAM;AAAA,IACJ,MAAM,KAAK;AAAA,MAAS,MAEhB,OACA,aAAa,cAAc;AAAA,IAC/B;AAAA,EACF;AACF,QAAM,iBAAiB,OAAO,SAAe;AAC3C,UAAM,KAAK;AAAA,MACT,MACE;AAAA,QAEI,OAGA,cAAc,cAAc,EAAE;AAAA,MAClC;AAAA,MACF;AAAA,MACA,EAAE,SAAS,KAAO;AAAA,IACpB;AAAA,EACF;AACA,MAAI;AACF,eAAW,OAAO,CAAC,OAAO,IAAI,GAAG;AAC/B,YAAM,UAAU,MAAM,QAAQ,WAAW;AAAA,QACvC,gBAAgB;AAAA,QAChB,GAAI,MAAM,EAAE,kBAAkB,EAAE,WAAW,IAAI,EAAE,IAAI,CAAC;AAAA,MACxD,CAAC;AACD,UAAI;AACF,cAAM,QAAQ;AAAA,UAAc,MAC1B,OAAO,eAAe,WAAW,wBAAwB;AAAA,YACvD,KAAK,MAAM;AAAA,UACb,CAAC;AAAA,QACH;AACF,YAAM,OAAO,MAAM,QAAQ,QAAQ;AACnC,WAAK,kBAAkB,IAAM;AAC7B,WAAK,4BAA4B,IAAM;AACvC,YAAM,UAAU,oBAAI,IAAmB;AACvC,WAAK,GAAG,WAAW,CAAC,YAAY;AAC9B,YAAI,CAAC,YAAY,KAAK,QAAQ,IAAI,CAAC,EAAG;AACtC,YAAI,SAAS,UAAU,KAAM;AAC3B,qBAAW;AACX;AAAA,QACF;AACA,iBAAS,KAAK;AAAA,UACZ,QAAQ,IAAI,IAAI,QAAQ,IAAI,CAAC,EAAE;AAAA,UAC/B,MAAM,QAAQ,aAAa;AAAA,UAC3B;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AACD,WAAK,GAAG,YAAY,CAAC,aAAa;AAChC,cAAM,cAAc,IAAI,IAAI,aAAa,SAAS,SAAS;AAC3D,cAAM,cAAc,IAAI,IAAI,SAAS,IAAI,CAAC;AAC1C,YACE,YAAY,WAAW,YAAY,UACnC,YAAY,aAAa,YAAY;AAErC;AACF,cAAM,mBAAmB;AACzB,cAAM,WAAW,YAAY;AAC3B,cAAI;AACJ,cAAI;AACF,kBAAM,MAAM,MAAM,QAAQ,KAAK;AAAA,cAC7B,SAAS,KAAK;AAAA,cACd,IAAI,QAAe,CAAC,GAAG,WAAW;AAChC,0BAAU,WAAW,MAAM,OAAO,IAAI,MAAM,SAAS,CAAC,GAAG,GAAI;AAAA,cAC/D,CAAC;AAAA,YACH,CAAC;AACD,gBAAI,IAAI,aAAa,MAAM,KAAM,OAAM,IAAI,MAAM,MAAM;AACvD,kBAAM,SAAS,SAAS,MAAM,KAAK,MAAM,IAAI,SAAS,CAAC,CAAC;AACxD,gBACE,OAAO,cAAc,aAAa,aAClC,OAAO,aAAa,aAAa;AAEjC,oBAAM,IAAI,MAAM,UAAU;AAC5B,uBAAW;AAAA,UACb,QAAQ;AACN,mBAAO,KAAK;AAAA,cACV,MAAM;AAAA,cACN,UAAU;AAAA,cACV,QACE;AAAA,YACJ,CAAC;AAAA,UACH,UAAE;AACA,yBAAa,OAAO;AAAA,UACtB;AAAA,QACF,GAAG;AACH,gBAAQ,IAAI,OAAO;AACnB,aAAK,QAAQ,QAAQ,MAAM,QAAQ,OAAO,OAAO,CAAC;AAAA,MACpD,CAAC;AACD,iBAAW,MAAM,oBAAoB;AACrC,UAAI;AACF,cAAM,KAAK,KAAK,MAAM,KAAK,EAAE,WAAW,mBAAmB,CAAC;AAC5D,YAAI,IAAI,IAAI,KAAK,IAAI,CAAC,EAAE,WAAW,IAAI,IAAI,MAAM,GAAG,EAAE;AACpD,gBAAM,IAAI,MAAM,2CAA2C;AAC7D,cAAM,eAAe,IAAI;AACzB,cAAM,QAAQ,IAAI,CAAC,GAAG,OAAO,CAAC;AAC9B,cAAM,UAAU,YAAY;AAE1B,gBAAM,KAAK,eAAe,IAAI;AAC9B,cAAI,IAAI,IAAI,KAAK,IAAI,CAAC,EAAE,WAAW,IAAI,IAAI,MAAM,GAAG,EAAE;AACpD,kBAAM,IAAI,MAAM,0CAA0C;AAC5D,gBAAM,eAAe,IAAI;AACzB,gBAAM,QAAQ,MAAM,UAAU,IAAI;AAClC,cACE,MAAM,WACN,MAAM,UAAU,cAAc,aAAa,aAC3C,MAAM,UAAU,aAAa,aAAa;AAE1C,mBAAO,KAAK;AAAA,cACV,MAAM;AAAA,cACN;AAAA,cACA,QACE;AAAA,YACJ,CAAC;AACH,cAAI,OAAO,MAAM,eAAe,MAAM,GAAG,EAAE,CAAC,CAAC,IAAI;AAC/C,mBAAO,KAAK;AAAA,cACV,MAAM;AAAA,cACN;AAAA,cACA,QAAQ,MAAM;AAAA,YAChB,CAAC;AACH,uBAAa,KAAK;AAAA,YAChB;AAAA,YACA;AAAA,YACA,SAAS;AAAA,cACP,GAAG,IAAI;AAAA,iBACJ,MAAM,QAAQ,QAAQ,GAAG,IAAI,CAAC,WAAW,OAAO,IAAI;AAAA,cACvD;AAAA,YACF,EAAE,KAAK;AAAA,YACP,cAAc,MAAM,KAAK;AAAA,cAAS,MAChC,OAAO,KAAK,YAAY,EAAE,KAAK;AAAA,YACjC;AAAA,UACF,CAAC;AAAA,QACH;AACA,cAAM,QAAQ;AACd,YAAI,KAAK;AACP,gBAAM,QAAQ,aAAa,GAAG,EAAE,EAAG;AACnC,cACE,CAAC,MAAM,QAAQ,wBACf,CAAC,MAAM,QAAQ,eAAe,qBAC9B,CAAC,MAAM,QAAQ,eAAe;AAE9B,mBAAO,KAAK;AAAA,cACV,MAAM;AAAA,cACN;AAAA,cACA,QAAQ;AAAA,YACV,CAAC;AAAA,QACL,OAAO;AACL,qBAAW,UAAU;AAAA,YACnB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF,GAAY;AACV,uBAAW;AACX,gBAAI;AACF,oBAAM,KAAK,SAAS,OAAO,WAAW;AACpC,sBAAM,MACJ,OAQA;AACF,oBAAI,WAAW,SAAU,OAAM,IAAI,UAAU;AAAA,yBACpC,WAAW;AAClB,wBAAM,IAAI;AAAA,oBACR,IACG,WAAW,EACX,WAAW,OAAO,CAAC,QAAQ,QAAQ,WAAW,EAC9C,MAAM,GAAG,CAAC;AAAA,kBACf;AAAA,oBACG,OAAM,IAAI,UAAU;AAAA,cAC3B,GAAG,MAAM;AAAA,YACX,SAAS,OAAO;AACd,kBACE,EAAE,iBAAiB,UACnB,CAAC,mCAAmC,KAAK,MAAM,OAAO;AAEtD,sBAAM;AAAA,YACV;AACA,kBAAM,QAAQ;AACd,kBAAM,QAAQ,aAAa,GAAG,EAAE,EAAG;AACnC,iBACG,WAAW,YAAY,WAAW,eACnC,MAAM,QAAQ,WAAW,KAAK,CAAC,QAAQ,QAAQ,WAAW;AAE1D,qBAAO,KAAK;AAAA,gBACV,MAAM;AAAA,gBACN;AAAA,gBACA,QAAQ;AAAA,cACV,CAAC;AAAA,UACL;AACA,qBAAW;AACX,gBAAM,KAAK,OAAO,EAAE,WAAW,mBAAmB,CAAC;AACnD,gBAAM,QAAQ;AACd,cACE,aACG,GAAG,EAAE,EACL,MAAM,QAAQ,WAAW,KAAK,CAAC,QAAQ,QAAQ,WAAW;AAE7D,mBAAO,KAAK;AAAA,cACV,MAAM;AAAA,cACN;AAAA,cACA,QAAQ;AAAA,YACV,CAAC;AAAA,QACL;AAAA,MACF,QAAQ;AACN,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN;AAAA,UACA,QACE;AAAA,QACJ,CAAC;AAAA,MACH,UAAE;AACA,cAAM,QAAQ,MAAM;AACpB,cAAM,QAAQ,IAAI,CAAC,GAAG,OAAO,CAAC;AAAA,MAChC;AAAA,IACF;AAAA,EACF,UAAE;AACA,UAAM,QAAQ,MAAM;AAAA,EACtB;AACA,QAAM,aAAa,WACf,yBAAyB;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB,IAAI,IAAI,MAAM,GAAG,EAAE;AAAA,IACrC,iBAAiB,OAAO,OAAO,aAAa,QAAQ,EACjD,OAAO,CAAC,QAAuB,OAAO,QAAQ,QAAQ,EACtD,IAAI,CAAC,QAAQ,IAAI,IAAI,GAAG,EAAE,MAAM;AAAA,EACrC,CAAC,IACD,EAAE,QAAQ,CAAC,GAAG,gBAAgB,CAAC,GAAG,gBAAgB,CAAC,EAAE;AACzD,SAAO,KAAK,GAAG,WAAW,MAAM;AAChC,MAAI,CAAC;AACH,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,UAAU;AAAA,MACV,QAAQ;AAAA,IACV,CAAC;AACH,MAAI;AACF,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,UAAU;AAAA,MACV,QAAQ;AAAA,IACV,CAAC;AACH,QAAM,SAAS;AACf,QAAM,SAAS,OAAO,SAClB,WACA,WAAW,eAAe,UACxB,WAAW,eAAe,UAC1B,QAAQ,OAAO,aAAa,sBAAsB,aAClD,iBACA;AACN,SAAO;AAAA,IACL,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,WAAW,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,GAAI,EAAE,YAAY;AAAA,IAClE,QAAQ;AAAA,MACN,QAAQ,IAAI,IAAI,MAAM,GAAG,EAAE;AAAA,MAC3B,MAAM,IAAI,IAAI,MAAM,GAAG,EAAE;AAAA,IAC3B;AAAA,IACA,SAAS,MAAM;AAAA,IACf,WAAW,aAAa;AAAA,IACxB,UAAU,aAAa;AAAA,IACvB,QAAQ,QAAQ,gBAAgB,UAAU;AAAA,IAC1C,QAAQ;AAAA,MACN,GAAG,IAAI;AAAA,QACL,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,UAAU,KAAK,GAAG,KAAK,CAAC;AAAA,MACtD,EAAE,OAAO;AAAA,IACX;AAAA,IACA,gBAAgB,WAAW;AAAA,IAC3B,gBAAgB,WAAW;AAAA,IAC3B;AAAA,IACA,eAAe;AAAA,MACb,GAAG,IAAI,IAAI,SAAS,IAAI,CAAC,SAAS,GAAG,KAAK,QAAQ,IAAI,KAAK,MAAM,EAAE,CAAC;AAAA,IACtE,EAAE,IAAI,CAAC,SAAS;AAAA,MACd,UAAU,IAAI,MAAM,GAAG,EAAE,CAAC;AAAA,MAC1B,QAAQ,IAAI,MAAM,GAAG,EAAE,CAAC;AAAA,MACxB,OAAO,SAAS;AAAA,QACd,CAAC,SAAS,GAAG,KAAK,QAAQ,IAAI,KAAK,MAAM,OAAO;AAAA,MAClD,EAAE;AAAA,IACJ,EAAE;AAAA,IACF,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAthBA,IAGM,OAIA,SAaA,UAqBA,OA4BO;AArEb;AAAA;AAAA;AAGA,IAAM,QAAQA,IAAE,OAAO;AAAA,MACrB,OAAOA,IAAE,MAAMA,IAAE,OAAO,CAAC;AAAA,MACzB,UAAUA,IAAE,MAAMA,IAAE,OAAO,CAAC;AAAA,IAC9B,CAAC;AACD,IAAM,UAAUA,IAAE,OAAO;AAAA,MACvB,KAAKA,IAAE,OAAO;AAAA,MACd,YAAYA,IAAE,OAAO;AAAA,MACrB,WAAWA,IACR,OAAO;AAAA,QACN,eAAeA,IAAE,MAAMA,IAAE,OAAO,CAAC;AAAA,QACjC,eAAeA,IAAE,MAAMA,IAAE,OAAO,CAAC;AAAA,QACjC,cAAcA,IAAE,MAAMA,IAAE,OAAO,CAAC;AAAA,QAChC,mBAAmB;AAAA,QACnB,cAAc;AAAA,MAChB,CAAC,EACA,SAAS;AAAA,IACd,CAAC;AACD,IAAM,WAAWA,IAAE,OAAO;AAAA,MACxB,WAAWA,IAAE,OAAO;AAAA,MACpB,UAAUA,IAAE,OAAO;AAAA,MACnB,SAASA,IAAE,OAAO;AAAA,MAClB,YAAYA,IAAE,OAAO;AAAA,MACrB,gBAAgBA,IACb,OAAO;AAAA,QACN,QAAQA,IACL,OAAO;AAAA,UACN,aAAaA,IAAE,OAAO,EAAE,SAAS;AAAA,UACjC,iBAAiBA,IAAE,OAAO,EAAE,SAAS;AAAA,QACvC,CAAC,EACA,SAAS;AAAA,MACd,CAAC,EACA,SAAS;AAAA,MACZ,QAAQA,IAAE,OAAO;AAAA,QACf,UAAUA,IAAE,MAAM,OAAO;AAAA,QACzB,YAAYA,IAAE,MAAMA,IAAE,OAAO,EAAE,KAAKA,IAAE,OAAO,GAAG,UAAUA,IAAE,QAAQ,EAAE,CAAC,CAAC;AAAA,QACxE,cAAcA,IAAE,OAAO,EAAE,mBAAmBA,IAAE,OAAO,EAAE,CAAC;AAAA,MAC1D,CAAC;AAAA,IACH,CAAC;AACD,IAAM,QAAQA,IAAE,OAAO;AAAA,MACrB,gBAAgBA,IAAE,OAAO;AAAA,MACzB,SAASA,IAAE,QAAQ;AAAA,MACnB,UAAUA,IACP,OAAO;AAAA,QACN,WAAWA,IAAE,OAAO;AAAA,QACpB,UAAUA,IAAE,OAAO;AAAA,QACnB,SAASA,IAAE,OAAO;AAAA,QAClB,YAAYA,IAAE,OAAO;AAAA,MACvB,CAAC,EACA,SAAS;AAAA,MACZ,SAASA,IAAE,OAAO;AAAA,QAChB,YAAYA,IAAE,MAAMA,IAAE,OAAO,CAAC;AAAA,QAC9B,UAAUA,IAAE,OAAO;AAAA,QACnB,sBAAsBA,IAAE,QAAQ;AAAA,QAChC,gBAAgBA,IAAE,OAAO;AAAA,UACvB,mBAAmBA,IAAE,QAAQ;AAAA,UAC7B,2BAA2BA,IAAE,QAAQ;AAAA,QACvC,CAAC;AAAA,MACH,CAAC;AAAA,MACD,UAAUA,IAAE;AAAA,QACVA,IAAE,OAAO;AAAA,UACP,KAAKA,IAAE,OAAO;AAAA,UACd,SAASA,IAAE,QAAQ;AAAA,UACnB,kBAAkBA,IAAE,QAAQ;AAAA,QAC9B,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AACM,IAAM,2BAA2BA,IAAE,OAAO;AAAA,MAC/C,WAAWA,IAAE,OAAO;AAAA,MACpB,0BAA0BA,IAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,MACpD,UAAUA,IAAE,OAAO;AAAA,QACjB,YAAYA,IAAE,OAAO,EAAE,IAAI;AAAA,QAC3B,WAAWA,IAAE,OAAO,EAAE,IAAI;AAAA,QAC1B,cAAcA,IAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,QACxC,aAAaA,IAAE,OAAO,EAAE,IAAI;AAAA,QAC5B,cAAcA,IAAE,OAAO,EAAE,IAAI;AAAA,MAC/B,CAAC;AAAA,IACH,CAAC;AAAA;AAAA;;;AC/ED,OAAOC,YAAU;;;ACAjB,OAAOC,WAAU;;;ACAjB,OAAOC,SAAQ;;;ACAf,SAAS,SAAS;AAEX,IAAM,+BAA+B;AACrC,IAAM,2BAA2B;AAgBjC,IAAM,+BAA+B,EACzC,OAAO;AAAA,EACN,iBAAiB,EAAE,QAAQ,CAAC;AAAA,EAC5B,QAAQ,EAAE,KAAK,CAAC,iBAAiB,WAAW,SAAS,CAAC;AAAA,EACtD,MAAM,EACH,OAAO;AAAA,IACN,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,IACpC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM;AAAA,EACjC,CAAC,EACA,OAAO;AAAA,EACV,cAAc,EACX,OAAO;AAAA,IACN,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,IACpC,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EAC/C,CAAC,EACA,OAAO,EACP,SAAS;AAAA,EACZ,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AACvC,CAAC,EACA,OAAO;AAEH,IAAM,8BAA8B,EACxC,OAAO;AAAA,EACN,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACpC,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EAC7C,gBAAgB,EAAE,KAAK,CAAC,SAAS,SAAS,QAAQ,CAAC;AACrD,CAAC,EACA,OAAO;AAEV,IAAM,oCAAoC,EACvC,OAAO;AAAA,EACN,iBAAiB,EAAE,QAAQ,CAAC;AAAA,EAC5B,QAAQ,EAAE,QAAQ,SAAS;AAAA,EAC3B,cAAc,4BACX,OAAO;AAAA,IACN,aAAa,EACV,OAAO,EACP,UAAU,CAAC,UAAU,MAAM,KAAK,CAAC,EACjC,OAAO,CAAC,UAAU;AACjB,YAAM,gBAAgB,MAAM,KAAK,KAAK,EAAE;AACxC,aAAO,iBAAiB,KAAK,iBAAiB;AAAA,IAChD,CAAC;AAAA,IACH,gBAAgB,EAAE,QAAQ,OAAO;AAAA,EACnC,CAAC,EACA,OAAO;AACZ,CAAC,EACA,OAAO;AAEH,IAAM,8BAA8B,EAAE,KAAK;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,IAAM,2BAA2B,EACrC,OAAO,EACP,IAAI,CAAC,EACL,IAAI,GAAG,EACP,MAAM,2CAA2C;AAEpD,IAAM,2BAA2B;AAAA,EAC/B,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,uBAAuB;AAAA,EACvB,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,oBAAoB;AACtB;AAEA,SAAS,sBAKP,OAAU,SAAgC;AAC1C,QAAM,SAAS,GAAG,yBAAyB,MAAM,QAAQ,CAAC;AAC1D,MAAI,IAAI,IAAI,MAAM,MAAM,EAAE,SAAS,MAAM,OAAO,QAAQ;AACtD,YAAQ,SAAS;AAAA,MACf,MAAM;AAAA,MACN,SAAS;AAAA,MACT,MAAM,CAAC,QAAQ;AAAA,IACjB,CAAC;AAAA,EACH;AACA,aAAW,CAAC,OAAO,KAAK,KAAK,MAAM,OAAO,QAAQ,GAAG;AACnD,QAAI,CAAC,MAAM,WAAW,MAAM,GAAG;AAC7B,cAAQ,SAAS;AAAA,QACf,MAAM;AAAA,QACN,SAAS;AAAA,QACT,MAAM,CAAC,UAAU,KAAK;AAAA,MACxB,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEO,IAAM,kCAAkC,EAC5C,OAAO;AAAA,EACN,gBAAgB,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EAChD,UAAU;AAAA,EACV,QAAQ,EAAE,MAAM,wBAAwB,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE;AACzD,CAAC,EACA,OAAO,EACP,YAAY,qBAAqB;AAEpC,IAAM,6BAA6B,EAChC,OAAO;AAAA,EACN,iBAAiB,EAAE,QAAQ,CAAC;AAAA,EAC5B,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,KAAM;AAAA,EAC1C,WAAW,EAAE,QAAQ,QAAQ;AAAA,EAC7B,OAAO,EACJ,OAAO;AAAA,IACN,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,IACpC,gBAAgB,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,IAChD,UAAU;AAAA,IACV,QAAQ,EAAE,MAAM,wBAAwB,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE;AAAA,IACvD,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EACvC,CAAC,EACA,OAAO,EACP,YAAY,qBAAqB;AACtC,CAAC,EACA,OAAO;AAEV,IAAM,yCAAyC,EAC5C,OAAO;AAAA,EACN,iBAAiB,EAAE,QAAQ,CAAC;AAAA,EAC5B,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,KAAM;AAAA,EACzC,WAAW,EAAE,QAAQ,QAAQ;AAAA,EAC7B,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AACvC,CAAC,EACA,OAAO;AAEV,IAAM,8BAA8B,EACjC,OAAO;AAAA,EACN,iBAAiB,EAAE,QAAQ,CAAC;AAAA,EAC5B,eAAe,EAAE,MAAM,2BAA2B;AACpD,CAAC,EACA,OAAO;AAEV,IAAM,sBAAsB,EACzB,OAAO;AAAA,EACN,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EAC3C,QAAQ,EAAE,QAAQ,uBAAuB;AAAA,EACzC,SAAS,EAAE,QAAQ,OAAO;AAAA,EAC1B,kBAAkB,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAC9C,CAAC,EACA,OAAO;AAEV,IAAM,yBAAyB,EAC5B,OAAO;AAAA,EACN,SAAS;AAAA,EACT,mBAAmB,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,IAAI,IAAI;AACvD,CAAC,EACA,OAAO;AAEV,IAAM,sBAAsB,EACzB,OAAO;AAAA,EACN,OAAO,EACJ,OAAO;AAAA,IACN,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE;AAAA,IACrC,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EAC3C,CAAC,EACA,OAAO;AACZ,CAAC,EACA,OAAO;AAwBV,IAAM,eAAuC;AAAA,EAC3C,aAAa;AAAA,EACb,cAAc;AAAA,EACd,uBAAuB;AAAA,EACvB,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,qBAAqB;AACvB;AAEO,IAAM,qBAAN,cAAiC,MAAM;AAAA,EACnC;AAAA,EACA;AAAA,EAET,YAAY,SAA6D;AACvE,UAAM,QAAQ,OAAO;AACrB,SAAK,OAAO;AACZ,SAAK,OAAO,QAAQ;AACpB,SAAK,SAAS,QAAQ;AAAA,EACxB;AACF;AAEO,SAAS,yBACd,MAAyB,QAAQ,KACzB;AACR,QAAM,SACJ,IAAI,wBAAwB,GAAG,KAAK,KAAK;AAE3C,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,MAAM;AAC1B,QACE,CAAC,CAAC,SAAS,QAAQ,EAAE,SAAS,IAAI,QAAQ,KAC1C,IAAI,YACJ,IAAI,UACJ;AACA,YAAM,IAAI,MAAM,sBAAsB;AAAA,IACxC;AACA,WAAO,IAAI;AAAA,EACb,QAAQ;AACN,UAAM,IAAI,mBAAmB;AAAA,MAC3B,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF;AAEO,SAAS,2BACd,OAC6B;AAC7B,SACE,iBAAiB,sBACjB,MAAM,WAAW,OACjB,CAAC,mBAAmB,cAAc,EAAE,SAAS,MAAM,IAAI;AAE3D;AAEO,SAAS,0BAA0B,SAGvC;AACD,SAAO;AAAA,IACL,MAAM,OAI+B;AACnC,aAAO,YAAY;AAAA,QACjB,GAAG;AAAA,QACH,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,gBAAgB;AAAA,MAClB,CAAC;AAAA,IACH;AAAA,IACA,SAAS,OAI+B;AACtC,aAAO,YAAY;AAAA,QACjB,GAAG;AAAA,QACH,MAAM;AAAA,UACJ,cAAc,MAAM;AAAA,UACpB,OAAO,MAAM;AAAA,QACf;AAAA,QACA,QAAQ;AAAA,QACR,MAAM,sCAAsC,mBAAmB,MAAM,SAAS,CAAC;AAAA,QAC/E,gBAAgB;AAAA,MAClB,CAAC;AAAA,IACH;AAAA,IACA,OAAO,OAE6B;AAClC,aAAO,YAAY;AAAA,QACjB,GAAG;AAAA,QACH,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,gBAAgB;AAAA,QAChB,mBAAmB,MAAM;AAAA,MAC3B,CAAC;AAAA,IACH;AAAA,IACA,cAAc,OAE+B;AAC3C,aAAO,YAAY;AAAA,QACjB,GAAG;AAAA,QACH,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,gBAAgB;AAAA,QAChB,mBAAmB,MAAM;AAAA,MAC3B,CAAC;AAAA,IACH;AAAA,IACA,mBAAmB,OAGgC;AACjD,aAAO,YAAY;AAAA,QACjB,GAAG;AAAA,QACH,MAAM,EAAE,aAAa,MAAM,YAAY;AAAA,QACvC,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,gBAAgB;AAAA,QAChB,mBAAmB,MAAM;AAAA,MAC3B,CAAC;AAAA,IACH;AAAA,IACA,aACE,OACqC;AACrC,aAAO,YAAY;AAAA,QACjB,GAAG;AAAA,QACH,MAAM;AAAA,UACJ,gBAAgB,MAAM;AAAA,UACtB,UAAU,MAAM;AAAA,UAChB,QAAQ,MAAM;AAAA,QAChB;AAAA,QACA,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,gBAAgB;AAAA,QAChB,mBAAmB,MAAM;AAAA,MAC3B,CAAC;AAAA,IACH;AAAA,IACA,yBAAyB,OAG2B;AAClD,aAAO,YAAY;AAAA,QACjB,GAAG;AAAA,QACH,MAAM,EAAE,gBAAgB,MAAM,eAAe;AAAA,QAC7C,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,gBAAgB;AAAA,QAChB,mBAAmB,MAAM;AAAA,MAC3B,CAAC;AAAA,IACH;AAAA,IACA,OAAO,OAE6B;AAClC,aAAO,YAAY;AAAA,QACjB,GAAG;AAAA,QACH,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,gBAAgB;AAAA,QAChB,mBAAmB,MAAM;AAAA,MAC3B,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,eAAe,YAAe,SAQf;AACb,QAAM,UAAkC;AAAA,IACtC,QAAQ;AAAA,EACV;AACA,MAAI;AAEJ,MAAI,QAAQ,SAAS,QAAW;AAC9B,YAAQ,cAAc,IAAI;AAC1B,WAAO,KAAK,UAAU,QAAQ,IAAI;AAAA,EACpC;AACA,MAAI,QAAQ,mBAAmB;AAC7B,YAAQ,gBAAgB,UAAU,QAAQ,iBAAiB;AAAA,EAC7D;AAEA,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,QAAQ;AAAA,MACvB,GAAG,QAAQ,WAAW,QAAQ,QAAQ,EAAE,CAAC,GAAG,QAAQ,IAAI;AAAA,MACxD;AAAA,QACE;AAAA,QACA;AAAA,QACA,QAAQ,QAAQ;AAAA,MAClB;AAAA,IACF;AAAA,EACF,QAAQ;AACN,UAAM,IAAI,mBAAmB;AAAA,MAC3B,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,QAAM,UAAU,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,MAAS;AAC3D,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,cAAc,oBAAoB,UAAU,OAAO;AACzD,QAAI,YAAY,SAAS;AACvB,YAAM,OAAO,YAAY,KAAK,MAAM;AACpC,YAAM,IAAI,mBAAmB;AAAA,QAC3B;AAAA,QACA,SAAS,aAAa,IAAI,KAAK;AAAA,QAC/B,QAAQ,SAAS;AAAA,MACnB,CAAC;AAAA,IACH;AACA,UAAM,IAAI,mBAAmB;AAAA,MAC3B,MAAM;AAAA,MACN,SAAS;AAAA,MACT,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAEA,QAAM,iBAAiB,QAAQ,eAAe,UAAU,OAAO;AAC/D,MAAI,CAAC,eAAe,SAAS;AAC3B,UAAM,IAAI,mBAAmB;AAAA,MAC3B,MAAM;AAAA,MACN,SAAS;AAAA,MACT,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AACA,SAAO,eAAe;AACxB;;;AClcA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,OAAO,UAAU;AACjB,SAAS,kBAAkB;AAE3B,SAAS,KAAAC,UAAS;AAOX,IAAM,8BAA8B;AACpC,IAAM,4BAA4B;AAEzC,IAAM,6BAA6BC,GAChC,OAAO;AAAA,EACN,IAAIA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AACtC,CAAC,EACA,OAAO;AAEV,IAAM,8BAA8BA,GACjC,OAAO;AAAA,EACN,SAASA,GAAE,QAAQ,CAAC;AAAA,EACpB,gBAAgBA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,IAAI,GAAG;AAAA,EACjD,SAASA,GACN,OAAO;AAAA,IACN,WAAWA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,IAC3C,cAAcA,GAAE,OAAO,EAAE,MAAM,yBAAyB;AAAA,IACxD,WAAWA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EACvC,CAAC,EACA,OAAO,EACP,SAAS;AAAA,EACZ,SAASA,GACN,OAAO;AAAA,IACN,YAAYA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,IAAI,IAAI;AAAA,IAC9C,UAAUA,GACP,OAAO;AAAA,MACN,iBAAiBA,GAAE,QAAQ,CAAC;AAAA,MAC5B,QAAQA,GAAE,KAAK,CAAC,iBAAiB,WAAW,SAAS,CAAC;AAAA,MACtD,MAAMA,GACH,OAAO;AAAA,QACN,IAAIA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,QACpC,OAAOA,GAAE,OAAO,EAAE,KAAK,EAAE,MAAM;AAAA,MACjC,CAAC,EACA,OAAO;AAAA,MACV,cAAcA,GACX,OAAO;AAAA,QACN,IAAIA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,QACpC,MAAMA,GACH,OAAO,EACP,IAAI,CAAC,EACL,IAAI,EAAE,EACN,MAAM,4BAA4B;AAAA,MACvC,CAAC,EACA,OAAO,EACP,SAAS;AAAA,MACZ,WAAWA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,IACvC,CAAC,EACA,OAAO;AAAA,IACV,sBAAsBA,GACnB,OAAO;AAAA,MACN,IAAIA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,MACpC,MAAMA,GACH,OAAO,EACP,IAAI,CAAC,EACL,IAAI,EAAE,EACN,MAAM,4BAA4B;AAAA,IACvC,CAAC,EACA,OAAO,EACP,SAAS;AAAA,EACd,CAAC,EACA,OAAO,EACP,SAAS;AACd,CAAC,EACA,OAAO;AAEV,IAAM,wBAAwBA,GAC3B,OAAO;AAAA,EACN,SAASA,GAAE,QAAQ,yBAAyB;AAAA,EAC5C,gBAAgBA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,IAAI,GAAG;AAAA,EACjD,SAASA,GACN,OAAO;AAAA,IACN,WAAWA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,IAC3C,cAAcA,GAAE,OAAO,EAAE,MAAM,yBAAyB;AAAA,IACxD,WAAWA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EACvC,CAAC,EACA,OAAO,EACP,SAAS;AAAA,EACZ,SAASA,GACN,OAAO;AAAA,IACN,YAAYA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,IAAI,IAAI;AAAA,IAC9C,UAAU;AAAA,IACV,sBAAsB,2BAA2B,SAAS;AAAA,EAC5D,CAAC,EACA,OAAO,EACP,SAAS;AACd,CAAC,EACA,OAAO;AAqBH,IAAM,uBAAN,cAAmC,MAAM;AAAA,EACrC;AAAA,EAET,YACE,MACA,SACA;AACA,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO;AAAA,EACd;AACF;AAEA,eAAsB,oBAAoB,SAIxC;AACA,QAAM,YAAY,KAAK,KAAK,QAAQ,YAAY,2BAA2B;AAC3E,QAAM,QAAQ,MAAM,MAAM,SAAS,EAAE,MAAM,CAAC,UAAmB;AAC7D,QAAI,gBAAgB,OAAO,QAAQ,EAAG,QAAO;AAC7C,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AACD,MAAI,CAAC,MAAO,QAAO,EAAE,QAAQ,UAAU;AACvC,MAAI,CAAC,MAAM,OAAO,GAAG;AACnB,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAQ,IAAI;AAAA,IAChB,MAAM,QAAQ,YAAY,GAAK;AAAA,IAC/B,MAAM,WAAW,GAAK;AAAA,EACxB,CAAC,EAAE,MAAM,MAAM;AACb,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,WAAW,MAAM,SAAS,WAAW,OAAO,EAAE,MAAM,MAAM;AAC9D,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AACD,MAAI;AACJ,MAAI;AACF,iBAAa,KAAK,MAAM,QAAQ;AAAA,EAClC,QAAQ;AACN,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,QAAM,cAAc,sBAAsB,UAAU,UAAU;AAC9D,MAAI,YAAY,SAAS;AACvB,WAAO;AAAA,MACL,OAAO,YAAY;AAAA,MACnB,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAM,cAAc,4BAA4B,UAAU,UAAU;AACpE,MAAI,CAAC,YAAY,SAAS;AACxB,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,gBAAgB,YAAY,KAAK;AACvC,QAAM,yBACJ,eAAe,sBAAsB,MACrC,eAAe,SAAS,cAAc;AACxC,QAAM,gBAAiC;AAAA,IACrC,gBAAgB,YAAY,KAAK;AAAA,IACjC,SAAS,YAAY,KAAK;AAAA,IAC1B,SAAS,gBACL;AAAA,MACE,YAAY,cAAc;AAAA,MAC1B,UAAU;AAAA,QACR,GAAG,cAAc;AAAA,QACjB,cAAc;AAAA,MAChB;AAAA,MACA,sBAAsB,yBAClB,EAAE,IAAI,uBAAuB,IAC7B;AAAA,IACN,IACA;AAAA,IACJ,SAAS;AAAA,EACX;AACA,QAAM,qBAAqB;AAAA,IACzB,YAAY,QAAQ;AAAA,IACpB,OAAO;AAAA,EACT,CAAC;AACD,SAAO;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AACF;AAEA,eAAsB,qBAAqB,SAGzB;AAChB,QAAM,cAAc,sBAAsB,UAAU,QAAQ,KAAK;AACjE,MAAI,CAAC,YAAY,SAAS;AACxB,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,KAAK,KAAK,QAAQ,YAAY,2BAA2B;AAC3E,QAAM,gBAAgB,KAAK;AAAA,IACzB,QAAQ;AAAA,IACR,IAAI,2BAA2B,IAAI,QAAQ,GAAG,IAAI,WAAW,CAAC;AAAA,EAChE;AAEA,MAAI;AACF,UAAM,MAAM,QAAQ,YAAY,EAAE,MAAM,KAAO,WAAW,KAAK,CAAC;AAChE,UAAM,MAAM,QAAQ,YAAY,GAAK;AACrC,UAAM;AAAA,MACJ;AAAA,MACA,GAAG,KAAK,UAAU,YAAY,MAAM,MAAM,CAAC,CAAC;AAAA;AAAA,MAC5C;AAAA,QACE,UAAU;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AACA,UAAM,MAAM,eAAe,GAAK;AAChC,UAAM,OAAO,eAAe,SAAS;AACrC,UAAM,MAAM,WAAW,GAAK;AAAA,EAC9B,SAAS,OAAO;AACd,QAAI,iBAAiB,qBAAsB,OAAM;AACjD,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF,UAAE;AACA,UAAM,GAAG,eAAe,EAAE,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM,MAAS;AAAA,EAChE;AACF;AAEA,SAAS,gBAAgB,OAAgB,MAAuB;AAC9D,SACE,iBAAiB,SACjB,UAAU,SACT,MAAgC,SAAS;AAE9C;;;AC1RA,OAAO,QAAQ;AACf,OAAOC,WAAU;AAEV,IAAM,kBAAkB;AAExB,SAAS,wBACd,UAAyD,CAAC,GAClD;AACR,QAAM,iBAAiB,QAAQ,MAAM,eAAe,GAAG,KAAK;AAC5D,SAAO,iBACHA,MAAK,QAAQ,cAAc,IAC3BA,MAAK,KAAK,QAAQ,WAAW,GAAG,QAAQ,GAAG,SAAS;AAC1D;;;AHKA,eAAsB,0BAA0B,SAMR;AACtC,QAAM,aAAa,wBAAwB;AAAA,IACzC,KAAK,QAAQ;AAAA,IACb,SAAS,QAAQ,WAAWC,IAAG,QAAQ;AAAA,EACzC,CAAC;AACD,QAAM,SAAS,MAAM,oBAAoB,EAAE,WAAW,CAAC;AAEvD,MAAI,OAAO,WAAW,WAAW;AAC/B,UAAM,IAAI,mBAAmB;AAAA,MAC3B,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACA,QAAM,UAAU,OAAO,MAAM;AAC7B,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,mBAAmB;AAAA,MAC3B,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACA,MAAI,QAAQ,SAAS,WAAW,iBAAiB;AAC/C,UAAM,qBAAqB;AAAA,MACzB;AAAA,MACA,OAAO,EAAE,GAAG,OAAO,OAAO,SAAS,OAAU;AAAA,IAC/C,CAAC;AACD,UAAM,IAAI,mBAAmB;AAAA,MAC3B,MAAM;AAAA,MACN,SAAS;AAAA,MACT,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AACA,MAAI,CAAC,QAAQ,sBAAsB;AACjC,UAAM,IAAI,mBAAmB;AAAA,MAC3B,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACA,MAAI,CAAC,QAAQ,WAAW;AACtB,UAAM,IAAI,mBAAmB;AAAA,MAC3B,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,QAAM,eAAe,gCAAgC,UAAU;AAAA,IAC7D,gBAAgB,QAAQ,qBAAqB;AAAA,IAC7C,UAAU,QAAQ;AAAA,IAClB,QAAQ,QAAQ;AAAA,EAClB,CAAC;AACD,MAAI,CAAC,aAAa,SAAS;AACzB,UAAM,IAAI,mBAAmB;AAAA,MAC3B,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,MAAI;AACF,WAAO,MAAM,0BAA0B;AAAA,MACrC,YAAY,yBAAyB,QAAQ,GAAG;AAAA,MAChD,WAAW,QAAQ;AAAA,IACrB,CAAC,EAAE,aAAa;AAAA,MACd,GAAG,aAAa;AAAA,MAChB,mBAAmB,QAAQ;AAAA,IAC7B,CAAC;AAAA,EACH,SAAS,OAAO;AACd,QAAI,2BAA2B,KAAK,GAAG;AACrC,YAAM,qBAAqB;AAAA,QACzB;AAAA,QACA,OAAO,EAAE,GAAG,OAAO,OAAO,SAAS,OAAU;AAAA,MAC/C,CAAC;AAAA,IACH;AACA,UAAM;AAAA,EACR;AACF;;;AIzFO,SAAS,iCAAiC,SAIxB;AACvB,SAAO;AAAA,IACL,MAAM,QAAQ,SAA8B;AAC1C,aAAO,0BAA0B;AAAA,QAC/B,GAAG;AAAA,QACH,UAAU,QAAQ;AAAA,QAClB,QAAQ,QAAQ;AAAA,MAClB,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;ACrBA,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,gBAAgB;AACzB,OAAOC,WAAU;AAEjB,SAAS,KAAAC,UAAS;;;ACJX,IAAM,mBAAmB,CAAC,SAAS,SAAS,QAAQ;AAGpD,IAAM,2BAA2B;AAAA,EACtC;AAAA,EACA,GAAG;AACL;;;ACNA,SAAS,YAAY,cAAAC,mBAAkB;AACvC;AAAA,EACE,SAAAC;AAAA,EACA,SAAAC;AAAA,EACA,SAAAC;AAAA,EACA,YAAAC;AAAA,EACA,UAAAC;AAAA,EACA,MAAAC;AAAA,EACA,aAAAC;AAAA,OACK;AACP,OAAOC,WAAU;AAgBV,IAAM,yBAAN,cAAqC,MAAM;AAAA,EACvC;AAAA,EAET,YAAY,MAAkC,SAAiB;AAC7D,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,wBAAN,MAAyD;AAAA,EAC9D,MAAM,KACJ,OACkC;AAClC,UAAM,YAAY,MAAM,UAAU,MAAM,QAAQ;AAChD,QAAI,CAAC,UAAW,QAAO,EAAE,QAAQ,UAAU;AAC3C,QAAI,UAAU,eAAe,KAAK,CAAC,UAAU,OAAO;AAClD,YAAM,eAAe;AAEvB,UAAM,YAAYA,MAAK,QAAQ,MAAM,QAAQ;AAC7C,UAAM,gBAAgB,SAAS;AAC/B,UAAM,kBAAkB,MAAM,UAAU,WAAW,MAAM,QAAQ;AAEjE,UAAM,SAAS,MAAMJ,UAAS,MAAM,UAAU,MAAM,EAAE,MAAM,MAAM;AAChE,YAAM,oBAAoB;AAAA,IAC5B,CAAC;AACD,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,MAAM;AAAA,IAC5B,QAAQ;AACN,YAAM,gBAAgB;AAAA,IACxB;AAEA,QAAI;AACF,YAAM,UAAU,MAAM,MAAM,OAAO,MAAM;AACzC,aAAO;AAAA,QACL,UAAU,SAAS,MAAM;AAAA,QACzB,UAAU,QAAQ;AAAA,QAClB;AAAA,QACA,QAAQ;AAAA,QACR,OAAO,QAAQ;AAAA,MACjB;AAAA,IACF,SAAS,OAAO;AACd,UAAI,iBAAiB,uBAAwB,OAAM;AACnD,YAAM,gBAAgB;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,MAAM,MACJ,OAC+B;AAC/B,QAAI;AACJ,QAAI;AACF,eAAS,GAAG,KAAK,UAAU,MAAM,MAAM,OAAO,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC;AAAA;AAAA,IACtE,QAAQ;AACN,YAAM,gBAAgB;AAAA,IACxB;AAEA,UAAM,YAAYI,MAAK,QAAQ,MAAM,QAAQ;AAC7C,UAAM,gBAAgB,WAAW,MAAM,QAAQ;AAC/C,UAAM,WAAW,MAAM,UAAU,MAAM,QAAQ;AAC/C,QAAI,aAAa,SAAS,eAAe,KAAK,CAAC,SAAS,OAAO;AAC7D,YAAM,eAAe;AAEvB,UAAM,gBAAgBA,MAAK;AAAA,MACzB;AAAA,MACA,IAAIA,MAAK,SAAS,MAAM,QAAQ,CAAC,IAAI,QAAQ,GAAG,IAAIR,YAAW,CAAC;AAAA,IAClE;AACA,UAAM,WAAW,MAAM,aAAa,YAAY,MAAQ;AAExD,QAAI;AACF,YAAMO,WAAU,eAAe,QAAQ;AAAA,QACrC,UAAU;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,MACR,CAAC;AACD,YAAMN,OAAM,eAAe,QAAQ;AACnC,YAAM,uBAAuB,MAAM,UAAU,MAAM,gBAAgB;AACnE,YAAMI,QAAO,eAAe,MAAM,QAAQ;AAC1C,YAAMJ,OAAM,MAAM,UAAU,QAAQ;AACpC,aAAO,EAAE,UAAU,SAAS,MAAM,EAAE;AAAA,IACtC,SAAS,OAAO;AACd,UAAI,iBAAiB,uBAAwB,OAAM;AACnD,YAAM,oBAAoB;AAAA,IAC5B,UAAE;AACA,YAAMK,IAAG,eAAe,EAAE,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM,MAAS;AAAA,IAChE;AAAA,EACF;AACF;AAEA,eAAe,gBACb,WACA,UACe;AACf,QAAM,OAAO,aAAa,YAAY,MAAQ;AAC9C,QAAMH,OAAM,WAAW,EAAE,MAAM,WAAW,KAAK,CAAC,EAAE,MAAM,MAAM;AAC5D,UAAM,oBAAoB;AAAA,EAC5B,CAAC;AACD,QAAM,gBAAgB,SAAS;AAC/B,QAAMF,OAAM,WAAW,IAAI,EAAE,MAAM,MAAM;AACvC,UAAM,oBAAoB;AAAA,EAC5B,CAAC;AACH;AAEA,eAAe,gBAAgB,WAAkC;AAC/D,QAAM,QAAQ,MAAM,UAAU,SAAS;AACvC,MAAI,CAAC,SAAS,MAAM,eAAe,KAAK,CAAC,MAAM,YAAY;AACzD,UAAM,eAAe;AACzB;AAEA,eAAe,kBACb,UACA,WACA,UACe;AACf,MAAI,aAAa,UAAW;AAC5B,QAAM,QAAQ,IAAI,CAACA,OAAM,WAAW,GAAK,GAAGA,OAAM,UAAU,GAAK,CAAC,CAAC,EAAE;AAAA,IACnE,MAAM;AACJ,YAAM,oBAAoB;AAAA,IAC5B;AAAA,EACF;AACF;AAEA,eAAe,uBACb,UACA,kBACe;AACf,MAAI,qBAAqB,OAAW;AACpC,QAAM,QAAQ,MAAM,UAAU,QAAQ;AACtC,MAAI,CAAC,OAAO;AACV,QAAI,qBAAqB,KAAM;AAC/B,UAAM,iBAAiB;AAAA,EACzB;AACA,MAAI,MAAM,eAAe,KAAK,CAAC,MAAM,OAAO,EAAG,OAAM,eAAe;AACpE,MAAI,qBAAqB,KAAM,OAAM,iBAAiB;AACtD,QAAM,gBAAgB,MAAMG,UAAS,UAAU,MAAM,EAAE,MAAM,MAAM;AACjE,UAAM,oBAAoB;AAAA,EAC5B,CAAC;AACD,MAAI,SAAS,aAAa,MAAM,iBAAkB,OAAM,iBAAiB;AAC3E;AAEA,eAAe,UAAU,WAAmB;AAC1C,SAAOF,OAAM,SAAS,EAAE,MAAM,CAAC,UAAmB;AAChD,QAAIO,iBAAgB,OAAO,QAAQ,KAAKA,iBAAgB,OAAO,SAAS;AACtE,aAAO;AACT,UAAM,oBAAoB;AAAA,EAC5B,CAAC;AACH;AAEA,SAAS,SAAS,QAAwB;AACxC,SAAO,WAAW,QAAQ,EAAE,OAAO,MAAM,EAAE,OAAO,KAAK;AACzD;AAEA,SAAS,mBAA2C;AAClD,SAAO,IAAI;AAAA,IACT;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,kBAA0C;AACjD,SAAO,IAAI;AAAA,IACT;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,sBAA8C;AACrD,SAAO,IAAI;AAAA,IACT;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,iBAAyC;AAChD,SAAO,IAAI;AAAA,IACT;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAASA,iBAAgB,OAAgB,MAAuB;AAC9D,SACE,iBAAiB,SACjB,UAAU,SACT,MAAgC,SAAS;AAE9C;;;AF/LA,IAAM,uBAAuBC,GAC1B,OAAO;AAAA,EACN,SAASA,GAAE,KAAK,wBAAwB;AAAA,EACxC,WAAWA,GACR,OAAO,EACP,IAAI,EACJ,OAAO,CAAC,UAAU,IAAI,IAAI,KAAK,EAAE,WAAW,KAAK;AAAA,EACpD,gBAAgBA,GAAE,OAAO,EAAE,OAAOC,MAAK,UAAU;AAAA,EACjD,gBAAgBD,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EAChD,iBAAiBA,GACd,OAAO,EACP,MAAM,iCAAiC,EACvC,IAAI,EAAE,EACN,SAAS;AAAA,EACZ,SAASA,GACN,OAAO;AAAA,IACN,IAAIA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,IACpC,MAAMA,GACH,OAAO,EACP,KAAK,EACL,IAAI,CAAC,EACL,IAAI,GAAG,EACP,MAAM,4BAA4B;AAAA,EACvC,CAAC,EACA,OAAO;AACZ,CAAC,EACA,OAAO;AAEV,IAAM,wBAAwBA,GAC3B,OAAO;AAAA,EACN,SAASA,GAAE,QAAQ,CAAC;AAAA,EACpB,UAAUA,GAAE,OAAO,oBAAoB;AACzC,CAAC,EACA,OAAO,EACP,YAAY,CAAC,UAAU,YAAY;AAClC,aAAW,CAAC,KAAK,OAAO,KAAK,OAAO,QAAQ,SAAS,QAAQ,GAAG;AAC9D,QAAI,QAAQ,kBAAkB,OAAO,GAAG;AACtC,cAAQ,SAAS;AAAA,QACf,MAAMA,GAAE,aAAa;AAAA,QACrB,SAAS;AAAA,QACT,MAAM,CAAC,YAAY,GAAG;AAAA,MACxB,CAAC;AAAA,IACH;AAAA,EACF;AACF,CAAC;AAIH,IAAM,uBAAmE;AAAA,EACvE,OAAO,OAAO;AACZ,WAAO,EAAE,UAAU,OAAO,OAAO,sBAAsB,MAAM,KAAK,EAAE;AAAA,EACtE;AAAA,EACA,OAAO,OAAO;AACZ,WAAO,sBAAsB,MAAM,KAAK;AAAA,EAC1C;AACF;AAOO,IAAM,2BAAN,cAAuC,MAAM;AAAA,EACzC;AAAA,EAET,YAAY,MAAoC,SAAiB;AAC/D,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,0BAAN,MAA6D;AAAA,EAClE,YACmB,UACA,YAA+B,IAAI,sBAAsB,GAC1E;AAFiB;AACA;AAAA,EAChB;AAAA,EAFgB;AAAA,EACA;AAAA,EAGnB,MAAM,KACJ,SACuC;AACvC,QAAI;AACF,YAAM,aAAa,MAAM,iBAAiB,OAAO;AACjD,YAAM,WAAW,MAAM,KAAK,aAAa;AACzC,UAAI,SAAS,WAAW,UAAW,QAAO;AAC1C,aAAO,SAAS,MAAM,SAAS,kBAAkB,UAAU,CAAC,KAAK;AAAA,IACnE,SAAS,OAAO;AACd,YAAM,cAAc,KAAK;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,SAAgE;AAC1E,QAAI;AACF,YAAM,aAAa,qBAAqB,MAAM;AAAA,QAC5C,GAAG;AAAA,QACH,GAAI,MAAM,iBAAiB,OAAO;AAAA,MACpC,CAAC;AACD,YAAM,WAAW,MAAM,KAAK,aAAa;AACzC,YAAM,WACJ,SAAS,WAAW,WAAW,SAAS,QAAQ,cAAc;AAChE,eAAS,SAAS,kBAAkB,UAAU,CAAC,IAAI;AACnD,YAAM,KAAK,UAAU,MAAM;AAAA,QACzB,OAAO;AAAA,QACP,kBACE,SAAS,WAAW,WAAW,SAAS,WAAW;AAAA,QACrD,UAAU,KAAK;AAAA,QACf,UAAU;AAAA,QACV,OAAO;AAAA,MACT,CAAC;AACD,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,cAAc,KAAK;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,SAAyD;AACpE,QAAI;AACF,YAAM,aAAa,MAAM,iBAAiB,OAAO;AACjD,YAAM,WAAW,MAAM,KAAK,aAAa;AACzC,UAAI,SAAS,WAAW,UAAW,QAAO;AAC1C,YAAM,MAAM,kBAAkB,UAAU;AACxC,UAAI,CAAC,SAAS,MAAM,SAAS,GAAG,EAAG,QAAO;AAC1C,aAAO,SAAS,MAAM,SAAS,GAAG;AAClC,YAAM,KAAK,UAAU,MAAM;AAAA,QACzB,OAAO;AAAA,QACP,kBAAkB,SAAS;AAAA,QAC3B,UAAU,KAAK;AAAA,QACf,UAAU;AAAA,QACV,OAAO,SAAS;AAAA,MAClB,CAAC;AACD,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,cAAc,KAAK;AAAA,IAC3B;AAAA,EACF;AAAA,EAEQ,eAEN;AACA,WAAO,KAAK,UAAU,KAAK;AAAA,MACzB,OAAO;AAAA,MACP,UAAU,KAAK;AAAA,MACf,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AACF;AAEO,SAAS,kBACd,SACQ;AACR,SAAOE,YAAW,QAAQ,EACvB;AAAA,IACC,GAAG,QAAQ,SAAS,KAAK,QAAQ,cAAc,KAAK,QAAQ,OAAO;AAAA,EACrE,EACC,OAAO,KAAK;AACjB;AAEA,eAAe,iBACb,SACuC;AACvC,SAAO;AAAA,IACL,WAAW,mBAAmB,QAAQ,SAAS;AAAA,IAC/C,gBAAgB,MAAM,SAASD,MAAK,QAAQ,QAAQ,cAAc,CAAC;AAAA,IACnE,SAAS,QAAQ;AAAA,EACnB;AACF;AAEA,SAAS,mBAAmB,OAAuB;AACjD,MAAI;AACJ,MAAI;AACF,UAAM,IAAI,IAAI,KAAK;AAAA,EACrB,QAAQ;AACN,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,IAAI,aAAa,WAAW,IAAI,aAAa,UAAU;AACzD,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO,IAAI;AACb;AAEA,SAAS,gBAAyC;AAChD,SAAO,EAAE,SAAS,GAAG,UAAU,CAAC,EAAE;AACpC;AAEA,SAAS,cAAc,OAA0C;AAC/D,MAAI,iBAAiB,yBAA0B,QAAO;AACtD,MAAI,iBAAiBD,GAAE,UAAU;AAC/B,WAAO,IAAI;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,iBAAiB,wBAAwB;AAC3C,QAAI,MAAM,SAAS,0BAA0B;AAC3C,aAAO,IAAI;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,QACE,MAAM,SAAS,2BACf,MAAM,SAAS,wBACf;AACA,aAAO,IAAI;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO,IAAI;AAAA,IACT;AAAA,IACA;AAAA,EACF;AACF;;;AGjPA,SAAS,SAAAG,QAAO,YAAAC,iBAAgB;AAChC,OAAOC,WAAU;AAOV,IAAM,sBAAN,cAAkC,MAAM;AAAA,EACpC;AAAA,EAET,YAAY,MAA+B,SAAiB;AAC1D,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO;AAAA,EACd;AACF;AAEA,eAAsB,mBAAmB,UAAmC;AAC1E,MAAI;AACJ,MAAI;AACF,cAAU,MAAMD,UAASC,MAAK,QAAQ,QAAQ,CAAC;AAAA,EACjD,QAAQ;AACN,UAAM,gBAAgB;AAAA,EACxB;AAEA,QAAMC,iBAAgB,OAAO;AAC7B,SAAO,MAAM;AACX,UAAM,SAAS,MAAMC,WAAUF,MAAK,KAAK,SAAS,MAAM,CAAC;AACzD,QAAI,QAAQ;AACV,UACE,OAAO,eAAe,KACrB,CAAC,OAAO,YAAY,KAAK,CAAC,OAAO,OAAO,GACzC;AACA,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,UAAM,SAASA,MAAK,QAAQ,OAAO;AACnC,QAAI,WAAW,SAAS;AACtB,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,cAAU;AAAA,EACZ;AACF;AAEA,eAAeC,iBAAgB,WAAkC;AAC/D,QAAM,QAAQ,MAAMC,WAAU,SAAS;AACvC,MAAI,CAAC,SAAS,MAAM,eAAe,KAAK,CAAC,MAAM,YAAY,GAAG;AAC5D,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAeA,WAAU,WAAmB;AAC1C,SAAOJ,OAAM,SAAS,EAAE,MAAM,CAAC,UAAmB;AAChD,QAAIK,iBAAgB,OAAO,QAAQ,KAAKA,iBAAgB,OAAO,SAAS;AACtE,aAAO;AACT,UAAM,gBAAgB;AAAA,EACxB,CAAC;AACH;AAEA,SAAS,kBAAuC;AAC9C,SAAO,IAAI;AAAA,IACT;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAASA,iBAAgB,OAAgB,MAAuB;AAC9D,SACE,iBAAiB,SACjB,UAAU,SACT,MAAgC,SAAS;AAE9C;;;ACpFA,SAAS,KAAAC,UAAS;AAQX,IAAM,mBAAmB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,gBAAgBC,GAAE,OAAO;AAAA,EAC7B,IAAIA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACpB,gBAAgBA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAChC,MAAMA,GAAE,OAAO;AAAA,EACf,MAAMA,GAAE,OAAO;AAAA,EACf,SAASA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,EAC3B,cAAcA,GAAE;AAAA,IACdA,GAAE,OAAO;AAAA,MACP,IAAIA,GAAE,OAAO;AAAA,MACb,MAAMA,GAAE,OAAO;AAAA,MACf,MAAMA,GAAE,OAAO;AAAA,MACf,KAAKA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,IACtC,CAAC;AAAA,EACH;AAAA,EACA,WAAWA,GAAE,OAAO;AAAA,EACpB,WAAWA,GAAE,OAAO;AACtB,CAAC;AACD,IAAM,iBAAiBA,GAAE,OAAO;AAAA,EAC9B,SAAS;AAAA,EACT,UAAUA,GAAE;AAAA,IACVA,GAAE,OAAO;AAAA,MACP,SAASA,GAAE,KAAK,gBAAgB;AAAA,MAChC,YAAYA,GACT,OAAO;AAAA,QACN,YAAYA,GAAE,OAAO;AAAA,QACrB,WAAWA,GAAE,OAAO;AAAA,QACpB,SAASA,GAAE,KAAK,gBAAgB;AAAA,QAChC,WAAWA,GAAE,OAAO;AAAA,QACpB,cAAcA,GAAE;AAAA,UACdA,GAAE,OAAO;AAAA,YACP,eAAeA,GAAE,OAAO;AAAA,YACxB,YAAYA,GAAE,OAAO;AAAA,YACrB,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,UAC5B,CAAC;AAAA,QACH;AAAA,MACF,CAAC,EACA,SAAS;AAAA,MACZ,aAAaA,GACV,OAAO;AAAA,QACN,OAAOA,GAAE,KAAK;AAAA,UACZ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,QACD,SAASA,GAAE,OAAO;AAAA,QAClB,YAAYA,GAAE,OAAO,EAAE,SAAS;AAAA,MAClC,CAAC,EACA,SAAS;AAAA,IACd,CAAC;AAAA,EACH;AACF,CAAC;AAIM,SAAS,iBAAiB,OAI9B;AACD,QAAM,SAAS,yBAAyB,MAAM,GAAG;AACjD,iBAAe,QACbC,QACA,QACA,MACA,QACA;AACA,UAAM,QACJ,SAAS,SACL,4BACA;AACN,UAAM,QAAQ,MAAM,MAAM,OAAO,QAAQ;AAAA,MACvC,UAAU;AAAA,MACV,QAAQ,CAAC,KAAK;AAAA,IAChB,CAAC;AACD,QACE,MAAM,MAAM,aAAa,qBACzB,CAAC,MAAM,MAAM,OAAO,SAAS,KAAK;AAElC,YAAM,gBAAgB;AACxB,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,mBAAmB;AAAA,QAC3B,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AACH,UAAM,WAAW,MAAM,MAAM;AAAA,MAC3B,GAAG,MAAM,4BAA4BA,MAAI;AAAA,MACzC;AAAA,QACE,QAAQ,WAAW,SAAS,SAAY,QAAQ;AAAA,QAChD,SAAS;AAAA,UACP,eAAe,UAAU,MAAM,WAAW;AAAA,UAC1C,QAAQ;AAAA,UACR,GAAI,SAAS,SAAY,CAAC,IAAI,EAAE,gBAAgB,mBAAmB;AAAA,QACrE;AAAA,QACA,GAAI,SAAS,SAAY,CAAC,IAAI,EAAE,MAAM,KAAK,UAAU,IAAI,EAAE;AAAA,QAC3D,QAAQ,YAAY,QAAQ,GAAM;AAAA,MACpC;AAAA,IACF;AACA,UAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,QAAQD,GACX,OAAO;AAAA,QACN,OAAOA,GAAE,OAAO,EAAE,MAAMA,GAAE,OAAO,GAAG,SAASA,GAAE,OAAO,EAAE,IAAI,GAAG,EAAE,CAAC;AAAA,MACpE,CAAC,EACA,UAAU,KAAK;AAClB,YAAM,IAAI,mBAAmB;AAAA,QAC3B,MAAM,MAAM,UAAU,MAAM,KAAK,MAAM,OAAO;AAAA,QAC9C,SAAS,MAAM,UACX,MAAM,KAAK,MAAM,UACjB;AAAA,QACJ,QAAQ,SAAS;AAAA,MACnB,CAAC;AAAA,IACH;AACA,UAAM,SAAS,OAAO,UAAU,KAAK;AACrC,QAAI,CAAC,OAAO,QAAS,OAAM,gBAAgB;AAC3C,WAAO,EAAE,OAAO,OAAO,MAAM,gBAAgB,MAAM,MAAM,eAAe;AAAA,EAC1E;AACA,WAAS,kBAAkB,SAAwB,gBAAwB;AACzE,QAAI,QAAQ,mBAAmB,eAAgB,OAAM,gBAAgB;AAAA,EACvE;AACA,SAAO;AAAA,IACL;AAAA,IACA,MAAM,OACJ,IACA,SAMA;AACA,YAAM,EAAE,OAAO,eAAe,IAAI,MAAM;AAAA,QACtC,IAAI,mBAAmB,EAAE,CAAC;AAAA,QAC1BA,GAAE,OAAO,EAAE,SAAS,cAAc,CAAC;AAAA,QACnC;AAAA,QACA;AAAA,MACF;AACA,wBAAkB,MAAM,SAAS,cAAc;AAC/C,UAAI,MAAM,QAAQ,OAAO,GAAI,OAAM,gBAAgB;AACnD,aAAO,MAAM;AAAA,IACf;AAAA,IACA,MAAM,kBACJ,IACA,eACA,SACA;AACA,YAAM,EAAE,OAAO,eAAe,IAAI,MAAM;AAAA,QACtC,IAAI,mBAAmB,EAAE,CAAC,iBAAiB,mBAAmB,aAAa,CAAC;AAAA,QAC5EA,GAAE,OAAO,EAAE,SAAS,cAAc,CAAC;AAAA,QACnC;AAAA,QACA;AAAA,MACF;AACA,wBAAkB,MAAM,SAAS,cAAc;AAC/C,UAAI,MAAM,QAAQ,OAAO,GAAI,OAAM,gBAAgB;AACnD,aAAO,MAAM;AAAA,IACf;AAAA,IACA,MAAM,OAAO;AACX,YAAM,EAAE,OAAO,eAAe,IAAI,MAAM;AAAA,QACtC;AAAA,QACAA,GAAE,OAAO,EAAE,UAAUA,GAAE,MAAM,aAAa,EAAE,CAAC;AAAA,MAC/C;AACA,YAAM,SAAS;AAAA,QAAQ,CAAC,YACtB,kBAAkB,SAAS,cAAc;AAAA,MAC3C;AACA,aAAO,MAAM;AAAA,IACf;AAAA,IACA,MAAM,IAAI,IAAY,iBAA0B;AAC9C,YAAM,EAAE,OAAO,eAAe,IAAI,MAAM;AAAA,QACtC,IAAI,mBAAmB,EAAE,CAAC,GAAG,kBAAkB,QAAQ,mBAAmB,eAAe,CAAC,KAAK,EAAE;AAAA,QACjG;AAAA,MACF;AACA,wBAAkB,MAAM,SAAS,cAAc;AAC/C,UACE,MAAM,QAAQ,OAAO,MACrB,MAAM,SAAS;AAAA,QACb,CAAC,YACC,QAAQ,eACP,QAAQ,WAAW,cAAc,MAChC,QAAQ,WAAW,YAAY,QAAQ;AAAA,MAC7C;AAEA,cAAM,gBAAgB;AACxB,aAAO;AAAA,IACT;AAAA,IACA,MAAM,OAAO,SAKV;AACD,YAAM,EAAE,OAAO,eAAe,IAAI,MAAM;AAAA,QACtC;AAAA,QACAA,GAAE,OAAO,EAAE,SAAS,cAAc,CAAC;AAAA,QACnC;AAAA,MACF;AACA,wBAAkB,MAAM,SAAS,cAAc;AAC/C,aAAO,MAAM;AAAA,IACf;AAAA,IACA,MAAM,QACJ,IACA,SACA,YACA,iBACA;AACA,YAAM;AAAA,QACJ,IAAI,mBAAmB,EAAE,CAAC,aAAa,OAAO,GAAG,kBAAkB,QAAQ,mBAAmB,eAAe,CAAC,KAAK,EAAE;AAAA,QACrHA,GAAE,OAAO;AAAA,UACP,YAAYA,GAAE,OAAO;AAAA,YACnB,YAAYA,GAAE,OAAO;AAAA,YACrB,WAAWA,GAAE,QAAQ,EAAE;AAAA,YACvB,SAASA,GAAE,QAAQ,OAAO;AAAA,UAC5B,CAAC;AAAA,QACH,CAAC;AAAA,QACD,aAAa,EAAE,WAAW,IAAI,EAAE,QAAQ,KAAK;AAAA,MAC/C;AACA,aAAO,KAAK,IAAI,IAAI,eAAe;AAAA,IACrC;AAAA,IACA,MAAM,kBACJ,IACA,SACA;AACA,YAAM,EAAE,OAAO,eAAe,IAAI,MAAM;AAAA,QACtC,IAAI,mBAAmB,EAAE,CAAC;AAAA,QAC1BA,GAAE,OAAO,EAAE,SAAS,cAAc,CAAC;AAAA,QACnC;AAAA,MACF;AACA,wBAAkB,MAAM,SAAS,cAAc;AAC/C,UAAI,MAAM,QAAQ,OAAO,GAAI,OAAM,gBAAgB;AACnD,aAAO,MAAM;AAAA,IACf;AAAA,IACA,MAAM,sBAAsB,IAAY,SAAyB;AAC/D,cACE,MAAM;AAAA,QACJ,IAAI,mBAAmB,EAAE,CAAC,aAAa,OAAO;AAAA,QAC9CA,GAAE,OAAO;AAAA,UACP,cAAcA,GAAE;AAAA,YACdA,GAAE,OAAO,EAAE,IAAIA,GAAE,OAAO,GAAG,MAAMA,GAAE,OAAO,GAAG,MAAMA,GAAE,OAAO,EAAE,CAAC;AAAA,UACjE;AAAA,QACF,CAAC;AAAA,MACH,GACA,MAAM;AAAA,IACV;AAAA,IACA,MAAM,mBACJ,IACA,SACA,eACA,YACA;AACA,YAAM;AAAA,QACJ,IAAI,mBAAmB,EAAE,CAAC,aAAa,OAAO,iBAAiB,mBAAmB,aAAa,CAAC;AAAA,QAChGA,GAAE,OAAO;AAAA,UACP,YAAYA,GAAE,OAAO;AAAA,YACnB,WAAWA,GAAE,QAAQ,EAAE;AAAA,YACvB,SAASA,GAAE,QAAQ,OAAO;AAAA,UAC5B,CAAC;AAAA,QACH,CAAC;AAAA,QACD,aAAa,EAAE,WAAW,IAAI,EAAE,QAAQ,KAAK;AAAA,MAC/C;AACA,aAAO,KAAK,IAAI,EAAE;AAAA,IACpB;AAAA,EACF;AACF;AACA,SAAS,kBAAkB;AACzB,SAAO,IAAI,mBAAmB;AAAA,IAC5B,MAAM;AAAA,IACN,SAAS;AAAA,EACX,CAAC;AACH;;;AVvQO,SAAS,qBAAqB,SAAgC;AACnE,QAAM,QACJ,QAAQ,uBACR,IAAI;AAAA,IACFE,MAAK,KAAK,wBAAwB,OAAO,GAAG,uBAAuB;AAAA,EACrE;AACF,QAAM,SACJ,QAAQ,wBAAwB,iCAAiC,OAAO;AAC1E,SAAO,EAAE,OAAO,QAAQ,KAAK,iBAAiB,EAAE,GAAG,SAAS,OAAO,CAAC,EAAE;AACxE;AACA,eAAsB,uBAAuB,SAAgC;AAC3E,QAAM,UAAU,qBAAqB,OAAO;AAC5C,QAAM,UAAU,MAAM,mBAAmB,QAAQ,OAAO,QAAQ,IAAI,CAAC;AACrE,QAAM,UAAU;AAAA,IACd,WAAW,QAAQ,IAAI;AAAA,IACvB,gBAAgB;AAAA,IAChB,SAAS;AAAA,EACX;AACA,QAAM,UAAU,MAAM,QAAQ,MAAM,KAAK,OAAO;AAChD,MAAI,CAAC,WAAW,QAAQ,YAAY,UAAW,QAAO;AACtD,SAAO,EAAE,GAAG,SAAS,SAAS,SAAS,QAAQ;AACjD;AACA,eAAsB,kBACpB,SACA,iBACA;AACA,QAAM,QAAQ,MAAM,uBAAuB,OAAO;AAClD,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,EAAE,KAAK,QAAQ,IAAI;AACzB,QAAM,eACJ,mBAAmB,QAAQ,mBAAmB;AAChD,QAAM,WAAW,MAAM,IAAI,IAAI,QAAQ,QAAQ,IAAI,YAAY;AAC/D,MAAI,SAAS,QAAQ,mBAAmB,QAAQ;AAC9C,UAAM,IAAI,mBAAmB;AAAA,MAC3B,MAAM;AAAA,MACN,SACE;AAAA,IACJ,CAAC;AACH,QAAM,cAAc,SAAS,QAAQ,aAAa;AAAA,IAChD,CAAC,SAAS,KAAK,SAAS;AAAA,EAC1B;AACA,MAAI,CAAC;AACH,UAAM,IAAI,mBAAmB;AAAA,MAC3B,MAAM;AAAA,MACN,SACE;AAAA,IACJ,CAAC;AACH,SAAO,EAAE,GAAG,OAAO,UAAU,YAAY;AAC3C;AACA,eAAsB,qBACpB,SACA,SACA,iBACA;AACA,QAAM,UAAU,MAAM,kBAAkB,SAAS,eAAe;AAChE,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,aAAa,QAAQ,SAAS,SAAS;AAAA,IAC3C,CAAC,SAAS,KAAK,YAAY;AAAA,EAC7B,GAAG;AACH,MAAI,CAAC;AACH,UAAM,IAAI,mBAAmB;AAAA,MAC3B,MAAM;AAAA,MACN,SAAS,UAAU,OAAO,mDAAmD,OAAO;AAAA,IACtF,CAAC;AACH,QAAM,UAAU,WAAW,aAAa;AAAA,IACtC,CAAC,SAAS,KAAK,kBAAkB,QAAQ,YAAY;AAAA,EACvD;AACA,MAAI,CAAC,SAAS,UAAU,OAAO,WAAW,EAAE,SAAS,OAAO,KAAK,CAAC;AAChE,UAAM,IAAI,mBAAmB;AAAA,MAC3B,MAAM;AAAA,MACN,SAAS,UAAU,OAAO,OAAO,QAAQ,YAAY,IAAI,kCAAkC,OAAO;AAAA,IACpG,CAAC;AACH,SAAO;AAAA,IACL,GAAG;AAAA,IACH,YAAY,CAAC,SAAS,UAAU,OAAO,WAAW,EAAE,SAAS,OAAO,IAChE,QAAS,aACT,WAAW;AAAA,IACf,oBAAoB;AAAA,EACtB;AACF;AAEA,eAAsB,2BACpB,SACA,SACAC,OACA;AACA,MAAI,YAAY,WAAWA,MAAK,CAAC,MAAM,gBAAgBA,MAAK,CAAC,MAAM;AACjE,WAAOA;AACT,QAAM,QAAQ,MAAM,uBAAuB,OAAO,EAAE,MAAM,CAAC,UAAU;AACnE,QACE,iBAAiB,uBACjB,MAAM,SAAS;AAEf,aAAO;AACT,UAAM;AAAA,EACR,CAAC;AACD,MAAI,CAAC,MAAO,QAAOA;AACnB,MAAIA,MAAK,CAAC,MAAM,iBAAiBA,MAAK,CAAC,MAAM;AAC3C,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AACF,MAAI,CAAC,WAAW,eAAe,QAAQ,EAAE,SAASA,MAAK,CAAC,KAAK,EAAE,EAAG,QAAOA;AACzE,QAAM,aAAaA,MAAK;AAAA,IAAQ,CAAC,QAC/B,IAAI,WAAW,gBAAgB,IAC3B,CAAC,iBAAiB,IAAI,MAAM,iBAAiB,MAAM,CAAC,IACpD,CAAC,GAAG;AAAA,EACV;AACA,MAAI,WAAW,OAAO,CAAC,QAAQ,QAAQ,eAAe,EAAE,SAAS;AAC/D,WAAOA;AACT,QAAM,QAAQ,WAAW,QAAQ,eAAe;AAChD,QAAMC,QAAO,SAAS,IAAI,WAAW,QAAQ,CAAC,IAAI;AAClD,MAAI,SAAS,MAAM,CAACA,SAAQA,MAAK,WAAW,IAAI,GAAI,QAAOD;AAC3D,QAAM,UAAU,MAAM,qBAAqB,SAAS,SAASC,KAAI;AACjE,QAAM,UAAU,SAAS;AACzB,MAAI,CAAC,WAAW,CAAC,SAAS;AACxB,UAAM,IAAI;AAAA,MACR,eAAe,OAAO;AAAA,IACxB;AACF,QAAM,SAAS,CAAC,GAAG,UAAU;AAC7B,MAAI,SAAS,EAAG,QAAO,QAAQ,CAAC,IAAI,QAAQ;AAAA,MACvC,QAAO,KAAK,iBAAiB,QAAQ,IAAI;AAC9C,SAAO;AACT;;;AWlJA,OAAOC,WAAU;AAEjB,SAAS,KAAAC,UAAS;AAeX,IAAM,wCAAwCC,MAAK;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,8BAA8BC,GACjC,OAAO;AAAA,EACN,SAASA,GAAE,QAAQ,CAAC;AAAA,EACpB,SAASA,GAAE,QAAQ,OAAO;AAAA,EAC1B,SAASA,GACN,OAAO;AAAA,IACN,MAAMA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,IACtC,MAAMA,GACH,OAAO,EACP,KAAK,EACL,IAAI,CAAC,EACL,IAAI,EAAE,EACN,MAAM,4BAA4B;AAAA,EACvC,CAAC,EACA,OAAO;AACZ,CAAC,EACA,OAAO;AAIV,IAAM,QAAkD;AAAA,EACtD,OAAO,OAAO;AACZ,WAAO,EAAE,UAAU,OAAO,OAAO,4BAA4B,MAAM,KAAK,EAAE;AAAA,EAC5E;AAAA,EACA,OAAO,OAAO;AACZ,WAAO,4BAA4B,MAAM,KAAK;AAAA,EAChD;AACF;AAiBO,IAAM,6BAAN,cAAyC,MAAM;AAAA,EAC3C;AAAA,EAET,YAAY,MAAsC,SAAiB;AACjE,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO;AAAA,EACd;AACF;AAEA,eAAsB,6BACpB,UACA,YAA+B,IAAI,sBAAsB,GACpB;AACrC,MAAI;AACF,UAAM,UAAU,MAAM,mBAAmB,QAAQ;AACjD,UAAM,WAAW,MAAM,UAAU,KAAK;AAAA,MACpC;AAAA,MACA,UAAUD,MAAK,KAAK,SAAS,qCAAqC;AAAA,MAClE,UAAU;AAAA,IACZ,CAAC;AACD,QAAI,SAAS,WAAW,UAAW,QAAO,EAAE,SAAS,QAAQ,UAAU;AACvE,WAAO;AAAA,MACL,UAAU,SAAS;AAAA,MACnB,WAAW,SAAS;AAAA,MACpB;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,EACF,SAAS,OAAO;AACd,UAAM,kBAAkB,KAAK;AAAA,EAC/B;AACF;AAEA,eAAsB,2BAA2B,SAKd;AACjC,QAAM,YAAY,4BAA4B,MAAM;AAAA,IAClD,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS,QAAQ;AAAA,EACnB,CAAC;AACD,MAAI;AACF,WAAO,QAAQ,aAAa,IAAI,sBAAsB,GAAG,MAAM;AAAA,MAC7D;AAAA,MACA,kBAAkB,QAAQ;AAAA,MAC1B,UAAUA,MAAK;AAAA,QACb,MAAM,mBAAmB,QAAQ,OAAO;AAAA,QACxC;AAAA,MACF;AAAA,MACA,UAAU;AAAA,MACV,OAAO;AAAA,IACT,CAAC;AACD,WAAO;AAAA,EACT,SAAS,OAAO;AACd,UAAM,kBAAkB,KAAK;AAAA,EAC/B;AACF;AAEA,SAAS,kBAAkB,OAA4C;AACrE,MAAI,iBAAiB,2BAA4B,QAAO;AACxD,MAAI,iBAAiB,oBAAqB,OAAM;AAChD,MAAI,iBAAiB,wBAAwB;AAC3C,QAAI,MAAM,SAAS,0BAA0B;AAC3C,aAAO,IAAI;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,QACE,MAAM,SAAS,2BACf,MAAM,SAAS,wBACf;AACA,aAAO,IAAI;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,iBAAiBC,GAAE,UAAU;AAC/B,WAAO,IAAI;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO,IAAI;AAAA,IACT;AAAA,IACA;AAAA,EACF;AACF;;;AC9JA,SAAS,cAAAC,aAAY,mBAAmB;AACxC,SAAS,YAAAC,WAAU,UAAAC,SAAQ,QAAQ,aAAAC,kBAAiB;AACpD,OAAOC,WAAU;AAEjB,SAAS,KAAAC,UAAS;;;ACJX,IAAM,WAAN,cAAuB,MAAM;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EAET,YACE,MACA,SACA,SACA;AACA,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,WAAW,SAAS,YAAY;AACrC,SAAK,OAAO,SAAS;AAAA,EACvB;AACF;;;ADRO,IAAM,cAAc;AAE3B,SAAS,mBAAmB,OAAwB;AAClD,MAAI,CAAC,SAASC,MAAK,WAAW,KAAK,KAAK,MAAM,WAAW,GAAG,EAAG,QAAO;AACtE,SAAO,CAAC,MAAM,MAAM,OAAO,EAAE,SAAS,IAAI;AAC5C;AAEA,IAAM,mBAAmBC,GACtB,OAAO,EACP,KAAK,EACL,IAAI,CAAC,EACL;AAAA,EACC;AAAA,EACA;AACF;AAEF,IAAM,OAAOA,GACV,OAAO,EACP,KAAK,EACL,IAAI,CAAC,EACL,IAAI,EAAE,EACN;AAAA,EACC;AAAA,EACA;AACF;AAEF,IAAM,cAAcA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAEpD,IAAM,UAAUA,GACb,OAAO,EACP,IAAI,EACJ,OAAO,CAAC,UAAU,CAAC,SAAS,QAAQ,EAAE,SAAS,IAAI,IAAI,KAAK,EAAE,QAAQ,GAAG;AAAA,EACxE,SAAS;AACX,CAAC;AAEH,IAAM,iBAAiBA,GACpB,OAAO;AAAA,EACN,SAASA,GAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EACjC,gBAAgBA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,MAAS,EAAE,QAAQ,GAAG;AACrE,CAAC,EACA,QAAQ,EAAE,SAAS,MAAM,gBAAgB,IAAI,CAAC;AAE1C,IAAM,uBAAuBA,GAAE,OAAO;AAAA,EAC3C,SAASA,GAAE,QAAQ,CAAC;AAAA,EACpB,SAAS;AAAA,EACT,OAAO,KAAK,QAAQ,OAAO;AAAA,EAC3B,UAAU,iBAAiB,QAAQ,cAAc;AAAA,EACjD,kBAAkB,iBAAiB,SAAS;AAAA,EAC5C,SAASA,GAAE,MAAM,gBAAgB,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACjD,SAAS,QAAQ,SAAS;AAAA,EAC1B,UAAU;AAAA,EACV,QAAQ,QAAQ,SAAS;AAC3B,CAAC;AAED,IAAM,wBAAwBA,GAAE,OAAO;AAAA,EACrC,MAAMA,GAAE,QAAQ,WAAW;AAAA,EAC3B,gBAAgBA,GAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,MAAS,EAAE,QAAQ,GAAG;AACrE,CAAC;AAED,IAAM,qBAAqBA,GAAE,OAAO,EAAE,MAAMA,GAAE,QAAQ,QAAQ,EAAE,CAAC;AAE1D,IAAM,oBAAoBA,GAAE,OAAO;AAAA,EACxC;AAAA,EACA,MAAM;AAAA,EACN,SAASA,GAAE,MAAM,gBAAgB,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACjD,QAAQA,GAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EAChC,UAAUA,GACP,mBAAmB,QAAQ,CAAC,uBAAuB,kBAAkB,CAAC,EACtE,QAAQ,EAAE,MAAM,aAAa,gBAAgB,IAAI,CAAC;AACvD,CAAC;AAEM,IAAM,uBAAuBA,GACjC,OAAO;AAAA,EACN,SAASA,GAAE,QAAQ,CAAC;AAAA,EACpB,SAASA,GAAE,OAAO;AAAA,IAChB;AAAA,IACA,MAAM;AAAA,IACN,SAAS,QAAQ,SAAS;AAAA,IAC1B,mBAAmBA,GAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EAC7C,CAAC;AAAA,EACD,UAAU,iBAAiB,QAAQ,cAAc;AAAA,EACjD,kBAAkB,iBAAiB,SAAS;AAAA,EAC5C,QAAQA,GACL,OAAO,EAAE,SAASA,GAAE,MAAM,gBAAgB,EAAE,IAAI,GAAG,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,EAClE,OAAO,EACP,SAAS;AAAA,EACZ,QAAQA,GAAE,MAAM,iBAAiB,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACjD,QAAQ,QAAQ,SAAS;AAC3B,CAAC,EACA,YAAY,CAAC,QAAQ,YAAY;AAChC,QAAM,QAAQ,oBAAI,IAAY;AAC9B,aAAW,CAAC,OAAO,KAAK,KAAK,OAAO,OAAO,QAAQ,GAAG;AACpD,QAAI,MAAM,IAAI,MAAM,IAAI,GAAG;AACzB,cAAQ,SAAS;AAAA,QACf,MAAMA,GAAE,aAAa;AAAA,QACrB,MAAM,CAAC,UAAU,OAAO,MAAM;AAAA,QAC9B,SAAS,yBAAyB,MAAM,IAAI;AAAA,MAC9C,CAAC;AAAA,IACH;AACA,UAAM,IAAI,MAAM,IAAI;AAAA,EACtB;AACF,CAAC;AAEI,IAAM,qBAAqBA,GAAE,MAAM;AAAA,EACxC;AAAA,EACA;AACF,CAAC;AAeD,SAAS,eAAe,QAAwB;AAC9C,SAAOC,YAAW,QAAQ,EAAE,OAAO,MAAM,EAAE,OAAO,KAAK;AACzD;AAEA,SAAS,cAAc,OAAuB;AAC5C,SAAO,MACJ,MAAM,GAAG,EACT,OAAO,OAAO,EACd,IAAI,CAAC,SAAS,GAAG,KAAK,OAAO,CAAC,EAAE,YAAY,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC,EAAE,EAC/D,KAAK,GAAG;AACb;AAEO,SAAS,sBAAsB,QAAwC;AAC5E,MAAI,OAAO,YAAY,EAAG,QAAO;AAEjC,SAAO,qBAAqB,MAAM;AAAA,IAChC,SAAS;AAAA,IACT,SAAS;AAAA,MACP,MAAM,OAAO;AAAA,MACb,MAAM,cAAc,OAAO,OAAO;AAAA,MAClC,SAAS,OAAO;AAAA,MAChB,mBAAmB;AAAA,IACrB;AAAA,IACA,UAAU,OAAO;AAAA,IACjB,kBAAkB,OAAO;AAAA,IACzB,QAAQ;AAAA,MACN;AAAA,QACE,MAAM,OAAO;AAAA,QACb,MAAM,cAAc,OAAO,KAAK;AAAA,QAChC,SAAS,OAAO;AAAA,QAChB,QAAQ;AAAA,QACR,UAAU,OAAO,SAAS,UACtB;AAAA,UACE,MAAM;AAAA,UACN,gBAAgB,OAAO,SAAS;AAAA,QAClC,IACA,EAAE,MAAM,SAAS;AAAA,MACvB;AAAA,IACF;AAAA,IACA,QAAQ,OAAO;AAAA,EACjB,CAAC;AACH;AAEA,eAAe,WAAW,UAAoC;AAC5D,MAAI;AACF,UAAMC,UAAS,QAAQ;AACvB,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,SAAU,QAAO;AAC/D,UAAM;AAAA,EACR;AACF;AAEA,eAAsB,qBACpB,aACwB;AACxB,SAAQ,MAAM,WAAWH,MAAK,KAAK,aAAa,WAAW,CAAC,IACxD,cACA;AACN;AAEA,eAAsB,qBACpB,aAC2B;AAC3B,UAAQ,MAAM,yBAAyB,WAAW,GAAG;AACvD;AAEA,eAAsB,yBACpB,aAC+B;AAC/B,QAAM,aAAa,MAAM,qBAAqB,WAAW;AACzD,MAAI,CAAC,YAAY;AACf,UAAM,IAAI;AAAA,MACR;AAAA,MACA,GAAG,WAAW,qBAAqB,WAAW;AAAA,MAC9C;AAAA,QACE,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,QAAM,aAAaA,MAAK,KAAK,aAAa,UAAU;AACpD,MAAI;AACJ,MAAI;AACF,aAAS,MAAMG,UAAS,YAAY,MAAM;AAAA,EAC5C,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD,YAAM,IAAI;AAAA,QACR;AAAA,QACA,GAAG,UAAU,qBAAqB,WAAW;AAAA,QAC7C;AAAA,UACE,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,UAAM;AAAA,EACR;AAEA,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,MAAM;AAAA,EAC5B,QAAQ;AACN,UAAM,IAAI;AAAA,MACR;AAAA,MACA,GAAG,UAAU;AAAA,IACf;AAAA,EACF;AAEA,QAAM,SAAS,mBAAmB,UAAU,MAAM;AAClD,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,UAAU,OAAO,MAAM,OAC1B,IAAI,CAAC,UAAU,GAAG,MAAM,KAAK,KAAK,GAAG,KAAK,QAAQ,KAAK,MAAM,OAAO,EAAE,EACtE,KAAK,IAAI;AACZ,UAAM,IAAI;AAAA,MACR;AAAA,MACA,GAAG,UAAU,gBAAgB,OAAO;AAAA,IACtC;AAAA,EACF;AACA,QAAM,aAAa,OAAO;AAC1B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,UAAU,eAAe,MAAM;AAAA,IAC/B;AAAA,IACA,QAAQ,sBAAsB,UAAU;AAAA,IACxC,mBAAmB,WAAW,YAAY;AAAA,EAC5C;AACF;AAEA,eAAsB,iBACpB,aACuB;AACvB,SAAO,sBAAsB,MAAM,qBAAqB,WAAW,CAAC;AACtE;AAEA,eAAsB,iBACpB,aACA,QACA,UAAyC,CAAC,GAC3B;AACf,QAAM,aAAc,MAAM,qBAAqB,WAAW,KAAM;AAChE,QAAM,aAAaH,MAAK,KAAK,aAAa,UAAU;AACpD,QAAM,gBAAgBA,MAAK;AAAA,IACzB;AAAA,IACA,IAAI,UAAU,IAAI,QAAQ,GAAG,IAAI,YAAY,CAAC,EAAE,SAAS,KAAK,CAAC;AAAA,EACjE;AACA,MAAI;AACF,UAAMI;AAAA,MACJ;AAAA,MACA,GAAG,KAAK,UAAU,qBAAqB,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC;AAAA;AAAA,MAC9D;AAAA,QACE,UAAU;AAAA,QACV,MAAM;AAAA,MACR;AAAA,IACF;AACA,QAAI,QAAQ,kBAAkB;AAC5B,YAAM,gBAAgB,MAAMD,UAAS,YAAY,MAAM,EAAE;AAAA,QACvD,CAAC,UAAmB;AAClB,cAAK,MAAgC,SAAS,SAAU,QAAO;AAC/D,gBAAM;AAAA,QACR;AAAA,MACF;AACA,UACE,kBAAkB,QAClB,eAAe,aAAa,MAAM,QAAQ,kBAC1C;AACA,cAAM,IAAI;AAAA,UACR;AAAA,UACA,GAAG,UAAU;AAAA,UACb;AAAA,YACE,MAAM;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,UAAME,QAAO,eAAe,UAAU;AAAA,EACxC,SAAS,OAAO;AACd,UAAM,OAAO,aAAa,EAAE,MAAM,MAAM,MAAS;AACjD,UAAM;AAAA,EACR;AACF;AAEA,eAAsB,qBACpB,aACAC,cACA,UAAyC,CAAC,GACX;AAC/B,QAAM,WAAW,MAAM,yBAAyB,WAAW;AAC3D,QAAM,SAAS,qBAAqB,MAAM;AAAA,IACxC,GAAG,SAAS;AAAA,IACZ,SAAS,EAAE,GAAG,SAAS,OAAO,SAAS,MAAMA,aAAY;AAAA,EAC3D,CAAC;AACD,MACE,OAAO,QAAQ,SAAS,SAAS,OAAO,QAAQ,QAChD,SAAS,mBACT;AACA,UAAM,iBAAiB,aAAa,QAAQ;AAAA,MAC1C,kBAAkB,QAAQ,oBAAoB,SAAS;AAAA,IACzD,CAAC;AAAA,EACH;AACA,SAAO,yBAAyB,WAAW;AAC7C;AAEO,SAAS,YAAY,OAAuB;AACjD,QAAM,aAAa,MAChB,KAAK,EACL,YAAY,EACZ,QAAQ,aAAa,EAAE,EACvB,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE,EACtB,MAAM,GAAG,EAAE;AACd,SAAO,cAAc;AACvB;AAEO,SAAS,mBAAmB,OAAuB;AACxD,QAAM,eAAe,MAAM,KAAK,EAAE,QAAQ,aAAa,EAAE;AACzD,QAAM,QAAQ,aACX,QAAQ,sBAAsB,OAAO,EACrC,MAAM,eAAe,EACrB,OAAO,OAAO;AACjB,QAAM,OAAO,MACV,IAAI,CAAC,SAAS,GAAG,KAAK,OAAO,CAAC,EAAE,YAAY,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC,EAAE,EAC/D,KAAK,GAAG;AACX,SAAO,KAAK,MAAM,GAAG,GAAG,KAAK;AAC/B;;;AEhWA,OAAOC,WAAU;AAEjB,SAAS,KAAAC,UAAS;AAeX,IAAM,yCAAyCC,MAAK;AAAA,EACzD;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,+BAA+BC,GAClC,OAAO;AAAA,EACN,SAASA,GAAE,QAAQ,CAAC;AAAA,EACpB,SAASA,GAAE,QAAQ,QAAQ;AAAA,EAC3B,SAASA,GACN,OAAO;AAAA,IACN,MAAMA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,IACtC,MAAMA,GACH,OAAO,EACP,KAAK,EACL,IAAI,CAAC,EACL,IAAI,GAAG,EACP,MAAM,4BAA4B;AAAA,EACvC,CAAC,EACA,OAAO;AACZ,CAAC,EACA,OAAO;AAMV,IAAMC,SAAmD;AAAA,EACvD,OAAO,OAAO;AACZ,WAAO;AAAA,MACL,UAAU;AAAA,MACV,OAAO,6BAA6B,MAAM,KAAK;AAAA,IACjD;AAAA,EACF;AAAA,EACA,OAAO,OAAO;AACZ,WAAO,6BAA6B,MAAM,KAAK;AAAA,EACjD;AACF;AAiBO,IAAM,8BAAN,cAA0C,MAAM;AAAA,EAC5C;AAAA,EAET,YAAY,MAAuC,SAAiB;AAClE,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO;AAAA,EACd;AACF;AAEA,eAAsB,8BACpB,UACA,YAA+B,IAAI,sBAAsB,GACnB;AACtC,MAAI;AACF,UAAM,UAAU,MAAM,mBAAmB,QAAQ;AACjD,UAAM,WAAW,MAAM,UAAU,KAAK;AAAA,MACpC,OAAAA;AAAA,MACA,UAAUF,MAAK,KAAK,SAAS,sCAAsC;AAAA,MACnE,UAAU;AAAA,IACZ,CAAC;AACD,QAAI,SAAS,WAAW,UAAW,QAAO,EAAE,SAAS,QAAQ,UAAU;AACvE,WAAO;AAAA,MACL,UAAU,SAAS;AAAA,MACnB,WAAW,SAAS;AAAA,MACpB;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,EACF,SAAS,OAAO;AACd,UAAMG,mBAAkB,KAAK;AAAA,EAC/B;AACF;AAEA,eAAsB,4BAA4B,SAKd;AAClC,QAAM,YAAY,6BAA6B,MAAM;AAAA,IACnD,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS,QAAQ;AAAA,EACnB,CAAC;AACD,MAAI;AACF,WAAO,QAAQ,aAAa,IAAI,sBAAsB,GAAG,MAAM;AAAA,MAC7D,OAAAD;AAAA,MACA,kBAAkB,QAAQ;AAAA,MAC1B,UAAUF,MAAK;AAAA,QACb,MAAM,mBAAmB,QAAQ,OAAO;AAAA,QACxC;AAAA,MACF;AAAA,MACA,UAAU;AAAA,MACV,OAAO;AAAA,IACT,CAAC;AACD,WAAO;AAAA,EACT,SAAS,OAAO;AACd,UAAMG,mBAAkB,KAAK;AAAA,EAC/B;AACF;AAEA,SAASA,mBAAkB,OAA6C;AACtE,MAAI,iBAAiB,4BAA6B,QAAO;AACzD,MAAI,iBAAiB,oBAAqB,OAAM;AAChD,MAAI,iBAAiB,wBAAwB;AAC3C,QAAI,MAAM,SAAS,0BAA0B;AAC3C,aAAO,IAAI;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,QACE,MAAM,SAAS,2BACf,MAAM,SAAS,wBACf;AACA,aAAO,IAAI;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,iBAAiBF,GAAE,UAAU;AAC/B,WAAO,IAAI;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO,IAAI;AAAA,IACT;AAAA,IACA;AAAA,EACF;AACF;;;AflHA,eAAsB,wBACpB,UAA8B,CAAC,GACH;AAC5B,QAAM,kBAAkB,QAAQ,mBAAmB;AAAA,IACjD,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AACA,QAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI;AACvC,QAAM,aAAa,wBAAwB;AAAA,IACzC,KAAK,QAAQ,OAAO,QAAQ;AAAA,IAC5B,SAAS,QAAQ;AAAA,EACnB,CAAC;AACD,QAAM,iBAAiB,MAAM,uBAAuB,GAAG;AACvD,QAAM,kBAAkB,iBACpB,MAAM,uBAAuB,cAAc,IAC3C,uBAAuB,GAAG;AAC9B,MAAI,UAAkD,EAAE,QAAQ,UAAU;AAC1E,MAAI,gBAAgB;AAClB,QAAI;AACF,YAAM,SAAS,MAAM,uBAAuB;AAAA,QAC1C,GAAG;AAAA,QACH,KAAK;AAAA,MACP,CAAC;AACD,UAAI;AACF,kBAAU;AAAA,UACR,QAAQ;AAAA,UACR,IAAI,OAAO,QAAQ,QAAQ;AAAA,UAC3B,MAAM,OAAO,QAAQ,QAAQ;AAAA,QAC/B;AAAA,IACJ,QAAQ;AACN,gBAAU,EAAE,QAAQ,UAAU;AAAA,IAChC;AAAA,EACF;AACA,QAAM,aACJ,QAAQ,WAAW,cACnB,OAAO,OAAO,eAAe,EAAE;AAAA,IAC7B,CAACG,aAAYA,SAAQ,WAAW;AAAA,EAClC;AAEF,SAAO;AAAA,IACL,QAAQ;AAAA,MACN,YAAY,EAAE,MAAM,YAAY,QAAQ,KAAK;AAAA,MAC7C;AAAA,MACA;AAAA,MACA,YAAY,iBACR,EAAE,SAAS,gBAAgB,QAAQ,KAAK,IACxC,EAAE,QAAQ,UAAU;AAAA,IAC1B;AAAA,IACA,SAAS;AAAA,MACP,QAAQ;AAAA,MACR,MAAM,gBAAgB;AAAA,MACtB,SAAS,gBAAgB;AAAA,IAC3B;AAAA,IACA,QAAQ,kBAAkB,aAAa,OAAO;AAAA,IAC9C,SAAS;AAAA,EACX;AACF;AAEA,eAAe,uBAAuB,KAAqC;AACzE,MAAI;AACF,WAAO,MAAM,mBAAmB,GAAG;AAAA,EACrC,SAAS,OAAO;AACd,QACE,iBAAiB,uBACjB,MAAM,SAAS,4BACf;AACA,aAAO;AAAA,IACT;AACA,UAAM;AAAA,EACR;AACF;AAEA,eAAe,uBAAuB,gBAAwB;AAC5D,QAAM,CAAC,OAAO,OAAO,MAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,IAC/C;AAAA,MACE;AAAA,MACAC,OAAK,KAAK,gBAAgB,qCAAqC;AAAA,MAC/D,MAAM,6BAA6B,cAAc;AAAA,IACnD;AAAA,IACA,aAAa,cAAc;AAAA,IAC3B;AAAA,MACE;AAAA,MACAA,OAAK,KAAK,gBAAgB,sCAAsC;AAAA,MAChE,MAAM,8BAA8B,cAAc;AAAA,IACpD;AAAA,EACF,CAAC;AACD,SAAO,EAAE,OAAO,OAAO,OAAO;AAChC;AAEA,eAAe,iBACb,SACA,eACA,SAImC;AACnC,MAAI;AACF,UAAM,QAAQ,MAAM,QAAQ;AAC5B,WAAO,MAAM,WAAW,WACpB;AAAA,MACE,MAAM;AAAA,MACN,MAAM,MAAM,UAAU,QAAQ;AAAA,MAC9B,QAAQ;AAAA,MACR,SAAS,MAAM,UAAU;AAAA,IAC3B,IACA,EAAE,MAAM,eAAe,QAAQ,UAAU;AAAA,EAC/C,SAAS,OAAO;AACd,WAAO;AAAA,MACL,OACE,iBAAiB,SAAS,UAAU,QAChC,OAAO,MAAM,IAAI,IACjB,GAAG,QAAQ,YAAY,CAAC;AAAA,MAC9B,MAAM;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,EACF;AACF;AAEA,eAAe,aACb,gBACmC;AACnC,QAAM,aAAaA,OAAK,KAAK,gBAAgB,WAAW;AACxD,MAAI;AACF,UAAM,WAAW,MAAM,yBAAyB,cAAc;AAC9D,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM,SAAS,OAAO,QAAQ;AAAA,MAC9B,QAAQ;AAAA,MACR,SAAS,SAAS,WAAW;AAAA,IAC/B;AAAA,EACF,SAAS,OAAO;AACd,QACE,iBAAiB,SACjB,UAAU,SACV,MAAM,SAAS,oBACf;AACA,aAAO,EAAE,MAAM,YAAY,QAAQ,UAAU;AAAA,IAC/C;AACA,WAAO;AAAA,MACL,OACE,iBAAiB,SAAS,UAAU,QAChC,OAAO,MAAM,IAAI,IACjB;AAAA,MACN,MAAM;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,EACF;AACF;AAEA,SAAS,uBAAuB,KAAa;AAC3C,QAAM,OAAOA,OAAK,QAAQ,GAAG;AAC7B,SAAO;AAAA,IACL,OAAO;AAAA,MACL,MAAMA,OAAK,KAAK,MAAM,qCAAqC;AAAA,MAC3D,QAAQ;AAAA,IACV;AAAA,IACA,OAAO,EAAE,MAAMA,OAAK,KAAK,MAAM,WAAW,GAAG,QAAQ,UAAmB;AAAA,IACxE,QAAQ;AAAA,MACN,MAAMA,OAAK,KAAK,MAAM,sCAAsC;AAAA,MAC5D,QAAQ;AAAA,IACV;AAAA,EACF;AACF;;;AgBpNA,SAAS,cAAAC,aAAY,eAAAC,oBAAmB;AACxC,OAAOC,SAAQ;AAEf,SAAS,KAAAC,UAAS;AAsBlB,IAAM,aAAa,oBAAI,IAAI,CAAC,UAAU,IAAI,CAAC;AAC3C,IAAM,gCAAgCC,GACnC,OAAO,EACP,UAAU,CAAC,UAAU,MAAM,KAAK,CAAC,EACjC,OAAO,CAAC,UAAU;AACjB,QAAM,gBAAgB,MAAM,KAAK,KAAK,EAAE;AACxC,SAAO,iBAAiB,KAAK,iBAAiB;AAChD,CAAC;AAEI,IAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBzB,eAAsB,eAAe,SAQN;AAC7B,MACE,QAAQ,KAAK,WAAW,KACxB,QAAQ,KAAK,KAAK,CAAC,QAAQ,WAAW,IAAI,GAAG,CAAC,GAC9C;AACA,WAAO,EAAE,UAAU,GAAG,QAAQ,UAAU;AAAA,EAC1C;AAEA,QAAM,aAAa,QAAQ,KAAK,CAAC;AACjC,QAAMC,QAAO,QAAQ,KAAK,MAAM,CAAC;AACjC,QAAM,aAAa,wBAAwB;AAAA,IACzC,KAAK,QAAQ;AAAA,IACb,SAAS,QAAQ,WAAWC,IAAG,QAAQ;AAAA,EACzC,CAAC;AACD,QAAM,MAAM,QAAQ,QAAQ,MAAM,oBAAI,KAAK;AAE3C,MAAI,eAAe,SAAS;AAC1B,UAAM,SAAS,kBAAkBD,OAAM,SAAS;AAChD,QAAI,CAAC,OAAO,GAAI,QAAO,WAAW,OAAO,OAAO,OAAO,IAAI;AAC3D,UAAM,QAAQD,GAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,OAAO,KAAK;AAC9D,QAAI,CAAC,MAAM,QAAS,QAAO,WAAW,uBAAuB,OAAO,IAAI;AACxE,WAAO,SAAS;AAAA,MACd,GAAG;AAAA,MACH;AAAA,MACA,OAAO,MAAM;AAAA,MACb,MAAM,OAAO;AAAA,MACb;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,eAAe,YAAY;AAC7B,UAAM,SAAS,kBAAkBC,OAAM,SAAS;AAChD,QAAI,CAAC,OAAO,GAAI,QAAO,WAAW,OAAO,OAAO,OAAO,IAAI;AAC3D,UAAM,QAAQD,GACX,OAAO,EACP,KAAK,EACL,MAAM,qBAAqB,EAC3B,UAAU,OAAO,KAAK;AACzB,QAAI,CAAC,MAAM,QAAS,QAAO,WAAW,uBAAuB,OAAO,IAAI;AACxE,WAAO,YAAY;AAAA,MACjB,GAAG;AAAA,MACH;AAAA,MACA,MAAM,OAAO;AAAA,MACb,OAAO,MAAM;AAAA,IACf,CAAC;AAAA,EACH;AAEA,MAAI,eAAe,UAAU;AAC3B,UAAM,SAAS,kBAAkBC,OAAM,gBAAgB;AACvD,QAAI,CAAC,OAAO,GAAI,QAAO,WAAW,OAAO,OAAO,OAAO,IAAI;AAC3D,WAAO,sBAAsB;AAAA,MAC3B,GAAG;AAAA,MACH;AAAA,MACA,MAAM,OAAO;AAAA,MACb,cAAc,OAAO;AAAA,IACvB,CAAC;AAAA,EACH;AAEA,MAAI,eAAe,mBAAmBA,MAAK,CAAC,MAAM,UAAU;AAC1D,UAAM,SAAS,kBAAkBA,MAAK,MAAM,CAAC,GAAG,gBAAgB;AAChE,QAAI,CAAC,OAAO,GAAI,QAAO,WAAW,OAAO,OAAO,OAAO,IAAI;AAC3D,UAAME,eAAc,8BAA8B,UAAU,OAAO,KAAK;AACxE,QAAI,CAACA,aAAY,SAAS;AACxB,aAAO,WAAW,8BAA8B,OAAO,IAAI;AAAA,IAC7D;AACA,WAAO,sBAAsB;AAAA,MAC3B,GAAG;AAAA,MACH;AAAA,MACA,aAAaA,aAAY;AAAA,MACzB,MAAM,OAAO;AAAA,IACf,CAAC;AAAA,EACH;AAEA,MACE,eAAe,YACf,eAAe,mBACf,eAAe,UACf;AACA,UAAM,SAAS,cAAcF,KAAI;AACjC,QAAI,CAAC,OAAO,GAAI,QAAO,WAAW,OAAO,OAAO,OAAO,IAAI;AAC3D,QAAI,eAAe,UAAU;AAC3B,aAAO,UAAU,EAAE,GAAG,SAAS,YAAY,MAAM,OAAO,KAAK,CAAC;AAAA,IAChE;AACA,QAAI,eAAe,iBAAiB;AAClC,aAAO,iBAAiB,EAAE,GAAG,SAAS,YAAY,MAAM,OAAO,KAAK,CAAC;AAAA,IACvE;AACA,WAAO,UAAU,EAAE,GAAG,SAAS,YAAY,MAAM,OAAO,KAAK,CAAC;AAAA,EAChE;AAEA,SAAO,WAAW,gCAAgCA,MAAK,SAAS,QAAQ,CAAC;AAC3E;AAEA,eAAe,SAAS,SASO;AAC7B,MAAI;AACF,UAAM,SAAS,MAAM,oBAAoB;AAAA,MACvC,YAAY,QAAQ;AAAA,IACtB,CAAC;AACD,UAAM,iBACJ,OAAO,WAAW,WACd,OAAO,MAAM,kBACZ,QAAQ,0BAA0B,qBAAqB;AAC9D,UAAM,eACJ,QAAQ,uBAAuB,KAAK,oBAAoB;AAC1D,UAAM,SAAS,aAAa,OAAO;AACnC,UAAM,WAAW,MAAM,OAAO,MAAM;AAAA,MAClC,OAAO,QAAQ;AAAA,MACf,oBAAoB,gBAAgB,cAAc;AAAA,MAClD,eAAe,gBAAgB,YAAY;AAAA,IAC7C,CAAC;AACD,UAAM,QAAyB;AAAA,MAC7B,GAAI,OAAO,WAAW,WAAW,OAAO,QAAQ,CAAC;AAAA,MACjD;AAAA,MACA,SAAS;AAAA,QACP,WAAW,SAAS;AAAA,QACpB;AAAA,QACA,WACE,KAAK,MAAM,QAAQ,IAAI,EAAE,QAAQ,IAAI,GAAK,IAC1C,SAAS;AAAA,MACb;AAAA,MACA,SAAS;AAAA,IACX;AACA,UAAM,qBAAqB,EAAE,YAAY,QAAQ,YAAY,MAAM,CAAC;AAEpE,UAAM,OAAO;AAAA,MACX,QAAQ,SAAS;AAAA,MACjB,SAAS,SAAS;AAAA,MAClB,kBAAkB,SAAS;AAAA,IAC7B;AACA,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ,QAAQ,OACZ,KAAK,UAAU,MAAM,MAAM,CAAC,IAC5B;AAAA,IACN;AAAA,EACF,SAAS,OAAO;AACd,WAAO,YAAY,OAAO,QAAQ,IAAI;AAAA,EACxC;AACF;AAEA,eAAe,YAAY,SAMI;AAC7B,MAAI;AACF,UAAM,SAAS,MAAM,oBAAoB;AAAA,MACvC,YAAY,QAAQ;AAAA,IACtB,CAAC;AACD,QAAI,OAAO,WAAW,aAAa,CAAC,OAAO,MAAM,SAAS;AACxD,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,IACF;AACA,UAAM,WAAW,MAAM,aAAa,OAAO,EAAE,SAAS;AAAA,MACpD,cAAc,OAAO,MAAM,QAAQ;AAAA,MACnC,WAAW,OAAO,MAAM,QAAQ;AAAA,MAChC,OAAO,QAAQ;AAAA,IACjB,CAAC;AACD,QAAI,SAAS,QAAQ,WAAW,iBAAiB;AAC/C,YAAM,IAAI,mBAAmB;AAAA,QAC3B,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AACA,UAAM,qBAAqB;AAAA,MACzB,YAAY,QAAQ;AAAA,MACpB,OAAO;AAAA,QACL,gBAAgB,OAAO,MAAM;AAAA,QAC7B,SAAS;AAAA,UACP,YAAY,SAAS;AAAA,UACrB,UAAU,SAAS;AAAA,UACnB,sBAAsB,SAAS,QAAQ,eACnC,EAAE,IAAI,SAAS,QAAQ,aAAa,GAAG,IACvC;AAAA,QACN;AAAA,QACA,SAAS;AAAA,MACX;AAAA,IACF,CAAC;AACD,WAAO,cAAc,SAAS,SAAS,QAAQ,MAAM,eAAe;AAAA,EACtE,SAAS,OAAO;AACd,WAAO,YAAY,OAAO,QAAQ,IAAI;AAAA,EACxC;AACF;AAEA,eAAe,UAAU,SAKM;AAC7B,MAAI;AACF,UAAM,SAAS,MAAM,oBAAoB;AAAA,MACvC,YAAY,QAAQ;AAAA,IACtB,CAAC;AACD,QAAI,OAAO,WAAW,aAAa,CAAC,OAAO,MAAM,SAAS;AACxD,aAAO,gBAAgB,QAAQ,IAAI;AAAA,IACrC;AACA,QAAI;AACF,YAAM,SAAS,aAAa,OAAO;AACnC,YAAM,UAAU,MAAM,OAAO,OAAO;AAAA,QAClC,mBAAmB,OAAO,MAAM,QAAQ;AAAA,MAC1C,CAAC;AACD,UAAI,QAAQ,WAAW,iBAAiB;AACtC,cAAM,qBAAqB;AAAA,UACzB,YAAY,QAAQ;AAAA,UACpB,OAAO,EAAE,GAAG,OAAO,OAAO,SAAS,OAAU;AAAA,QAC/C,CAAC;AAAA,MACH,OAAO;AACL,cAAM,gBAAgB,MAAM,OAAO,cAAc;AAAA,UAC/C,mBAAmB,OAAO,MAAM,QAAQ;AAAA,QAC1C,CAAC;AACD,cAAM,uBAAuB;AAAA,UAC3B,QAAQ,eACJ,EAAE,IAAI,QAAQ,aAAa,GAAG,IAC9B,OAAO,MAAM,QAAQ;AAAA,UACzB,cAAc;AAAA,QAChB;AACA,cAAM,8BAA8B,uBAChC,cAAc,cAAc;AAAA,UAC1B,CAAC,iBAAiB,aAAa,OAAO,qBAAqB;AAAA,QAC7D,IACA;AACJ,cAAM,qBAAqB;AAAA,UACzB,YAAY,QAAQ;AAAA,UACpB,OAAO;AAAA,YACL,GAAG,OAAO;AAAA,YACV,SAAS;AAAA,cACP,GAAG,OAAO,MAAM;AAAA,cAChB,UAAU;AAAA,cACV;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAC;AACD,eAAO;AAAA,UACL;AAAA,YACE,GAAG;AAAA,YACH,cAAc,8BACV,oBAAoB,2BAA2B,IAC/C;AAAA,UACN;AAAA,UACA,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV;AAAA,MACF;AACA,aAAO,cAAc,SAAS,QAAQ,MAAM,QAAQ,MAAM;AAAA,IAC5D,SAAS,OAAO;AACd,UAAI,CAAC,2BAA2B,KAAK,EAAG,OAAM;AAC9C,YAAM,qBAAqB;AAAA,QACzB,YAAY,QAAQ;AAAA,QACpB,OAAO,EAAE,GAAG,OAAO,OAAO,SAAS,OAAU;AAAA,MAC/C,CAAC;AACD,aAAO,gBAAgB,QAAQ,IAAI;AAAA,IACrC;AAAA,EACF,SAAS,OAAO;AACd,WAAO,YAAY,OAAO,QAAQ,IAAI;AAAA,EACxC;AACF;AAEA,eAAe,iBAAiB,SAKD;AAC7B,MAAI;AACF,UAAM,UAAU,MAAM,wBAAwB,OAAO;AACrD,UAAM,uBAAuB;AAAA,MAC3B,QAAQ,OAAO,MAAM,QAAQ;AAAA,MAC7B,QAAQ,SAAS;AAAA,IACnB;AACA,UAAM,8BAA8B,uBAChC,QAAQ,SAAS,cAAc;AAAA,MAC7B,CAAC,iBAAiB,aAAa,OAAO,qBAAqB;AAAA,IAC7D,IACA;AACJ,UAAM,qBAAqB;AAAA,MACzB,YAAY,QAAQ;AAAA,MACpB,OAAO;AAAA,QACL,GAAG,QAAQ,OAAO;AAAA,QAClB,SAAS;AAAA,UACP,GAAG,QAAQ,OAAO,MAAM;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AACD,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,+BAA+B;AAAA,MAC/B,QAAQ;AAAA,IACV;AAAA,EACF,SAAS,OAAO;AACd,WAAO,YAAY,OAAO,QAAQ,IAAI;AAAA,EACxC;AACF;AAEA,eAAe,sBAAsB,SAMN;AAC7B,MAAI;AACF,UAAM,SAAS,MAAM,oBAAoB;AAAA,MACvC,YAAY,QAAQ;AAAA,IACtB,CAAC;AACD,QAAI,OAAO,WAAW,aAAa,CAAC,OAAO,MAAM,SAAS;AACxD,YAAM,IAAI,mBAAmB;AAAA,QAC3B,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AACA,UAAM,WAAW,MAAM,aAAa,OAAO,EAAE,mBAAmB;AAAA,MAC9D,aAAa,QAAQ;AAAA,MACrB,mBAAmB,OAAO,MAAM,QAAQ;AAAA,IAC1C,CAAC;AACD,UAAM,qBAAqB;AAAA,MACzB,YAAY,QAAQ;AAAA,MACpB,OAAO;AAAA,QACL,GAAG,OAAO;AAAA,QACV,SAAS;AAAA,UACP,GAAG,OAAO,MAAM;AAAA,UAChB,sBAAsB,EAAE,IAAI,SAAS,aAAa,GAAG;AAAA,QACvD;AAAA,MACF;AAAA,IACF,CAAC;AACD,WAAO,0BAA0B,SAAS,cAAc,QAAQ,IAAI;AAAA,EACtE,SAAS,OAAO;AACd,WAAO,YAAY,OAAO,QAAQ,IAAI;AAAA,EACxC;AACF;AAEA,eAAe,sBAAsB,SAMN;AAC7B,MAAI;AACF,UAAM,UAAU,MAAM,wBAAwB,OAAO;AACrD,UAAM,UAAU,QAAQ,SAAS,cAAc;AAAA,MAC7C,CAAC,iBAAiB,aAAa,OAAO,QAAQ;AAAA,IAChD;AACA,UAAM,WAAW;AACjB,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,IACF;AACA,UAAM,uBAAuB,EAAE,IAAI,SAAS,GAAG;AAC/C,UAAM,qBAAqB;AAAA,MACzB,YAAY,QAAQ;AAAA,MACpB,OAAO;AAAA,QACL,GAAG,QAAQ,OAAO;AAAA,QAClB,SAAS;AAAA,UACP,GAAG,QAAQ,OAAO,MAAM;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AACD,WAAO,2BAA2B,UAAU,QAAQ,IAAI;AAAA,EAC1D,SAAS,OAAO;AACd,WAAO,YAAY,OAAO,QAAQ,IAAI;AAAA,EACxC;AACF;AAEA,eAAe,wBAAwB,SAYpC;AACD,QAAM,SAAS,MAAM,oBAAoB,EAAE,YAAY,QAAQ,WAAW,CAAC;AAC3E,MAAI,OAAO,WAAW,aAAa,CAAC,OAAO,MAAM,SAAS;AACxD,UAAM,IAAI,mBAAmB;AAAA,MAC3B,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACA,QAAM,gBAAgB;AAAA,IACpB,QAAQ;AAAA,IACR,OAAO,EAAE,GAAG,OAAO,OAAO,SAAS,OAAO,MAAM,QAAQ;AAAA,EAC1D;AACA,MAAI;AACF,UAAM,WAAW,MAAM,aAAa,OAAO,EAAE,cAAc;AAAA,MACzD,mBAAmB,cAAc,MAAM,QAAQ;AAAA,IACjD,CAAC;AACD,WAAO,EAAE,QAAQ,eAAe,SAAS;AAAA,EAC3C,SAAS,OAAO;AACd,QAAI,2BAA2B,KAAK,GAAG;AACrC,YAAM,qBAAqB;AAAA,QACzB,YAAY,QAAQ;AAAA,QACpB,OAAO,EAAE,GAAG,OAAO,OAAO,SAAS,OAAU;AAAA,MAC/C,CAAC;AAAA,IACH;AACA,UAAM;AAAA,EACR;AACF;AAEA,SAAS,8BACP,SACA,eACwC;AACxC,MAAI,cAAc,WAAW,GAAG;AAC9B,WAAO,EAAE,IAAI,cAAc,CAAC,EAAE,GAAG;AAAA,EACnC;AACA,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,oBAAoB,cAAc;AAAA,IACtC,CAAC,iBAAiB,aAAa,OAAO,QAAQ;AAAA,EAChD;AACA,SAAO,oBAAoB,EAAE,IAAI,kBAAkB,GAAG,IAAI;AAC5D;AAEA,SAAS,oBACP,UACA,sBACA,MACmB;AACnB,MAAI,MAAM;AACR,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ,KAAK;AAAA,QACX;AAAA,UACE,GAAG;AAAA,UACH,sBAAsB,uBAClB,oBAAoB,oBAAoB,IACxC;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,SAAS,cAAc,WAAW,GAAG;AACvC,WAAO,EAAE,UAAU,GAAG,QAAQ,yCAAyC;AAAA,EACzE;AACA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ;AAAA,MACN;AAAA,MACA,GAAG,SAAS,cAAc,IAAI,CAAC,iBAAiB;AAC9C,cAAM,SAAS,sBAAsB,OAAO,aAAa,KAAK,MAAM;AACpE,eAAO,GAAG,MAAM,IAAI,aAAa,WAAW,KAAK,aAAa,EAAE,YAAO,aAAa,cAAc;AAAA,MACpG,CAAC;AAAA,IACH,EAAE,KAAK,IAAI;AAAA,EACb;AACF;AAEA,SAAS,2BACP,cACA,MACmB;AACnB,SAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ,OACJ,KAAK;AAAA,MACH,EAAE,iBAAiB,GAAG,QAAQ,YAAY,aAAa;AAAA,MACvD;AAAA,MACA;AAAA,IACF,IACA,iCAAiC,aAAa,WAAW,KAAK,aAAa,EAAE;AAAA,EACnF;AACF;AAEA,SAAS,0BACP,cACA,MACmB;AACnB,SAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ,OACJ,KAAK;AAAA,MACH,EAAE,iBAAiB,GAAG,QAAQ,WAAW,aAAa;AAAA,MACtD;AAAA,MACA;AAAA,IACF,IACA,gCAAgC,aAAa,WAAW,KAAK,aAAa,EAAE;AAAA,EAClF;AACF;AAEA,SAAS,oBAAoB,cAG3B;AACA,SAAO,EAAE,IAAI,aAAa,IAAI,aAAa,aAAa,YAAY;AACtE;AAEA,eAAe,UAAU,SAKM;AAC7B,MAAI;AACF,UAAM,SAAS,MAAM,oBAAoB;AAAA,MACvC,YAAY,QAAQ;AAAA,IACtB,CAAC;AACD,QAAI,OAAO,WAAW,UAAW,QAAO,gBAAgB,QAAQ,IAAI;AAEpE,UAAM,iBAAiB,EAAE,GAAG,OAAO,OAAO,SAAS,OAAU;AAC7D,QAAI,CAAC,OAAO,MAAM,SAAS;AACzB,YAAM,qBAAqB;AAAA,QACzB,YAAY,QAAQ;AAAA,QACpB,OAAO;AAAA,MACT,CAAC;AACD,aAAO,gBAAgB,QAAQ,IAAI;AAAA,IACrC;AACA,QAAI;AACF,YAAM,aAAa,OAAO,EAAE,OAAO;AAAA,QACjC,mBAAmB,OAAO,MAAM,QAAQ;AAAA,MAC1C,CAAC;AAAA,IACH,SAAS,OAAO;AACd,UAAI,CAAC,2BAA2B,KAAK,GAAG;AACtC,cAAM,qBAAqB;AAAA,UACzB,YAAY,QAAQ;AAAA,UACpB,OAAO;AAAA,QACT,CAAC;AACD,cAAM;AAAA,MACR;AAAA,IACF;AACA,UAAM,qBAAqB;AAAA,MACzB,YAAY,QAAQ;AAAA,MACpB,OAAO,EAAE,GAAG,gBAAgB,SAAS,OAAU;AAAA,IACjD,CAAC;AACD,WAAO,gBAAgB,QAAQ,IAAI;AAAA,EACrC,SAAS,OAAO;AACd,WAAO,YAAY,OAAO,QAAQ,IAAI;AAAA,EACxC;AACF;AAEA,SAAS,aAAa,SAGnB;AACD,MAAI,CAAC,QAAQ,WAAW;AACtB,UAAM,IAAI,mBAAmB;AAAA,MAC3B,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACA,SAAO,0BAA0B;AAAA,IAC/B,YAAY,yBAAyB,QAAQ,GAAG;AAAA,IAChD,WAAW,QAAQ;AAAA,EACrB,CAAC;AACH;AAEA,SAAS,sBAA8B;AACrC,SAAOG,aAAY,EAAE,EAAE,SAAS,WAAW;AAC7C;AAEO,SAAS,gBAAgB,OAAuB;AACrD,SAAOC,YAAW,QAAQ,EAAE,OAAO,OAAO,OAAO,EAAE,OAAO,WAAW;AACvE;AAEA,SAAS,cACP,SACA,MACA,QACmB;AACnB,MAAI,MAAM;AACR,WAAO,EAAE,UAAU,GAAG,QAAQ,KAAK,UAAU,SAAS,MAAM,CAAC,EAAE;AAAA,EACjE;AACA,MAAI,WAAW,WAAW;AACxB,WAAO,EAAE,UAAU,GAAG,QAAQ,iCAAiC;AAAA,EACjE;AACA,MAAI,WAAW,WAAW;AACxB,WAAO,EAAE,UAAU,GAAG,QAAQ,iCAAiC;AAAA,EACjE;AACA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ;AAAA,MACN;AAAA,MACA,SAAS,QAAQ,KAAK,KAAK;AAAA,MAC3B,QAAQ,eACJ,iBAAiB,QAAQ,aAAa,WAAW,KAAK,QAAQ,aAAa,EAAE,MAC7E;AAAA,MACJ,YAAY,IAAI,KAAK,QAAQ,YAAY,GAAK,EAAE,YAAY,CAAC;AAAA,IAC/D,EAAE,KAAK,IAAI;AAAA,EACb;AACF;AAEA,SAAS,gBAAgB,MAAkC;AACzD,SAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ,OACJ,KAAK,UAAU,EAAE,QAAQ,aAAa,GAAG,MAAM,CAAC,IAChD;AAAA,EACN;AACF;AAEA,SAAS,YAAY,OAAgB,MAAkC;AACrE,MAAI,iBAAiB,oBAAoB;AACvC,WAAO,aAAa,MAAM,MAAM,MAAM,SAAS,IAAI;AAAA,EACrD;AACA,MAAI,iBAAiB,sBAAsB;AACzC,WAAO,aAAa,MAAM,MAAM,MAAM,SAAS,IAAI;AAAA,EACrD;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,aACP,MACA,SACA,MACmB;AACnB,SAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ,OACJ,KAAK,UAAU,EAAE,OAAO,EAAE,MAAM,QAAQ,EAAE,GAAG,MAAM,CAAC,IACpD,sBAAsB,OAAO;AAAA,EACnC;AACF;AAEA,SAAS,WAAW,SAAiB,MAAkC;AACrE,SAAO,aAAa,oBAAoB,SAAS,IAAI;AACvD;AAEA,SAAS,kBACPJ,OACA,WAG8C;AAC9C,MAAI,OAAO;AACX,MAAI;AAEJ,WAAS,QAAQ,GAAG,QAAQA,MAAK,QAAQ,SAAS,GAAG;AACnD,UAAM,MAAMA,MAAK,KAAK;AACtB,QAAI,QAAQ,UAAU;AACpB,UAAI,KAAM,QAAO,EAAE,OAAO,4BAA4B,MAAM,IAAI,MAAM;AACtE,aAAO;AACP;AAAA,IACF;AACA,QAAI,QAAQ,WAAW;AACrB,YAAM,OAAOA,MAAK,QAAQ,CAAC;AAC3B,UAAI,UAAU,QAAW;AACvB,eAAO,EAAE,OAAO,GAAG,SAAS,sBAAsB,MAAM,IAAI,MAAM;AAAA,MACpE;AACA,UAAI,CAAC,QAAQ,KAAK,WAAW,IAAI,GAAG;AAClC,eAAO,EAAE,OAAO,GAAG,SAAS,sBAAsB,MAAM,IAAI,MAAM;AAAA,MACpE;AACA,cAAQ;AACR,eAAS;AACT;AAAA,IACF;AACA,WAAO,EAAE,OAAO,wBAAwB,GAAG,IAAI,MAAM,IAAI,MAAM;AAAA,EACjE;AACA,MAAI,CAAC,OAAO;AACV,WAAO,EAAE,OAAO,GAAG,SAAS,iBAAiB,MAAM,IAAI,MAAM;AAAA,EAC/D;AACA,SAAO,EAAE,MAAM,IAAI,MAAM,MAAM;AACjC;AAEA,SAAS,cACPA,OAC2E;AAC3E,MAAIA,MAAK,WAAW,EAAG,QAAO,EAAE,MAAM,OAAO,IAAI,KAAK;AACtD,MAAIA,MAAK,WAAW,KAAKA,MAAK,CAAC,MAAM,UAAU;AAC7C,WAAO,EAAE,MAAM,MAAM,IAAI,KAAK;AAAA,EAChC;AACA,SAAO;AAAA,IACL,OAAO,wBAAwBA,MAAK,CAAC,CAAC;AAAA,IACtC,MAAMA,MAAK,SAAS,QAAQ;AAAA,IAC5B,IAAI;AAAA,EACN;AACF;;;ACxuBO,SAAS,sBACd,UACiB;AACjB,SAAO,IAAI,IAAI,OAAO,QAAQ,QAAQ,CAAC;AACzC;AAEA,eAAsB,gBACpB,UACAK,UACAC,OAC+B;AAC/B,QAAM,UAAU,SAAS,IAAID,QAAO;AACpC,SAAO,UAAU,QAAQC,KAAI,IAAI;AACnC;;;ACpBO,IAAM,gBAAgB;AAAA,EAC3B,SAAS;AAAA,EACT,UAAU;AAAA,EACV,OAAO;AAAA,EACP,eAAe;AAAA,EACf,UAAU;AAAA,EACV,aAAa;AACf;AAUO,SAAS,uBAAuB,QAIrB;AAChB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,UAAU,cAAc,OAAO,QAAQ,IACnC,OAAO,WACP,cAAc;AAAA,EACpB;AACF;AAEA,SAAS,cAAc,OAAqC;AAC1D,SAAO,OAAO,OAAO,aAAa,EAAE,KAAK,CAAC,aAAa,aAAa,KAAK;AAC3E;;;AC3BA,SAAS,YAAAC,iBAAgB;AACzB,OAAOC,YAAU;AAEjB,SAAS,KAAAC,WAAS;AAClB,SAAS,WAAW;AACpB,OAAO,gBAAgB;;;ACVvB,SAAS,KAAAC,UAAS;AAIX,IAAM,gCAAgC;AACtC,IAAM,4BAA4B;AAEzC,IAAM,yBAAyBA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAE/D,IAAM,qBAAqBA,GACxB,OAAO;AAAA,EACN,WAAWA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,KAAK,CAAC;AAAA,EAC/C,IAAI;AAAA,EACJ,MAAMA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACtC,gBAAgB;AAAA,EAChB,MAAMA,GACH,OAAO,EACP,KAAK,EACL,IAAI,CAAC,EACL,IAAI,GAAG,EACP,MAAM,4BAA4B;AAAA,EACrC,WAAWA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,KAAK,CAAC;AACjD,CAAC,EACA,OAAO;AAEV,IAAM,yBAAyBA,GAC5B,OAAO,EAAE,UAAUA,GAAE,MAAM,kBAAkB,EAAE,CAAC,EAChD,OAAO;AACV,IAAM,6BAA6BA,GAChC,OAAO,EAAE,SAAS,mBAAmB,CAAC,EACtC,OAAO;AAEV,IAAM,yBAAyBA,GAC5B,OAAO;AAAA,EACN,WAAWA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,KAAK,CAAC;AAAA,EAC/C,IAAI;AAAA,EACJ,MAAMA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACtC,WAAW;AAAA,EACX,MAAMA,GACH,OAAO,EACP,KAAK,EACL,IAAI,CAAC,EACL,IAAI,GAAG,EACP,MAAM,4BAA4B;AAAA,EACrC,WAAWA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,KAAK,CAAC;AACjD,CAAC,EACA,OAAO;AAEV,IAAM,6BAA6BA,GAChC,OAAO,EAAE,cAAcA,GAAE,MAAM,sBAAsB,EAAE,CAAC,EACxD,OAAO;AACV,IAAM,iCAAiCA,GACpC,OAAO,EAAE,aAAa,uBAAuB,CAAC,EAC9C,OAAO;AAEV,IAAM,mCAAmCA,GACtC,OAAO;AAAA,EACN,iBAAiB;AAAA,EACjB,aAAaA,GAAE,QAAQ;AAAA,EACvB,gBAAgBA,GAAE,QAAQ;AAAA,EAC1B,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAASA,GAAE,QAAQ,IAAI;AAAA,EACvB,SAASA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AACrC,CAAC,EACA,OAAO;AAEV,IAAM,mBAAmBA,GAAE,OAAO;AAAA,EAChC,IAAI;AAAA,EACJ,eAAe;AAAA,EACf,SAAS;AAAA,EACT,MAAMA,GAAE,OAAO;AAAA,EACf,gBAAgBA,GAAE,OAAO,EAAE,SAAS;AAAA,EACpC,eAAeA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EACzC,iBAAiB;AAAA,EACjB,QAAQA,GAAE,KAAK,CAAC,UAAU,UAAU,CAAC;AAAA,EACrC,iBAAiBA,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EAC9C,iBAAiBA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,KAAK,CAAC,EAAE,SAAS;AAAA,EAChE,WAAWA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,KAAK,CAAC;AAAA,EAC/C,WAAWA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,KAAK,CAAC;AACjD,CAAC;AACD,IAAM,uBAAuBA,GAAE,OAAO;AAAA,EACpC,aAAaA,GAAE,MAAM,gBAAgB;AACvC,CAAC;AACD,IAAM,0BAA0BA,GAAE,OAAO;AAAA,EACvC,YAAY;AAAA,EACZ,UAAUA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EACpC,WAAWA,GAAE,QAAQ;AAAA,EACrB,SAASA,GAAE,OAAO,EAAE,IAAI,wBAAwB,MAAMA,GAAE,OAAO,EAAE,CAAC;AAAA,EAClE,aAAaA,GAAE,OAAO;AAAA,IACpB,IAAI;AAAA,IACJ,MAAMA,GAAE,OAAO;AAAA,IACf,MAAMA,GAAE,OAAO;AAAA,EACjB,CAAC;AACH,CAAC;AACD,IAAM,iCAAiCA,GAAE,OAAO;AAAA,EAC9C,SAASA,GAAE,QAAQ;AAAA,EACnB,QAAQ;AACV,CAAC;AAUD,IAAM,+BAA+BA,GAClC,OAAO;AAAA,EACN,QAAQ;AAAA,EACR,YAAYA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,KAAK,CAAC;AAAA,EAChD,cAAc;AAAA,EACd,SAASA,GAAE,QAAQ,IAAI;AACzB,CAAC,EACA,OAAO;AAEH,IAAM,8BAA8BA,GAAE,KAAK;AAAA,EAChD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,0BAA0BA,GAAE,OAAO;AAAA,EACvC,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,YAAYA,GAAE;AAAA,IACZA,GAAE,MAAM,CAACA,GAAE,OAAO,GAAGA,GAAE,OAAO,GAAGA,GAAE,QAAQ,GAAGA,GAAE,KAAK,CAAC,CAAC;AAAA,EACzD;AAAA,EACA,QAAQ;AAAA,EACR,aAAaA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,KAAK,CAAC;AACnD,CAAC;AACD,IAAM,yBAAyB,wBAAwB,OAAO;AAAA,EAC5D,SAASA,GAAE,OAAOA,GAAE,QAAQ,CAAC;AAAA,EAC7B,QAAQA,GAAE;AAAA,IACRA,GAAE,OAAO;AAAA,MACP,KAAKA,GAAE,OAAO;AAAA,MACd,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC3B,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC1B,aAAaA,GAAE,KAAK,CAAC,WAAW,WAAW,CAAC,EAAE,SAAS;AAAA,MACvD,UAAUA,GAAE,QAAQ,EAAE,SAAS;AAAA,MAC/B,SAASA,GACN,MAAMA,GAAE,OAAO,EAAE,OAAOA,GAAE,OAAO,GAAG,OAAOA,GAAE,OAAO,EAAE,CAAC,CAAC,EACxD,SAAS;AAAA,IACd,CAAC;AAAA,EACH;AAAA,EACA,SAASA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EACnC,WAAW;AACb,CAAC;AACD,IAAM,uBAAuBA,GAAE,OAAO;AAAA,EACpC,aAAaA,GAAE,MAAM,uBAAuB;AAAA,EAC5C,OAAOA,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EACpC,YAAYA,GAAE,OAAO,EAAE,SAAS;AAClC,CAAC;AACD,IAAM,iCAAiCA,GAAE,OAAO;AAAA,EAC9C,YAAY;AACd,CAAC;AAeD,IAAM,gCAAgCA,GACnC,OAAO;AAAA,EACN,WAAWA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,KAAK,CAAC;AAAA,EAC/C,IAAIA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACpC,YAAYA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,KAAK,CAAC,EAAE,SAAS;AAAA,EAC3D,MAAMA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACtC,sBAAsBA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACtD,WAAWA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,KAAK,CAAC,EAAE,SAAS;AAAA,EAC1D,QAAQA,GAAE,KAAK,CAAC,UAAU,SAAS,CAAC;AACtC,CAAC,EACA,OAAO;AAEV,IAAM,4BAA4BA,GAC/B,OAAO;AAAA,EACN,QAAQA,GAAE,MAAM,6BAA6B;AAC/C,CAAC,EACA,OAAO;AAEV,IAAM,gCAAgC,8BAA8B,OAAO;AAAA,EACzE,OAAOA,GAAE,OAAO,EAAE,MAAM,yBAAyB;AACnD,CAAC;AASD,IAAM,uBAAuBA,GAAE,KAAK;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,yBAGF;AAAA,EACF,yBACE;AAAA,EACF,WAAW;AAAA,EACX,UACE;AAAA,EACF,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,aAAa;AAAA,EACb,eACE;AAAA,EACF,cACE;AAAA,EACF,WAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,6BAA6B;AAAA,EAC7B,gCACE;AAAA,EACF,uBAAuB;AAAA,EACvB,sBAAsB;AAAA,EACtB,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,gBAAgB;AAClB;AAEA,IAAM,yBAAyBA,GAC5B,OAAO;AAAA,EACN,OAAOA,GACJ,OAAO;AAAA,IACN,MAAM;AAAA,IACN,SAASA,GAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EAC3C,CAAC,EACA,OAAO;AACZ,CAAC,EACA,OAAO;AAEH,IAAM,sBAAN,cAAkC,MAAM;AAAA,EACpC;AAAA,EACA;AAAA,EAET,YAAY,SAA8D;AACxE,UAAM,QAAQ,OAAO;AACrB,SAAK,OAAO;AACZ,SAAK,OAAO,QAAQ,QAAQ;AAC5B,SAAK,SAAS,QAAQ;AAAA,EACxB;AACF;AAEO,SAAS,0BACd,MAAyB,QAAQ,KACzB;AACR,SAAO;AAAA,IACL,IAAI,yBAAyB,GAAG,KAAK,KAAK;AAAA,EAC5C;AACF;AAEA,IAAM,2BAA2BA,GAAE,OAAO;AAAA,EACxC,eAAe;AAAA,EACf,OAAOA,GAAE;AAAA,IACPA,GAAE,OAAO;AAAA,MACP,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,iBAAiBA,GAAE,OAAO,EAAE,MAAM,uBAAuB;AAAA,MACzD,WAAW;AAAA,MACX,SAASA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,IACrC,CAAC;AAAA,EACH;AACF,CAAC;AAEM,SAAS,2BAA2B,SAoFzC;AACA,QAAM,aAAa,qBAAqB,QAAQ,UAAU;AAC1D,QAAM,YAAY,CAAC,UACjB,8BAA8B,mBAAmB,MAAM,aAAa,CAAC,UAAU,mBAAmB,MAAM,MAAM,CAAC;AACjH,QAAM,iBAAiB,CAAC,UACtB,8BAA8B,mBAAmB,MAAM,aAAa,CAAC,UAAU,mBAAmB,MAAM,MAAM,CAAC;AACjH,QAAM,gBAAgB,CACpB,UAEA,QAAQ,iBACJ,GAAG,oBAAoB,KAAK,CAAC,qBAC7B,yBAAyB,KAAK;AACpC,SAAO;AAAA,IACL,oBAAoB,CAAC,UACnBC,aAAY;AAAA,MACV;AAAA,MACA,WAAW,QAAQ;AAAA,MACnB,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM,EAAE,aAAa,MAAM,YAAY;AAAA,MACvC,SAAS,EAAE,iCAAiC,MAAM,WAAW;AAAA,MAC7D,gBAAgB;AAAA,IAClB,CAAC;AAAA,IACH,iBAAiB,CAAC,UAChBA,aAAY;AAAA,MACV;AAAA,MACA,WAAW,QAAQ;AAAA,MACnB,SAAS,kBAAkB,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR,MAAM,8BAA8B,mBAAmB,MAAM,aAAa,CAAC,uBAAuB,MAAM,MAAM;AAAA,MAC9G,gBAAgB;AAAA,IAClB,CAAC;AAAA,IACH,gBAAgB,CAAC,UACfA,aAAY;AAAA,MACV;AAAA,MACA,WAAW,QAAQ;AAAA,MACnB,SAAS,kBAAkB,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR,MAAM,eAAe,KAAK;AAAA,MAC1B,gBAAgB;AAAA,IAClB,CAAC;AAAA,IACH,kBAAkB,CAAC,UACjBA,aAAY;AAAA,MACV;AAAA,MACA,WAAW,QAAQ;AAAA,MACnB,SAAS,kBAAkB,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR,MAAM,eAAe,KAAK;AAAA,MAC1B,MAAM,MAAM;AAAA,MACZ,gBAAgB;AAAA,IAClB,CAAC;AAAA,IACH,iBAAiB,CAAC,UAChBA,aAAY;AAAA,MACV;AAAA,MACA,WAAW,QAAQ;AAAA,MACnB,SAAS,kBAAkB,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR,MAAM,GAAG,UAAU,KAAK,CAAC,IAAI,MAAM,OAAO;AAAA,MAC1C,gBAAgB;AAAA,IAClB,CAAC;AAAA,IACH,gBAAgB,CAAC,UACfA,aAAY;AAAA,MACV;AAAA,MACA,WAAW,QAAQ;AAAA,MACnB,SAAS,kBAAkB,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR,MAAM,GAAG,UAAU,KAAK,CAAC,IAAI,mBAAmB,MAAM,YAAY,CAAC;AAAA,MACnE,gBAAgB;AAAA,IAClB,CAAC;AAAA,IACH,wBAAwB,CAAC,UACvBA,aAAY;AAAA,MACV;AAAA,MACA,WAAW,QAAQ;AAAA,MACnB,SAAS,kBAAkB,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR,MAAM,GAAG,UAAU,KAAK,CAAC,IAAI,mBAAmB,MAAM,YAAY,CAAC;AAAA,MACnE,MAAM,EAAE,QAAQ,MAAM,QAAQ,gBAAgB,MAAM,eAAe;AAAA,MACnE,gBAAgB;AAAA,IAClB,CAAC;AAAA,IACH,eAAe,CAAC,UACdA,aAAY;AAAA,MACV;AAAA,MACA,MAAM,EAAE,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK;AAAA,MAC3C,WAAW,QAAQ;AAAA,MACnB,SAAS,kBAAkB,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,gBAAgB;AAAA,IAClB,CAAC;AAAA,IACH,mBAAmB,CAAC,UAClBA,aAAY;AAAA,MACV;AAAA,MACA,MAAM,EAAE,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK;AAAA,MAC3C,WAAW,QAAQ;AAAA,MACnB,SAAS,kBAAkB,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR,MAAM,0BAA0B,KAAK;AAAA,MACrC,gBAAgB;AAAA,IAClB,CAAC;AAAA,IACH,iBAAiB,CAAC,UAChBA,aAAY;AAAA,MACV;AAAA,MACA,MAAM,MAAM,OAAO,EAAE,MAAM,MAAM,KAAK,IAAI,CAAC;AAAA,MAC3C,WAAW,QAAQ;AAAA,MACnB,SAAS,kBAAkB,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR,MAAM,cAAc,KAAK;AAAA,MACzB,gBAAgB,QAAQ,iBACpB,8BAA8B,OAAO;AAAA,QACnC,OAAOD,GAAE,OAAO,EAAE,MAAM,yBAAyB;AAAA,MACnD,CAAC,IACD;AAAA,IACN,CAAC;AAAA,IACH,kBAAkB,CAAC,UACjBC,aAAY;AAAA,MACV;AAAA,MACA,WAAW,QAAQ;AAAA,MACnB,SAAS,kBAAkB,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR,MAAM,0BAA0B,KAAK;AAAA,MACrC,gBAAgB;AAAA,IAClB,CAAC;AAAA,IACH,cAAc,CAAC,UACbA,aAAY;AAAA,MACV;AAAA,MACA,WAAW,QAAQ;AAAA,MACnB,SAAS,kBAAkB,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,gBAAgB;AAAA,IAClB,CAAC;AAAA,IACH,iBAAiB,CAAC,UAChBA,aAAY;AAAA,MACV;AAAA,MACA,WAAW,QAAQ;AAAA,MACnB,SAAS,kBAAkB,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR,MAAM,cAAc,KAAK;AAAA,MACzB,gBAAgB;AAAA,IAClB,CAAC;AAAA,IACH,kBAAkB,CAAC,UACjBA,aAAY;AAAA,MACV;AAAA,MACA,WAAW,QAAQ;AAAA,MACnB,SAAS,kBAAkB,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR,MAAM,QAAQ,iBACV,GAAG,cAAc,KAAK,CAAC,IAAI,mBAAmB,MAAM,YAAY,CAAC,KACjE,mBAAmB,KAAK;AAAA,MAC5B,gBAAgB;AAAA,IAClB,CAAC;AAAA,IACH,kBAAkB,CAAC,UACjBA,aAAY;AAAA,MACV;AAAA,MACA,MAAM,MAAM,OAAO,EAAE,MAAM,MAAM,KAAK,IAAI,CAAC;AAAA,MAC3C,WAAW,QAAQ;AAAA,MACnB,SAAS,kBAAkB,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR,MAAM,qBAAqB,KAAK;AAAA,MAChC,gBAAgB,QAAQ,iBACpB,8BAA8B,OAAO;AAAA,QACnC,OAAOD,GAAE,OAAO,EAAE,MAAM,yBAAyB;AAAA,MACnD,CAAC,IACD;AAAA,IACN,CAAC;AAAA,IACH,YAAY,CAAC,UACXC,aAAY;AAAA,MACV;AAAA,MACA,MAAM,MAAM;AAAA,MACZ,WAAW,QAAQ;AAAA,MACnB,SAAS;AAAA,QACP,qCAAqC,MAAM;AAAA,MAC7C;AAAA,MACA,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,gBAAgB;AAAA,IAClB,CAAC;AAAA,IACH,gBAAgB,CAAC,UACfA,aAAY;AAAA,MACV;AAAA,MACA,MAAM,MAAM;AAAA,MACZ,WAAW,QAAQ;AAAA,MACnB,SAAS,kBAAkB,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR,MAAM,GAAG,oBAAoB,KAAK,CAAC;AAAA,MACnC,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACL;AACF;AAEA,eAAeA,aAAe,SAQf;AACb,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,QAAQ,UAAU,YAAY,OAAO,GAAG;AAAA,MACvD,MACE,QAAQ,SAAS,SAAY,SAAY,KAAK,UAAU,QAAQ,IAAI;AAAA,MACtE,SAAS;AAAA,QACP,QAAQ;AAAA,QACR,GAAI,QAAQ,SAAS,SACjB,CAAC,IACD,EAAE,gBAAgB,mBAAmB;AAAA,QACzC,GAAG,QAAQ;AAAA,MACb;AAAA,MACA,QAAQ,QAAQ;AAAA,MAChB,UAAU;AAAA,MACV,QAAQ,YAAY,QAAQ,GAAM;AAAA,IACpC,CAAC;AAAA,EACH,QAAQ;AACN,UAAM,IAAI,oBAAoB;AAAA,MAC5B,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,QAAM,UAAU,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,MAAS;AAE3D,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,cAAc,uBAAuB,UAAU,OAAO;AAC5D,QAAI,YAAY,SAAS;AACvB,YAAM,IAAI,oBAAoB;AAAA,QAC5B,MAAM,YAAY,KAAK,MAAM;AAAA,QAC7B,SAAS,uBAAuB,YAAY,KAAK,MAAM,IAAI;AAAA,QAC3D,QAAQ,SAAS;AAAA,MACnB,CAAC;AAAA,IACH;AACA,UAAM,IAAI,oBAAoB;AAAA,MAC5B,MAAM;AAAA,MACN,SAAS;AAAA,MACT,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAEA,QAAM,gBAAgB,QAAQ,eAAe,UAAU,OAAO;AAC9D,MAAI,CAAC,cAAc,SAAS;AAC1B,UAAM,IAAI,oBAAoB;AAAA,MAC5B,MAAM;AAAA,MACN,SAAS;AAAA,MACT,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAEA,SAAO,cAAc;AACvB;AAEA,SAAS,kBAAkB,OAAkD;AAC3E,SAAO;AAAA,IACL,eAAe,UAAU,MAAM,KAAK;AAAA,EACtC;AACF;AAEA,SAAS,gBAAgB,OAAsC;AAC7D,SAAO,0BAA0B,mBAAmB,MAAM,SAAS,CAAC;AACtE;AAEA,SAAS,0BAA0B,OAAsC;AACvE,SAAO,GAAG,gBAAgB,KAAK,CAAC;AAClC;AAEA,SAAS,oBAAoB,OAGlB;AACT,SAAO,GAAG,0BAA0B,KAAK,CAAC,IAAI,mBAAmB,MAAM,eAAe,CAAC;AACzF;AAEA,SAAS,yBAAyB,OAG/B;AACD,SAAO,GAAG,oBAAoB,KAAK,CAAC;AACtC;AAEA,SAAS,mBAAmB,OAIzB;AACD,SAAO,GAAG,yBAAyB,KAAK,CAAC,IAAI,mBAAmB,MAAM,YAAY,CAAC;AACrF;AAEA,SAAS,qBAAqB,OAG3B;AACD,SAAO,GAAG,yBAAyB,KAAK,CAAC;AAC3C;AAEA,SAAS,YAAY,SAAuD;AAC1E,SAAO,IAAI;AAAA,IACT,GAAG,QAAQ,WAAW,QAAQ,QAAQ,EAAE,CAAC,GAAG,QAAQ,IAAI;AAAA,EAC1D,EAAE,SAAS;AACb;AAEA,SAAS,qBAAqB,QAAwB;AACpD,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,MAAM;AAC1B,UAAM,WAAW,CAAC,aAAa,aAAa,OAAO,OAAO,EAAE;AAAA,MAC1D,IAAI;AAAA,IACN;AACA,QACE,CAAC,CAAC,SAAS,QAAQ,EAAE,SAAS,IAAI,QAAQ,KAC1C,IAAI,YACJ,IAAI,YACJ,IAAI,aAAa,OACjB,IAAI,UACJ,IAAI,QACH,IAAI,aAAa,WAAW,CAAC,UAC9B;AACA,YAAM,IAAI,MAAM,uBAAuB;AAAA,IACzC;AACA,WAAO,IAAI;AAAA,EACb,QAAQ;AACN,UAAM,IAAI,oBAAoB;AAAA,MAC5B,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF;;;ACvsBA,SAAS,aAAa;AACtB,SAAS,cAAAC,mBAAkB;AAC3B;AAAA,EACE,SAAAC;AAAA,EACA,SAAAC;AAAA,EACA,YAAAC;AAAA,EACA,UAAAC;AAAA,EACA,MAAAC;AAAA,EACA,aAAAC;AAAA,OACK;AACP,OAAOC,YAAU;AAEV,IAAM,yCACX;AAEK,IAAM,kCAAkC;AAExC,IAAM,oCAAN,cAAgD,MAAM;AAAA,EAClD;AAAA,EAGT,YACE,MAGA;AACA;AAAA,MACE,SAAS,qCACL,wDACA;AAAA,IACN;AACA,SAAK,OAAO;AACZ,SAAK,OAAO;AAAA,EACd;AACF;AAMA,eAAsB,yCAAyC,SAGhB;AAC7C,QAAM,WAAW,QAAQ,aACrB,kCACA;AACJ,QAAM,oBAAoB,QAAQ,aAC9B,4BACA;AACJ,QAAM,cAAcA,OAAK,QAAQ,QAAQ,WAAW;AACpD,QAAM,aAAaA,OAAK,KAAK,aAAa,MAAM;AAEhD,MAAI;AACF,UAAM,sBAAsB,WAAW;AACvC,QAAI,CAAE,MAAM,gBAAgB,WAAW,GAAI;AACzC,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,UAAM,eAAe,UAAU;AAE/B,WAAO;AAAA,MACL,SAAS,OAAO,eAAe;AAC7B,YAAI,CAAC,kBAAkB,KAAK,UAAU,GAAG;AACvC,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AACA,YAAI;AACF,gBAAM,sBAAsB,WAAW;AACvC,cAAI,CAAE,MAAM,gBAAgB,WAAW,GAAI;AACzC,kBAAM,IAAI;AAAA,cACR;AAAA,YACF;AAAA,UACF;AACA,gBAAM,iBAAiB,MAAM,eAAe,UAAU;AACtD,gBAAM,0BAA0B;AAAA,YAC9B,SAAS,cAAc,gBAAgB,YAAY,QAAQ;AAAA,YAC3D;AAAA,YACA;AAAA,UACF,CAAC;AAAA,QACH,SAAS,OAAO;AACd,cAAI,iBAAiB,kCAAmC,OAAM;AAC9D,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,QAAI,iBAAiB,kCAAmC,OAAM;AAC9D,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,sBAAsB,aAAqB;AACxD,QAAM,eAAe,MAAML,OAAM,WAAW;AAC5C,MAAI,CAAC,aAAa,YAAY,KAAK,aAAa,eAAe,GAAG;AAChE,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,eAAe,YAAoB;AAChD,QAAM,cAAc,MAAMA,OAAM,UAAU,EAAE,MAAM,CAAC,UAAmB;AACpE,QAAIM,iBAAgB,OAAO,QAAQ,EAAG,QAAO;AAC7C,UAAM;AAAA,EACR,CAAC;AACD,MAAI,eAAe,CAAC,YAAY,OAAO,GAAG;AACxC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,QAAM,UAAU,cAAc,MAAML,UAAS,YAAY,MAAM,IAAI;AACnE,MACE;AAAA,IACE;AAAA,IACA;AAAA,EACF,EAAE,KAAK,CAAC,aAAa,uBAAuB,SAAS,QAAQ,IAAI,CAAC,GAClE;AACA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,0BAA0B,SAItC;AACD,QAAM,gBAAgBI,OAAK;AAAA,IACzB,QAAQ;AAAA,IACR,4BAA4B,QAAQ,GAAG,IAAIP,YAAW,CAAC;AAAA,EACzD;AACA,MAAI;AACF,UAAMM,WAAU,eAAe,QAAQ,SAAS;AAAA,MAC9C,UAAU;AAAA,MACV,MAAM;AAAA,MACN,MAAM;AAAA,IACR,CAAC;AACD,UAAML,OAAM,eAAe,GAAK;AAChC,UAAMG,QAAO,eAAe,QAAQ,UAAU;AAAA,EAChD,QAAQ;AACN,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF,UAAE;AACA,UAAMC,IAAG,eAAe,EAAE,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM,MAAS;AAAA,EAChE;AACF;AAEA,SAAS,cAAc,SAAiB,YAAoB,UAAkB;AAC5E,QAAM,aAAa,GAAG,QAAQ,IAAI,UAAU;AAC5C,QAAM,WAAW,IAAI,OAAO,IAAI,QAAQ,wBAAwB,GAAG;AACnE,MAAI,SAAS,KAAK,OAAO,EAAG,QAAO,QAAQ,QAAQ,UAAU,UAAU;AACvE,QAAM,UAAU,QAAQ,SAAS,MAAM,IAAI,SAAS;AACpD,MAAI,QAAQ,WAAW,EAAG,QAAO,GAAG,UAAU,GAAG,OAAO;AACxD,SAAO,GAAG,OAAO,GAAG,QAAQ,SAAS,IAAI,IAAI,KAAK,OAAO,GAAG,UAAU,GAAG,OAAO;AAClF;AAEA,SAAS,uBAAuB,SAAiB,UAAkB;AACjE,SAAO,QACJ,MAAM,QAAQ,EACd,OAAO,CAAC,SAAS,KAAK,WAAW,GAAG,QAAQ,GAAG,CAAC,EAAE;AACvD;AAEA,SAAS,gBAAgB,aAAqB;AAC5C,SAAO,IAAI,QAAiB,CAAC,SAAS,WAAW;AAC/C,UAAM,QAAQ;AAAA,MACZ;AAAA,MACA,CAAC,gBAAgB,WAAW,cAAc,MAAM,MAAM;AAAA,MACtD;AAAA,QACE,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,IACF;AACA,UAAM,KAAK,SAAS,MAAM;AAC1B,UAAM,KAAK,QAAQ,CAAC,SAAS;AAC3B,UAAI,SAAS,EAAG,SAAQ,IAAI;AAAA,eACnB,SAAS,EAAG,SAAQ,KAAK;AAAA,UAC7B,QAAO,IAAI,MAAM,+BAA+B,CAAC;AAAA,IACxD,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAASG,iBAAgB,OAAgB,MAAuB;AAC9D,SACE,iBAAiB,SACjB,UAAU,SACT,MAAgC,SAAS;AAE9C;;;ACrMA,IAAM,yBAAyB;AAExB,SAAS,uBAAuB,OAAwB;AAC7D,SACE,MAAM,UAAU,KAChB,MAAM,UAAU,MAChB,uBAAuB,KAAK,KAAK;AAErC;;;AHoCA,IAAMC,cAAa,oBAAI,IAAI,CAAC,UAAU,IAAI,CAAC;AAC3C,IAAM,YAAY;AAClB,IAAM,aAAa;AACnB,IAAM,gBAAgB;AACtB,IAAM,mBAAmB;AACzB,IAAM,eAAe;AACrB,IAAM,YAAY;AAClB,IAAM,YAAY;AAClB,IAAM,kBAAkB;AACxB,IAAM,eAAe;AAIrB,IAAM,8BAA8BC,IAAE,OAAO;AAAA,EAC3C,OAAOA,IAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACvC,OAAOA,IAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AACzC,CAAC;AAED,IAAM,wBAAwBA,IAC3B,OAAO;AAAA,EACN,KAAKA,IAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACrC,MAAMA,IAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA,EAChD,OAAOA,IAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA,EAClD,aAAaA,IAAE,KAAK,CAAC,WAAW,WAAW,CAAC,EAAE,SAAS;AAAA,EACvD,UAAUA,IAAE,QAAQ,EAAE,SAAS;AAAA,EAC/B,SAASA,IAAE,MAAM,2BAA2B,EAAE,IAAI,GAAG,EAAE,SAAS;AAClE,CAAC,EACA,OAAO;AAEV,IAAM,4BAA4BA,IAC/B,OAAO;AAAA,EACN,SAASA,IAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACzC,MAAMA,IAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACtC,sBAAsBA,IAAE,MAAM,qBAAqB,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACnE,YAAYA,IAAE,OAAOA,IAAE,QAAQ,CAAC;AAAA,EAChC,gBAAgBA,IAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA,EAC3D,gBAAgBA,IAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,SAAS;AAC9D,CAAC,EACA,OAAO,EACP,YAAY,CAAC,YAAY,YAAY;AACpC,QAAM,MAAM,IAAI,IAAI;AAAA,IAClB,WAAW;AAAA,IACX,kBAAkB;AAAA,IAClB,QAAQ;AAAA,EACV,CAAC;AACD,aAAW,QAAQ,GAAG;AACtB,MAAI;AACF,QAAI,QAAQ,WAAW,UAAU;AAAA,EACnC,QAAQ;AACN,YAAQ,SAAS;AAAA,MACf,MAAMA,IAAE,aAAa;AAAA,MACrB,SACE;AAAA,MACF,MAAM,CAAC,YAAY;AAAA,IACrB,CAAC;AAAA,EACH;AACA,QAAM,SAAS,WAAW;AAE1B,QAAM,gBAAgB,OACnB,IAAI,CAAC,UAAU,MAAM,GAAG,EACxB,OAAO,CAAC,KAAK,OAAO,SAAS,KAAK,QAAQ,GAAG,MAAM,KAAK;AAC3D,aAAW,OAAO,IAAI,IAAI,aAAa,GAAG;AACxC,YAAQ,SAAS;AAAA,MACf,MAAMA,IAAE,aAAa;AAAA,MACrB,SAAS,cAAc,GAAG;AAAA,MAC1B,MAAM,CAAC,sBAAsB;AAAA,IAC/B,CAAC;AAAA,EACH;AAEA,QAAM,gBAAgB,OAAO;AAAA,IAC3B,CAAC,UAAU,MAAM,gBAAgB;AAAA,EACnC;AACA,MAAI,cAAc,WAAW,GAAG;AAC9B,YAAQ,SAAS;AAAA,MACf,MAAMA,IAAE,aAAa;AAAA,MACrB,SAAS;AAAA,MACT,MAAM,CAAC,sBAAsB;AAAA,IAC/B,CAAC;AAAA,EACH;AAEA,QAAM,mBAAmB,WAAW,WAAW;AAC/C,MAAI,CAAC,SAAS,gBAAgB,GAAG;AAC/B,YAAQ,SAAS;AAAA,MACf,MAAMA,IAAE,aAAa;AAAA,MACrB,SAAS;AAAA,MACT,MAAM,CAAC,cAAc,YAAY;AAAA,IACnC,CAAC;AACD;AAAA,EACF;AAEA,QAAM,eAAe,IAAI,IAAI,OAAO,IAAI,CAAC,UAAU,MAAM,GAAG,CAAC;AAC7D,aAAW,OAAO,OAAO,KAAK,gBAAgB,GAAG;AAC/C,QAAI,CAAC,aAAa,IAAI,GAAG,GAAG;AAC1B,cAAQ,SAAS;AAAA,QACf,MAAMA,IAAE,aAAa;AAAA,QACrB,SAAS,iBAAiB,GAAG;AAAA,QAC7B,MAAM,CAAC,sBAAsB;AAAA,MAC/B,CAAC;AAAA,IACH;AAAA,EACF;AAEA,aAAW,CAAC,OAAO,KAAK,KAAK,OAAO,QAAQ,GAAG;AAC7C,QAAI,CAAC,OAAO,UAAU,eAAe,KAAK,kBAAkB,MAAM,GAAG,GAAG;AACtE,cAAQ,SAAS;AAAA,QACf,MAAMA,IAAE,aAAa;AAAA,QACrB,SAAS,kBAAkB,MAAM,GAAG;AAAA,QACpC,MAAM,CAAC,wBAAwB,OAAO,KAAK;AAAA,MAC7C,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,eAAe,cAAc,CAAC;AACpC,QAAM,iBAAiB,WAAW,WAAW;AAC7C,MACE,iBACC,CAAC,MAAM,QAAQ,cAAc,KAC5B,CAAC,eAAe,SAAS,aAAa,GAAG,IAC3C;AACA,YAAQ,SAAS;AAAA,MACf,MAAMA,IAAE,aAAa;AAAA,MACrB,SAAS,0BAA0B,aAAa,GAAG;AAAA,MACnD,MAAM,CAAC,cAAc,UAAU;AAAA,IACjC,CAAC;AAAA,EACH;AACF,CAAC;AAEH,IAAM,2BAA2BA,IAAE,OAAO;AAAA,EACxC,SAASA,IAAE,QAAQ,CAAC;AAAA,EACpB,OAAOA,IAAE,MAAMA,IAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC;AAChD,CAAC;AAED,IAAM,oBAAoBA,IACvB,OAAO;AAAA,EACN,SAASA,IAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC;AAAA,EAChC,gBAAgBA,IAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC;AAAA,EACvC,WAAWA,IAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAC7C,SAASA,IAAE,OAAOA,IAAE,QAAQ,CAAC;AAAA,EAC7B,WAAWA,IAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAC7C,WAAWA,IAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS;AAC/C,CAAC,EACA,YAAY;AAEf,IAAM,wBAAwBA,IAC3B,OAAO,EACP,UAAU,CAAC,UAAU,MAAM,KAAK,CAAC,EACjC,OAAO,CAAC,UAAU,MAAM,UAAU,KAAK,MAAM,UAAU,GAAG;AAE7D,IAAM,oBAAoBA,IACvB,OAAO,EACP,KAAK,EACL,IAAI,CAAC,EACL,IAAI,GAAG,EACP,MAAM,4BAA4B;AAE9B,IAAM,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;AAuG1B,eAAsB,gBAAgB,SAQN;AAC9B,MAAIC,QAAO,QAAQ;AAEnB,MAAIA,MAAK,WAAW,KAAKA,MAAK,KAAK,CAAC,QAAQF,YAAW,IAAI,GAAG,CAAC,GAAG;AAChE,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,MAAIE,MAAK,CAAC,MAAM;AACd,WAAO,cAAc,EAAE,GAAG,SAAS,MAAMA,MAAK,MAAM,CAAC,EAAE,CAAC;AAE1D,MAAIA,MAAK,CAAC,MAAM,YAAYA,MAAK,CAAC,MAAM,WAAW;AACjD,QAAI;AACF,MAAAA,QAAO,MAAM,2BAA2B,SAAS,SAASA,KAAI;AAAA,IAChE,SAAS,OAAO;AACd,aAAO;AAAA,QACL,UAAU;AAAA,QACV,QACE,iBAAiB,QACb,MAAM,UACN;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAIA,MAAK,CAAC,MAAM;AACd,WAAO,sBAAsB,EAAE,GAAG,SAAS,MAAMA,MAAK,MAAM,CAAC,EAAE,CAAC;AAElE,MAAIA,MAAK,CAAC,MAAM,cAAc;AAC5B,WAAO,qBAAqB;AAAA,MAC1B,GAAG;AAAA,MACH,MAAMA,MAAK,MAAM,CAAC;AAAA,IACpB,CAAC;AAAA,EACH;AAEA,MAAIA,MAAK,CAAC,MAAM,eAAe;AAC7B,WAAO,sBAAsB;AAAA,MAC3B,GAAG;AAAA,MACH,MAAMA,MAAK,MAAM,CAAC;AAAA,IACpB,CAAC;AAAA,EACH;AAEA,MAAIA,MAAK,CAAC,MAAM,WAAW;AACzB,WAAO,kBAAkB;AAAA,MACvB,GAAG;AAAA,MACH,MAAMA,MAAK,MAAM,CAAC;AAAA,IACpB,CAAC;AAAA,EACH;AAEA,MAAIA,MAAK,CAAC,MAAM,UAAU;AACxB,WAAO,UAAU;AAAA,MACf,GAAG;AAAA,MACH,MAAMA,MAAK,MAAM,CAAC;AAAA,IACpB,CAAC;AAAA,EACH;AAEA,MAAIA,MAAK,CAAC,MAAM,kBAAkB;AAChC,WAAO,qBAAqB;AAAA,MAC1B,GAAG;AAAA,MACH,MAAMA,MAAK,MAAM,CAAC;AAAA,MAClB,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AAEA,MAAIA,MAAK,CAAC,MAAM,cAAc;AAC5B,WAAO,qBAAqB;AAAA,MAC1B,GAAG;AAAA,MACH,MAAMA,MAAK,MAAM,CAAC;AAAA,IACpB,CAAC;AAAA,EACH;AAEA,MAAIA,MAAK,CAAC,MAAM,iBAAiBA,MAAK,CAAC,MAAM,SAAS;AACpD,UAAM,oBAAoBA,MAAK,MAAM,CAAC;AACtC,WAAO,qBAAqB;AAAA,MAC1B,GAAG;AAAA,MACH,MAAM;AAAA,QACJ;AAAA,QACA,GAAG;AAAA,QACH,GAAI,kBAAkB,SAAS,YAAY,IAAI,CAAC,IAAI,CAAC,YAAY;AAAA,MACnE;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAOC,YAAW,+BAA+B;AACnD;AAEA,eAAe,sBACb,SAC6B;AAC7B,QAAM,SAAS,QAAQ,KAAK,CAAC;AAC7B,MAAI,CAAC,UAAU,CAAC,CAAC,QAAQ,QAAQ,QAAQ,EAAE,SAAS,MAAM;AACxD,WAAOA,YAAW,oCAAoC;AACxD,QAAM,SAAS,WAAW,QAAQ,KAAK,MAAM,CAAC,GAAG;AAAA,IAC/C,SAAS,oBAAI,IAAI;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAI,WAAW,SACX,CAAC,WAAW,YAAY,UAAU,QAAQ,WAAW,UAAU,IAC/D;AAAA,QACE;AAAA,QACA,GAAI,WAAW,WAAW,CAAC,YAAY,mBAAmB,IAAI,CAAC;AAAA,MACjE;AAAA,IACN,CAAC;AAAA,IACD,SAAS,oBAAI,IAAI,CAAC,QAAQ,CAAC;AAAA,IAC3B,kBAAkB;AAAA,EACpB,CAAC;AACD,MAAI,CAAC,OAAO,GAAI,QAAOA,YAAW,OAAO,KAAK;AAC9C,MAAI,OAAO,YAAY;AACrB,WAAOA,YAAW,kCAAkC;AACtD,QAAM,QAAQ,CAAC,QAAgB,eAAe,OAAO,OAAO,KAAK,GAAG,EAAE;AACtE,QAAM,kBAAkB,MAAM,aAAa;AAC3C,QAAM,SAAS,MAAM,MAAM;AAC3B,QAAM,eAAe,MAAM,YAAY;AACvC,MACE,CAAC,mBACD,CAAC,uBAAuB,eAAe,KACvC,CAAC,UACD,OAAO,SAAS;AAEhB,WAAOA,YAAW,2CAA2C;AAC/D,MAAI,WAAW,WAAW,CAAC,gBAAgB,aAAa,SAAS;AAC/D,WAAOA,YAAW,uBAAuB;AAC3C,QAAM,SAAS,4BAA4B,UAAU,MAAM,QAAQ,CAAC;AACpE,QAAM,WAAW,4BAA4B;AAAA,IAC3C,MAAM,iBAAiB;AAAA,EACzB;AACA,MACG,MAAM,QAAQ,KAAK,CAAC,OAAO,WAC3B,WAAW,aAAa,CAAC,OAAO,WAAW,CAAC,SAAS;AAEtD,WAAOA;AAAA,MACL;AAAA,IACF;AACF,QAAMC,WAAU,IAAI,gBAAgB;AACpC,aAAW,OAAO,CAAC,SAAS,UAAU,QAAQ,MAAM,SAAS,QAAQ,GAAG;AACtE,UAAM,OAAO,MAAM,GAAG;AACtB,QAAI,KAAM,CAAAA,SAAQ,IAAI,KAAK,IAAI;AAAA,EACjC;AACA,QAAM,QAAQ,OAAO,MAAM,OAAO,KAAK,EAAE;AACzC,MAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,KAAK,QAAQ;AACnD,WAAOD,YAAW,oCAAoC;AACxD,OACG,MAAM,OAAO,GAAG,UAAU,KAAK,QAC/B,MAAM,QAAQ,GAAG,UAAU,KAAK;AAEjC,WAAOA,YAAW,kCAAkC;AACtD,aAAW,OAAO,CAAC,QAAQ,IAAI;AAC7B,QACE,MAAM,GAAG,KACT,CAACF,IAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,KAAK,CAAC,EAAE,UAAU,MAAM,GAAG,CAAC,EAAE;AAE7D,aAAOE;AAAA,QACL,KAAK,GAAG;AAAA,MACV;AACJ,MACE,MAAM,MAAM,KACZ,MAAM,IAAI,KACV,KAAK,MAAM,MAAM,MAAM,CAAE,KAAK,KAAK,MAAM,MAAM,IAAI,CAAE;AAErD,WAAOA,YAAW,+CAA+C;AACnE,QAAM,UAAU,MAAM;AAAA,IACpB;AAAA,IACA;AAAA,EACF;AACA,MAAI,CAAC,QAAQ,GAAI,QAAO,QAAQ;AAChC,MAAI;AACF,UAAM,EAAE,aAAa,IAAI,MAAM,QAAQ,OAAO,iBAAiB;AAAA,MAC7D,OAAO,QAAQ;AAAA,MACf,WAAW,QAAQ,QAAQ;AAAA,IAC7B,CAAC;AACD,yCAAqC,cAAc,QAAQ,QAAQ,EAAE;AACrE,UAAM,cAAc,aAAa;AAAA,MAC/B,CAAC,SAAS,KAAK,SAAS;AAAA,IAC1B;AACA,QAAI,CAAC;AACH,aAAOA;AAAA,QACL;AAAA,MACF;AACF,UAAM,QAAQ;AAAA,MACZ,OAAO,QAAQ;AAAA,MACf,eAAe,YAAY;AAAA,MAC3B;AAAA,IACF;AACA,UAAM,WACJ,WAAW,SACP,MAAM,QAAQ,OAAO,gBAAgB,EAAE,GAAG,OAAO,SAAAC,SAAQ,CAAC,IAC1D,WAAW,SACT,MAAM,QAAQ,OAAO,eAAe;AAAA,MAClC,GAAG;AAAA,MACH;AAAA,IACF,CAAC,IACD,MAAM,QAAQ,OAAO,uBAAuB;AAAA,MAC1C,GAAG;AAAA,MACH;AAAA,MACA,QAAQ,OAAO;AAAA,MACf,gBAAgB,SAAS;AAAA,IAC3B,CAAC;AAET,WAAO,EAAE,UAAU,GAAG,QAAQ,kBAAkB,QAAQ,EAAE;AAAA,EAC5D,SAAS,OAAO;AACd,WAAO,eAAe,KAAK;AAAA,EAC7B;AACF;AAEA,eAAe,kBAAkB,SAOD;AAC9B,QAAM,SAAS,QAAQ,KAAK,CAAC;AAC7B,MAAI,CAAC,UAAU,CAAC,CAAC,UAAU,QAAQ,UAAU,KAAK,EAAE,SAAS,MAAM,GAAG;AACpE,WAAOD,YAAW,uCAAuC;AAAA,EAC3D;AACA,QAAM,SAAS,kBAAkB,QAAQ,QAAQ,KAAK,MAAM,CAAC,CAAC;AAC9D,MAAI,CAAC,OAAO,GAAI,QAAO,OAAO;AAC9B,MAAI,CAAC,QAAQ,WAAW;AACtB,WAAO;AAAA,MACL,IAAI,oBAAoB;AAAA,QACtB,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI;AACF,UAAM,aAAa,0BAA0B,QAAQ,GAAG;AACxD,UAAM,QAAQ,MAAM,qBAAqB,OAAO,EAAE,QAAQ;AAAA,MACxD,UAAU;AAAA,MACV,QAAQ,CAAC,uBAAuB;AAAA,IAClC,CAAC;AACD,iBAAa,OAAO,uBAAuB;AAC3C,UAAM,SAAS,2BAA2B;AAAA,MACxC;AAAA,MACA,WAAW,QAAQ;AAAA,IACrB,CAAC;AAED,QAAI,WAAW,QAAQ;AACrB,YAAM,WAAW,MAAM,OAAO,aAAa,EAAE,OAAO,MAAM,YAAY,CAAC;AACvE,iCAA2B,SAAS,UAAU,MAAM,MAAM,cAAc;AACxE,aAAO;AAAA,QACL,UAAU;AAAA,QACV,QAAQ,OAAO,OACX,kBAAkB,QAAQ,IAC1B,wBAAwB,SAAS,QAAQ;AAAA,MAC/C;AAAA,IACF;AAEA,QAAI,WAAW,UAAU;AACvB,YAAM,WAAW,MAAM,OAAO,cAAc;AAAA,QAC1C,OAAO,MAAM;AAAA,QACb,MAAM,OAAO;AAAA,QACb,MAAM,OAAO;AAAA,MACf,CAAC;AACD;AAAA,QACE,CAAC,SAAS,OAAO;AAAA,QACjB,MAAM,MAAM;AAAA,MACd;AACA,aAAO;AAAA,QACL,UAAU;AAAA,QACV,QAAQ,OAAO,OACX,kBAAkB,QAAQ,IAC1B;AAAA,UACE;AAAA,UACA,YAAY,SAAS,QAAQ,IAAI;AAAA,UACjC,SAAS,SAAS,QAAQ,IAAI;AAAA,UAC9B,mCACE,SAAS,QAAQ,OACjB;AAAA,QACJ,EAAE,KAAK,IAAI;AAAA,MACjB;AAAA,IACF;AAEA,UAAM,YAAY,MAAM;AAAA,MACtB,QAAQ,OAAO,QAAQ,IAAI;AAAA,IAC7B;AACA,UAAM,QAAQ,oBAAoB,OAAO;AACzC,UAAM,UAAU;AAAA,MACd,WAAW;AAAA,MACX,gBAAgB,UAAU;AAAA,MAC1B,SAAS;AAAA,IACX;AAEA,QAAI,WAAW,OAAO;AACpB,YAAM,WAAW,MAAM,OAAO,aAAa,EAAE,OAAO,MAAM,YAAY,CAAC;AACvE,iCAA2B,SAAS,UAAU,MAAM,MAAM,cAAc;AACxE,YAAM,UAAU,SAAS,SAAS;AAAA,QAChC,CAACE,aAAYA,SAAQ,SAAS,OAAO;AAAA,MACvC;AACA,UAAI,QAAQ,WAAW,GAAG;AACxB,cAAM,IAAI,oBAAoB;AAAA,UAC5B,MAAM,QAAQ,WAAW,IAAI,sBAAsB;AAAA,UACnD,SACE,QAAQ,WAAW,IACf,qCACA;AAAA,UACN,QAAQ,QAAQ,WAAW,IAAI,MAAM;AAAA,QACvC,CAAC;AAAA,MACH;AACA,YAAMA,WAAU,QAAQ,CAAC;AACzB,UACE,UAAU,WAAW,YACrB,UAAU,UAAU,QAAQ,SAASA,SAAQ,QAC7C,CAAC,OAAO,SACR;AACA,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,YAAM,kBAAkB,MAAM,MAAM,KAAK,OAAO;AAChD,YAAM,MAAM,MAAM;AAAA,QAChB,GAAG;AAAA,QACH,gBAAgB,MAAM,MAAM;AAAA,QAC5B,SAAS,EAAE,IAAIA,SAAQ,IAAI,MAAMA,SAAQ,KAAK;AAAA,MAChD,CAAC;AACD,UAAI;AACF,cAAM,2BAA2B;AAAA,UAC/B,kBACE,UAAU,WAAW,WAAW,UAAU,WAAW;AAAA,UACvD,SAAS,EAAE,MAAMA,SAAQ,MAAM,MAAMA,SAAQ,KAAK;AAAA,UAClD,SAAS,UAAU;AAAA,QACrB,CAAC;AAAA,MACH,SAAS,OAAO;AACd,YAAI,gBAAiB,OAAM,MAAM,MAAM,eAAe;AAAA,YACjD,OAAM,MAAM,OAAO,OAAO;AAC/B,cAAM;AAAA,MACR;AAEA,YAAMC,UAAS;AAAA,QACb,WAAW;AAAA,QACX,gBAAgB,MAAM,MAAM;AAAA,QAC5B,SAAAD;AAAA,QACA,eAAeE,OAAK;AAAA,UAClB,UAAU;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,QACL,UAAU;AAAA,QACV,QAAQ,OAAO,OACX,kBAAkBD,OAAM,IACxB;AAAA,UACE;AAAA,UACA,YAAYD,SAAQ,IAAI;AAAA,UACxB,cAAcC,QAAO,aAAa;AAAA,QACpC,EAAE,KAAK,IAAI;AAAA,MACjB;AAAA,IACF;AAEA,QAAI,UAAU,WAAW,WAAW;AAClC,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,UAAM,UAAU,MAAM,MAAM,KAAK,OAAO;AACxC,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,QACE,QAAQ,mBAAmB,MAAM,MAAM,kBACvC,QAAQ,QAAQ,SAAS,UAAU,UAAU,QAAQ,MACrD;AACA,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,UAAM,WAAW,MAAM,OAAO,aAAa,EAAE,OAAO,MAAM,YAAY,CAAC;AACvE,+BAA2B,SAAS,UAAU,MAAM,MAAM,cAAc;AACxE,UAAM,UAAU,SAAS,SAAS;AAAA,MAChC,CAAC,cAAc,UAAU,OAAO,QAAQ,QAAQ;AAAA,IAClD;AACA,QAAI,CAAC,WAAW,QAAQ,SAAS,QAAQ,QAAQ,MAAM;AACrD,YAAM,IAAI,oBAAoB;AAAA,QAC5B,MAAM;AAAA,QACN,SAAS;AAAA,QACT,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AACA,UAAM,SAAS;AAAA,MACb,WAAW;AAAA,MACX,WAAW;AAAA,MACX,gBAAgB,QAAQ;AAAA,MACxB;AAAA,MACA,gBAAgB,UAAU;AAAA,IAC5B;AACA,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ,OAAO,OACX,kBAAkB,MAAM,IACxB;AAAA,QACE;AAAA,QACA,YAAY,QAAQ,IAAI;AAAA,QACxB,iBAAiB,QAAQ,cAAc;AAAA,QACvC,QAAQ,UAAU;AAAA,MACpB,EAAE,KAAK,IAAI;AAAA,IACjB;AAAA,EACF,SAAS,OAAO;AACd,WAAO,mBAAmB,KAAK;AAAA,EACjC;AACF;AAEA,eAAe,sBAAsB,SAOL;AAC9B,QAAM,SAAS,QAAQ,KAAK,CAAC;AAC7B,MAAI,CAAC,UAAU,CAAC,CAAC,UAAU,MAAM,EAAE,SAAS,MAAM,GAAG;AACnD,WAAOH,YAAW,2CAA2C;AAAA,EAC/D;AAEA,QAAM,SAAS,sBAAsB,QAAQ,QAAQ,KAAK,MAAM,CAAC,CAAC;AAClE,MAAI,CAAC,OAAO,GAAI,QAAO,OAAO;AAC9B,QAAM,UAAU,MAAM;AAAA,IACpB;AAAA,IACA;AAAA,EACF;AACA,MAAI,CAAC,QAAQ,GAAI,QAAO,QAAQ;AAEhC,MAAI;AACF,QAAI,WAAW,QAAQ;AACrB,YAAMK,YAAW,MAAM,QAAQ,OAAO,iBAAiB;AAAA,QACrD,OAAO,QAAQ;AAAA,QACf,WAAW,QAAQ,QAAQ;AAAA,MAC7B,CAAC;AACD;AAAA,QACEA,UAAS;AAAA,QACT,QAAQ,QAAQ;AAAA,MAClB;AACA,aAAO;AAAA,QACL,UAAU;AAAA,QACV,QAAQ,OAAO,OACX,kBAAkBA,SAAQ,IAC1B,4BAA4BA,UAAS,YAAY;AAAA,MACvD;AAAA,IACF;AAEA,UAAM,WAAW,MAAM,QAAQ,OAAO,kBAAkB;AAAA,MACtD,OAAO,QAAQ;AAAA,MACf,MAAM,OAAO;AAAA,MACb,WAAW,QAAQ,QAAQ;AAAA,MAC3B,MAAM,OAAO;AAAA,IACf,CAAC;AACD;AAAA,MACE,CAAC,SAAS,WAAW;AAAA,MACrB,QAAQ,QAAQ;AAAA,IAClB;AACA,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ,OAAO,OACX,kBAAkB,QAAQ,IAC1B;AAAA,QACE;AAAA,QACA,gBAAgB,SAAS,YAAY,IAAI;AAAA,QACzC,SAAS,SAAS,YAAY,IAAI;AAAA,QAClC,YAAY,SAAS,YAAY,SAAS;AAAA,MAC5C,EAAE,KAAK,IAAI;AAAA,IACjB;AAAA,EACF,SAAS,OAAO;AACd,WAAO,eAAe,KAAK;AAAA,EAC7B;AACF;AAEA,eAAe,qBAAqB,SASJ;AAC9B,QAAM,SAAS,QAAQ,KAAK,CAAC;AAC7B,MAAI,CAAC,UAAU,CAAC,CAAC,SAAS,QAAQ,UAAU,QAAQ,EAAE,SAAS,MAAM,GAAG;AACtE,WAAOL,YAAW,0CAA0C;AAAA,EAC9D;AACA,MAAI,QAAQ,cAAc,WAAW;AACnC,WAAOA;AAAA,MACL;AAAA,IACF;AACF,QAAM,WAAW,QAAQ,aACrB,kCACA;AACJ,QAAM,SAAS,qBAAqB,QAAQ,QAAQ,KAAK,MAAM,CAAC,CAAC;AACjE,MAAI,CAAC,OAAO,GAAI,QAAO,OAAO;AAE9B,QAAM,UAAU,MAAM,gCAAgC;AAAA,IACpD,GAAG;AAAA,IACH,SAAS,OAAO;AAAA,EAClB,CAAC;AACD,MAAI,CAAC,QAAQ,GAAI,QAAO,QAAQ;AAEhC,MAAI;AACF,QAAI,WAAW,QAAQ;AACrB,YAAM,WAAW,MAAM,QAAQ,OAAO,gBAAgB;AAAA,QACpD,iBAAiB,OAAO;AAAA,QACxB,OAAO,QAAQ;AAAA,QACf,WAAW,QAAQ,QAAQ;AAAA,MAC7B,CAAC;AACD,YAAMG,UAAS;AAAA,QACb,aAAa,SAAS;AAAA,QACtB,aAAa,OAAO;AAAA,MACtB;AACA,aAAO;AAAA,QACL,UAAU;AAAA,QACV,QAAQ,OAAO,OACX,kBAAkBA,OAAM,IACxB,2BAA2BA,OAAM;AAAA,MACvC;AAAA,IACF;AAEA,QAAI,WAAW,UAAU;AACvB,YAAMG,cAAa,MAAM,QAAQ,OAAO,iBAAiB;AAAA,QACvD,cAAc,OAAO;AAAA,QACrB,iBAAiB,OAAO;AAAA,QACxB,OAAO,QAAQ;AAAA,QACf,WAAW,QAAQ,QAAQ;AAAA,MAC7B,CAAC;AACD,YAAMH,UAAS;AAAA,QACb,YAAAG;AAAA,QACA,aAAa,OAAO;AAAA,QACpB,SAAS;AAAA,MACX;AACA,aAAO;AAAA,QACL,UAAU;AAAA,QACV,QAAQ,OAAO,OACX,kBAAkBH,OAAM,IACxB;AAAA,cAAiDG,YAAW,EAAE;AAAA,eAAkB,OAAO,eAAe;AAAA,MAC5G;AAAA,IACF;AAEA,UAAM,sBACJ,WAAW,YAEL,MAAM,QAAQ,OAAO,gBAAgB;AAAA,MACnC,iBAAiB,OAAO;AAAA,MACxB,OAAO,QAAQ;AAAA,MACf,WAAW,QAAQ,QAAQ;AAAA,IAC7B,CAAC,GACD,OAAO,OAAO,CAACA,gBAAeA,YAAW,WAAW,QAAQ,IAC9D,CAAC;AACP,UAAM,WAAW,MAAM,QAAQ,OAAO,gBAAgB;AAAA,MACpD,iBAAiB,OAAO;AAAA,MACxB,OAAO,QAAQ;AAAA,MACf,MAAM,OAAO;AAAA,MACb,WAAW,QAAQ,QAAQ;AAAA,IAC7B,CAAC;AACD,UAAM,QAAQ,aAAc,QAAQ,SAAS,KAAK;AAClD,QAAI,WAAW,UAAU;AACvB,YAAM,QAAQ;AAAA,QACZ,oBAAoB;AAAA,UAAI,CAACA,gBACvB,QAAQ,OAAO,iBAAiB;AAAA,YAC9B,cAAcA,YAAW;AAAA,YACzB,iBAAiB,OAAO;AAAA,YACxB,OAAO,QAAQ;AAAA,YACf,WAAW,QAAQ,QAAQ;AAAA,UAC7B,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AACA,UAAM,EAAE,OAAO,QAAQ,GAAG,WAAW,IAAI;AACzC,UAAM,SAAS;AAAA,MACb;AAAA,MACA,aAAa,OAAO;AAAA,MACpB,WAAW;AAAA,QACT;AAAA,MACF;AAAA,MACA,WAAW,WAAW,UAAU,WAAW;AAAA,IAC7C;AACA,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ,OAAO,OACX,kBAAkB,MAAM,IACxB;AAAA,QACE,2BAA2B,OAAO,SAAS;AAAA,QAC3C,eAAe,WAAW,EAAE;AAAA,QAC5B,gBAAgB,OAAO,eAAe;AAAA,QACtC,aAAa,QAAQ;AAAA,MACvB,EAAE,KAAK,IAAI;AAAA,IACjB;AAAA,EACF,SAAS,OAAO;AACd,WAAO,sBAAsB,KAAK;AAAA,EACpC;AACF;AAEA,eAAe,gCAAgC,SAkB7C;AACA,MAAI;AACF,UAAM,QAAQ,MAAM,uBAAuB,OAAO;AAClD,UAAM,UACJ,OAAO,YACN,MAAM,6BAA6B,QAAQ,OAAO,QAAQ,IAAI,CAAC,GAC7D;AACL,UAAM,eAAe,QAAQ,UACzB,OACE,QAAQ,iCACR,0CACA;AAAA,MACA,aAAa;AAAA,MACb,GAAI,QAAQ,aAAa,EAAE,YAAY,KAAK,IAAI,CAAC;AAAA,IACnD,CAAC,IACD;AACJ,UAAM,UAAU,MAAM;AAAA,MACpB;AAAA,MACA;AAAA,IACF;AACA,QAAI,CAAC,QAAQ,GAAI,QAAO;AACxB,WAAO;AAAA,MACL,QAAQ,QAAQ,aACZ,2BAA2B;AAAA,QACzB,YAAY,QAAQ;AAAA,QACpB,WAAW,QAAQ,aAAa;AAAA,QAChC,gBAAgB;AAAA,MAClB,CAAC,IACD,QAAQ;AAAA,MACZ,OAAO,QAAQ;AAAA,MACf,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;AAAA,MACvC,IAAI;AAAA,MACJ,SAAS,QAAQ;AAAA,IACnB;AAAA,EACF,SAAS,OAAO;AACd,WAAO,EAAE,OAAO,sBAAsB,KAAK,GAAG,IAAI,MAAM;AAAA,EAC1D;AACF;AAEA,eAAe,2BACb,SAOA,OAC4E;AAC5E,MAAI;AACF,UAAM,SAAS,MAAM,qBAAqB,SAAS,OAAO;AAC1D,QAAI,QAAQ;AACV,UAAI,CAAC,QAAQ;AACX,cAAM,IAAI,mBAAmB;AAAA,UAC3B,MAAM;AAAA,UACN,SAAS;AAAA,QACX,CAAC;AACH,YAAMC,SAAQ,MAAM,qBAAqB,OAAO,EAAE,QAAQ;AAAA,QACxD,UAAU;AAAA,QACV,QAAQ,CAAC,KAAK;AAAA,MAChB,CAAC;AACD,mBAAaA,QAAO,KAAK;AACzB,UAAIA,OAAM,MAAM,mBAAmB,OAAO,SAAS,QAAQ;AACzD,cAAM,IAAI,mBAAmB;AAAA,UAC3B,MAAM;AAAA,UACN,SACE;AAAA,QACJ,CAAC;AACH,aAAO;AAAA,QACL,iBAAiB,OAAO,SAAS,QAAQ;AAAA,QACzC,YAAY,OAAO,IAAI;AAAA,QACvB,QAAQ,2BAA2B;AAAA,UACjC,YAAY,OAAO,IAAI;AAAA,UACvB,WAAW,QAAQ;AAAA,QACrB,CAAC;AAAA,QACD,OAAOA,OAAM;AAAA,QACb,IAAI;AAAA,QACJ,cAAc,EAAE,IAAI,OAAO,SAAS,QAAQ,eAAe;AAAA,QAC3D,SAAS;AAAA,UACP,IAAI,OAAO;AAAA,UACX,MAAM,OAAO,SAAS,QAAQ;AAAA,UAC9B,MAAM,OAAO,SAAS,QAAQ;AAAA,QAChC;AAAA,QACA,SAAS,OAAO;AAAA,MAClB;AAAA,IACF;AAEA,UAAM,YAAY,MAAM;AAAA,MACtB,QAAQ,OAAO,QAAQ,IAAI;AAAA,IAC7B;AACA,QAAI,CAAC,QAAQ,WAAW;AACtB,YAAM,IAAI,oBAAoB;AAAA,QAC5B,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AACA,UAAM,aAAa,0BAA0B,QAAQ,GAAG;AAExD,UAAM,UAAU,MAAM,oBAAoB,OAAO,EAAE,KAAK;AAAA,MACtD,WAAW;AAAA,MACX,gBAAgB,UAAU;AAAA,MAC1B,SAAS;AAAA,IACX,CAAC;AACD,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,QAAQ,MAAM,qBAAqB,OAAO,EAAE,QAAQ;AAAA,MACxD,UAAU;AAAA,MACV,QAAQ,CAAC,KAAK;AAAA,IAChB,CAAC;AACD,QACE,MAAM,MAAM,aAAa,kBACzB,MAAM,MAAM,OAAO,WAAW,KAC9B,MAAM,MAAM,OAAO,CAAC,MAAM,OAC1B;AACA,YAAM,IAAI,mBAAmB;AAAA,QAC3B,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,QACE,MAAM,MAAM,mBAAmB,QAAQ,kBACvC,QAAQ,QAAQ,SAAS,UAAU,UAAU,QAAQ,MACrD;AACA,YAAM,IAAI,mBAAmB;AAAA,QAC3B,MAAM;AAAA,QACN,SACE;AAAA,MACJ,CAAC;AAAA,IACH;AACA,WAAO;AAAA,MACL;AAAA,MACA,QAAQ,2BAA2B;AAAA,QACjC;AAAA,QACA,WAAW,QAAQ;AAAA,MACrB,CAAC;AAAA,MACD,OAAO,MAAM;AAAA,MACb,IAAI;AAAA,MACJ,cAAc,EAAE,IAAI,QAAQ,eAAe;AAAA,MAC3C,SAAS;AAAA,QACP,IAAI,QAAQ,QAAQ;AAAA,QACpB,MAAM,UAAU,UAAU,QAAQ;AAAA,QAClC,MAAM,QAAQ,QAAQ;AAAA,MACxB;AAAA,MACA,SAAS,UAAU;AAAA,IACrB;AAAA,EACF,SAAS,OAAO;AACd,WAAO,EAAE,OAAO,6BAA6B,KAAK,GAAG,IAAI,MAAM;AAAA,EACjE;AACF;AAEA,eAAe,6BACb,KAMA;AACA,QAAM,YAAY,MAAM,6BAA6B,GAAG;AACxD,MAAI,UAAU,WAAW,WAAW;AAClC,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,qBAAqB,SAOJ;AAC9B,MACE,CAAC,QAAQ,QAAQ,WAAW,WAAW,QAAQ,EAAE;AAAA,IAC/C,QAAQ,KAAK,CAAC,KAAK;AAAA,EACrB;AAEA,WAAO,uBAAuB,OAAO;AACvC,MAAI,QAAQ,KAAK,CAAC,MAAM,QAAQ;AAC9B,WAAO,kBAAkB;AAAA,MACvB,GAAG;AAAA,MACH,MAAM,QAAQ,KAAK,MAAM,CAAC;AAAA,IAC5B,CAAC;AAAA,EACH;AAEA,MAAI,QAAQ,KAAK,CAAC,MAAM,SAAS;AAC/B,WAAO,mBAAmB;AAAA,MACxB,GAAG;AAAA,MACH,MAAM,QAAQ,KAAK,MAAM,CAAC;AAAA,IAC5B,CAAC;AAAA,EACH;AAEA,SAAOP,YAAW,0CAA0C;AAC9D;AAEA,eAAe,uBACb,SAC6B;AAC7B,QAAM,SAAS,QAAQ,KAAK,CAAC;AAC7B,QAAM,SAAS,WAAW,QAAQ,KAAK,MAAM,CAAC,GAAG;AAAA,IAC/C,SAAS,oBAAI,IAAI;AAAA,MACf;AAAA,MACA;AAAA,MACA,GAAI,WAAW,SAAS,CAAC,UAAU,IAAI,CAAC,QAAQ;AAAA,MAChD,GAAI,CAAC,WAAW,WAAW,QAAQ,EAAE,SAAS,MAAM,IAChD,CAAC,qBAAqB,IACtB,CAAC;AAAA,MACL,GAAI,WAAW,WACX,CAAC,WAAW,aAAa,wBAAwB,IACjD,CAAC;AAAA,IACP,CAAC;AAAA,IACD,SAAS,oBAAI,IAAI,CAAC,UAAU,SAAS,CAAC;AAAA,IACtC,kBAAkB;AAAA,EACpB,CAAC;AACD,MAAI,CAAC,OAAO,GAAI,QAAOA,YAAW,OAAO,KAAK;AAC9C,MAAI,OAAO,YAAY;AACrB,WAAOA,YAAW,kCAAkC;AACtD,QAAM,QAAQ,CAAC,QAAgB,eAAe,OAAO,OAAO,KAAK,GAAG,EAAE;AACtE,QAAM,kBAAkB,MAAM,aAAa;AAC3C,QAAM,SAAS,MAAM,MAAM;AAC3B,MACE,CAAC,mBACD,CAAC,uBAAuB,eAAe,KACtC,WAAW,WAAW,CAAC,UAAU,OAAO,SAAS;AAElD,WAAOA,YAAW,2CAA2C;AAC/D,QAAM,SAAS,MAAM,QAAQ,KAAK;AAClC,MAAI,CAAC,CAAC,UAAU,YAAY,KAAK,EAAE,SAAS,MAAM;AAChD,WAAOA,YAAW,2CAA2C;AAC/D,QAAM,QAAQ,OAAO,MAAM,IAAI,SAAS,MAAM;AAC9C,QAAM,WAAW,OAAO,MAAM,mBAAmB,CAAC;AAClD,QAAM,QAAQ,OAAO,MAAM,sBAAsB,CAAC;AAClD,QAAM,aAAa,MAAM,SAAS;AAClC,OACG,WAAW,aAAa,WAAW,aAAa,WAChD,CAAC,OAAO,cAAc,QAAQ,KAAK,WAAW;AAE/C,WAAOA;AAAA,MACL;AAAA,IACF;AACF,MACE,UACC,CAAC,cACA,WAAW,SAAS,OACpB,CAAC,OAAO,cAAc,KAAK,KAC3B,QAAQ;AAEV,WAAOA;AAAA,MACL;AAAA,IACF;AACF,MACE,WAAW,YACX,CAAC,SACD,CAAC,WAAW,qBAAqB,sBAAsB,EAAE;AAAA,IACvD,CAAC,QAAQ,MAAM,GAAG,MAAM;AAAA,EAC1B;AAEA,WAAOA;AAAA,MACL;AAAA,IACF;AACF,QAAM,UAAU,MAAM;AAAA,IACpB;AAAA,IACA;AAAA,EACF;AACA,MAAI,CAAC,QAAQ,GAAI,QAAO,QAAQ;AAChC,MAAI;AACF,UAAM,EAAE,aAAa,IAAI,MAAM,QAAQ,OAAO,iBAAiB;AAAA,MAC7D,OAAO,QAAQ;AAAA,MACf,WAAW,QAAQ,QAAQ;AAAA,IAC7B,CAAC;AACD,yCAAqC,cAAc,QAAQ,QAAQ,EAAE;AACrE,UAAM,cAAc,aAAa;AAAA,MAC/B,CAAC,SAAS,KAAK,SAAS;AAAA,IAC1B;AACA,QAAI,CAAC;AACH,aAAOA;AAAA,QACL;AAAA,MACF;AACF,UAAM,QAAQ;AAAA,MACZ,OAAO,QAAQ;AAAA,MACf,eAAe,YAAY;AAAA,MAC3B,QAAQ,UAAU;AAAA,IACpB;AACA,QAAI,WAAW;AACb,aAAO;AAAA,QACL,UAAU;AAAA,QACV,QAAQ;AAAA,UACN,MAAM,QAAQ,OAAO,gBAAgB;AAAA,YACnC,GAAG;AAAA,YACH;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AACF,QAAI,WAAW,UAAW,WAAW,YAAY,CAAC,OAAQ;AACxD,YAAM,UAAU,MAAM,QAAQ,OAAO,eAAe,KAAK;AACzD,UACE,QAAQ,QAAQ,OAAO,QAAQ,QAAQ,MACvC,QAAQ,YAAY,OAAO,YAAY,MACvC,QAAQ,WAAW,OAAO,UAC1B,QAAQ,WAAW,kBAAkB,YAAY;AAEjD,cAAM,IAAI,oBAAoB;AAAA,UAC5B,MAAM;AAAA,UACN,SACE;AAAA,QACJ,CAAC;AACH,aAAO;AAAA,QACL,UAAU;AAAA,QACV,QAAQ;AAAA,UACN,WAAW,SACP,UACA;AAAA,YACE,GAAG;AAAA,YACH,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,SACE;AAAA,YACF,cAAc;AAAA,cACZ,YAAY,QAAQ,WAAW;AAAA,cAC/B,kBAAkB,QAAQ;AAAA,cAC1B,yBAAyB,QAAQ,WAAW;AAAA,YAC9C;AAAA,UACF;AAAA,QACN;AAAA,MACF;AAAA,IACF;AACA,UAAM,WAAW,MAAM,QAAQ,OAAO,iBAAiB;AAAA,MACrD,GAAG;AAAA,MACH,QACE,WAAW,WACP;AAAA,QACE;AAAA,QACA;AAAA,QACA,kBAAkB;AAAA,QAClB,yBAAyB;AAAA,MAC3B,IACA;AAAA,QACE;AAAA,QACA,kBAAkB;AAAA,MACpB;AAAA,IACR,CAAC;AACD,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ,kBAAkB,EAAE,GAAG,UAAU,QAAQ,SAAS,KAAK,CAAC;AAAA,IAClE;AAAA,EACF,SAAS,OAAO;AACd,WAAO,eAAe,KAAK;AAAA,EAC7B;AACF;AAEA,eAAe,kBAAkB,SAOD;AAC9B,QAAM,SAAS,2BAA2B,QAAQ,MAAM;AAAA,IACtD,qBAAqB;AAAA,IACrB,OACE;AAAA,EACJ,CAAC;AACD,MAAI,CAAC,OAAO,IAAI;AACd,WAAO,OAAO;AAAA,EAChB;AAEA,QAAM,SAAS,MAAM,oBAAoB;AAAA,IACvC,KAAK,QAAQ;AAAA,IACb,QAAQ,OAAO;AAAA,EACjB,CAAC;AACD,MAAI,CAAC,OAAO,IAAI;AACd,WAAO,OAAO;AAAA,EAChB;AAEA,QAAM,OAAO,OAAO;AACpB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO,EAAE,QAAQ,QAAQ,MAAM;AAC7B,YAAM,cAAc,CAAC;AACrB,iBAAW,cAAc,OAAO,aAAa;AAC3C,cAAM,WAAW,MAAM,OAAO,eAAe;AAAA,UAC3C,MAAM,WAAW;AAAA,UACjB,iBAAiB,OAAO;AAAA,UACxB,OAAO,QAAQ;AAAA,UACf,WAAW,QAAQ,QAAQ;AAAA,QAC7B,CAAC;AACD,oBAAY,KAAK;AAAA,UACf,YAAY;AAAA,UACZ,SACE,iBAAiB,SAAS,OAAO,KAAK,WAAW,MAAM;AAAA,UACzD,MAAM,WAAW;AAAA,UACjB,IAAI,oBAAoB;AAAA,YACtB;AAAA,UACF,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAEA,YAAM,SACJ,OAAO,OAAO,SAAS,UACnB;AAAA,QACE,GAAG,YAAY,CAAC;AAAA,QAChB,SAAS,QAAQ;AAAA,MACnB,IACA;AAAA,QACE;AAAA,QACA,UAAU,OAAO,OAAO;AAAA,QACxB,SAAS,QAAQ;AAAA,MACnB;AAEN,aAAO;AAAA,QACL,UAAU;AAAA,QACV,QAAQ,OACJ,kBAAkB,MAAM,IACxB,2BAA2B,WAAW;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,mBAAmB,SAGF;AAC9B,QAAM,SAAS,2BAA2B,QAAQ,MAAM;AAAA,IACtD,OACE;AAAA,EACJ,CAAC;AACD,MAAI,CAAC,OAAO,GAAI,QAAO,OAAO;AAE9B,QAAM,SAAS,MAAM,oBAAoB;AAAA,IACvC,KAAK,QAAQ;AAAA,IACb,QAAQ,OAAO;AAAA,EACjB,CAAC;AACD,MAAI,CAAC,OAAO,GAAI,QAAO,OAAO;AAE9B,QAAM,SAAS;AAAA,IACb,OAAO,OAAO,YAAY;AAAA,IAC1B,OAAO,OAAO,YAAY,IAAI,CAAC,gBAAgB;AAAA,MAC7C,SAAS,WAAW,MAAM;AAAA,MAC1B,MAAM,WAAW;AAAA,IACnB,EAAE;AAAA,IACF,SAAS;AAAA,EACX;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ,OAAO,OACX,kBAAkB,MAAM,IACxB;AAAA,MACE;AAAA,MACA,UAAU,OAAO,KAAK;AAAA,MACtB,GAAG,OAAO,MAAM,IAAI,CAAC,SAAS,KAAK,KAAK,OAAO,KAAK,KAAK,IAAI,EAAE;AAAA,IACjE,EAAE,KAAK,IAAI;AAAA,EACjB;AACF;AAEA,eAAe,UAAU,SAMO;AAC9B,QAAM,SAAS,gBAAgB,QAAQ,MAAM;AAAA,IAC3C,OAAO;AAAA,EACT,CAAC;AACD,MAAI,CAAC,OAAO,IAAI;AACd,WAAO,OAAO;AAAA,EAChB;AAEA,QAAM,QAAQ,MAAM,cAAc;AAAA,IAChC,KAAK,QAAQ;AAAA,IACb,WAAW,OAAO;AAAA,IAClB,QAAQ;AAAA,EACV,CAAC;AACD,MAAI,CAAC,MAAM,IAAI;AACb,WAAO,MAAM;AAAA,EACf;AAEA,QAAM,OAAO,OAAO;AACpB,SAAO,wBAAwB,SAAS,OAAO,EAAE,QAAQ,QAAQ,MAAM;AACrE,UAAM,WAAW,MAAM,OAAO,WAAW;AAAA,MACvC,MAAM,MAAM;AAAA,MACZ,YAAY,QAAQ;AAAA,IACtB,CAAC;AACD,UAAM,SAAS;AAAA,MACb,SAAS,MAAM,MAAM;AAAA,MACrB,SAAS,QAAQ;AAAA,MACjB,YAAY;AAAA,MACZ,IAAI,oBAAoB;AAAA,QACtB;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ,OACJ,kBAAkB,MAAM,IACxB;AAAA,QACE;AAAA,QACA,SAAS,MAAM,MAAM,OAAO;AAAA,QAC5B,iBAAiB,SAAS,YAAY,IAClC,eAAe,iBAAiB,SAAS,YAAY,CAAC,KACtD;AAAA,QACJ,iBAAiB,SAAS,UAAU,IAChC,gBAAgB,iBAAiB,SAAS,UAAU,CAAC,KACrD;AAAA,QACJ,OAAO,KACH,0CAA0C,OAAO,GAAG,GAAG,KACvD;AAAA,MACN,EACG,OAAO,CAAC,SAAyB,QAAQ,IAAI,CAAC,EAC9C,KAAK,IAAI;AAAA,IAClB;AAAA,EACF,CAAC;AACH;AAEA,eAAe,6BACb,SAOA,OACA,KAI6B;AAC7B,QAAM,UAAU,MAAM,2BAA2B,SAAS,KAAK;AAC/D,MAAI,CAAC,QAAQ,IAAI;AACf,WAAO,QAAQ;AAAA,EACjB;AAEA,MAAI;AACF,WAAO,MAAM,IAAI,EAAE,QAAQ,QAAQ,QAAQ,QAAQ,CAAC;AAAA,EACtD,SAAS,OAAO;AACd,WAAO,eAAe,KAAK;AAAA,EAC7B;AACF;AAEA,eAAe,wBACb,SAMA,KAI6B;AAC7B,QAAM,UAAU,MAAM,2BAA2B,OAAO;AACxD,MAAI,CAAC,QAAQ,GAAI,QAAO,QAAQ;AAEhC,MAAI,CAAC,QAAQ,WAAW;AACtB,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,MAAI;AACF,WAAO,MAAM,IAAI;AAAA,MACf,QAAQ,2BAA2B;AAAA,QACjC,YAAY,QAAQ;AAAA,QACpB,WAAW,QAAQ;AAAA,MACrB,CAAC;AAAA,MACD;AAAA,IACF,CAAC;AAAA,EACH,SAAS,OAAO;AACd,WAAO,eAAe,KAAK;AAAA,EAC7B;AACF;AAEA,eAAe,2BAA2B,SAKN;AAClC,QAAM,aACJ,QAAQ,MAAM,sCAAsC,GAAG,KAAK;AAC9D,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,MACL,OAAO;AAAA,QACL,UAAU;AAAA,QACV,QAAQ,oDAAoD,sCAAsC;AAAA,MACpG;AAAA,MACA,IAAI;AAAA,IACN;AAAA,EACF;AAEA,MAAI;AACF,UAAM,SAAS,MAAM,uBAAuB,OAAO;AACnD,QAAI;AACF,aAAO;AAAA,QACL,YAAY,OAAO,IAAI;AAAA,QACvB,iBAAiB,OAAO,QAAQ,QAAQ;AAAA,QACxC,IAAI;AAAA,QACJ,cAAc,EAAE,IAAI,OAAO,QAAQ,eAAe;AAAA,QAClD,SAAS,EAAE,MAAM,OAAO,QAAQ,QAAQ,KAAK;AAAA,QAC7C;AAAA,MACF;AACF,UAAM,YAAY,MAAM;AAAA,MACtB,QAAQ,OAAO,QAAQ,IAAI;AAAA,IAC7B;AACA,UAAM,aAAa,0BAA0B,QAAQ,GAAG;AACxD,UAAM,UAAU,MAAM,oBAAoB,OAAO,EAAE,KAAK;AAAA,MACtD,WAAW;AAAA,MACX,gBAAgB,UAAU;AAAA,MAC1B,SAAS;AAAA,IACX,CAAC;AACD,QAAI,CAAC,WAAW,QAAQ,QAAQ,SAAS,UAAU,UAAU,QAAQ,MAAM;AACzE,YAAM,IAAI;AAAA,QACR,UACI,oCACA;AAAA,QACJ,UACI,kEACA;AAAA,MACN;AAAA,IACF;AACA,WAAO;AAAA,MACL;AAAA,MACA,IAAI;AAAA,MACJ,cAAc,EAAE,IAAI,QAAQ,eAAe;AAAA,MAC3C,SAAS;AAAA,QACP,IAAI,QAAQ,QAAQ;AAAA,QACpB,MAAM,UAAU,UAAU,QAAQ;AAAA,QAClC,MAAM,QAAQ,QAAQ;AAAA,MACxB;AAAA,MACA;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,WAAO,EAAE,OAAO,6BAA6B,KAAK,GAAG,IAAI,MAAM;AAAA,EACjE;AACF;AAEA,SAAS,gBACP,OACgD;AAChD,MAAI,iBAAiB,oBAAoB;AACvC,WAAO;AAAA,MACL,OAAO;AAAA,QACL,UAAU;AAAA,QACV,QAAQ;AAAA,UACN;AAAA,UACA,MAAM,SAAS,WAAW,MAAM,MAAM,KAAK;AAAA,UAC3C,SAAS,MAAM,IAAI;AAAA,UACnB,MAAM;AAAA,QACR,EACG,OAAO,CAAC,SAAyB,QAAQ,IAAI,CAAC,EAC9C,KAAK,IAAI;AAAA,MACd;AAAA,MACA,IAAI;AAAA,IACN;AAAA,EACF;AACA,SAAO;AAAA,IACL,OAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ;AAAA,IACV;AAAA,IACA,IAAI;AAAA,EACN;AACF;AAEA,SAAS,kBACP,QACAD,OAS2C;AAC3C,QAAM,UAAU,WAAW;AAC3B,QAAM,OAAO,WAAW;AACxB,QAAM,SAAS,WAAWA,OAAM;AAAA,IAC9B,SAAS,oBAAI,IAAI;AAAA,MACf;AAAA,MACA,GAAI,UAAU,CAAC,WAAW,SAAS,IAAI,CAAC;AAAA,MACxC,GAAI,OAAO,CAAC,YAAY,IAAI,CAAC;AAAA,IAC/B,CAAC;AAAA,IACD,SAAS,oBAAI,IAAI,CAAC,WAAW,YAAY,CAAC;AAAA,IAC1C,kBAAkB;AAAA,EACpB,CAAC;AACD,MAAI,CAAC,OAAO,GAAI,QAAO,EAAE,OAAOC,YAAW,OAAO,KAAK,GAAG,IAAI,MAAM;AAEpE,MAAI,MAAM;AACR,QAAI,OAAO,YAAY,WAAW,GAAG;AACnC,aAAO;AAAA,QACL,OAAOA,YAAW,gDAAgD;AAAA,QAClE,IAAI;AAAA,MACN;AAAA,IACF;AACA,UAAMQ,QAAO,kBAAkB,UAAU,OAAO,YAAY,CAAC,CAAC;AAC9D,QAAI,CAACA,MAAK,SAAS;AACjB,aAAO,EAAE,OAAOR,YAAW,0BAA0B,GAAG,IAAI,MAAM;AAAA,IACpE;AACA,WAAO;AAAA,MACL,MAAM,OAAO,MAAM,IAAI,SAAS;AAAA,MAChC,IAAI;AAAA,MACJ,SAAS,OAAO,MAAM,IAAI,YAAY;AAAA,MACtC,MAAMQ,MAAK;AAAA,IACb;AAAA,EACF;AAEA,MAAI,OAAO,YAAY,SAAS,GAAG;AACjC,WAAO;AAAA,MACL,OAAOR,YAAW,wBAAwB,OAAO,YAAY,CAAC,CAAC,EAAE;AAAA,MACjE,IAAI;AAAA,IACN;AAAA,EACF;AACA,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,MACL,MAAM,OAAO,MAAM,IAAI,SAAS;AAAA,MAChC,IAAI;AAAA,MACJ,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAMQ,QAAO,kBAAkB;AAAA,IAC7B,eAAe,OAAO,OAAO,SAAS;AAAA,EACxC;AACA,QAAM,OAAO,sBAAsB;AAAA,IACjC,eAAe,OAAO,OAAO,SAAS;AAAA,EACxC;AACA,MAAI,CAACA,MAAK,SAAS;AACjB,WAAO;AAAA,MACL,OAAOR,YAAW,uCAAuC;AAAA,MACzD,IAAI;AAAA,IACN;AAAA,EACF;AACA,MAAI,CAAC,KAAK,SAAS;AACjB,WAAO;AAAA,MACL,OAAOA,YAAW,uCAAuC;AAAA,MACzD,IAAI;AAAA,IACN;AAAA,EACF;AACA,SAAO;AAAA,IACL,MAAM,OAAO,MAAM,IAAI,SAAS;AAAA,IAChC,MAAM,KAAK;AAAA,IACX,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,MAAMQ,MAAK;AAAA,EACb;AACF;AAEA,SAAS,qBACP,QACAT,OAU2C;AAC3C,QAAM,WAAW,WAAW,WAAW,WAAW;AAClD,QAAM,UAAU,WAAW;AAC3B,QAAM,SAAS,WAAWA,OAAM;AAAA,IAC9B,SAAS,oBAAI,IAAI;AAAA,MACf;AAAA,MACA;AAAA,MACA,GAAI,WAAW,CAAC,cAAc,SAAS,IAAI,CAAC;AAAA,MAC5C,GAAI,UAAU,CAAC,eAAe,IAAI,CAAC;AAAA,IACrC,CAAC;AAAA,IACD,SAAS,oBAAI,IAAI,CAAC,WAAW,YAAY,CAAC;AAAA,IAC1C,kBAAkB;AAAA,EACpB,CAAC;AACD,MAAI,CAAC,OAAO,GAAI,QAAO,EAAE,OAAOC,YAAW,OAAO,KAAK,GAAG,IAAI,MAAM;AACpE,MAAI,OAAO,YAAY,SAAS,GAAG;AACjC,WAAO;AAAA,MACL,OAAOA,YAAW,wBAAwB,OAAO,YAAY,CAAC,CAAC,EAAE;AAAA,MACjE,IAAI;AAAA,IACN;AAAA,EACF;AAEA,QAAM,kBAAkB,eAAe,OAAO,OAAO,gBAAgB;AACrE,MAAI,CAAC,iBAAiB;AACpB,WAAO;AAAA,MACL,OAAOA,YAAW,4BAA4B;AAAA,MAC9C,IAAI;AAAA,IACN;AAAA,EACF;AACA,MAAI,CAAC,uBAAuB,eAAe,GAAG;AAC5C,WAAO;AAAA,MACL,OAAOA,YAAW,iDAAiD;AAAA,MACnE,IAAI;AAAA,IACN;AAAA,EACF;AACA,MAAI,YAAY,CAAC,OAAO,MAAM,IAAI,YAAY,GAAG;AAC/C,WAAO;AAAA,MACL,OAAOA,YAAW,6CAA6C;AAAA,MAC/D,IAAI;AAAA,IACN;AAAA,EACF;AACA,QAAM,eAAe,eAAe,OAAO,OAAO,eAAe;AACjE,MAAI,WAAW,CAAC,cAAc;AAC5B,WAAO;AAAA,MACL,OAAOA,YAAW,sCAAsC;AAAA,MACxD,IAAI;AAAA,IACN;AAAA,EACF;AACA,QAAM,OAAO,eAAe,OAAO,OAAO,SAAS;AACnD,MAAI,gBAAgB,aAAa,SAAS,KAAK;AAC7C,WAAO;AAAA,MACL,OAAOA,YAAW,0BAA0B;AAAA,MAC5C,IAAI;AAAA,IACN;AAAA,EACF;AACA,MAAI,QAAQ,KAAK,SAAS,KAAK;AAC7B,WAAO;AAAA,MACL,OAAOA,YAAW,oBAAoB;AAAA,MACtC,IAAI;AAAA,IACN;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;AAAA,IACvC;AAAA,IACA,SAAS;AAAA,IACT,MAAM,OAAO,MAAM,IAAI,SAAS;AAAA,IAChC,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,IACvB,IAAI;AAAA,EACN;AACF;AAEA,SAAS,sBACP,QACAD,OAQ2C;AAC3C,QAAM,UAAU,WAAW;AAC3B,QAAM,SAAS,WAAWA,OAAM;AAAA,IAC9B,SAAS,oBAAI,IAAI,CAAC,WAAW,GAAI,UAAU,CAAC,WAAW,SAAS,IAAI,CAAC,CAAE,CAAC;AAAA,IACxE,SAAS,oBAAI,IAAI,CAAC,SAAS,CAAC;AAAA,IAC5B,kBAAkB;AAAA,EACpB,CAAC;AACD,MAAI,CAAC,OAAO,GAAI,QAAO,EAAE,OAAOC,YAAW,OAAO,KAAK,GAAG,IAAI,MAAM;AACpE,MAAI,OAAO,YAAY,SAAS,GAAG;AACjC,WAAO;AAAA,MACL,OAAOA,YAAW,wBAAwB,OAAO,YAAY,CAAC,CAAC,EAAE;AAAA,MACjE,IAAI;AAAA,IACN;AAAA,EACF;AAEA,MAAI,CAAC,SAAS;AACZ,WAAO,EAAE,MAAM,OAAO,MAAM,IAAI,SAAS,GAAG,IAAI,KAAK;AAAA,EACvD;AAEA,QAAMQ,QAAO,eAAe,OAAO,OAAO,SAAS;AACnD,MAAI,CAACA,OAAM;AACT,WAAO,EAAE,OAAOR,YAAW,qBAAqB,GAAG,IAAI,MAAM;AAAA,EAC/D;AACA,MAAI,CAAC,uBAAuBQ,KAAI,GAAG;AACjC,WAAO;AAAA,MACL,OAAOR,YAAW,0CAA0C;AAAA,MAC5D,IAAI;AAAA,IACN;AAAA,EACF;AACA,QAAM,OAAO,eAAe,OAAO,OAAO,SAAS;AACnD,MAAI,CAAC,MAAM;AACT,WAAO,EAAE,OAAOA,YAAW,qBAAqB,GAAG,IAAI,MAAM;AAAA,EAC/D;AACA,QAAM,aAAa,sBAAsB,UAAU,IAAI;AACvD,MAAI,CAAC,WAAW,SAAS;AACvB,WAAO,EAAE,OAAOA,YAAW,oBAAoB,GAAG,IAAI,MAAM;AAAA,EAC9D;AACA,SAAO;AAAA,IACL,MAAM,OAAO,MAAM,IAAI,SAAS;AAAA,IAChC,MAAM,WAAW;AAAA,IACjB,IAAI;AAAA,IACJ,MAAAQ;AAAA,EACF;AACF;AAEA,SAAS,2BACPT,OACA,SAcI;AACJ,QAAM,SAAS,WAAWA,OAAM;AAAA,IAC9B,SAAS,oBAAI,IAAI;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAI,QAAQ,sBAAsB,CAAC,gBAAgB,IAAI,CAAC;AAAA,IAC1D,CAAC;AAAA,IACD,SAAS,oBAAI,IAAI,CAAC,SAAS,CAAC;AAAA,EAC9B,CAAC;AACD,MAAI,CAAC,OAAO,IAAI;AACd,WAAO;AAAA,MACL,OAAOC,YAAW,OAAO,KAAK;AAAA,MAC9B,IAAI;AAAA,IACN;AAAA,EACF;AACA,MAAI,OAAO,YAAY,SAAS,GAAG;AACjC,WAAO;AAAA,MACL,OAAOA,YAAW,QAAQ,KAAK;AAAA,MAC/B,IAAI;AAAA,IACN;AAAA,EACF;AAEA,QAAM,YAAY,eAAe,OAAO,OAAO,UAAU;AACzD,QAAM,eAAe,eAAe,OAAO,OAAO,aAAa;AAC/D,QAAM,kBAAkB,eAAe,OAAO,OAAO,gBAAgB;AACrE,MAAI,QAAQ,uBAAuB,CAAC,iBAAiB;AACnD,WAAO;AAAA,MACL,OAAOA,YAAW,gDAAgD;AAAA,MAClE,IAAI;AAAA,IACN;AAAA,EACF;AACA,MAAI,mBAAmB,CAAC,uBAAuB,eAAe,GAAG;AAC/D,WAAO;AAAA,MACL,OAAOA,YAAW,iDAAiD;AAAA,MACnE,IAAI;AAAA,IACN;AAAA,EACF;AACA,MAAI,QAAQ,SAAS,MAAM,QAAQ,YAAY,GAAG;AAChD,WAAO;AAAA,MACL,OAAOA;AAAA,QACL;AAAA,MACF;AAAA,MACA,IAAI;AAAA,IACN;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAI,kBAAkB,EAAE,gBAAgB,IAAI,CAAC;AAAA,IAC7C,MAAM,OAAO,MAAM,IAAI,SAAS;AAAA,IAChC,IAAI;AAAA,IACJ,QAAQ,YACJ,EAAE,MAAM,WAAW,MAAM,QAAQ,IACjC,EAAE,MAAM,cAAe,MAAM,WAAW;AAAA,EAC9C;AACF;AAEA,eAAe,oBAAoB,SAYjC;AACA,MAAI,QAAQ,OAAO,SAAS,SAAS;AACnC,UAAM,aAAa,MAAM,cAAc;AAAA,MACrC,KAAK,QAAQ;AAAA,MACb,WAAW,QAAQ,OAAO;AAAA,MAC1B,QAAQ;AAAA,IACV,CAAC;AACD,QAAI,CAAC,WAAW,GAAI,QAAO;AAE3B,WAAO;AAAA,MACL,aAAa;AAAA,QACX;AAAA,UACE,MAAM,QAAQ,OAAO;AAAA,UACrB,OAAO,WAAW;AAAA,QACpB;AAAA,MACF;AAAA,MACA,IAAI;AAAA,IACN;AAAA,EACF;AAEA,QAAM,eAAeI,OAAK;AAAA,IACxB,QAAQ,OAAO,QAAQ,IAAI;AAAA,IAC3B,QAAQ,OAAO;AAAA,EACjB;AACA,QAAM,WAAW,MAAM,cAAc;AAAA,IACnC,KAAK,QAAQ;AAAA,IACb,WAAW,QAAQ,OAAO;AAAA,IAC1B,QAAQ;AAAA,EACV,CAAC;AACD,MAAI,CAAC,SAAS,GAAI,QAAO;AAEzB,QAAM,oBAAoBA,OAAK,QAAQ,YAAY;AACnD,QAAM,cAAsC,CAAC;AAC7C,aAAW,kBAAkB,SAAS,MAAM,OAAO;AACjD,QAAIA,OAAK,WAAW,cAAc,GAAG;AACnC,aAAO;AAAA,QACL,OAAOJ;AAAA,UACL,+CAA+C,cAAc;AAAA,QAC/D;AAAA,QACA,IAAI;AAAA,MACN;AAAA,IACF;AAEA,UAAM,eAAeI,OAAK,QAAQ,mBAAmB,cAAc;AACnE,UAAM,eAAeA,OAAK,SAAS,mBAAmB,YAAY;AAClE,QAAI,aAAa,WAAW,KAAKA,OAAK,GAAG,EAAE,KAAK,iBAAiB,MAAM;AACrE,aAAO;AAAA,QACL,OAAOJ;AAAA,UACL,sEAAsE,cAAc;AAAA,QACtF;AAAA,QACA,IAAI;AAAA,MACN;AAAA,IACF;AAEA,UAAM,aAAa,MAAM,cAAc;AAAA,MACrC,WAAW;AAAA,MACX,QAAQ;AAAA,IACV,CAAC;AACD,QAAI,CAAC,WAAW,GAAI,QAAO;AAE3B,gBAAY,KAAK;AAAA,MACf,MAAM;AAAA,MACN,OAAO,WAAW;AAAA,IACpB,CAAC;AAAA,EACH;AAEA,QAAM,gBAAgB,YACnB,IAAI,CAAC,eAAe,WAAW,MAAM,OAAO,EAC5C,OAAO,CAAC,KAAK,OAAO,SAAS,KAAK,QAAQ,GAAG,MAAM,KAAK;AAC3D,MAAI,cAAc,SAAS,GAAG;AAC5B,WAAO;AAAA,MACL,OAAOA;AAAA,QACL,0CAA0C,CAAC,GAAG,IAAI,IAAI,aAAa,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,MAClF;AAAA,MACA,IAAI;AAAA,IACN;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,IAAI;AAAA,EACN;AACF;AAEA,SAAS,gBACPD,OACA,SAYI;AACJ,QAAM,SAAS,WAAWA,OAAM;AAAA,IAC9B,SAAS,oBAAI,IAAI,CAAC,YAAY,SAAS,CAAC;AAAA,IACxC,SAAS,oBAAI,IAAI,CAAC,SAAS,CAAC;AAAA,EAC9B,CAAC;AACD,MAAI,CAAC,OAAO,IAAI;AACd,WAAO;AAAA,MACL,OAAOC,YAAW,OAAO,KAAK;AAAA,MAC9B,IAAI;AAAA,IACN;AAAA,EACF;AACA,MAAI,OAAO,YAAY,SAAS,GAAG;AACjC,WAAO;AAAA,MACL,OAAOA,YAAW,QAAQ,KAAK;AAAA,MAC/B,IAAI;AAAA,IACN;AAAA,EACF;AAEA,QAAM,YAAY,eAAe,OAAO,OAAO,UAAU;AACzD,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,MACL,OAAOA,YAAW,sBAAsB;AAAA,MACxC,IAAI;AAAA,IACN;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,MAAM,OAAO,MAAM,IAAI,SAAS;AAAA,IAChC,IAAI;AAAA,EACN;AACF;AAEA,eAAe,cAAiB,SAa9B;AACA,QAAM,oBAAoBI,OAAK;AAAA,IAC7B,QAAQ,OAAO,QAAQ,IAAI;AAAA,IAC3B,QAAQ;AAAA,EACV;AACA,QAAM,WAAW,MAAMK,UAAS,mBAAmB,OAAO,EAAE;AAAA,IAC1D,CAAC,UAAmB;AAClB,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,aAAO;AAAA,QACL,OAAOT,YAAW,8BAA8B,OAAO,EAAE;AAAA,QACzD,IAAI;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,aAAa,UAAU;AAChC,WAAO;AAAA,EACT;AAEA,MAAI;AACJ,MAAI;AACF,iBAAa,KAAK,MAAM,QAAQ;AAAA,EAClC,SAAS,OAAO;AACd,WAAO;AAAA,MACL,OAAOA;AAAA,QACL,iCAAiC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MACzF;AAAA,MACA,IAAI;AAAA,IACN;AAAA,EACF;AAEA,QAAM,cAAc,QAAQ,OAAO,UAAU,UAAU;AACvD,MAAI,CAAC,YAAY,SAAS;AACxB,WAAO;AAAA,MACL,OAAOA;AAAA,QACL,wDAAwD,YAAY,MAAM,OACvE;AAAA,UACC,CAAC,UAAU,GAAG,MAAM,KAAK,KAAK,GAAG,KAAK,OAAO,KAAK,MAAM,OAAO;AAAA,QACjE,EACC,KAAK,IAAI,CAAC;AAAA,MACf;AAAA,MACA,IAAI;AAAA,IACN;AAAA,EACF;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,OAAO,YAAY;AAAA,EACrB;AACF;AAEA,SAAS,WACPD,OACA,SAKa;AACb,QAAM,QAAQ,oBAAI,IAAuB;AACzC,QAAM,cAAwB,CAAC;AAE/B,WAAS,QAAQ,GAAG,QAAQA,MAAK,QAAQ,SAAS,GAAG;AACnD,UAAM,MAAMA,MAAK,KAAK;AACtB,QAAI,CAAC,IAAI,WAAW,IAAI,GAAG;AACzB,kBAAY,KAAK,GAAG;AACpB;AAAA,IACF;AAEA,UAAM,CAAC,UAAU,WAAW,IAAI,UAAU,GAAG;AAC7C,QAAI,CAAC,QAAQ,QAAQ,IAAI,QAAQ,GAAG;AAClC,aAAO;AAAA,QACL,OAAO,wBAAwB,QAAQ;AAAA,QACvC,IAAI;AAAA,MACN;AAAA,IACF;AACA,QAAI,QAAQ,oBAAoB,MAAM,IAAI,QAAQ,GAAG;AACnD,aAAO;AAAA,QACL,OAAO,uBAAuB,QAAQ;AAAA,QACtC,IAAI;AAAA,MACN;AAAA,IACF;AAEA,QAAI,QAAQ,QAAQ,IAAI,QAAQ,GAAG;AACjC,UAAI,gBAAgB,QAAW;AAC7B,eAAO;AAAA,UACL,OAAO,GAAG,QAAQ;AAAA,UAClB,IAAI;AAAA,QACN;AAAA,MACF;AACA,YAAM,IAAI,UAAU,IAAI;AACxB;AAAA,IACF;AAEA,UAAM,QAAQ,eAAeA,MAAK,QAAQ,CAAC;AAC3C,QAAI,CAAC,SAAS,MAAM,WAAW,IAAI,GAAG;AACpC,aAAO;AAAA,QACL,OAAO,GAAG,QAAQ;AAAA,QAClB,IAAI;AAAA,MACN;AAAA,IACF;AAEA,UAAM,IAAI,UAAU,KAAK;AACzB,QAAI,gBAAgB,QAAW;AAC7B,eAAS;AAAA,IACX;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,IAAI;AAAA,IACJ;AAAA,EACF;AACF;AAEA,SAAS,UAAU,KAA2C;AAC5D,QAAM,iBAAiB,IAAI,QAAQ,GAAG;AACtC,MAAI,mBAAmB,IAAI;AACzB,WAAO,CAAC,KAAK,MAAS;AAAA,EACxB;AAEA,SAAO,CAAC,IAAI,MAAM,GAAG,cAAc,GAAG,IAAI,MAAM,iBAAiB,CAAC,CAAC;AACrE;AAEA,SAAS,eACP,OACA,UACoB;AACpB,QAAM,QAAQ,MAAM,IAAI,QAAQ;AAChC,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI;AACpE;AAEA,SAASC,YAAW,SAAqC;AACvD,SAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ,GAAG,OAAO;AAAA;AAAA,EAAO,UAAU;AAAA,EACrC;AACF;AAEA,SAAS,eAAe,OAAoC;AAC1D,MAAI,iBAAiB,qBAAqB;AACxC,UAAM,UAAU;AAAA,MACd;AAAA,MACA,MAAM,SAAS,WAAW,MAAM,MAAM,KAAK;AAAA,MAC3C,SAAS,MAAM,IAAI;AAAA,MACnB,MAAM;AAAA,MACN,MAAM,WAAW,OAAO,MAAM,SAAS,cACnC,gGACA;AAAA,MACJ,MAAM,WAAW,OAAO,MAAM,SAAS,mCACnC,yIACA;AAAA,IACN,EAAE,OAAO,CAAC,SAAyB,QAAQ,IAAI,CAAC;AAEhD,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ,QAAQ,KAAK,IAAI;AAAA,IAC3B;AAAA,EACF;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,sBAAsB,OAAoC;AACjE,MAAI,iBAAiB,oBAAoB;AACvC,WAAO,gBAAgB,KAAK,EAAE;AAAA,EAChC;AACA,MAAI,iBAAiB,mCAAmC;AACtD,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ,MAAM;AAAA,IAChB;AAAA,EACF;AACA,MACE,iBAAiB,8BACjB,iBAAiB,4BACjB,iBAAiB,qBACjB;AACA,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ;AAAA,QACN;AAAA,QACA,SAAS,MAAM,IAAI;AAAA,QACnB,MAAM;AAAA,MACR,EAAE,KAAK,IAAI;AAAA,IACb;AAAA,EACF;AACA,MAAI,iBAAiB,qBAAqB;AACxC,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ;AAAA,QACN;AAAA,QACA,MAAM,SAAS,WAAW,MAAM,MAAM,KAAK;AAAA,QAC3C,SAAS,MAAM,IAAI;AAAA,MACrB,EACG,OAAO,CAAC,SAAyB,QAAQ,IAAI,CAAC,EAC9C,KAAK,IAAI;AAAA,IACd;AAAA,EACF;AACA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,6BAA6B,OAAoC;AACxE,MAAI,iBAAiB,oBAAoB;AACvC,WAAO,gBAAgB,KAAK,EAAE;AAAA,EAChC;AACA,MACE,iBAAiB,8BACjB,iBAAiB,4BACjB,iBAAiB,qBACjB;AACA,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ;AAAA,QACN;AAAA,QACA,SAAS,MAAM,IAAI;AAAA,QACnB,MAAM;AAAA,MACR,EACG,OAAO,CAAC,SAAyB,QAAQ,IAAI,CAAC,EAC9C,KAAK,IAAI;AAAA,IACd;AAAA,EACF;AACA,SAAO,eAAe,KAAK;AAC7B;AAEA,SAAS,mBAAmB,OAAoC;AAC9D,MAAI,iBAAiB,mBAAoB,QAAO,gBAAgB,KAAK,EAAE;AACvE,SAAO,6BAA6B,KAAK;AAC3C;AAEA,SAAS,qBAAqB,SAIL;AACvB,SACE,QAAQ,wBACR,iCAAiC;AAAA,IAC/B,KAAK,QAAQ;AAAA,IACb,WAAW,QAAQ;AAAA,EACrB,CAAC;AAEL;AAEA,SAAS,oBAAoB,SAGL;AACtB,SACE,QAAQ,uBACR,IAAI;AAAA,IACFI,OAAK;AAAA,MACH,wBAAwB,EAAE,KAAK,QAAQ,IAAI,CAAC;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AAEJ;AAEA,SAAS,aACP,OACA,OACM;AACN,MACE,MAAM,MAAM,aAAa,kBACzB,MAAM,MAAM,OAAO,WAAW,KAC9B,MAAM,MAAM,OAAO,CAAC,MAAM,OAC1B;AACA,UAAM,IAAI,mBAAmB;AAAA,MAC3B,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF;AAEA,SAAS,2BACP,UACA,gBACM;AACN,MAAI,SAAS,KAAK,CAAC,YAAY,QAAQ,mBAAmB,cAAc,GAAG;AACzE,UAAM,IAAI,oBAAoB;AAAA,MAC5B,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF;AAEA,SAAS,wBAAwB,UAAwC;AACvE,SAAO;AAAA,IACL;AAAA,IACA,aAAa,SAAS,MAAM;AAAA,IAC5B,GAAG,SAAS;AAAA,MACV,CAAC,YAAY,KAAK,QAAQ,IAAI,KAAK,QAAQ,IAAI,KAAK,QAAQ,EAAE;AAAA,IAChE;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,2BAA2B,OAGjC;AACD,SAAO;AAAA,IACL;AAAA,IACA,gBAAgB,MAAM,WAAW;AAAA,IACjC,gBAAgB,MAAM,YAAY,MAAM;AAAA,IACxC,GAAG,MAAM,YAAY;AAAA,MACnB,CAAC,eACC,KAAK,WAAW,EAAE,KAAK,WAAW,IAAI,KAAK,WAAW,MAAM;AAAA,IAChE;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,4BACP,cACA;AACA,SAAO;AAAA,IACL;AAAA,IACA,iBAAiB,aAAa,MAAM;AAAA,IACpC,GAAG,aAAa;AAAA,MACd,CAAC,gBACC,KAAK,YAAY,IAAI,KAAK,YAAY,IAAI,KAAK,YAAY,EAAE;AAAA,IACjE;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,qCACP,cACA,WACM;AACN,MAAI,aAAa,KAAK,CAAC,gBAAgB,YAAY,cAAc,SAAS,GAAG;AAC3E,UAAM,IAAI,oBAAoB;AAAA,MAC5B,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF;AAEA,SAAS,kBAAkB,OAAwB;AACjD,SAAO,KAAK,UAAU,OAAO,MAAM,CAAC;AACtC;AAEA,SAAS,2BACP,aAQQ;AACR,SAAO;AAAA,IACL;AAAA,IACA,UAAU,YAAY,MAAM;AAAA,IAC5B,GAAG,YAAY,QAAQ,CAAC,WAAW;AAAA,MACjC,KAAK,OAAO,OAAO;AAAA,MACnB,OAAO,OAAO,WAAW,YAAY,YACrC,OAAO,OAAO,WAAW,YAAY,WACjC,cAAc,OAAO,OAAO,WAAW,OAAO,CAAC,KAC/C;AAAA,MACJ,OAAO,OAAO,WAAW,gBAAgB,YACrC,mBAAmB,OAAO,OAAO,WAAW,WAAW,CAAC,KACxD;AAAA,MACJ,OAAO,OAAO,WAAW,mBAAmB,YACxC,sBAAsB,OAAO,OAAO,WAAW,cAAc,CAAC,KAC9D;AAAA,MACJ,OAAO,KAAK,gCAAgC,OAAO,GAAG,GAAG,KAAK;AAAA,IAChE,CAAC;AAAA,EACH,EACG,OAAO,CAAC,SAAyB,QAAQ,IAAI,CAAC,EAC9C,KAAK,IAAI;AACd;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,iBAAiB,OAAoC;AAC5D,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI;AACpE;AAEA,SAAS,oBAAoB,OAWf;AACZ,QAAM,kBAAkB,MAAM,QAAQ;AACtC,QAAM,YAAY,mBAAmB,MAAM,QAAQ,QAAQ;AAC3D,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,IAAI;AAAA,IACd,kBACI,aAAa,mBAAmB,eAAe,CAAC,WAChD,mBAAmB,mBAAmB,SAAS,CAAC;AAAA,IACpD,IAAI,IAAI,MAAM,QAAQ,UAAU,EAAE;AAAA,EACpC,EAAE,SAAS;AACX,SAAO;AAAA,IACL;AAAA,EACF;AACF;AAEA,eAAe,cAAc,SAKG;AAC9B,QAAM,SAAS,2BAA2B,QAAQ,MAAM;AAAA,IACtD,qBAAqB;AAAA,IACrB,OAAO;AAAA,EACT,CAAC;AACD,MAAI,CAAC,OAAO,GAAI,QAAO,OAAO;AAC9B,QAAM,SAAS,MAAM,oBAAoB;AAAA,IACvC,KAAK,QAAQ;AAAA,IACb,QAAQ,OAAO;AAAA,EACjB,CAAC;AACD,MAAI,CAAC,OAAO,GAAI,QAAO,OAAO;AAC9B,QAAM,MAAM,QAAQ,OAAO,QAAQ;AACnC,QAAM,aAAa,IAAI,+BAA+B,GAAG,KAAK;AAC9D,QAAM,aAAa,IAAI,yBAAyB,KAAK;AACrD,MAAI,CAAC,cAAc,CAAC,0BAA0B,KAAK,UAAU,KAAK,CAAC;AACjE,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QACE;AAAA,IACJ;AACF,MAAI;AACF,UAAM,SAAS,2BAA2B;AAAA,MACxC;AAAA,MACA,WAAW,QAAQ,aAAa;AAAA,IAClC,CAAC;AACD,UAAM,SAAS,MAAM,OAAO,mBAAmB;AAAA,MAC7C;AAAA,MACA,aAAa,OAAO,YAAY,IAAI,CAAC,SAAS,KAAK,KAAK;AAAA,IAC1D,CAAC;AACD,UAAM,WAAW,IAAI;AAAA,MACnB,OAAO,YAAY,IAAI,CAAC,SAAS;AAAA,QAC/B,KAAK,MAAM;AAAA,QACX,KAAK,MAAM;AAAA,MACb,CAAC;AAAA,IACH;AACA,QACE,OAAO,MAAM,WAAW,SAAS,QACjC,IAAI,IAAI,OAAO,MAAM,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE,SAChD,SAAS,QACX,OAAO,MAAM;AAAA,MACX,CAAC,SACC,CAAC,SAAS,IAAI,KAAK,OAAO,KAC1B,SAAS,IAAI,KAAK,OAAO,MAAM,KAAK;AAAA,IACxC;AAEA,aAAO;AAAA,QACL,UAAU;AAAA,QACV,QAAQ;AAAA,MACV;AACF,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ,OAAO,OACX,kBAAkB,MAAM,IACxB,aAAa,OAAO,MAAM,MAAM,oCAAoC,OAAO,aAAa;AAAA,IAC9F;AAAA,EACF,SAAS,OAAO;AACd,WAAO,eAAe,KAAK;AAAA,EAC7B;AACF;;;AI/+EA,SAAS,oBAAoB;AAC7B,OAAOM,YAAU;AACjB,SAAS,qBAAqB;AAOvB,SAAS,sBAAuC;AACrD,QAAM,kBAAkBA,OAAK;AAAA,IAC3BA,OAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AAAA,IAC3C;AAAA,IACA;AAAA,EACF;AACA,QAAM,cAAc,KAAK;AAAA,IACvB,aAAa,iBAAiB,MAAM;AAAA,EACtC;AAEA,SAAO;AAAA,IACL,MAAM,YAAY,QAAQ;AAAA,IAC1B,SAAS,YAAY,WAAW;AAAA,EAClC;AACF;;;ACnBA,OAAOC,YAAU;AACjB,SAAS,iBAAiB;;;ACOnB,SAASC,cAAa,OAIX;AAChB,SAAO;AAAA,IACL,UAAU,MAAM,YAAY,cAAc;AAAA,IAC1C,QAAQ,MAAM,OACV,KAAK,UAAU,EAAE,IAAI,OAAO,OAAO,MAAM,MAAM,GAAG,MAAM,CAAC,IACzD,MAAM,MAAM;AAAA,EAClB;AACF;;;ACvBA,SAAS,YAAAC,iBAAgB;AAEzB,SAAS,KAAAC,WAAS;AAKlB,IAAM,gBAAgBC,IACnB,OAAO;AAAA,EACN,SAASA,IAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EACnC,YAAYA,IAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC;AAAA,EAClC,IAAIA,IAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACpC,MAAMA,IAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACtC,MAAMA,IACH,OAAO,EACP,KAAK,EACL,IAAI,CAAC,EACL,IAAI,EAAE,EACN,MAAM,4BAA4B;AACvC,CAAC,EACA,OAAO;AAEV,IAAM,oBAAoBA,IACvB,OAAO,EAAE,UAAUA,IAAE,MAAM,aAAa,EAAE,CAAC,EAC3C,OAAO;AACV,IAAM,wBAAwBA,IAAE,OAAO,EAAE,SAAS,cAAc,CAAC,EAAE,OAAO;AAC1E,IAAMC,4BAA2BD,IAC9B,OAAO;AAAA,EACN,QAAQA,IAAE;AAAA,IACRA,IACG,OAAO;AAAA,MACN,SAASA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MACzB,SAASA,IAAE,QAAQ;AAAA,MACnB,cAAcA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MAC9B,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,MACtB,SAASA,IAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,IACrC,CAAC,EACA,OAAO;AAAA,EACZ;AAAA,EACA,UAAUA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC1B,cAAcA,IAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EACxC,WAAWA,IAAE,OAAO,EAAE,IAAI,CAAC;AAC7B,CAAC,EACA,OAAO;AASH,SAAS,qBAAqB,OAGlC;AACD,QAAM,YAAY,MAAM,aAAa;AACrC,QAAM,UAAU,OAAU,YAMR;AAChB,UAAM,WAAW,IAAI,IAAI,QAAQ,MAAM,MAAM,SAAS;AACtD,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,UAAU,UAAU;AAAA,QACnC,MAAM,QAAQ;AAAA,QACd,SAAS;AAAA,UACP,QAAQ;AAAA,UACR,eAAe,UAAU,QAAQ,KAAK;AAAA,UACtC,GAAI,OAAO,QAAQ,SAAS,WACxB,EAAE,gBAAgB,mBAAmB,IACrC,CAAC;AAAA,QACP;AAAA,QACA,QAAQ,QAAQ;AAAA,MAClB,CAAC;AAAA,IACH,QAAQ;AACN,YAAM,IAAI;AAAA,QACR;AAAA,QACA,mBAAmB,SAAS,MAAM;AAAA,QAClC;AAAA,UACE,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,UAAM,OAAQ,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,IAAI;AAEpD,QAAI,CAAC,SAAS,GAAI,OAAM,cAAc,MAAM,SAAS,MAAM;AAC3D,UAAM,SAAS,QAAQ,OAAO,UAAU,IAAI;AAC5C,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,WAAO,OAAO;AAAA,EAChB;AAEA,SAAO;AAAA,IACL,MAAM,cAAc,SAMM;AACxB,YAAM,SAAS,MAAM,QAAQ;AAAA,QAC3B,MAAM,KAAK,UAAU;AAAA,UACnB,SAAS,QAAQ;AAAA,UACjB,mBAAmB,QAAQ;AAAA,UAC3B,MAAM,QAAQ;AAAA,UACd,MAAM,QAAQ;AAAA,QAChB,CAAC;AAAA,QACD,OAAO,QAAQ;AAAA,QACf,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,QAAQ;AAAA,MACV,CAAC;AACD,aAAO,OAAO;AAAA,IAChB;AAAA,IAEA,MAAM,WAAW,SAGS;AACxB,YAAM,SAAS,MAAM,QAAQ;AAAA,QAC3B,OAAO,QAAQ;AAAA,QACf,MAAM,wBAAwB,mBAAmB,QAAQ,SAAS,CAAC;AAAA,QACnE,QAAQ;AAAA,MACV,CAAC;AACD,aAAO,OAAO;AAAA,IAChB;AAAA,IAEA,MAAM,aAAa,SAAqD;AACtE,YAAM,SAAS,MAAM,QAAQ;AAAA,QAC3B,OAAO,QAAQ;AAAA,QACf,MAAM;AAAA,QACN,QAAQ;AAAA,MACV,CAAC;AACD,aAAO,OAAO;AAAA,IAChB;AAAA,IAEA,MAAM,iBAAiB,SAIc;AACnC,YAAM,OAAO,IAAI,SAAS;AAC1B,YAAM,EAAE,aAAa,cAAc,GAAG,eAAe,IAAI,QAAQ;AACjE,WAAK,IAAI,YAAY,KAAK,UAAU,cAAc,CAAC;AACnD,WAAK;AAAA,QACH;AAAA,QACA,KAAK,UAAU;AAAA,UACb,SAAS;AAAA,UACT,MAAM;AAAA,UACN,WAAW,QAAQ;AAAA,QACrB,CAAC;AAAA,MACH;AACA,WAAK;AAAA,QACH;AAAA,QACA,IAAI,KAAK,CAAC,MAAME,UAAS,QAAQ,SAAS,WAAW,CAAC,GAAG;AAAA,UACvD,MAAM;AAAA,QACR,CAAC;AAAA,QACD;AAAA,MACF;AACA,aAAO,QAAQ;AAAA,QACb,MAAM;AAAA,QACN,OAAO,QAAQ;AAAA,QACf,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,QAAQD;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,cAAc,MAAe,QAA0B;AAC9D,QAAM,UAAU;AAChB,QAAM,YAAY,SAAS;AAC3B,QAAM,OACJ,aACA,OAAO,cAAc,YACrB,OAAO,UAAU,SAAS,WACtB,UAAU,OACV,WAAW,MACT,iBACA,WAAW,MACT,cACA,WAAW,MACT,cACA,WAAW,MACT,aACA;AACd,QAAM,UACJ,OAAO,cAAc,WACjB,YACA,aACE,OAAO,cAAc,YACrB,OAAO,UAAU,YAAY,WAC7B,UAAU,UACV,yBAAyB,MAAM;AACvC,SAAO,IAAI,SAAS,MAAM,OAAO;AACnC;;;AC7MA,SAAS,cAAAE,mBAAkB;AAC3B,SAAS,SAAAC,QAAO,YAAAC,WAAU,YAAAC,iBAAgB;AAC1C,OAAOC,SAAQ;AACf,OAAOC,YAAU;AAEjB,SAAS,KAAAC,WAAS;;;ACLX,IAAM,+BAA+B;AAErC,SAAS,gBAAgB,OAAuB;AACrD,MAAI;AACJ,MAAI;AACF,UAAM,IAAI,IAAI,KAAK;AAAA,EACrB,QAAQ;AACN,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,MAAI,IAAI,aAAa,YAAY,IAAI,aAAa,SAAS;AACzD,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AACA,SAAO,IAAI;AACb;;;ADJA,IAAM,sBAAsBC,IACzB,OAAO;AAAA,EACN,QAAQA,IAAE,OAAO,EAAE,IAAI;AAAA,EACvB,gBAAgBA,IAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EAChD,WAAWA,IAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EAC3C,aAAaA,IAAE,OAAO,EAAE,OAAOC,OAAK,UAAU;AAAA,EAC9C,aAAaD,IACV,OAAO,EACP,KAAK,EACL,IAAI,CAAC,EACL,IAAI,EAAE,EACN,MAAM,4BAA4B;AACvC,CAAC,EACA,OAAO;AAEV,IAAM,uBAAuBA,IAC1B,OAAO;AAAA,EACN,UAAUA,IAAE,OAAO,mBAAmB;AAAA,EACtC,SAASA,IAAE,QAAQ,CAAC;AACtB,CAAC,EACA,OAAO;AAaV,eAAsB,0BAA0B,OAOP;AACvC,QAAM,YAAY,gBAAgB,MAAM,SAAS;AACjD,QAAM,iBAAiB,MAAME,UAASD,OAAK,QAAQ,MAAM,cAAc,CAAC;AACxE,QAAM,UAAU,EAAE,WAAW,gBAAgB,SAAS,QAAiB;AACvE,QAAM,UAAU,MAAM,MAAM,oBAAoB,KAAK,OAAO;AAC5D,MAAI,QAAS,QAAO,EAAE,SAAS,SAAS,QAAQ,kBAAkB;AAElE,QAAM,SAAS,MAAM;AAAA,IACnB,MAAM,sBAAsB,4BAA4B;AAAA,EAC1D;AACA,MAAI,CAAC,OAAQ,QAAO,EAAE,SAAS,MAAM,QAAQ,YAAY;AACzD,QAAM,MAAM,iBAAiB,WAAW,cAAc;AACtD,QAAM,YAAY,OAAO,SAAS,GAAG;AACrC,MACE,CAAC,aACD,UAAU,WAAW,aACrB,UAAU,gBAAgB,kBAC1B,UAAU,mBAAmB,MAAM,kBACnC,UAAU,gBAAgB,MAAM,aAChC;AACA,WAAO,EAAE,SAAS,MAAM,QAAQ,YAAY;AAAA,EAC9C;AAEA,QAAM,WAAW,MAAM,MAAM,oBAAoB,MAAM;AAAA,IACrD,GAAG;AAAA,IACH,gBAAgB,UAAU;AAAA,IAC1B,SAAS,EAAE,IAAI,UAAU,WAAW,MAAM,UAAU,YAAY;AAAA,EAClE,CAAC;AACD,QAAM,WAAW,MAAM,MAAM,oBAAoB,KAAK,OAAO;AAC7D,MAAI,CAAC,YAAY,SAAS,QAAQ,OAAO,SAAS,QAAQ,IAAI;AAC5D,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,SAAS,UAAU,QAAQ,WAAW;AACjD;AAEO,SAAS,4BACd,QAGI,CAAC,GACG;AACR,QAAM,MAAM,MAAM,OAAO,QAAQ;AACjC,QAAM,aAAa,IAAI,kBACnBA,OAAK,QAAQ,IAAI,eAAe,IAChCA,OAAK,KAAK,MAAM,WAAWE,IAAG,QAAQ,GAAG,SAAS;AACtD,SAAOF,OAAK,KAAK,YAAY,UAAU,SAAS,uBAAuB;AACzE;AAEA,eAAe,mBAAmB,UAAkB;AAClD,MAAI;AACF,UAAM,QAAQ,MAAMG,OAAM,QAAQ;AAClC,QAAI,MAAM,eAAe,KAAK,CAAC,MAAM,OAAO;AAC1C,YAAM,IAAI,MAAM,aAAa;AAC/B,UAAM,SAAS,qBAAqB;AAAA,MAClC,KAAK,MAAM,MAAMC,UAAS,UAAU,MAAM,CAAC;AAAA,IAC7C;AACA,eAAW,CAAC,KAAK,OAAO,KAAK,OAAO,QAAQ,OAAO,QAAQ,GAAG;AAC5D,UACE,QACA,iBAAiB,gBAAgB,QAAQ,MAAM,GAAG,QAAQ,WAAW,GACrE;AACA,cAAM,IAAI,MAAM,sBAAsB;AAAA,MACxC;AAAA,IACF;AACA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,SAAU,QAAO;AAC/D,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,QACE,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,QAAgB,aAA6B;AACrE,SAAOC,YAAW,QAAQ,EAAE,OAAO,GAAG,MAAM,KAAK,WAAW,EAAE,EAAE,OAAO,KAAK;AAC9E;;;AErIA,SAAS,cAAAC,aAAY,cAAAC,mBAAkB;AACvC;AAAA,EACE;AAAA,EACA,SAAAC;AAAA,EACA,YAAAC;AAAA,EACA,UAAAC;AAAA,EACA,MAAAC;AAAA,EACA,aAAAC;AAAA,OACK;AACP,OAAOC,YAAU;AACjB,YAAY,SAAS;;;ACVrB,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,SAAAC,QAAO,YAAAC,iBAAgB;AAChC,OAAOC,YAAU;AACjB,OAAO,QAAQ;AAGR,IAAM,mBAAmB;AACzB,IAAM,mBAAmB,KAAK,OAAO;AACrC,IAAM,iBAAiB,KAAK,OAAO;AAE1C,IAAM,oBAAoB;AAC1B,IAAM,qBAAqB,oBAAI,IAAI;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AACD,IAAM,kBAAkB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AACF;AAaA,SAAS,YAAY,cAA+B;AAClD,QAAM,WAAW,aAAa,MAAM,GAAG;AACvC,MAAI,SAAS,KAAK,CAAC,YAAY,mBAAmB,IAAI,OAAO,CAAC,EAAG,QAAO;AACxE,SAAO,gBAAgB,KAAK,CAAC,YAAY,QAAQ,KAAK,SAAS,GAAG,EAAE,KAAK,EAAE,CAAC;AAC9E;AAEA,eAAe,SAAS,UAAmC;AACzD,SAAOH,YAAW,QAAQ,EACvB,OAAO,MAAME,UAAS,QAAQ,CAAC,EAC/B,OAAO,KAAK;AACjB;AAEA,eAAsB,qBACpB,aACA,QAC2B;AAC3B,QAAM,SAAmB,CAAC;AAC1B,QAAM,WAAqB,CAAC;AAC5B,QAAM,kBAAkB;AAAA,IACtB,GAAG,OAAO,OAAO,QAAQ,CAAC,UAAU,MAAM,OAAO;AAAA,IACjD,GAAI,OAAO,QAAQ,WAAW,CAAC;AAAA,IAC/B,GAAI,OAAO,mBAAmB,CAAC,OAAO,gBAAgB,IAAI,CAAC;AAAA,EAC7D;AACA,QAAM,UAAU,MAAM,GAAG,iBAAiB;AAAA,IACxC,KAAK;AAAA,IACL,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,qBAAqB;AAAA,IACrB,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AACD,QAAM,gBAAgB;AAAA,IACpB,GAAG,IAAI,IAAI,QAAQ,IAAI,CAAC,SAAS,KAAK,WAAW,MAAM,GAAG,CAAC,CAAC;AAAA,EAC9D,EAAE,KAAK;AAEP,MAAI,cAAc,WAAW;AAC3B,WAAO,KAAK,+CAA+C;AAC7D,MAAI,cAAc,SAAS,kBAAkB;AAC3C,WAAO;AAAA,MACL,uBAAuB,cAAc,MAAM,wBAAwB,gBAAgB;AAAA,IACrF;AAAA,EACF;AAEA,QAAM,oBAAoB,oBAAI,IAAY;AAE1C,aAAW,SAAS,OAAO,QAAQ;AACjC,UAAM,iBAAiB,MAAM,GAAG,MAAM,SAAS;AAAA,MAC7C,KAAK;AAAA,MACL,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,qBAAqB;AAAA,MACrB,QAAQ;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AACD,QAAI,eAAe,WAAW,GAAG;AAC/B,aAAO,KAAK,SAAS,MAAM,IAAI,oCAAoC;AACnE;AAAA,IACF;AACA,UAAM,WAAW,eACd,IAAI,CAAC,SAAS,KAAK,WAAW,MAAM,GAAG,CAAC,EACxC,OAAO,CAAC,SAAS,kBAAkB,KAAK,IAAI,CAAC;AAChD,QAAI,SAAS,WAAW,GAAG;AACzB,aAAO;AAAA,QACL,SAAS,MAAM,IAAI;AAAA,MACrB;AACA;AAAA,IACF;AACA,aAAS,QAAQ,CAAC,SAAS,kBAAkB,IAAI,IAAI,CAAC;AACtD,UAAM,aAAa,eAAe,SAAS,SAAS;AACpD,QAAI,aAAa,GAAG;AAClB,eAAS;AAAA,QACP,SAAS,MAAM,IAAI,aAAa,UAAU,mBAAmB,eAAe,IAAI,KAAK,GAAG;AAAA,MAC1F;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAuB,CAAC;AAC9B,MAAI,aAAa;AACjB,aAAW,gBAAgB,eAAe;AACxC,QAAI,YAAY,YAAY,GAAG;AAC7B,aAAO,KAAK,sCAAsC,YAAY,EAAE;AAChE;AAAA,IACF;AACA,UAAM,eAAeC,OAAK,QAAQ,aAAa,YAAY;AAC3D,UAAM,iBAAiBA,OAAK,SAAS,aAAa,YAAY;AAC9D,QAAI,eAAe,WAAW,IAAI,KAAKA,OAAK,WAAW,cAAc,GAAG;AACtE,aAAO,KAAK,2CAA2C,YAAY,EAAE;AACrE;AAAA,IACF;AACA,UAAM,QAAQ,MAAMF,OAAM,YAAY;AACtC,QAAI,CAAC,MAAM,OAAO,EAAG;AACrB,QAAI,MAAM,OAAO,gBAAgB;AAC/B,aAAO,KAAK,kCAAkC,YAAY,EAAE;AAC5D;AAAA,IACF;AACA,kBAAc,MAAM;AACpB,UAAM,KAAK;AAAA,MACT,MAAM;AAAA,MACN,MAAM,MAAM;AAAA,MACZ,UAAU,MAAM,SAAS,YAAY;AAAA,IACvC,CAAC;AAAA,EACH;AACA,MAAI,aAAa;AACf,WAAO,KAAK,2CAA2C;AAEzD,MAAI;AACF,UAAM,gBAAgB,MAAMC;AAAA,MAC1BC,OAAK,KAAK,aAAa,cAAc;AAAA,MACrC;AAAA,IACF;AACA,UAAM,cAAc,KAAK,MAAM,aAAa;AAI5C,QACE,CAAC,YAAY,eAAe,kBAAkB,KAC9C,CAAC,YAAY,kBAAkB,kBAAkB,GACjD;AACA,aAAO,KAAK,mDAAmD;AAAA,IACjE;AAAA,EACF,QAAQ;AACN,WAAO,KAAK,sCAAsC;AAAA,EACpD;AAEA,SAAO;AAAA,IACL,OAAO,OAAO,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe,kBAAkB;AAAA,EACnC;AACF;;;AD5IA,eAAe,YAAY,aAAsC;AAC/D,SAAOC,YAAW,QAAQ,EACvB,OAAO,MAAMC,UAAS,WAAW,CAAC,EAClC,OAAO,KAAK;AACjB;AAEA,eAAsB,uBAAuB,OAIb;AAC9B,QAAM,cAAcC,OAAK,QAAQ,MAAM,WAAW;AAClD,QAAM,SAAS,MAAM,iBAAiB,WAAW;AACjD,QAAM,aAAc,MAAM,qBAAqB,WAAW,KAAM;AAChE,QAAM,SAAS,MAAM,qBAAqB,aAAa,MAAM;AAC7D,MAAI,CAAC,OAAO,OAAO;AACjB,UAAM,IAAI;AAAA,MACR;AAAA,MACA,8BAA8B,OAAO,OAAO,KAAK,IAAI,CAAC;AAAA,MACtD;AAAA,QACE,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,kBAAkB,MAAM,SAC1BA,OAAK,QAAQA,OAAK,QAAQ,aAAa,MAAM,MAAM,CAAC,IACpDA,OAAK,KAAK,aAAa,WAAW,SAAS,aAAa;AAC5D,QAAMC,OAAM,iBAAiB,EAAE,WAAW,KAAK,CAAC;AAChD,QAAM,gBAAgBD,OAAK;AAAA,IACzB;AAAA,IACA,iBAAiBE,YAAW,CAAC;AAAA,EAC/B;AACA,QAAM,eAAe;AAAA,IACnB,GAAG,oBAAI,IAAI,CAAC,YAAY,GAAG,OAAO,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC;AAAA,EACnE,EAAE,KAAK;AAEP,QAAU;AAAA,IACR;AAAA,MACE,KAAK;AAAA,MACL,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,IACA;AAAA,EACF;AAEA,QAAMC,YAAW,MAAM,YAAY,aAAa;AAChD,QAAM,cAAc,MAAM,SACtBH,OAAK,QAAQ,aAAa,MAAM,MAAM,IACtCA,OAAK,KAAK,iBAAiB,gBAAgBG,UAAS,MAAM,GAAG,EAAE,CAAC,MAAM;AAC1E,MAAI;AACF,UAAM,OAAO,WAAW;AACxB,QAAI,MAAM,QAAQ;AAChB,YAAMC,IAAG,eAAe,EAAE,OAAO,KAAK,CAAC;AACvC,YAAM,IAAI;AAAA,QACR;AAAA,QACA,yBAAyB,WAAW;AAAA,MACtC;AAAA,IACF;AACA,UAAMA,IAAG,eAAe,EAAE,OAAO,KAAK,CAAC;AAAA,EACzC,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS;AAC5C,YAAMC,QAAO,eAAe,WAAW;AAAA,QACpC,OAAM;AAAA,EACb;AAEA,QAAM,WAA+B;AAAA,IACnC,eAAe;AAAA,IACf,SAAS,EAAE,GAAG,OAAO,SAAS,GAAG,MAAM,gBAAgB;AAAA,IACvD,QAAQ,OAAO;AAAA,IACf,UAAU,OAAO;AAAA,IACjB,kBAAkB,OAAO;AAAA,IACzB,WAAW,OAAO;AAAA,IAClB,UAAAF;AAAA,IACA;AAAA,IACA,WAAW,OAAO,MAAM;AAAA,IACxB,YAAY,OAAO;AAAA,IACnB,OAAO,OAAO;AAAA,IACd,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AACA,QAAMG;AAAA,IACJ,GAAG,WAAW;AAAA,IACd,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA;AAAA,IACpC;AAAA,EACF;AACA,SAAO;AACT;;;AE5HA,SAAS,SAAAC,QAAO,YAAAC,YAAU,aAAAC,kBAAiB;AAC3C,OAAOC,YAAU;AAYV,IAAM,2BAA2B;AACxC,IAAM,wBAAwB;AAE9B,eAAe,OAAO,UAAoC;AACxD,MAAI;AACF,UAAMC,WAAS,QAAQ;AACvB,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,SAAU,QAAO;AAC/D,UAAM;AAAA,EACR;AACF;AAEA,SAAS,4BAA4B,OAG1B;AACT,QAAM,WAAW,MAAM,SAAS,WAAW,MAAM,GAAG;AACpD,SAAO;AAAA;AAAA;AAAA,aAGI,KAAK,UAAU,aAAa,MAAM,MAAM,KAAK,QAAQ,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAc7D,KAAK,UAAU,MAAM,WAAW,uBAAuB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOhE;AAEA,eAAe,4BAA4B,OAIzB;AAChB,QAAM,aAAaC,OAAK,KAAK,MAAM,aAAa,wBAAwB;AACxE,MAAI,MAAM,OAAO,UAAU,GAAG;AAC5B,UAAM,IAAI;AAAA,MACR;AAAA,MACA,GAAG,wBAAwB;AAAA,MAC3B;AAAA,QACE,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,QAAMC,WAAU,YAAY,4BAA4B,KAAK,GAAG;AAAA,IAC9D,UAAU;AAAA,IACV,MAAM;AAAA,EACR,CAAC;AACH;AAEA,eAAsB,kBAAkB,aAAsC;AAC5E,MAAI;AACF,UAAM,WAAW,MAAMF;AAAA,MACrBC,OAAK,KAAK,aAAa,cAAc;AAAA,MACrC;AAAA,IACF;AACA,UAAM,SAAS,KAAK,MAAM,QAAQ;AAClC,WAAO,OAAO,OAAO,SAAS,WAC1B,OAAO,OACPA,OAAK,SAAS,WAAW;AAAA,EAC/B,QAAQ;AACN,WAAOA,OAAK,SAAS,WAAW;AAAA,EAClC;AACF;AAEA,eAAe,gBAAgB,aAAuC;AACpE,QAAM,gBAAgBA,OAAK,KAAK,aAAa,YAAY;AACzD,MAAI,WAAW;AACf,MAAI;AACF,eAAW,MAAMD,WAAS,eAAe,MAAM;AAAA,EACjD,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,SAAU,OAAM;AAAA,EAChE;AACA,MAAI,SAAS,MAAM,OAAO,EAAE,SAAS,qBAAqB,EAAG,QAAO;AACpE,QAAM,SAAS,SAAS,SAAS,KAAK,CAAC,SAAS,SAAS,IAAI,IAAI,OAAO;AACxE,QAAME;AAAA,IACJ;AAAA,IACA,GAAG,QAAQ,GAAG,MAAM,GAAG,qBAAqB;AAAA;AAAA,IAC5C;AAAA,EACF;AACA,SAAO;AACT;AAmDA,eAAsB,kBAAkB,OAMhB;AACtB,QAAM,cAAcC,OAAK,QAAQ,MAAM,WAAW;AAClD,QAAM,iBAAiB,MAAM,qBAAqB,WAAW;AAC7D,MAAI,gBAAgB;AAClB,UAAM,IAAI,SAAS,iBAAiB,GAAG,cAAc,oBAAoB;AAAA,MACvE,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACA,QAAM,aAAaA,OAAK,KAAK,aAAa,WAAW;AAErD,QAAM,UAAoB,CAAC;AAC3B,QAAM,UAAoB,CAAC;AAC3B,QAAM,WAAW,MAAM,YAAY;AACnC,QAAMC,eAAc,MAAM,kBAAkB,WAAW;AACvD,QAAM,cAAc,mBAAmB,MAAM,WAAWA,YAAW;AACnE,QAAM,YAAY,YAAY,MAAM,SAAS,UAAU;AACvD,QAAM,cAAcD,OAAK,MAAM;AAAA,IAC7B,SAAS,WAAW,MAAM,GAAG;AAAA,IAC7B,GAAG,SAAS;AAAA,EACd;AACA,QAAM,eAAe,qBAAqB,UAAU;AAAA,IAClD,SAAS;AAAA,IACT,SAAS;AAAA,MACP,MAAM,YAAY,MAAM,WAAWC,YAAW;AAAA,MAC9C,MAAM;AAAA,MACN,SAAS,MAAM;AAAA,MACf,mBAAmB;AAAA,IACrB;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,kBAAkB;AAAA,IAClB,QAAQ;AAAA,MACN;AAAA,QACE,MAAM;AAAA,QACN,MAAM,mBAAmB,MAAM,SAAS,UAAU;AAAA,QAClD,SAAS,CAAC,WAAW;AAAA,QACrB,QAAQ;AAAA,QACR,UAAU,EAAE,MAAM,aAAa,gBAAgB,IAAI;AAAA,MACrD;AAAA,IACF;AAAA,EACF,CAAC;AACD,MAAI,CAAC,aAAa,SAAS;AACzB,UAAM,IAAI;AAAA,MACR;AAAA,MACA,aAAa,MAAM,OAAO,IAAI,CAAC,UAAU,MAAM,OAAO,EAAE,KAAK,IAAI;AAAA,IACnE;AAAA,EACF;AACA,QAAM,SAAS,aAAa;AAE5B,QAAM,4BAA4B;AAAA,IAChC;AAAA,IACA;AAAA,IACA,SAAS,MAAM;AAAA,EACjB,CAAC;AACD,UAAQ,KAAK,wBAAwB;AAErC,QAAM,gBAAgBD,OAAK,KAAK,aAAa,QAAQ;AACrD,QAAME,OAAM,eAAe,EAAE,WAAW,KAAK,CAAC;AAC9C,MAAI,CAAE,MAAM,OAAOF,OAAK,KAAK,aAAa,WAAW,CAAC,GAAI;AACxD,UAAMG;AAAA,MACJH,OAAK,KAAK,aAAa,WAAW;AAAA,MAClC;AAAA;AAAA,OAA4D,KAAK,UAAU,GAAG,mBAAmB,MAAM,SAAS,UAAU,CAAC,eAAe,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,MAC3I,EAAE,UAAU,QAAQ,MAAM,KAAK;AAAA,IACjC;AACA,YAAQ,KAAK,WAAW;AAAA,EAC1B;AAEA,QAAMG,WAAU,YAAY,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,GAAM;AAAA,IAClE,UAAU;AAAA,IACV,MAAM;AAAA,EACR,CAAC;AACD,UAAQ,QAAQ,WAAW;AAE3B,MAAI,MAAM,gBAAgB,WAAW,EAAG,SAAQ,KAAK,YAAY;AACjE,SAAO,EAAE,SAAS,QAAQ;AAC5B;;;ACjPA,OAAOC,SAAQ;;;ACAf,SAAS,YAAAC,kBAAgB;AACzB,SAAS,qBAAqB;AAC9B,OAAOC,YAAU;AAEjB,OAAOC,SAAQ;;;ACJf,SAAS,YAAAC,kBAAgB;AACzB,OAAOC,YAAU;;;ADgBjB,IAAM,0BACJ;AACF,IAAM,SAAS;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,eAAsB,wBACpB,aACA,UACmB;AACnB,QAAM,qBAAqB,SACxB,WAAW,MAAM,GAAG,EACpB,QAAQ,SAAS,EAAE;AACtB,QAAM,YAAY,MAAMC,IAAG,yBAAyB;AAAA,IAClD,KAAK;AAAA,IACL,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,qBAAqB;AAAA,IACrB,QAAQ;AAAA,EACV,CAAC;AACD,SAAO,UACJ,IAAI,CAAC,UAAU,MAAM,WAAW,MAAM,GAAG,CAAC,EAC1C;AAAA,IACC,CAAC,aACC,uBAAuB,OACvB,SAAS,WAAW,GAAG,kBAAkB,GAAG;AAAA,EAChD,EACC,KAAK;AACV;AAEA,eAAsB,kCACpB,aACA,WACA,UACmB;AACnB,MAAI,UAAU,WAAW,EAAG,QAAO,CAAC;AACpC,QAAM,aAAa,IAAI;AAAA,IACrB,MAAM,wBAAwB,aAAa,QAAQ;AAAA,EACrD;AACA,QAAM,UAAU,MAAMA,IAAG,WAAW;AAAA,IAClC,KAAK;AAAA,IACL,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,qBAAqB;AAAA,IACrB,QAAQ;AAAA,EACV,CAAC;AACD,SAAO,QACJ,IAAI,CAAC,UAAU,MAAM,WAAW,MAAM,GAAG,CAAC,EAC1C,OAAO,CAAC,UAAU,WAAW,IAAI,KAAK,CAAC,EACvC,KAAK;AACV;;;AE5EA,OAAOC,YAAU;AAEjB,OAAOC,SAAQ;AAIf,IAAM,uBAAuB;AAe7B,SAAS,oBAAoB,UAA0B;AACrD,QAAM,WAAWC,OAAK,MACnB,SAAS,QAAQ,EACjB,QAAQ,2BAA2B,EAAE;AACxC,SACE,SACG,MAAM,eAAe,EACrB,OAAO,OAAO,EACd,IAAI,CAAC,SAAS,GAAG,KAAK,OAAO,CAAC,EAAE,YAAY,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC,EAAE,EAC/D,KAAK,GAAG,KAAK;AAEpB;AAEA,SAAS,gBAAgB,OAA2B;AAClD,SAAO,CAAC,GAAG,IAAI,IAAI,MAAM,IAAI,CAAC,UAAU,MAAM,WAAW,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK;AAC9E;AAEO,SAAS,cAAc,OAKjB;AACX,QAAM,aAAa,gBAAgB,MAAM,eAAe;AACxD,QAAM,gBAAgB,IAAI,IAAI,UAAU;AACxC,QAAM,kBAAkB,oBAAI,IAAY;AACxC,QAAM,iBAAiB,oBAAI,IAAY;AACvC,QAAM,UAA+B,CAAC;AACtC,QAAM,YAAmC,CAAC;AAC1C,QAAM,iBAA6C,CAAC;AAEpD,aAAW,SAAS,MAAM,OAAO,QAAQ;AACvC,UAAM,YAAY,gBAAgB,MAAM,OAAO;AAC/C,QAAI,UAAU,KAAK,CAAC,aAAaC,IAAG,iBAAiB,QAAQ,CAAC,GAAG;AAC/D,YAAM,eAAe;AAAA,QACnB,MAAM,sBAAsB,MAAM,IAAI,KAAK,CAAC;AAAA,MAC9C;AACA,mBAAa,QAAQ,CAAC,SAAS,eAAe,IAAI,IAAI,CAAC;AACvD,qBAAe,KAAK,EAAE,WAAW,MAAM,MAAM,WAAW,aAAa,CAAC;AACtE;AAAA,IACF;AAEA,eAAW,YAAY,UAAU;AAAA,MAAO,CAAC,UACvC,qBAAqB,KAAK,KAAK;AAAA,IACjC,GAAG;AACD,sBAAgB,IAAI,QAAQ;AAC5B,UAAI,cAAc,IAAI,QAAQ;AAC5B,kBAAU,KAAK,EAAE,MAAM,UAAU,WAAW,MAAM,KAAK,CAAC;AAAA,UACrD,SAAQ,KAAK,EAAE,MAAM,UAAU,WAAW,MAAM,KAAK,CAAC;AAAA,IAC7D;AAAA,EACF;AAEA,QAAM,QAAQ,WACX,OAAO,CAAC,SAAS,CAAC,gBAAgB,IAAI,IAAI,KAAK,CAAC,eAAe,IAAI,IAAI,CAAC,EACxE,IAAI,CAAC,SAAS;AACb,UAAM,cAAc,oBAAoB,IAAI;AAC5C,WAAO,EAAE,MAAM,MAAM,aAAa,aAAa,YAAY,WAAW,EAAE;AAAA,EAC1E,CAAC;AAEH,UAAQ;AAAA,IAAK,CAAC,MAAM,UAClB,KAAK,SAAS,MAAM,OAChB,KAAK,UAAU,cAAc,MAAM,SAAS,IAC5C,KAAK,KAAK,cAAc,MAAM,IAAI;AAAA,EACxC;AACA,YAAU;AAAA,IAAK,CAAC,MAAM,UACpB,KAAK,SAAS,MAAM,OAChB,KAAK,UAAU,cAAc,MAAM,SAAS,IAC5C,KAAK,KAAK,cAAc,MAAM,IAAI;AAAA,EACxC;AACA,iBAAe;AAAA,IAAK,CAAC,MAAM,UACzB,KAAK,UAAU,cAAc,MAAM,SAAS;AAAA,EAC9C;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,mBAAmB,MAAM;AAAA,IACzB,UAAU,MAAM,SAAS,KAAK,QAAQ,SAAS,KAAK,MAAM;AAAA,EAC5D;AACF;;;ACtGA,SAAS,sBAAsB;AAC/B,SAAS,YAAAC,kBAAgB;AACzB,OAAOC,YAAU;AAEjB,SAAS,aAAa;AAItB,IAAM,mBAAmB,oBAAI,IAAI,CAAC,kBAAkB,CAAC;AACrD,IAAM,WAAW,oBAAI,IAAI;AAAA,EACvB,GAAG;AAAA,EACH,GAAG,eAAe,IAAI,CAAC,SAAS,QAAQ,IAAI,EAAE;AAChD,CAAC;AACD,IAAM,sBAAsB;AAU5B,SAAS,YAAY,YAA4B;AAC/C,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO,WAAW,MAAM,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG;AACnD,SAAO,WAAW,MAAM,GAAG,EAAE,CAAC,KAAK;AACrC;AAEA,SAAS,uBACP,aACA,WACQ;AACR,QAAM,WAAWC,OAAK,WAAW,SAAS,IACtC,YACAA,OAAK,QAAQ,aAAa,SAAS;AACvC,QAAM,WAAWA,OAAK,SAAS,aAAa,QAAQ,EAAE,WAAW,MAAM,GAAG;AAC1E,MAAI,CAAC,YAAY,SAAS,WAAW,KAAK,KAAKA,OAAK,WAAW,QAAQ,GAAG;AACxE,UAAM,IAAI;AAAA,MACR;AAAA,MACA,gDAAgD,SAAS;AAAA,IAC3D;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,mBAAmB,OAGb;AAC1B,QAAM,cAAcA,OAAK,QAAQ,MAAM,WAAW;AAClD,QAAM,aAAa;AAAA,IACjB,GAAG,IAAI;AAAA,MACL,MAAM,WAAW,IAAI,CAAC,SAAS,uBAAuB,aAAa,IAAI,CAAC;AAAA,IAC1E;AAAA,EACF;AACA,MAAI;AACJ,MAAI;AACF,aAAS,MAAM,MAAM;AAAA,MACnB,eAAe;AAAA,MACf,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,UAAU;AAAA,MACV,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,UAAU;AAAA,MACV,WAAW;AAAA,IACb,CAAC;AAAA,EACH,SAAS,OAAO;AACd,UAAM,IAAI;AAAA,MACR;AAAA,MACA,iBAAiB,QACb,MAAM,UACN;AAAA,MACJ;AAAA,QACE,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,OAAO,KAAK,OAAO,UAAU,UAAU,CAAC,CAAC,EAAE;AAAA,IAAI,CAAC,SAC7D,uBAAuB,aAAa,IAAI;AAAA,EAC1C;AACA,QAAM,WAAW,IAAI,IAAI,UAAU;AACnC,QAAM,mBAAmB,oBAAI,IAAY;AACzC,QAAM,oBAAoB,oBAAI,IAAyB;AACvD,aAAW,CAAC,YAAY,aAAa,KAAK,OAAO;AAAA,IAC/C,OAAO,UAAU,UAAU,CAAC;AAAA,EAC9B,GAAG;AACD,eAAW,YAAY,cAAc,SAAS;AAC5C,UAAI,CAAC,SAAS,YAAY,SAAS,IAAI,SAAS,IAAI,EAAG;AACvD,YAAM,aAAa,YAAY,SAAS,IAAI;AAC5C,UAAI,iBAAiB,IAAI,UAAU,EAAG;AACtC,YAAM,YAAY,kBAAkB,IAAI,UAAU,KAAK,oBAAI,IAAY;AACvE,gBAAU,IAAI,uBAAuB,aAAa,UAAU,CAAC;AAC7D,wBAAkB,IAAI,YAAY,SAAS;AAAA,IAC7C;AAAA,EACF;AACA,aAAW,UAAU,OAAO,OAAO,OAAO,UAAU,WAAW,CAAC,CAAC,GAAG;AAClE,eAAW,YAAY,OAAO,SAAS;AACrC,UAAI,CAAC,SAAS,YAAY,SAAS,IAAI,SAAS,IAAI,EAAG;AACvD,YAAM,aAAa,YAAY,SAAS,IAAI;AAC5C,UAAI,CAAC,iBAAiB,IAAI,UAAU,EAAG,kBAAiB,IAAI,UAAU;AAAA,IACxE;AAAA,EACF;AAEA,QAAM,uBAAuB,oBAAI,IAAY;AAC7C,QAAM,sBAAsB,oBAAI,IAAY;AAC5C,QAAM,QAAQ;AAAA,IACZ,OAAO,IAAI,OAAO,SAAS;AACzB,YAAM,SAAS,MAAMC,WAASD,OAAK,KAAK,aAAa,IAAI,GAAG,MAAM,EAAE;AAAA,QAClE,MAAM;AAAA,MACR;AACA,iBAAW,SAAS,OAAO,SAAS,mBAAmB,GAAG;AACxD,YAAI,MAAM,CAAC,KAAK,MAAM,CAAC,MAAM,uBAAuB;AAClD,+BAAqB,IAAI,MAAM,CAAC,CAAC;AAAA,QACnC;AAAA,MACF;AACA,UACE,6BAA6B,KAAK,IAAI,KACtC,kBAAkB,KAAK,MAAM,GAC7B;AACA,4BAAoB;AAAA,UAClB,GAAG,IAAI;AAAA,QACT;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,iBAAiB,OAAO,OAAO,CAAC,SAAS,CAAC,SAAS,IAAI,IAAI,CAAC,EAAE,KAAK;AAAA,IACnE,kBAAkB,CAAC,GAAG,gBAAgB,EAAE,KAAK;AAAA,IAC7C,mBAAmB,OAAO;AAAA,MACxB,CAAC,GAAG,kBAAkB,QAAQ,CAAC,EAC5B,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM,KAAK,cAAc,KAAK,CAAC,EACnD,IAAI,CAAC,CAAC,YAAY,SAAS,MAAM,CAAC,YAAY,CAAC,GAAG,SAAS,EAAE,KAAK,CAAC,CAAC;AAAA,IACzE;AAAA,IACA,sBAAsB,CAAC,GAAG,oBAAoB,EAAE,KAAK;AAAA,IACrD,qBAAqB,CAAC,GAAG,mBAAmB,EAAE,KAAK;AAAA,EACrD;AACF;;;AJ9HA,IAAME,wBAAuB;AAiC7B,SAAS,aAAa,QAA4B;AAChD,SAAO,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC,EAAE,KAAK;AACnC;AAEA,SAAS,kBAAkB,QAAgC;AACzD,SAAO;AAAA,IACL,OAAO,OAAO,QAAQ,CAAC,UAAU;AAC/B,UAAI,MAAM,QAAQ,KAAK,CAAC,aAAaC,IAAG,iBAAiB,QAAQ,CAAC;AAChE,eAAO,CAAC;AACV,aAAO,MAAM,QAAQ;AAAA,QAAO,CAAC,aAC3BD,sBAAqB,KAAK,QAAQ;AAAA,MACpC;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,qBAAqB,UAAyC;AACrE,QAAM,qBAAqB,SAAS,iBAAiB,IAAI,CAAC,eAAe;AACvE,UAAM,aACJ,SAAS,kBAAkB,UAAU,GAAG,KAAK,IAAI,KAAK;AACxD,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,GAAG,UAAU,mBAAmB,UAAU;AAAA,IACrD;AAAA,EACF,CAAC;AACD,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG,SAAS,oBAAoB,IAAI,CAAC,aAAa;AAAA,MAChD,MAAM;AAAA,MACN;AAAA,IACF,EAAE;AAAA,EACJ;AACF;AAEA,eAAe,oBACb,aACA,oBACyB;AACzB,QAAM,aAAa,MAAM,QAAQ,kBAAkB,IAC/C,aAAa,kBAAkB,IAC/B,kBAAkB,kBAAkB;AACxC,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO;AAAA,MACL,iBAAiB,CAAC;AAAA,MAClB,kBAAkB,CAAC;AAAA,MACnB,mBAAmB,CAAC;AAAA,MACpB,sBAAsB,CAAC;AAAA,MACvB,qBAAqB,CAAC;AAAA,IACxB;AAAA,EACF;AACA,SAAO,mBAAmB,EAAE,aAAa,WAAW,CAAC;AACvD;AAEA,eAAsB,mBACpB,aACyB;AACzB,QAAM,WAAW,MAAM,yBAAyB,WAAW;AAC3D,QAAM,kBAAkB,MAAM;AAAA,IAC5B;AAAA,IACA,SAAS,OAAO;AAAA,EAClB;AACA,QAAM,gBAAgB,SAAS,OAAO,OAAO;AAAA,IAAO,CAAC,UACnD,MAAM,QAAQ,KAAK,CAAC,aAAaC,IAAG,iBAAiB,QAAQ,CAAC;AAAA,EAChE;AACA,QAAM,iBAAiB,MAAM,QAAQ;AAAA,IACnC,cAAc,IAAI,OAAO,UAAU;AAAA,MACjC,MAAM;AAAA,MACN,MAAM;AAAA,QACJ;AAAA,QACA,MAAM;AAAA,QACN,SAAS,OAAO;AAAA,MAClB;AAAA,IACF,CAAC;AAAA,EACH;AACA,QAAM,OAAO,cAAc;AAAA,IACzB,QAAQ,SAAS;AAAA,IACjB;AAAA,IACA,uBAAuB,OAAO,YAAY,cAAc;AAAA,IACxD,mBAAmB,SAAS;AAAA,EAC9B,CAAC;AACD,QAAM,WAAW,MAAM;AAAA,IACrB;AAAA,IACA,KAAK,UAAU,IAAI,CAAC,UAAU,MAAM,IAAI;AAAA,EAC1C;AACA,QAAM,4BAA4B;AAAA,IAChC,SAAS,OAAO,QAAQ,WAAW,CAAC;AAAA,EACtC;AACA,QAAM,uBAAuB,SAAS,gBAAgB;AAAA,IACpD,CAAC,SAAS,CAAC,0BAA0B,SAAS,IAAI;AAAA,EACpD;AAEA,SAAO;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,MACN,GAAG;AAAA,MACH,UAAU,KAAK,YAAY,qBAAqB,SAAS;AAAA,MACzD,iBAAiB;AAAA,QACf,YAAY;AAAA,QACZ,UAAU,SAAS;AAAA,QACnB,OAAO;AAAA,MACT;AAAA,MACA,sBAAsB,SAAS;AAAA,MAC/B,UAAU,qBAAqB,QAAQ;AAAA,IACzC;AAAA,EACF;AACF;AAEA,SAAS,WAAW,MAAc,MAA2B;AAC3D,MAAI,YAAY;AAChB,MAAI,SAAS;AACb,SAAO,KAAK,IAAI,SAAS,GAAG;AAC1B,gBAAY,GAAG,KAAK,MAAM,GAAG,KAAK,IAAI,GAAG,KAAK,OAAO,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,MAAM;AACnF,cAAU;AAAA,EACZ;AACA,OAAK,IAAI,SAAS;AAClB,SAAO;AACT;AAEA,SAAS,yBAAyB,OAIzB;AACP,QAAM,gBAAgB,IAAI;AAAA,IACxB,MAAM,WAAW,OAAO,MAAM,IAAI,CAAC,UAAU,MAAM,IAAI;AAAA,EACzD;AACA,QAAM,kBAAkB,IAAI;AAAA,IAC1B,MAAM,WAAW,OAAO,QAAQ;AAAA,MAC9B,CAAC,UAAU,GAAG,MAAM,SAAS,KAAK,MAAM,IAAI;AAAA,IAC9C;AAAA,EACF;AACA,QAAM,eAAe,MAAM,cAAc;AAAA,IACvC,CAAC,SAAS,CAAC,cAAc,IAAI,IAAI;AAAA,EACnC;AACA,QAAM,iBAAiB,MAAM,gBAAgB;AAAA,IAC3C,CAAC,UAAU,CAAC,gBAAgB,IAAI,GAAG,MAAM,SAAS,KAAK,MAAM,IAAI,EAAE;AAAA,EACrE;AACA,MAAI,gBAAgB,gBAAgB;AAClC,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,QACE,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,UAAgC;AACxD,QAAM,aAAa,SAAS,iBAAiB,CAAC;AAC9C,MAAI,YAAY;AACd,UAAM,aACJ,SAAS,kBAAkB,UAAU,GAAG,KAAK,IAAI,KAAK;AACxD,UAAM,IAAI;AAAA,MACR;AAAA,MACA,sBAAsB,UAAU,uBAAuB,UAAU;AAAA,MACjE,EAAE,MAAM,+DAA+D;AAAA,IACzE;AAAA,EACF;AACA,QAAM,qBAAqB,SAAS,oBAAoB,CAAC;AACzD,MAAI,oBAAoB;AACtB,UAAM,IAAI,SAAS,4BAA4B,oBAAoB;AAAA,MACjE,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACF;AAEA,eAAsB,mBAAmB,OAKR;AAC/B,QAAM,gBAAgB,aAAa,MAAM,aAAa;AACtD,QAAM,kBACJ,MAAM,mBAAmB,MAAM,WAAW,OAAO;AACnD,2BAAyB;AAAA,IACvB,YAAY,MAAM;AAAA,IAClB;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,cAAc,IAAI;AAAA,IACtB,gBAAgB,IAAI,CAAC,UAAU,GAAG,MAAM,SAAS,KAAK,MAAM,IAAI,EAAE;AAAA,EACpE;AACA,QAAM,SAAS,MAAM,WAAW,SAAS,OAAO,OAC7C,IAAI,CAAC,WAAW;AAAA,IACf,GAAG;AAAA,IACH,SAAS,MAAM,QAAQ;AAAA,MACrB,CAAC,aAAa,CAAC,YAAY,IAAI,GAAG,MAAM,IAAI,KAAK,QAAQ,EAAE;AAAA,IAC7D;AAAA,EACF,EAAE,EACD,OAAO,CAAC,UAAU,MAAM,QAAQ,SAAS,CAAC;AAC7C,QAAM,YAAY,IAAI,IAAI,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC;AAC3D,QAAM,cAAkD,CAAC;AACzD,aAAW,YAAY,eAAe;AACpC,UAAM,WAAW,MAAM,WAAW,OAAO,MAAM;AAAA,MAC7C,CAAC,UAAU,MAAM,SAAS;AAAA,IAC5B;AACA,UAAM,YAAY,WAAW,SAAS,aAAa,SAAS;AAC5D,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,MAAM,SAAS;AAAA,MACf,SAAS,CAAC,QAAQ;AAAA,MAClB,QAAQ;AAAA,MACR,UAAU,EAAE,MAAM,SAAS;AAAA,IAC7B,CAAC;AACD,gBAAY,KAAK,EAAE,MAAM,UAAU,UAAU,CAAC;AAAA,EAChD;AACA,MAAI,OAAO,WAAW,GAAG;AACvB,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,QACE,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,qBAAqB,MAAM;AAAA,IAC3C,GAAG,MAAM,WAAW,SAAS;AAAA,IAC7B;AAAA,EACF,CAAC;AACD,QAAM,WAAW,MAAM,oBAAoB,MAAM,aAAa,SAAS;AACvE,mBAAiB,QAAQ;AACzB,QAAM,4BAA4B,UAAU,QAAQ,WAAW,CAAC;AAChE,QAAM,uBAAuB,SAAS,gBAAgB;AAAA,IACpD,CAAC,SAAS,CAAC,0BAA0B,SAAS,IAAI;AAAA,EACpD;AACA,QAAM,wBAAwB,aAAa;AAAA,IACzC,GAAG;AAAA,IACH,GAAG,SAAS;AAAA,EACd,CAAC;AACD,QAAM,SAAS,qBAAqB,MAAM;AAAA,IACxC,GAAG;AAAA,IACH,QACE,sBAAsB,SAAS,IAC3B,EAAE,SAAS,sBAAsB,IACjC,UAAU;AAAA,EAClB,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA,SACE,YAAY,SAAS,KACrB,gBAAgB,SAAS,KACzB,qBAAqB,SAAS,KAC9B,MAAM,WAAW,SAAS;AAAA,IAC5B;AAAA,IACA,kBAAkB;AAAA,IAClB;AAAA,IACA,mBAAmB,MAAM,WAAW,SAAS;AAAA,EAC/C;AACF;AAEA,eAAsB,iBAAiB,OAIR;AAC7B,MAAI,MAAM,SAAS,SAAS;AAC1B,UAAM,iBAAiB,MAAM,aAAa,MAAM,SAAS,QAAQ;AAAA,MAC/D,kBAAkB,MAAM,WAAW,SAAS;AAAA,IAC9C,CAAC;AAAA,EACH;AACA,QAAM,EAAE,QAAQ,SAAS,GAAG,OAAO,IAAI,MAAM;AAC7C,SAAO;AACT;;;AK7TA,SAAS,uBAAuC;AAwBzC,IAAM,iBAAN,MAA2C;AAAA,EACvC;AAAA,EAET,cAAc;AACZ,SAAK,YAAY,gBAAgB;AAAA,MAC/B,OAAO,QAAQ;AAAA,MACf,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAM,SAAgC;AAC1C,UAAM,KAAK,UAAU,SAAS,GAAG,OAAO,GAAG;AAAA,EAC7C;AAAA,EAEA,MAAM,MAAM,OAIQ;AAClB,WAAO,MAAM;AACX,YAAM,SAAS,MAAM,eAAe,KAAK,MAAM,YAAY,MAAM;AACjE,YAAM,UACJ,MAAM,KAAK,UAAU,SAAS,GAAG,MAAM,OAAO,GAAG,MAAM,IAAI,GAC3D,KAAK;AACP,YAAM,QAAQ,UAAU,MAAM,gBAAgB;AAC9C,YAAM,kBAAkB,MAAM,WAAW,KAAK,KAAK;AACnD,UAAI,CAAC,gBAAiB,QAAO;AAC7B,cAAQ,MAAM,eAAe;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,OAGO;AACnB,UAAM,SAAS,MAAM,eAAe,WAAW;AAC/C,UAAM,UACJ,MAAM,KAAK,UAAU,SAAS,GAAG,MAAM,OAAO,GAAG,MAAM,IAAI,GAE1D,KAAK,EACL,YAAY;AACf,QAAI,CAAC,OAAQ,QAAO,MAAM;AAC1B,WAAO,WAAW,OAAO,WAAW;AAAA,EACtC;AAAA,EAEA,MAAM,OAAyB,OAGhB;AACb,YAAQ,IAAI,MAAM,OAAO;AACzB,UAAM,QAAQ;AAAA,MAAQ,CAAC,QAAQ,UAC7B,QAAQ,IAAI,KAAK,QAAQ,CAAC,KAAK,OAAO,KAAK,EAAE;AAAA,IAC/C;AACA,WAAO,MAAM;AACX,YAAM,UACJ,MAAM,KAAK,UAAU,SAAS,oBAAoB,GAClD,KAAK;AACP,YAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,YAAM,SAAS,MAAM,QAAQ,KAAK;AAClC,UAAI,OAAQ,QAAO,OAAO;AAC1B,cAAQ,MAAM,4BAA4B,MAAM,QAAQ,MAAM,GAAG;AAAA,IACnE;AAAA,EACF;AAAA,EAEA,MAAM,YAA8B,OAInB;AACf,YAAQ,IAAI,MAAM,OAAO;AACzB,UAAM,QAAQ;AAAA,MAAQ,CAAC,QAAQ,UAC7B,QAAQ,IAAI,KAAK,QAAQ,CAAC,KAAK,OAAO,KAAK,EAAE;AAAA,IAC/C;AACA,WAAO,MAAM;AACX,YAAM,UACJ,MAAM,KAAK,UAAU;AAAA,QACnB,MAAM,aACF,gEACA;AAAA,MACN,GACA,KAAK;AACP,UAAI,CAAC,UAAU,MAAM,WAAY,QAAO,CAAC;AACzC,YAAM,UAAU;AAAA,QACd,GAAG,IAAI;AAAA,UACL,OACG,MAAM,GAAG,EACT,IAAI,CAAC,UAAU,OAAO,MAAM,KAAK,CAAC,IAAI,CAAC,EACvC,OAAO,CAAC,UAAU,OAAO,UAAU,KAAK,CAAC;AAAA,QAC9C;AAAA,MACF;AACA,YAAM,UAAU,QACb,IAAI,CAAC,UAAU,MAAM,QAAQ,KAAK,CAAC,EACnC,OAAO,OAAO;AACjB,UAAI,QAAQ,WAAW,QAAQ,UAAU,QAAQ,SAAS,GAAG;AAC3D,eAAO,QAAQ,IAAI,CAAC,WAAW,OAAO,KAAK;AAAA,MAC7C;AACA,cAAQ;AAAA,QACN,uCAAuC,MAAM,QAAQ,MAAM;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAAA,EAEA,QAAc;AACZ,SAAK,UAAU,MAAM;AAAA,EACvB;AACF;;;AC9FA,IAAM,sBAAgD;AAAA,EACpD,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AACT;AAEA,SAAS,aACP,QACA,OACA,QACM;AACN,SAAO,IAAI,GAAG,KAAK,KAAK,OAAO,MAAM,GAAG;AACxC,SAAO,QAAQ,CAAC,UAAU,OAAO,IAAI,KAAK,KAAK,EAAE,CAAC;AACpD;AAEA,SAAS,gBAAgB,QAAoB,YAAkC;AAC7E,QAAM,EAAE,OAAO,IAAI;AACnB;AAAA,IACE;AAAA,IACA;AAAA,IACA,OAAO,MAAM,IAAI,CAAC,UAAU,MAAM,IAAI;AAAA,EACxC;AACA;AAAA,IACE;AAAA,IACA;AAAA,IACA,OAAO,QAAQ,IAAI,CAAC,UAAU,GAAG,MAAM,IAAI,YAAY,MAAM,SAAS,GAAG;AAAA,EAC3E;AACA;AAAA,IACE;AAAA,IACA;AAAA,IACA,OAAO,UAAU;AAAA,MACf,CAAC,UAAU,GAAG,MAAM,IAAI,YAAY,MAAM,SAAS;AAAA,IACrD;AAAA,EACF;AACA;AAAA,IACE;AAAA,IACA;AAAA,IACA,OAAO,eAAe;AAAA,MACpB,CAAC,UACC,GAAG,MAAM,SAAS,KAAK,MAAM,UAAU,KAAK,IAAI,CAAC,KAAK,MAAM,aAAa,MAAM;AAAA,IACnF;AAAA,EACF;AACA,eAAa,QAAQ,2BAA2B,OAAO,gBAAgB,KAAK;AAC5E,MAAI,OAAO;AACT,WAAO,IAAI,iDAAiD;AAC9D,aAAW,WAAW,OAAO;AAC3B,WAAO,MAAM,YAAY,QAAQ,OAAO,EAAE;AAC9C;AAEA,SAAS,cACP,QACA,UACM;AACN,SAAO,IAAI,mBAAmB;AAC9B,WAAS,YAAY;AAAA,IAAQ,CAAC,UAC5B,OAAO,IAAI,eAAe,MAAM,SAAS,KAAK,MAAM,IAAI,EAAE;AAAA,EAC5D;AACA,WAAS,iBAAiB;AAAA,IAAQ,CAAC,UACjC,OAAO,IAAI,iBAAiB,MAAM,SAAS,KAAK,MAAM,IAAI,EAAE;AAAA,EAC9D;AACA,WAAS,qBAAqB;AAAA,IAAQ,CAAC,SACrC,OAAO,IAAI,0BAA0B,IAAI,EAAE;AAAA,EAC7C;AACA,MAAI,SAAS;AACX,WAAO,IAAI,sCAAsC;AACrD;AAEA,eAAsB,gBAAgB,OAKN;AAC9B,QAAM,eAAe,MAAM,gBAAgB;AAC3C,QAAM,aAAa,MAAM,aAAa,QAAQ,MAAM,WAAW;AAC/D,kBAAgB,MAAM,QAAQ,UAAU;AACxC,MAAI,CAAC,WAAW,OAAO,UAAU;AAC/B,UAAM,OAAO,IAAI,2CAA2C;AAC5D,WAAO,EAAE,SAAS,OAAO,WAAW,MAAM;AAAA,EAC5C;AAEA,QAAM,gBAAgB,WAAW,OAAO,MAAM,SAC1C,MAAM,MAAM,OAAO,YAAY;AAAA,IAC7B,SAAS;AAAA,IACT,SAAS,WAAW,OAAO,MAAM,IAAI,CAAC,WAAW;AAAA,MAC/C,OAAO,GAAG,MAAM,IAAI,WAAM,MAAM,WAAW;AAAA,MAC3C,OAAO,MAAM;AAAA,IACf,EAAE;AAAA,IACF,YAAY;AAAA,EACd,CAAC,IACD,CAAC;AACL,QAAM,WAAW,MAAM,aAAa,QAAQ;AAAA,IAC1C,aAAa,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,EACF,CAAC;AACD,MAAI,CAAC,SAAS,SAAS;AACrB,UAAM,OAAO,IAAI,2CAA2C;AAC5D,WAAO,EAAE,SAAS,OAAO,WAAW,MAAM;AAAA,EAC5C;AACA,gBAAc,MAAM,QAAQ,QAAQ;AACpC,QAAM,YAAY,MAAM,MAAM,OAAO,QAAQ;AAAA,IAC3C,SAAS;AAAA,IACT,cAAc;AAAA,EAChB,CAAC;AACD,MAAI,CAAC,WAAW;AACd,UAAM,OAAO,IAAI,8CAA8C;AAC/D,WAAO,EAAE,SAAS,OAAO,WAAW,KAAK;AAAA,EAC3C;AAEA,QAAM,aAAa,MAAM;AAAA,IACvB,aAAa,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,OAAO,IAAI,6BAA6B;AAC9C,SAAO,EAAE,SAAS,MAAM,WAAW,MAAM;AAC3C;AAEA,eAAsB,WAAW,OAIb;AAClB,QAAM,SAAS,MAAM,UAAU,IAAI,eAAe;AAClD,QAAM,aAAa,CAAC,MAAM;AAC1B,MAAI;AACF,UAAM,gBAAgB;AAAA,MACpB,aAAa,MAAM;AAAA,MACnB;AAAA,MACA,QAAQ,MAAM,UAAU;AAAA,QACtB,KAAK,CAAC,YAAY,QAAQ,IAAI,OAAO;AAAA,QACrC,OAAO,CAAC,YAAY,QAAQ,MAAM,OAAO;AAAA,MAC3C;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT,UAAE;AACA,QAAI,WAAY,QAAO,MAAM;AAAA,EAC/B;AACF;;;AC9KA,SAAS,SAAAC,cAAa;AACtB,SAAS,iBAAAC,sBAAqB;AAC9B,OAAOC,YAAU;;;ACFjB,SAAS,SAAAC,cAAa;AACtB,SAAS,UAAAC,SAAQ,YAAAC,kBAAgB;AACjC,OAAOC,YAAU;AAiBjB,IAAM,YAGD;AAAA,EACH,EAAE,gBAAgB,QAAQ,WAAW,CAAC,gBAAgB,EAAE;AAAA,EACxD,EAAE,gBAAgB,QAAQ,WAAW,CAAC,WAAW,EAAE;AAAA,EACnD,EAAE,gBAAgB,OAAO,WAAW,CAAC,YAAY,WAAW,EAAE;AAAA,EAC9D;AAAA,IACE,gBAAgB;AAAA,IAChB,WAAW,CAAC,qBAAqB,qBAAqB;AAAA,EACxD;AACF;AAEA,eAAeC,YAAW,UAAoC;AAC5D,MAAI;AACF,UAAMC,QAAO,QAAQ;AACrB,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,SAAU,QAAO;AAC/D,UAAM;AAAA,EACR;AACF;AAEA,eAAe,uBACb,aACgC;AAChC,MAAI;AACJ,MAAI;AACF,eAAW,MAAMC,WAASC,OAAK,KAAK,aAAa,cAAc,GAAG,MAAM;AAAA,EAC1E,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,SAAU,QAAO;AAC/D,UAAM;AAAA,EACR;AAEA,MAAI;AACJ,MAAI;AACF,kBAAc,KAAK,MAAM,QAAQ;AAAA,EACnC,QAAQ;AACN,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,QACE,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,MAAI,YAAY,mBAAmB,OAAW,QAAO;AACrD,MAAI,OAAO,YAAY,mBAAmB,UAAU;AAClD,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA,EAAE,MAAM,0DAA0D;AAAA,IACpE;AAAA,EACF;AAEA,QAAM,OAAO,YAAY,eAAe,MAAM,KAAK,CAAC,EAAE,CAAC;AACvD,MAAI,SAAS,SAAS,SAAS,UAAU,SAAS,UAAU,SAAS;AACnE,WAAO;AACT,QAAM,IAAI;AAAA,IACR;AAAA,IACA,+DAA+D,YAAY,cAAc;AAAA,IACzF;AAAA,MACE,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,eAAsB,qBACpB,aACyB;AACzB,QAAM,OAAOA,OAAK,QAAQ,WAAW;AACrC,QAAM,WAAW,MAAM,uBAAuB,IAAI;AAClD,MAAI,SAAU,QAAO;AAErB,QAAM,WACJ,MAAM,QAAQ;AAAA,IACZ,UAAU,IAAI,OAAO,EAAE,gBAAgB,WAAAC,WAAU,OAAO;AAAA,MACtD;AAAA,MACA,YACE,MAAM,QAAQ;AAAA,QACZA,WAAU,IAAI,OAAO,cAAc;AAAA,UACjC;AAAA,UACA,QAAQ,MAAMJ,YAAWG,OAAK,KAAK,MAAM,QAAQ,CAAC;AAAA,QACpD,EAAE;AAAA,MACJ,GAEC,OAAO,CAAC,UAAU,MAAM,MAAM,EAC9B,IAAI,CAAC,UAAU,MAAM,QAAQ;AAAA,IAClC,EAAE;AAAA,EACJ,GACA,OAAO,CAAC,UAAU,MAAM,UAAU,SAAS,CAAC;AAE9C,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,MAAI,QAAQ,WAAW,EAAG,QAAO,QAAQ,CAAC,EAAG;AAE7C,QAAM,YAAY,QAAQ,QAAQ,CAAC,UAAU,MAAM,SAAS,EAAE,KAAK;AACnE,QAAM,IAAI;AAAA,IACR;AAAA,IACA,kDAAkD,UAAU,KAAK,IAAI,CAAC;AAAA,IACtE;AAAA,MACE,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAoBO,SAAS,gCACd,gBACQ;AACR,MAAI,mBAAmB,OAAQ,QAAO;AACtC,MAAI,mBAAmB,OAAQ,QAAO;AACtC,MAAI,mBAAmB,MAAO,QAAO;AACrC,SAAO;AACT;;;ADjIA,IAAM,wBAAwB,KAAK;AAEnC,SAAS,iBAAiB,QAAgB,OAAuB;AAC/D,SAAO,GAAG,MAAM,GAAG,MAAM,SAAS,MAAM,CAAC,GAAG,MAAM,CAAC,qBAAqB;AAC1E;AAEO,IAAM,aAA4B,CAAC,EAAE,SAAAE,UAAS,MAAAC,OAAM,KAAK,IAAI,MAClE,IAAI,QAAQ,CAAC,SAAS,WAAW;AAC/B,QAAM,QAAQC,OAAMF,UAASC,OAAM;AAAA,IACjC;AAAA,IACA;AAAA,IACA,OAAO,CAAC,WAAW,QAAQ,MAAM;AAAA,EACnC,CAAC;AACD,MAAI,aAAa;AACjB,QAAM,OAAO,GAAG,QAAQ,CAAC,UAAkB;AACzC,YAAQ,OAAO,MAAM,KAAK;AAC1B,iBAAa,iBAAiB,YAAY,KAAK;AAAA,EACjD,CAAC;AACD,QAAM,OAAO,GAAG,QAAQ,CAAC,UAAkB;AACzC,YAAQ,OAAO,MAAM,KAAK;AAC1B,iBAAa,iBAAiB,YAAY,KAAK;AAAA,EACjD,CAAC;AACD,QAAM,KAAK,SAAS,MAAM;AAC1B,QAAM,KAAK,SAAS,CAAC,MAAM,WAAW;AACpC,QAAI;AACF;AAAA,QACE,IAAI;AAAA,UACF;AAAA,UACA,2BAA2B,MAAM;AAAA,QACnC;AAAA,MACF;AAAA,QACG,SAAQ,EAAE,UAAU,QAAQ,GAAG,WAAW,CAAC;AAAA,EAClD,CAAC;AACH,CAAC;AAEI,SAAS,2BAA2B,QAAyB;AAClE,SACE,oCAAoC,KAAK,MAAM,KAC/C,sBAAsB,KAAK,MAAM;AAErC;AAEO,SAAS,qBAAqB,aAA6B;AAChE,MAAI;AACF,UAAM,qBAAqBE;AAAA,MACzBC,OAAK,KAAK,aAAa,cAAc;AAAA,IACvC;AACA,UAAM,cAAc,mBAAmB;AAAA,MACrC;AAAA,IACF;AACA,WAAOA,OAAK,KAAKA,OAAK,QAAQ,WAAW,GAAG,QAAQ;AAAA,EACtD,QAAQ;AACN,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,QACE,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAsB,gBAAgB,OAQlB;AAClB,QAAM,cAAcA,OAAK,QAAQ,MAAM,WAAW;AAClD,QAAM,SAAS,MAAM,iBAAiB,WAAW;AACjD,QAAM,SAAS,MAAM,qBAAqB,aAAa,MAAM;AAC7D,MAAI,CAAC,OAAO,OAAO;AACjB,UAAM,IAAI;AAAA,MACR;AAAA,MACA,8BAA8B,OAAO,OAAO,KAAK,IAAI,CAAC;AAAA,MACtD;AAAA,QACE,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY;AAAA,IAChB,GAAG,IAAI;AAAA,MACL,OAAO,OACJ,OAAO,CAAC,UAAU,MAAM,MAAM,EAC9B,QAAQ,CAAC,UAAU,MAAM,OAAO;AAAA,IACrC;AAAA,EACF;AACA,MAAI,UAAU,WAAW,GAAG;AAC1B,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,QACE,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,QAAMH,QAAO;AAAA,IACX,MAAM,iBAAiB,qBAAqB,WAAW;AAAA,IACvD;AAAA,IACA,GAAG;AAAA,EACL;AACA,MAAI,OAAO,iBAAkB,CAAAA,MAAK,KAAK,YAAY,OAAO,gBAAgB;AAC1E,MAAI,MAAM,OAAQ,CAAAA,MAAK,KAAK,UAAU;AACtC,MAAI,MAAM,eAAgB,CAAAA,MAAK,KAAK,aAAa,MAAM,cAAc;AACrE,EAAAA,MAAK,KAAK,GAAI,MAAM,eAAe,CAAC,CAAE;AAEtC,QAAM,YAAY,OAAO,MAAM,iBAAiB,YAAY;AAAA,IAC1D,SAAS,QAAQ;AAAA,IACjB,MAAAA;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,MACH,GAAG,QAAQ;AAAA,MACX,GAAI,MAAM,UAAU,EAAE,qBAAqB,MAAM,QAAQ,IAAI,CAAC;AAAA,IAChE;AAAA,EACF,CAAC;AACD,MACE,UAAU,aAAa,KACvB,2BAA2B,UAAU,UAAU,GAC/C;AACA,UAAM,iBAAiB,MAAM,qBAAqB,WAAW;AAC7D,UAAM,iBAAiB,gCAAgC,cAAc;AACrE,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA,EAAE,MAAM,SAAS,cAAc,mCAAmC;AAAA,IACpE;AAAA,EACF;AACA,SAAO,UAAU;AACnB;;;AExJA,OAAOI,YAAU;AAOjB,eAAsB,gBACpB,aAC2B;AAC3B,QAAM,OAAOC,OAAK,QAAQ,WAAW;AACrC,QAAM,SAAS,MAAM,iBAAiB,IAAI;AAC1C,SAAO,qBAAqB,MAAM,MAAM;AAC1C;;;AjB6BA,IAAMC,cAAa,oBAAI,IAAI,CAAC,UAAU,IAAI,CAAC;AAC3C,IAAM,cAAc;AAEb,IAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0B1B,eAAsB,gBACpB,SACwB;AACxB,MACE,QAAQ,KAAK,WAAW,KACxB,QAAQ,KAAK,KAAK,CAAC,aAAaA,YAAW,IAAI,QAAQ,CAAC,GACxD;AACA,WAAO,EAAE,UAAU,cAAc,SAAS,QAAQ,WAAW;AAAA,EAC/D;AAEA,MAAI;AACF,UAAM,CAACC,UAAS,GAAGC,KAAI,IAAI,QAAQ;AACnC,QAAID,aAAY;AACd,aAAO,MAAME,mBAAkB,EAAE,GAAG,SAAS,MAAAD,MAAK,CAAC;AACrD,QAAID,aAAY,OAAQ,QAAO,MAAM,eAAe,SAASC,KAAI;AACjE,QAAID,aAAY,WAAY,QAAO,MAAM,mBAAmB,SAASC,KAAI;AACzE,QAAID,aAAY,OAAQ,QAAO,MAAM,eAAe,SAASC,KAAI;AACjE,QAAID,aAAY,OAAQ,QAAO,MAAM,eAAe,SAASC,KAAI;AACjE,QAAID,aAAY,SAAU,QAAO,MAAM,iBAAiB,SAASC,KAAI;AACrE,UAAME,YAAW,+BAA+B;AAAA,EAClD,SAAS,OAAO;AACd,WAAO,iBAAiB,OAAO,QAAQ,KAAK,SAAS,QAAQ,CAAC;AAAA,EAChE;AACF;AAEA,eAAeD,mBACb,SACwB;AACxB,QAAM,CAAC,QAAQ,GAAGD,KAAI,IAAI,QAAQ;AAClC,MAAI,CAAC,UAAU,CAAC,CAAC,UAAU,QAAQ,UAAU,KAAK,EAAE,SAAS,MAAM,GAAG;AACpE,UAAME,YAAW,uCAAuC;AAAA,EAC1D;AACA,QAAM,SAAS,sBAAsB,QAAQF,KAAI;AACjD,QAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI;AACvC,QAAM,OAAO,WAAW,SAAS,OAAO,MAAM,mBAAmB,GAAG;AACpE,QAAM,YAAY,MAAM,sBAAsB;AAAA,IAC5C,KAAK,QAAQ;AAAA,IACb,KAAK,QAAQ;AAAA,IACb,eAAe,WAAW;AAAA,EAC5B,CAAC;AACD,QAAM,QAAQ,MAAM,kBAAkB,OAAO;AAC7C,QAAM,SAAS,qBAAqB;AAAA,IAClC;AAAA,IACA,WAAW,QAAQ;AAAA,EACrB,CAAC;AAED,MAAI,WAAW,QAAQ;AACrB,UAAM,WAAW,MAAM,OAAO,aAAa,EAAE,OAAO,MAAM,YAAY,CAAC;AACvE,WAAO;AAAA,MACL,OAAO;AAAA,MACP,EAAE,WAAW,gBAAgB,MAAM,MAAM,gBAAgB,SAAS;AAAA,MAClE,kBAAkB,QAAQ;AAAA,IAC5B;AAAA,EACF;AAEA,QAAM,iBAAiB;AACvB,QAAM,WAAW,MAAM,yBAAyB,cAAc;AAC9D,MAAI,WAAW,UAAU;AACvB,UAAM,UAAU,SAAS,OAAO,QAAQ;AACxC,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,UAAM,UAAU,MAAM,OAAO,cAAc;AAAA,MACzC;AAAA,MACA,OAAO,MAAM;AAAA,MACb,mBAAmB,SAAS,OAAO,QAAQ;AAAA,MAC3C,MAAM,OAAO;AAAA,MACb,MAAM,OAAO;AAAA,IACf,CAAC;AACD,WAAO;AAAA,MACL,OAAO;AAAA,MACP,EAAE,WAAW,QAAQ;AAAA,MACrB;AAAA,QACE;AAAA,QACA,YAAY,QAAQ,IAAI;AAAA,QACxB,SAAS,QAAQ,IAAI;AAAA,QACrB,kCAAkC,QAAQ,IAAI;AAAA,MAChD,EAAE,KAAK,IAAI;AAAA,IACb;AAAA,EACF;AAEA,QAAM,QAAQG,qBAAoB,OAAO;AACzC,QAAM,UAAU,EAAE,WAAW,gBAAgB,SAAS,QAAiB;AACvE,MAAI,WAAW,OAAO;AACpB,UAAM,WAAW,MAAM,OAAO,aAAa,EAAE,OAAO,MAAM,YAAY,CAAC;AACvE,UAAM,UAAU,oBAAoB,UAAU,OAAO,IAAK;AAC1D,UAAM,WAAW,MAAM,MAAM,KAAK,OAAO;AACzC,UAAM,YACJ,SAAS,OAAO,QAAQ,SAAS,QAAQ,QACxC,aAAa,QAAQ,SAAS,QAAQ,OAAO,QAAQ;AACxD,QAAI,aAAa,CAAC,OAAO,SAAS;AAChC,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,MAAM,MAAM;AAAA,MAChB,GAAG;AAAA,MACH,gBAAgB,MAAM,MAAM;AAAA,MAC5B,SAAS,EAAE,IAAI,QAAQ,IAAI,MAAM,QAAQ,KAAK;AAAA,IAChD,CAAC;AACD,QAAI;AACF,YAAM,qBAAqB,gBAAgB,QAAQ,MAAM;AAAA,QACvD,kBAAkB,SAAS;AAAA,MAC7B,CAAC;AAAA,IACH,SAAS,OAAO;AACd,UAAI,SAAU,OAAM,MAAM,MAAM,QAAQ;AAAA,UACnC,OAAM,MAAM,OAAO,OAAO;AAC/B,YAAM;AAAA,IACR;AACA,WAAO;AAAA,MACL,OAAO;AAAA,MACP;AAAA,QACE;AAAA,QACA,gBAAgB,MAAM,MAAM;AAAA,QAC5B;AAAA,QACA,eAAeC,OAAK,KAAK,gBAAgB,WAAW;AAAA,MACtD;AAAA,MACA;AAAA,QACE;AAAA,QACA,YAAY,QAAQ,IAAI;AAAA,QACxB,cAAcA,OAAK,KAAK,gBAAgB,WAAW,CAAC;AAAA,MACtD,EAAE,KAAK,IAAI;AAAA,IACb;AAAA,EACF;AAEA,QAAM,WAAW,MAAM,uBAAuB;AAAA,IAC5C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,oBAAoB,QAAQ;AAAA,IAC5B,qBAAqB;AAAA,IACrB,aAAa,SAAS,OAAO,QAAQ;AAAA,IACrC;AAAA,EACF,CAAC;AACD,SAAO;AAAA,IACL,OAAO;AAAA,IACP;AAAA,MACE;AAAA,MACA,WAAW;AAAA,MACX,WAAW,SAAS;AAAA,MACpB,gBAAgB,MAAM,MAAM;AAAA,MAC5B,SAAS,SAAS;AAAA,MAClB;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA,YAAY,SAAS,QAAQ,IAAI;AAAA,MACjC,iBAAiB,MAAM,MAAM,cAAc;AAAA,MAC3C,QAAQ,SAAS;AAAA,IACnB,EAAE,KAAK,IAAI;AAAA,EACb;AACF;AAEA,eAAe,eACb,SACAJ,OACwB;AACxB,QAAM,EAAE,OAAO,IAAI,UAAU;AAAA,IAC3B,MAAAA;AAAA,IACA,SAAS;AAAA,MACP,YAAY,EAAE,MAAM,SAAS;AAAA,MAC7B,SAAS,EAAE,MAAM,SAAS;AAAA,MAC1B,OAAO,EAAE,MAAM,SAAS;AAAA,MACxB,aAAa,EAAE,MAAM,SAAS;AAAA,IAChC;AAAA,IACA,QAAQ;AAAA,EACV,CAAC;AACD,QAAM,SACJ,CAAC,OAAO,UAAU,KAAK,CAAC,OAAO,UAC3B,MAAM,uBAAuB,OAAO,IACpC;AACN,QAAM,SAAS,MAAM,kBAAkB;AAAA,IACrC,SAAS,OAAO,UAAU,KAAK,QAAQ,YAAY,OAAO;AAAA,IAC1D,SAAS,OAAO,WAAW,QAAQ,SAAS,QAAQ;AAAA,IACpD,aAAa,QAAQ,OAAO,QAAQ,IAAI;AAAA,IACxC,OAAO,OAAO;AAAA,IACd,UAAU,OAAO,WAAW;AAAA,EAC9B,CAAC;AACD,SAAO;AAAA,IACL,UAAU,cAAc;AAAA,IACxB,QAAQ;AAAA,MACN;AAAA,MACA,GAAG,OAAO,QAAQ,IAAI,CAAC,SAAS,YAAY,IAAI,EAAE;AAAA,MAClD,GAAG,OAAO,QAAQ,IAAI,CAAC,SAAS,YAAY,IAAI,EAAE;AAAA,MAClD;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,EACb;AACF;AAEA,eAAe,mBACb,SACAA,OACwB;AACxB,QAAM,EAAE,OAAO,IAAI,UAAU;AAAA,IAC3B,MAAAA;AAAA,IACA,SAAS,EAAE,MAAM,EAAE,SAAS,OAAO,MAAM,UAAU,EAAE;AAAA,IACrD,QAAQ;AAAA,EACV,CAAC;AACD,QAAM,SAAS,MAAM,gBAAgB,QAAQ,OAAO,QAAQ,IAAI,CAAC;AACjE,SAAO;AAAA,IACL,UAAU,OAAO,QAAQ,cAAc,UAAU,cAAc;AAAA,IAC/D,QAAQ,OAAO,OACX,KAAK,UAAU,QAAQ,MAAM,CAAC,IAC9B,iBAAiB,MAAM;AAAA,EAC7B;AACF;AAEA,eAAe,eACb,SACAA,OACwB;AACxB,QAAM,EAAE,OAAO,IAAI,UAAU;AAAA,IAC3B,MAAAA;AAAA,IACA,SAAS;AAAA,MACP,OAAO,EAAE,SAAS,OAAO,MAAM,UAAU;AAAA,MACzC,MAAM,EAAE,SAAS,OAAO,MAAM,UAAU;AAAA,IAC1C;AAAA,IACA,QAAQ;AAAA,EACV,CAAC;AACD,QAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI;AACvC,MAAI,OAAO,SAAS,OAAO,MAAM;AAC/B,UAAM,UAAU,MAAM,mBAAmB,GAAG,GAAG;AAC/C,WAAO;AAAA,MACL,UACE,OAAO,YAAY,OAAO,SAAS,SAAS,IACxC,cAAc,WACd,cAAc;AAAA,MACpB,QAAQ,OAAO,OACX,KAAK,UAAU,QAAQ,MAAM,CAAC,IAC9B,iBAAiB,MAAM;AAAA,IAC7B;AAAA,EACF;AACA,MAAI,CAAC,QAAQ,MAAM,SAAS,CAAC,QAAQ,OAAO,OAAO;AACjD,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,QAAM,WAAW,OAAO,QAAQ,sBAAsB,YAAY;AAAA,IAChE,aAAa;AAAA,EACf,CAAC;AACD,SAAO;AAAA,IACL,UAAU,aAAa,IAAI,cAAc,UAAU,cAAc;AAAA,EACnE;AACF;AAEA,eAAe,eACb,SACAA,OACwB;AACxB,QAAM,YAAYA,MAAK,QAAQ,IAAI;AACnC,QAAM,cAAc,cAAc,KAAKA,QAAOA,MAAK,MAAM,GAAG,SAAS;AACrE,QAAM,cAAc,cAAc,KAAK,CAAC,IAAIA,MAAK,MAAM,YAAY,CAAC;AACpE,QAAM,EAAE,OAAO,IAAI,UAAU;AAAA,IAC3B,MAAM;AAAA,IACN,SAAS;AAAA,MACP,YAAY,EAAE,MAAM,SAAS;AAAA,MAC7B,QAAQ,EAAE,SAAS,OAAO,MAAM,UAAU;AAAA,MAC1C,SAAS,EAAE,MAAM,SAAS;AAAA,IAC5B;AAAA,IACA,QAAQ;AAAA,EACV,CAAC;AACD,QAAM,WAAW,OAAO,QAAQ,YAAY,iBAAiB;AAAA,IAC3D,SACE,OAAO,UAAU,MAChB,MAAM,uBAAuB,OAAO,IAAI,YAAY,OACrD;AAAA,IACF,gBAAgB,OAAO;AAAA,IACvB,QAAQ,OAAO;AAAA,IACf;AAAA,IACA,aAAa,QAAQ,OAAO,QAAQ,IAAI;AAAA,EAC1C,CAAC;AACD,SAAO;AAAA,IACL,UAAU,aAAa,IAAI,cAAc,UAAU,cAAc;AAAA,EACnE;AACF;AAEA,eAAe,uBAAuB,SAA8B;AAClE,QAAM,UAAU,MAAM,kBAAkB,OAAO,EAAE,MAAM,CAAC,UAAU;AAChE,QACE,iBAAiB,uBACjB,MAAM,SAAS;AAEf,aAAO;AACT,UAAM;AAAA,EACR,CAAC;AACD,MAAI,WAAW,CAAC,QAAQ,YAAY;AAClC,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AACF,SAAO;AACT;AAEA,eAAe,iBACb,SACAA,OACwB;AACxB,QAAM,EAAE,OAAO,IAAI,UAAU;AAAA,IAC3B,MAAAA;AAAA,IACA,SAAS;AAAA,MACP,WAAW,EAAE,SAAS,OAAO,MAAM,UAAU;AAAA,MAC7C,MAAM,EAAE,SAAS,OAAO,MAAM,UAAU;AAAA,MACxC,QAAQ,EAAE,MAAM,SAAS;AAAA,IAC3B;AAAA,IACA,QAAQ;AAAA,EACV,CAAC;AACD,QAAM,iBAAiB,MAAM,mBAAmB,QAAQ,OAAO,QAAQ,IAAI,CAAC;AAC5E,QAAM,SAAS,MAAM,qBAAqB,SAAS,OAAO;AAC1D,MAAI,WAAW,CAAC,OAAO,oBAAoB,QAAQ,CAAC,OAAO,YAAY;AACrE,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AACF,QAAM,WAAW,MAAM,uBAAuB;AAAA,IAC5C,GAAI,SACA;AAAA,MACE,iBAAiB;AAAA,QACf,MAAM,OAAO,SAAS,QAAQ;AAAA,QAC9B,MAAM,OAAO,mBAAoB;AAAA,QACjC,SAAS,OAAO,YAAY;AAAA,MAC9B;AAAA,IACF,IACA,CAAC;AAAA,IACL,QAAQ,OAAO;AAAA,IACf,aAAa;AAAA,EACf,CAAC;AACD,MAAI,OAAO,SAAS,GAAG;AACrB,WAAO;AAAA,MACL,OAAO;AAAA,MACP,EAAE,QAAQ,MAAM,SAAS;AAAA,MACzB;AAAA,QACE,WAAWI,OAAK,SAAS,gBAAgB,SAAS,WAAW,CAAC;AAAA,QAC9D,aAAa,SAAS,QAAQ;AAAA,QAC9B,UAAU,SAAS,SAAS;AAAA,QAC5B;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,IACb;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,sBAAsB;AAAA,IAC5C,KAAK;AAAA,IACL,KAAK,QAAQ;AAAA,IACb,eAAe;AAAA,EACjB,CAAC;AACD,QAAM,QAAQ,MAAM,kBAAkB,OAAO;AAC7C,QAAM,SAAS,qBAAqB;AAAA,IAClC;AAAA,IACA,WAAW,QAAQ;AAAA,EACrB,CAAC;AACD,QAAM,WAAW,MAAM,yBAAyB,cAAc;AAC9D,QAAM,WAAW,MAAM,uBAAuB;AAAA,IAC5C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,oBAAoB,QAAQ;AAAA,IAC5B,qBAAqBD,qBAAoB,OAAO;AAAA,IAChD,aAAa,SAAS,OAAO,QAAQ;AAAA,IACrC;AAAA,EACF,CAAC;AACD,QAAM,aAAa,MAAM,OAAO,iBAAiB;AAAA,IAC/C,OAAO,MAAM;AAAA,IACb;AAAA,IACA,WAAW,SAAS,QAAQ;AAAA,EAC9B,CAAC;AACD,MAAI,WAAW,cAAc,SAAS,QAAQ,IAAI;AAChD,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL,OAAO;AAAA,IACP,EAAE,YAAY,QAAQ,OAAO,SAAS;AAAA,IACtC;AAAA,MACE,WAAWC,OAAK,SAAS,gBAAgB,SAAS,WAAW,CAAC;AAAA,MAC9D,aAAa,SAAS,QAAQ;AAAA,MAC9B,UAAU,SAAS,SAAS;AAAA,MAC5B,WAAW,WAAW,SAAS;AAAA,MAC/B,GAAG,WAAW,OAAO;AAAA,QACnB,CAAC,UACC,GAAG,MAAM,IAAI,gBAAgB,MAAM,YAAY,KAAK,MAAM,OAAO;AAAA,MACrE;AAAA,MACA,GAAI,WAAW,eACX,CAAC,cAAc,WAAW,YAAY,EAAE,IACxC,CAAC;AAAA,IACP,EAAE,KAAK,IAAI;AAAA,EACb;AACF;AAEA,eAAe,kBAAkB,SAA8B;AAC7D,QAAM,QAAQ,OACZ,QAAQ,wBACR,iCAAiC;AAAA,IAC/B,KAAK,QAAQ;AAAA,IACb,WAAW,QAAQ;AAAA,IACnB,SAAS,QAAQ;AAAA,EACnB,CAAC,GACD,QAAQ,EAAE,UAAU,gBAAgB,QAAQ,CAAC,WAAW,EAAE,CAAC;AAC7D,MACE,MAAM,MAAM,aAAa,kBACzB,MAAM,MAAM,OAAO,WAAW,KAC9B,MAAM,MAAM,OAAO,CAAC,MAAM,aAC1B;AACA,UAAM,IAAI,mBAAmB;AAAA,MAC3B,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,eAAe,uBAAuB,OASnC;AACD,QAAM,SAAS,MAAM,qBAAqB,MAAM,SAAS,OAAO;AAChE,MAAI,QAAQ;AACV,QACE,OAAO,IAAI,WAAW,MAAM,aAC5B,OAAO,SAAS,QAAQ,mBACtB,MAAM,MAAM,MAAM,gBACpB;AACA,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,UAAMC,WAAU,MAAM,MAAM,OAAO,WAAW;AAAA,MAC5C,OAAO,MAAM,MAAM;AAAA,MACnB,WAAW,OAAO;AAAA,IACpB,CAAC;AACD,QACEA,SAAQ,SAAS,MAAM,eACvB,OAAO,SAAS,QAAQ,SAAS,MAAM;AAEvC,YAAM,IAAI;AAAA,QACR;AAAA,QACA,6CAA6C,OAAO,SAAS,QAAQ,IAAI;AAAA,MAC3E;AACF,WAAO,EAAE,WAAW,gBAAgB,SAAAA,SAAQ;AAAA,EAC9C;AACA,QAAM,YAAY,MAAM,0BAA0B;AAAA,IAChD,WAAW,MAAM;AAAA,IACjB,oBAAoB,MAAM;AAAA,IAC1B,gBAAgB,MAAM,MAAM,MAAM;AAAA,IAClC,qBAAqB,MAAM;AAAA,IAC3B,aAAa,MAAM;AAAA,IACnB,gBAAgB,MAAM;AAAA,EACxB,CAAC;AACD,QAAM,UAAU,UAAU;AAC1B,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA,EAAE,MAAM,kCAAkC,MAAM,WAAW,MAAM;AAAA,IACnE;AAAA,EACF;AACA,MACE,QAAQ,mBAAmB,MAAM,MAAM,MAAM,kBAC7C,QAAQ,QAAQ,SAAS,MAAM,aAC/B;AACA,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,QACE,MAAM,kCAAkC,MAAM,WAAW;AAAA,MAC3D;AAAA,IACF;AAAA,EACF;AACA,QAAM,UAAU,MAAM,MAAM,OAAO,WAAW;AAAA,IAC5C,OAAO,MAAM,MAAM;AAAA,IACnB,WAAW,QAAQ,QAAQ;AAAA,EAC7B,CAAC;AACD,MAAI,QAAQ,SAAS,QAAQ,QAAQ,MAAM;AACzC,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,QACE,MAAM,kCAAkC,MAAM,WAAW;AAAA,MAC3D;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,WAAW,UAAU,QAAQ,QAAQ;AAChD;AAEA,eAAe,sBAAsB,OAIjB;AAClB,QAAM,aAAa,MAAM,KAAK,sBAAsB,KAAK;AACzD,MAAI,WAAY,QAAO,gBAAgB,UAAU;AACjD,MAAI;AACF,UAAM,SAAS,MAAM,qBAAqB,MAAM,GAAG;AACnD,QAAI,OAAO,OAAQ,QAAO,gBAAgB,OAAO,MAAM;AAAA,EACzD,SAAS,OAAO;AACd,QACE,MAAM,iBACN,EAAE,iBAAiB,aACnB,MAAM,SAAS,oBACf;AACA,YAAM;AAAA,IACR;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAASF,qBACP,SACqB;AACrB,SACE,QAAQ,uBACR,IAAI;AAAA,IACFC,OAAK;AAAA,MACH,wBAAwB,EAAE,KAAK,QAAQ,KAAK,SAAS,QAAQ,QAAQ,CAAC;AAAA,MACtE;AAAA,IACF;AAAA,EACF;AAEJ;AAEA,SAAS,sBAAsB,QAAgBJ,OAAgB;AAC7D,QAAM,EAAE,aAAa,OAAO,IAAI,UAAU;AAAA,IACxC,kBAAkB;AAAA,IAClB,MAAAA;AAAA,IACA,SAAS;AAAA,MACP,MAAM,EAAE,SAAS,OAAO,MAAM,UAAU;AAAA,MACxC,GAAI,WAAW,WACX;AAAA,QACE,MAAM,EAAE,MAAM,SAAkB;AAAA,QAChC,MAAM,EAAE,MAAM,SAAkB;AAAA,MAClC,IACA,CAAC;AAAA,MACL,GAAI,WAAW,QACX,EAAE,SAAS,EAAE,SAAS,OAAO,MAAM,UAAmB,EAAE,IACxD,CAAC;AAAA,IACP;AAAA,IACA,QAAQ;AAAA,EACV,CAAC;AACD,MACE,WAAW,aACV,CAAC,OAAO,QAAQ,CAAC,OAAO,QAAQ,YAAY,SAAS,IACtD;AACA,UAAME;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AACA,MAAI,WAAW,UAAU,YAAY,WAAW,KAAK,CAAC,YAAY,CAAC,IAAI;AACrE,UAAMA;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AACA,OAAK,WAAW,UAAU,WAAW,aAAa,YAAY,SAAS,GAAG;AACxE,UAAMA;AAAA,MACJ,wBAAwB,MAAM;AAAA,IAChC;AAAA,EACF;AACA,SAAO;AAAA,IACL,MAAM,QAAQ,OAAO,IAAI;AAAA,IACzB,MAAM,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAAA,IACtD,SAAS,QAAQ,OAAO,OAAO;AAAA,IAC/B,MACE,WAAW,QACP,YAAY,CAAC,IACb,OAAO,OAAO,SAAS,WACrB,OAAO,OACP;AAAA,EACV;AACF;AAEA,SAAS,oBACP,UACAI,OACc;AACd,QAAM,UAAU,SAAS,OAAO,CAAC,YAAY,QAAQ,SAASA,KAAI;AAClE,MAAI,QAAQ,WAAW,GAAG;AACxB,UAAM,IAAI;AAAA,MACR,QAAQ,WAAW,IAAI,4BAA4B;AAAA,MACnD,QAAQ,WAAW,IACf,qCACA;AAAA,IACN;AAAA,EACF;AACA,SAAO,QAAQ,CAAC;AAClB;AAEA,SAAS,iBACP,QACQ;AACR,SAAO;AAAA,IACL,OAAO,QACH,mCACA;AAAA,IACJ,kBAAkB,OAAO,MAAM,MAAM,WAAW,OAAO,UAAU;AAAA,IACjE,GAAG,OAAO,SAAS,IAAI,CAAC,YAAY,YAAY,OAAO,EAAE;AAAA,IACzD,GAAG,OAAO,OAAO,IAAI,CAAC,UAAU,UAAU,KAAK,EAAE;AAAA,EACnD,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,iBAAiB,QAA4B;AACpD,SAAO;AAAA,IACL,OAAO,WACH,oCACA;AAAA,IACJ,GAAG,OAAO,MAAM,IAAI,CAAC,UAAU,UAAU,MAAM,IAAI,EAAE;AAAA,IACrD,GAAG,OAAO,QAAQ;AAAA,MAChB,CAAC,UAAU,YAAY,MAAM,IAAI,YAAY,MAAM,SAAS;AAAA,IAC9D;AAAA,IACA,GAAG,OAAO,UAAU;AAAA,MAClB,CAAC,UAAU,cAAc,MAAM,IAAI,YAAY,MAAM,SAAS;AAAA,IAChE;AAAA,IACA,GAAG,OAAO,eAAe;AAAA,MACvB,CAAC,UACC,oBAAoB,MAAM,SAAS,KAAK,MAAM,aAAa,MAAM,gBAAgB,MAAM,aAAa,WAAW,IAAI,KAAK,GAAG;AAAA,IAC/H;AAAA,IACA,GAAG,OAAO,gBAAgB,MAAM;AAAA,MAC9B,CAAC,SAAS,2BAA2B,IAAI;AAAA,IAC3C;AAAA,IACA,GAAI,OAAO,oBACP,CAAC,4CAA4C,IAC7C,CAAC;AAAA,IACL,GAAG,OAAO,SAAS,IAAI,CAAC,YAAY,YAAY,QAAQ,OAAO,EAAE;AAAA,EACnE,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,kBAAkB,UAAkC;AAC3D,SAAO;AAAA,IACL;AAAA,IACA,aAAa,SAAS,MAAM;AAAA,IAC5B,GAAG,SAAS;AAAA,MACV,CAAC,YACC,KAAK,QAAQ,IAAI,KAAK,QAAQ,IAAI,KAAK,QAAQ,UAAU,SAAS,QAAQ,eAAe,IAAI,KAAK,GAAG;AAAA,IACzG;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,QAAQ,MAAe,OAAgB,MAA6B;AAC3E,SAAO;AAAA,IACL,UAAU,cAAc;AAAA,IACxB,QAAQ,OAAO,KAAK,UAAU,OAAO,MAAM,CAAC,IAAI;AAAA,EAClD;AACF;AAEA,SAASJ,YAAW,SAA2B;AAC7C,SAAO,IAAI,SAAS,eAAe,SAAS;AAAA,IAC1C,UAAU,cAAc;AAAA,EAC1B,CAAC;AACH;AAEA,SAAS,iBAAiB,OAAgB,MAA8B;AACtE,MACE,iBAAiB,aACjB,UAAU,SACV,MAAM,SAAS,kBACf;AACA,WAAOK,cAAa;AAAA,MAClB,OAAO,EAAE,MAAM,eAAe,SAAS,MAAM,SAAS,SAAS,QAAQ;AAAA,MACvE,UAAU,cAAc;AAAA,MACxB;AAAA,IACF,CAAC;AAAA,EACH;AACA,QAAM,aAAa,oBAAoB,KAAK;AAC5C,SAAOA,cAAa;AAAA,IAClB,OAAO;AAAA,MACL,MAAM,WAAW;AAAA,MACjB,SAAS,WAAW,OAChB,GAAG,WAAW,OAAO;AAAA,QAAW,WAAW,IAAI,KAC/C,WAAW;AAAA,MACf,SAAS;AAAA,IACX;AAAA,IACA,UAAU,sBAAsB,UAAU;AAAA,IAC1C;AAAA,EACF,CAAC;AACH;AAEA,SAAS,oBAAoB,OAA0B;AACrD,MAAI,iBAAiB,SAAU,QAAO;AACtC,MAAI,iBAAiB;AACnB,WAAO,IAAI,SAAS,MAAM,MAAM,MAAM,OAAO;AAC/C,MACE,iBAAiB,uBACjB,iBAAiB,0BACjB;AACA,WAAO,IAAI,SAAS,MAAM,MAAM,MAAM,OAAO;AAAA,EAC/C;AACA,SAAO,IAAI;AAAA,IACT;AAAA,IACA,iBAAiB,QAAQ,MAAM,UAAU;AAAA,EAC3C;AACF;AAEA,SAAS,sBACP,OACgE;AAChE,MAAI,MAAM,aAAa,cAAc,SAAS,MAAM,SAAS,eAAe;AAC1E,WAAO,cAAc;AAAA,EACvB;AACA,MACE,CAAC,gBAAgB,aAAa,mBAAmB,cAAc,EAAE;AAAA,IAC/D,MAAM;AAAA,EACR,GACA;AACA,WAAO,cAAc;AAAA,EACvB;AACA,MACE,MAAM,KAAK,SAAS,UAAU,KAC9B,MAAM,KAAK,SAAS,SAAS,KAC7B,MAAM,KAAK,SAAS,SAAS,KAC7B,MAAM,KAAK,SAAS,WAAW,GAC/B;AACA,WAAO,cAAc;AAAA,EACvB;AACA,MAAI,MAAM,KAAK,SAAS,aAAa,KAAK,MAAM,SAAS,mBAAmB;AAC1E,WAAO,cAAc;AAAA,EACvB;AACA,SAAO,cAAc;AACvB;;;AkB5xBA,OAAOC,YAAU;;;ACLjB,SAAS,KAAAC,WAAS;AAEX,IAAM,iCAAiC;AACvC,IAAM,6BAA6B;AAiB1C,IAAM,yBAAyBA,IAAE,OAAOA,IAAE,QAAQ,CAAC;AACnD,IAAM,wBAAwBA,IAC3B,OAAO,EACP,IAAI,CAAC,EACL,IAAI,EAAE,EACN,MAAM,4BAA4B;AACrC,IAAM,sBAAsBA,IACzB,OAAO;AAAA,EACN,WAAWA,IAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,KAAK,CAAC;AAAA,EAC/C,IAAIA,IAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACpC,MAAMA,IAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACtC,gBAAgBA,IAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EAChD,MAAMA,IACH,OAAO,EACP,KAAK,EACL,IAAI,CAAC,EACL,IAAI,GAAG,EACP,MAAM,4BAA4B;AAAA,EACrC,WAAWA,IAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,KAAK,CAAC;AACjD,CAAC,EACA,OAAO;AACV,IAAM,kCAAkCA,IACrC,OAAO,EAAE,UAAUA,IAAE,MAAM,mBAAmB,GAAG,SAASA,IAAE,QAAQ,IAAI,EAAE,CAAC,EAC3E,OAAO;AACV,IAAM,8BAA8BA,IACjC,OAAO,EAAE,SAAS,qBAAqB,SAASA,IAAE,QAAQ,IAAI,EAAE,CAAC,EACjE,OAAO;AACV,IAAM,0BAA0BA,IAC7B,OAAO;AAAA,EACN,WAAWA,IAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,KAAK,CAAC;AAAA,EAC/C,IAAIA,IAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACpC,MAAMA,IAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACtC,WAAWA,IAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EAC3C,MAAM;AAAA,EACN,WAAWA,IAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,KAAK,CAAC;AACjD,CAAC,EACA,OAAO;AACV,IAAM,sCAAsCA,IACzC,OAAO;AAAA,EACN,cAAcA,IAAE,MAAM,uBAAuB;AAAA,EAC7C,SAASA,IAAE,QAAQ,IAAI;AACzB,CAAC,EACA,OAAO;AACV,IAAM,kCAAkCA,IACrC,OAAO,EAAE,aAAa,yBAAyB,SAASA,IAAE,QAAQ,IAAI,EAAE,CAAC,EACzE,YAAY;AACf,IAAM,iCAAiCA,IACpC,OAAO;AAAA,EACN,WAAWA,IAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,KAAK,CAAC;AAAA,EAC/C,IAAIA,IAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACpC,YAAYA,IAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,KAAK,CAAC,EAAE,SAAS;AAAA,EAC3D,MAAMA,IAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACtC,sBAAsBA,IAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACtD,WAAWA,IAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,KAAK,CAAC,EAAE,SAAS;AAAA,EAC1D,QAAQA,IAAE,KAAK,CAAC,UAAU,SAAS,CAAC;AACtC,CAAC,EACA,OAAO;AACV,IAAM,qCAAqCA,IACxC,OAAO;AAAA,EACN,iBAAiB;AAAA,EACjB,SAASA,IAAE,QAAQ,IAAI;AAAA,EACvB,QAAQA,IAAE,MAAM,8BAA8B;AAChD,CAAC,EACA,OAAO;AACV,IAAM,yCAAyCA,IAC5C,OAAO;AAAA,EACN,iBAAiB;AAAA,EACjB,SAASA,IAAE,QAAQ,IAAI;AAAA,EACvB,OAAO,+BAA+B,OAAO;AAAA,IAC3C,OAAOA,IAAE,OAAO,EAAE,MAAM,yBAAyB;AAAA,EACnD,CAAC;AACH,CAAC,EACA,OAAO;AACV,IAAM,uCAAuCA,IAC1C,OAAO;AAAA,EACN,iBAAiB;AAAA,EACjB,SAASA,IAAE,QAAQ,IAAI;AAAA,EACvB,OAAO;AACT,CAAC,EACA,OAAO;AACV,IAAM,6CAA6CA,IAChD,OAAO;AAAA,EACN,aAAaA,IAAE,MAAM,8BAA8B;AAAA,EACnD,iBAAiB;AAAA,EACjB,SAASA,IAAE,QAAQ,IAAI;AACzB,CAAC,EACA,OAAO;AACV,IAAM,iDAAiDA,IACpD,OAAO;AAAA,EACN,YAAY,+BACT,OAAO;AAAA,IACN,YAAYA,IAAE,OAAO,EAAE,MAAM,yBAAyB;AAAA,EACxD,CAAC,EACA,OAAO;AAAA,EACV,iBAAiB;AAAA,EACjB,SAASA,IAAE,QAAQ,IAAI;AACzB,CAAC,EACA,OAAO;AACV,IAAM,+CAA+CA,IAClD,OAAO;AAAA,EACN,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,SAASA,IAAE,QAAQ,IAAI;AACzB,CAAC,EACA,OAAO;AACV,IAAM,+BAA+BA,IAClC,OAAO;AAAA,EACN,OAAOA,IAAE,OAAO;AAAA,IACd,MAAMA,IAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,IACxC,SAASA,IAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC;AAAA,IAChC,aAAaA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAC5C,CAAC;AACH,CAAC,EACA,YAAY;AACf,IAAM,+BAA+BA,IAClC,OAAO;AAAA,EACN,MAAMA,IAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACxC,SAASA,IAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAC3C,QAAQA,IAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AACpC,CAAC,EACA,YAAY;AAER,IAAM,uBAAN,cAAmC,MAAM;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,SAKT;AACD,UAAM,QAAQ,OAAO;AACrB,SAAK,OAAO;AACZ,SAAK,OAAO,QAAQ,QAAQ;AAC5B,SAAK,cAAc,QAAQ;AAC3B,SAAK,SAAS,QAAQ;AAAA,EACxB;AACF;AAcO,SAAS,2BACd,MAAyB,QAAQ,KACzB;AACR,SAAO;AAAA,IACL,IAAI,0BAA0B,GAAG,KAAK,KAAK;AAAA,EAC7C;AACF;AAEO,SAAS,4BAA4B,SAmG1C;AACA,SAAO;AAAA,IACL,eAAe,OAAO,UAAU;AAC9B,YAAM,WAAW,MAAMC,aAAY;AAAA,QACjC,YAAY,QAAQ;AAAA,QACpB,WAAW,MAAM;AAAA,QACjB,MAAM,EAAE,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK;AAAA,QAC3C,WAAW,QAAQ;AAAA,QACnB,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,gBAAgB;AAAA,MAClB,CAAC;AACD,aAAO,SAAS;AAAA,IAClB;AAAA,IACA,cAAc,OAAO,UAAU;AAC7B,YAAM,WAAW,MAAMA,aAAY;AAAA,QACjC,YAAY,QAAQ;AAAA,QACpB,WAAW,MAAM;AAAA,QACjB,WAAW,QAAQ;AAAA,QACnB,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,gBAAgB;AAAA,MAClB,CAAC;AACD,aAAO,SAAS;AAAA,IAClB;AAAA,IACA,kBAAkB,OAAO,UAAU;AACjC,YAAM,WAAW,MAAMA,aAAY;AAAA,QACjC,YAAY,QAAQ;AAAA,QACpB,WAAW,MAAM;AAAA,QACjB,WAAW,QAAQ;AAAA,QACnB,QAAQ;AAAA,QACR,MAAMC,2BAA0B,MAAM,SAAS;AAAA,QAC/C,gBAAgB;AAAA,MAClB,CAAC;AACD,aAAO,SAAS;AAAA,IAClB;AAAA,IACA,mBAAmB,OAAO,UAAU;AAClC,YAAM,WAAW,MAAMD,aAAY;AAAA,QACjC,YAAY,QAAQ;AAAA,QACpB,WAAW,MAAM;AAAA,QACjB,MAAM,EAAE,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK;AAAA,QAC3C,WAAW,QAAQ;AAAA,QACnB,QAAQ;AAAA,QACR,MAAMC,2BAA0B,MAAM,SAAS;AAAA,QAC/C,gBAAgB;AAAA,MAClB,CAAC;AACD,aAAO,SAAS;AAAA,IAClB;AAAA,IACA,mBAAmB,OAAO,UAAU;AAClC,YAAM,WAAW,MAAMD,aAAY;AAAA,QACjC,YAAY,QAAQ;AAAA,QACpB,WAAW,MAAM;AAAA,QACjB,MAAM,EAAE,MAAM,MAAM,KAAK;AAAA,QACzB,WAAW,QAAQ;AAAA,QACnB,QAAQ;AAAA,QACR,MAAM,gBAAgB,MAAM,WAAW,MAAM,eAAe;AAAA,QAC5D,gBAAgB;AAAA,MAClB,CAAC;AACD,aAAO,SAAS;AAAA,IAClB;AAAA,IACA,iBAAiB,OAAO,UAAU;AAChC,YAAM,WAAW,MAAMA,aAAY;AAAA,QACjC,YAAY,QAAQ;AAAA,QACpB,WAAW,MAAM;AAAA,QACjB,MAAM,EAAE,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK;AAAA,QAC3C,WAAW,QAAQ;AAAA,QACnB,QAAQ;AAAA,QACR,MAAM,GAAG,gBAAgB,MAAM,WAAW,MAAM,qBAAqB,CAAC;AAAA,QACtE,gBAAgB;AAAA,MAClB,CAAC;AACD,aAAO,SAAS;AAAA,IAClB;AAAA,IACA,mBAAmB,CAAC,UAClBA,aAAY;AAAA,MACV,YAAY,QAAQ;AAAA,MACpB,WAAW,MAAM;AAAA,MACjB,WAAW,QAAQ;AAAA,MACnB,QAAQ;AAAA,MACR,MAAM,gBAAgB,MAAM,WAAW,MAAM,eAAe;AAAA,IAC9D,CAAC;AAAA,IACH,WAAW,CAAC,UACVA,aAAY;AAAA,MACV,YAAY,QAAQ;AAAA,MACpB,WAAW,MAAM;AAAA,MACjB,WAAW,QAAQ;AAAA,MACnB,QAAQ;AAAA,MACR,MAAM,GAAG,YAAY,MAAM,SAAS,CAAC;AAAA,MACrC,OAAO;AAAA,QACL,iBAAiB,MAAM;AAAA,MACzB;AAAA,IACF,CAAC;AAAA,IACH,aAAa,CAAC,UACZA,aAAY;AAAA,MACV,YAAY,QAAQ;AAAA,MACpB,WAAW,MAAM;AAAA,MACjB,WAAW,QAAQ;AAAA,MACnB,QAAQ;AAAA,MACR,MAAM,GAAG,YAAY,MAAM,SAAS,CAAC;AAAA,MACrC,OAAO;AAAA,QACL,iBAAiB,MAAM;AAAA,MACzB;AAAA,IACF,CAAC;AAAA,IACH,SAAS,CAAC,UACRA,aAAY;AAAA,MACV,YAAY,QAAQ;AAAA,MACpB,WAAW,MAAM;AAAA,MACjB,MAAM,CAAC;AAAA,MACP,WAAW,QAAQ;AAAA,MACnB,QAAQ;AAAA,MACR,MAAM,GAAG,gBAAgB,MAAM,WAAW,MAAM,eAAe,CAAC;AAAA,IAClE,CAAC;AAAA,IACH,iBAAiB,OAAO,UAAU;AAChC,YAAM,WAAW,MAAMA,aAAY;AAAA,QACjC,YAAY,QAAQ;AAAA,QACpB,WAAW,MAAM;AAAA,QACjB,MAAM,MAAM,OAAO,EAAE,MAAM,MAAM,KAAK,IAAI,CAAC;AAAA,QAC3C,WAAW,QAAQ;AAAA,QACnB,QAAQ;AAAA,QACR,MAAME,0BAAyB,MAAM,WAAW,MAAM,eAAe;AAAA,QACrE,gBAAgB;AAAA,MAClB,CAAC;AACD;AAAA,QACE,SAAS;AAAA,QACT,MAAM;AAAA,MACR;AACA,aAAO,SAAS;AAAA,IAClB;AAAA,IACA,iBAAiB,OAAO,UAAU;AAChC,YAAM,WAAW,MAAMF,aAAY;AAAA,QACjC,YAAY,QAAQ;AAAA,QACpB,WAAW,MAAM;AAAA,QACjB,WAAW,QAAQ;AAAA,QACnB,QAAQ;AAAA,QACR,MAAME,0BAAyB,MAAM,WAAW,MAAM,eAAe;AAAA,QACrE,gBAAgB;AAAA,MAClB,CAAC;AACD;AAAA,QACE,SAAS;AAAA,QACT,MAAM;AAAA,MACR;AACA,aAAO,EAAE,QAAQ,SAAS,OAAO;AAAA,IACnC;AAAA,IACA,kBAAkB,OAAO,UAAU;AACjC,YAAM,WAAW,MAAMF,aAAY;AAAA,QACjC,YAAY,QAAQ;AAAA,QACpB,WAAW,MAAM;AAAA,QACjB,WAAW,QAAQ;AAAA,QACnB,QAAQ;AAAA,QACR,MAAM,GAAGE,0BAAyB,MAAM,WAAW,MAAM,eAAe,CAAC,IAAI,mBAAmB,MAAM,YAAY,CAAC;AAAA,QACnH,gBAAgB;AAAA,MAClB,CAAC;AACD;AAAA,QACE,SAAS;AAAA,QACT,MAAM;AAAA,MACR;AACA,aAAO,SAAS;AAAA,IAClB;AAAA,IACA,kBAAkB,OAAO,UAAU;AACjC,YAAM,WAAW,MAAMF,aAAY;AAAA,QACjC,YAAY,QAAQ;AAAA,QACpB,WAAW,MAAM;AAAA,QACjB,MAAM,MAAM,OAAO,EAAE,MAAM,MAAM,KAAK,IAAI,CAAC;AAAA,QAC3C,WAAW,QAAQ;AAAA,QACnB,QAAQ;AAAA,QACR,MAAM,GAAGE,0BAAyB,MAAM,WAAW,MAAM,eAAe,CAAC;AAAA,QACzE,gBAAgB;AAAA,MAClB,CAAC;AACD;AAAA,QACE,SAAS;AAAA,QACT,MAAM;AAAA,MACR;AACA,aAAO,SAAS;AAAA,IAClB;AAAA,IACA,yBAAyB,OAAO,UAAU;AACxC,YAAM,WAAW,MAAMF,aAAY;AAAA,QACjC,YAAY,QAAQ;AAAA,QACpB,WAAW,MAAM;AAAA,QACjB,MAAM,MAAM,OAAO,EAAE,MAAM,MAAM,KAAK,IAAI,CAAC;AAAA,QAC3C,WAAW,QAAQ;AAAA,QACnB,QAAQ;AAAA,QACR,MAAM;AAAA,UACJ,MAAM;AAAA,UACN,MAAM;AAAA,QACR;AAAA,QACA,gBAAgB;AAAA,MAClB,CAAC;AACD;AAAA,QACE,SAAS;AAAA,QACT,MAAM;AAAA,MACR;AACA,aAAO,SAAS;AAAA,IAClB;AAAA,IACA,yBAAyB,OAAO,UAAU;AACxC,YAAM,WAAW,MAAMA,aAAY;AAAA,QACjC,YAAY,QAAQ;AAAA,QACpB,WAAW,MAAM;AAAA,QACjB,WAAW,QAAQ;AAAA,QACnB,QAAQ;AAAA,QACR,MAAM;AAAA,UACJ,MAAM;AAAA,UACN,MAAM;AAAA,QACR;AAAA,QACA,gBAAgB;AAAA,MAClB,CAAC;AACD;AAAA,QACE,SAAS;AAAA,QACT,MAAM;AAAA,MACR;AACA,aAAO,EAAE,aAAa,SAAS,YAAY;AAAA,IAC7C;AAAA,IACA,0BAA0B,OAAO,UAAU;AACzC,YAAM,WAAW,MAAMA,aAAY;AAAA,QACjC,YAAY,QAAQ;AAAA,QACpB,WAAW,MAAM;AAAA,QACjB,WAAW,QAAQ;AAAA,QACnB,QAAQ;AAAA,QACR,MAAM,GAAG,iCAAiC,MAAM,WAAW,MAAM,eAAe,CAAC,IAAI,mBAAmB,MAAM,YAAY,CAAC;AAAA,QAC3H,gBAAgB;AAAA,MAClB,CAAC;AACD;AAAA,QACE,SAAS;AAAA,QACT,MAAM;AAAA,MACR;AACA,aAAO,SAAS;AAAA,IAClB;AAAA,IACA,0BAA0B,OAAO,UAAU;AACzC,YAAM,WAAW,MAAMA,aAAY;AAAA,QACjC,YAAY,QAAQ;AAAA,QACpB,WAAW,MAAM;AAAA,QACjB,MAAM,MAAM,OAAO,EAAE,MAAM,MAAM,KAAK,IAAI,CAAC;AAAA,QAC3C,WAAW,QAAQ;AAAA,QACnB,QAAQ;AAAA,QACR,MAAM,GAAG,iCAAiC,MAAM,WAAW,MAAM,eAAe,CAAC;AAAA,QACjF,gBAAgB;AAAA,MAClB,CAAC;AACD;AAAA,QACE,SAAS;AAAA,QACT,MAAM;AAAA,MACR;AACA,aAAO,SAAS;AAAA,IAClB;AAAA,EACF;AACF;AAEA,eAAeA,aAA+C,SAS/C;AACb,QAAM,UAAkC;AAAA,IACtC,QAAQ;AAAA,IACR,eAAe,UAAU,QAAQ,SAAS;AAAA,EAC5C;AACA,QAAM,OACJ,QAAQ,SAAS,SAAY,SAAY,KAAK,UAAU,QAAQ,IAAI;AACtE,MAAI,KAAM,SAAQ,cAAc,IAAI;AAEpC,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,QAAQ,UAAUG,aAAY,OAAO,GAAG;AAAA,MACvD;AAAA,MACA;AAAA,MACA,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAAA,EACH,QAAQ;AACN,UAAM,IAAI,qBAAqB;AAAA,MAC7B,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,QAAM,UAAU,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,MAAS;AAC3D,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,cAAc,6BAA6B,UAAU,OAAO;AAClE,QAAI,YAAY,SAAS;AACvB,YAAM,IAAI,qBAAqB;AAAA,QAC7B,MAAM,YAAY,KAAK,MAAM;AAAA,QAC7B,SAAS,YAAY,KAAK,MAAM;AAAA,QAChC,aAAa,YAAY,KAAK,MAAM;AAAA,QACpC,QAAQ,SAAS;AAAA,MACnB,CAAC;AAAA,IACH;AACA,UAAM,cAAc,6BAA6B,UAAU,OAAO;AAClE,QACE,YAAY,YACX,YAAY,KAAK,QAAQ,YAAY,KAAK,UAC3C;AACA,YAAM,IAAI,qBAAqB;AAAA,QAC7B,MAAM,YAAY,KAAK;AAAA,QACvB,SACE,YAAY,KAAK,WAAW;AAAA,QAC9B,QAAQ,YAAY,KAAK,UAAU,SAAS;AAAA,MAC9C,CAAC;AAAA,IACH;AACA,UAAM,IAAI,qBAAqB;AAAA,MAC7B,MAAM;AAAA,MACN,SAAS;AAAA,MACT,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAEA,QAAM,iBACJ,QAAQ,kBAAmB,wBAC3B,UAAU,OAAO;AACnB,MAAI,CAAC,cAAc,SAAS;AAC1B,UAAM,IAAI,qBAAqB;AAAA,MAC7B,MAAM;AAAA,MACN,SAAS;AAAA,MACT,QAAQ,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AACA,SAAO,cAAc;AACvB;AAEA,SAAS,YAAY,WAA2B;AAC9C,SAAO,2BAA2B,mBAAmB,SAAS,CAAC;AACjE;AAEA,SAASF,2BAA0B,WAA2B;AAC5D,SAAO,GAAG,YAAY,SAAS,CAAC;AAClC;AAEA,SAAS,gBAAgB,WAAmB,iBAAiC;AAC3E,SAAO,GAAGA,2BAA0B,SAAS,CAAC,IAAI,mBAAmB,eAAe,CAAC;AACvF;AAEA,SAASC,0BACP,WACA,iBACQ;AACR,SAAO,GAAG,gBAAgB,WAAW,eAAe,CAAC;AACvD;AAEA,SAAS,iCACP,WACA,iBACQ;AACR,SAAO,GAAG,gBAAgB,WAAW,eAAe,CAAC;AACvD;AAEA,SAAS,0BAA0B,QAAgB,UAAwB;AACzE,MAAI,WAAW,UAAU;AACvB,UAAM,IAAI,qBAAqB;AAAA,MAC7B,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF;AAEA,SAASC,aAAY,SAIV;AACT,QAAM,MAAM,IAAI;AAAA,IACd,GAAG,QAAQ,WAAW,QAAQ,QAAQ,EAAE,CAAC,GAAG,QAAQ,IAAI;AAAA,EAC1D;AACA,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,SAAS,CAAC,CAAC,GAAG;AAC9D,QAAI,aAAa,IAAI,KAAK,KAAK;AAAA,EACjC;AACA,SAAO,IAAI,SAAS;AACtB;AAEA,SAAS,sBAAsB,OAAuB;AACpD,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,KAAK;AACzB,UAAM,WAAW,CAAC,aAAa,aAAa,SAAS,KAAK,EAAE;AAAA,MAC1D,IAAI;AAAA,IACN;AACA,QACE,IAAI,YACJ,IAAI,YACJ,IAAI,aAAa,OACjB,IAAI,UACJ,IAAI,QACH,IAAI,aAAa,YAAY,EAAE,IAAI,aAAa,WAAW,WAC5D;AACA,YAAM,IAAI,MAAM,uBAAuB;AAAA,IACzC;AACA,WAAO,IAAI;AAAA,EACb,QAAQ;AACN,UAAM,IAAI,qBAAqB;AAAA,MAC7B,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF;;;AC/pBA,SAAS,SAAAC,cAAa;AACtB,SAAS,cAAAC,mBAAkB;AAC3B;AAAA,EACE,SAAAC;AAAA,EACA,SAAAC;AAAA,EACA,YAAAC;AAAA,EACA,UAAAC;AAAA,EACA,MAAAC;AAAA,EACA,aAAAC;AAAA,OACK;AACP,OAAOC,YAAU;AAIV,IAAM,qCAAqC;AAC3C,IAAM,gCAAgC;AACtC,IAAM,wCACX;AACK,IAAM,+BAA+B;AAE5C,IAAM,yBAAyB;AAC/B,IAAM,4BAA4B;AAE3B,IAAM,qCAAN,cAAiD,MAAM;AAAA,EACnD;AAAA,EAIT,YACE,MAGA;AACA;AAAA,MACE,SAAS,sCACL,uDACA;AAAA,IACN;AACA,SAAK,OAAO;AACZ,SAAK,OAAO;AAAA,EACd;AACF;AAUA,eAAsB,0CAA0C,SAEhB;AAC9C,QAAM,cAAcC,OAAK,QAAQ,QAAQ,WAAW;AACpD,QAAM,aAAaA,OAAK,KAAK,aAAa,MAAM;AAEhD,MAAI;AACF,UAAMC,uBAAsB,WAAW;AACvC,QAAI,CAAE,MAAMC,iBAAgB,WAAW,GAAI;AACzC,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,UAAMC,gBAAe,YAAY;AAAA,MAC/B;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,WAAO;AAAA,MACL,SAAS,OAAO,EAAE,YAAY,iBAAiB,aAAa,MAAM;AAChE,YACE,CAAC,uBAAuB,KAAK,UAAU,KACvC,CAAC,uBAAuB,eAAe,KACvC,CAAC,mBAAmB,YAAY,GAChC;AACA,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AACA,YAAI;AACF,gBAAMF,uBAAsB,WAAW;AACvC,cAAI,CAAE,MAAMC,iBAAgB,WAAW,GAAI;AACzC,kBAAM,IAAI;AAAA,cACR;AAAA,YACF;AAAA,UACF;AACA,gBAAM,iBAAiB,MAAMC,gBAAe,YAAY;AAAA,YACtD;AAAA,YACA;AAAA,YACA;AAAA,UACF,CAAC;AACD,gBAAMC,2BAA0B;AAAA,YAC9B,SAAS;AAAA,cACP;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,YACA;AAAA,UACF,CAAC;AAAA,QACH,SAAS,OAAO;AACd,cAAI,iBAAiB,mCAAoC,OAAM;AAC/D,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,QAAI,iBAAiB,mCAAoC,OAAM;AAC/D,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAsB,kDAAkD,SAExB;AAC9C,QAAM,cAAcJ,OAAK,QAAQ,QAAQ,WAAW;AACpD,QAAM,aAAaA,OAAK,KAAK,aAAa,MAAM;AAEhD,MAAI;AACF,UAAMC,uBAAsB,WAAW;AACvC,QAAI,CAAE,MAAMC,iBAAgB,WAAW,GAAI;AACzC,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,UAAMC,gBAAe,YAAY;AAAA,MAC/B;AAAA,MACA;AAAA,IACF,CAAC;AAED,WAAO;AAAA,MACL,SAAS,OAAO,EAAE,YAAY,iBAAiB,aAAa,MAAM;AAChE,YACE,CAAC,0BAA0B,KAAK,UAAU,KAC1C,CAAC,uBAAuB,eAAe,KACvC,CAAC,mBAAmB,YAAY,GAChC;AACA,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AACA,YAAI;AACF,gBAAMF,uBAAsB,WAAW;AACvC,cAAI,CAAE,MAAMC,iBAAgB,WAAW,GAAI;AACzC,kBAAM,IAAI;AAAA,cACR;AAAA,YACF;AAAA,UACF;AACA,gBAAM,iBAAiB,MAAMC,gBAAe,YAAY;AAAA,YACtD;AAAA,YACA;AAAA,UACF,CAAC;AACD,gBAAMC,2BAA0B;AAAA,YAC9B,SAAS;AAAA,cACP;AAAA,gBACE;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,YACA;AAAA,UACF,CAAC;AAAA,QACH,SAAS,OAAO;AACd,cAAI,iBAAiB,mCAAoC,OAAM;AAC/D,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,QAAI,iBAAiB,mCAAoC,OAAM;AAC/D,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAeH,uBAAsB,aAAqB;AACxD,QAAM,eAAe,MAAMI,OAAM,WAAW;AAC5C,MAAI,CAAC,aAAa,YAAY,KAAK,aAAa,eAAe,GAAG;AAChE,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAeF,gBACb,YACA,yBACA;AACA,QAAM,cAAc,MAAME,OAAM,UAAU,EAAE,MAAM,CAAC,UAAmB;AACpE,QAAIC,iBAAgB,OAAO,QAAQ,EAAG,QAAO;AAC7C,UAAM;AAAA,EACR,CAAC;AACD,MAAI,eAAe,CAAC,YAAY,OAAO,GAAG;AACxC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,QAAM,UAAU,cAAc,MAAMC,WAAS,YAAY,MAAM,IAAI;AACnE,MACE,wBAAwB;AAAA,IACtB,CAAC,SAAS,oBAAoB,SAAS,IAAI,IAAI;AAAA,EACjD,GACA;AACA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAeH,2BAA0B,SAItC;AACD,QAAM,gBAAgBJ,OAAK;AAAA,IACzB,QAAQ;AAAA,IACR,6BAA6B,QAAQ,GAAG,IAAIQ,YAAW,CAAC;AAAA,EAC1D;AACA,MAAI;AACF,UAAMC,WAAU,eAAe,QAAQ,SAAS;AAAA,MAC9C,UAAU;AAAA,MACV,MAAM;AAAA,MACN,MAAM;AAAA,IACR,CAAC;AACD,UAAMC,OAAM,eAAe,GAAK;AAChC,UAAMC,QAAO,eAAe,QAAQ,UAAU;AAAA,EAChD,QAAQ;AACN,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF,UAAE;AACA,UAAMC,IAAG,eAAe,EAAE,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM,MAAS;AAAA,EAChE;AACF;AAEA,SAAS,kBACP,SACA,YACA,iBACA,cACA;AACA,SAAO;AAAA,IACL;AAAA,MACE,cAAc,SAAS,oCAAoC,UAAU;AAAA,MACrE;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,OAAwB;AAClD,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,KAAK;AACzB,WACE,CAAC,IAAI,YACL,CAAC,IAAI,YACL,CAAC,IAAI,UACL,CAAC,IAAI,QACL,IAAI,aAAa,QAChB,IAAI,aAAa,YACf,IAAI,aAAa,WAChB,CAAC,aAAa,aAAa,OAAO,EAAE,SAAS,IAAI,QAAQ;AAAA,EAEjE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,cAAc,SAAiB,MAAc,OAAe;AACnE,QAAM,aAAa,GAAG,IAAI,IAAI,KAAK;AACnC,QAAM,WAAW,IAAI,OAAO,IAAI,IAAI,wBAAwB,GAAG;AAC/D,MAAI,SAAS,KAAK,OAAO,EAAG,QAAO,QAAQ,QAAQ,UAAU,UAAU;AACvE,QAAM,UAAU,QAAQ,SAAS,MAAM,IAAI,SAAS;AACpD,MAAI,QAAQ,WAAW,EAAG,QAAO,GAAG,UAAU,GAAG,OAAO;AACxD,SAAO,GAAG,OAAO,GAAG,QAAQ,SAAS,IAAI,IAAI,KAAK,OAAO,GAAG,UAAU,GAAG,OAAO;AAClF;AAEA,SAAS,oBAAoB,SAAiB,MAAc;AAC1D,SAAO,QAAQ,MAAM,QAAQ,EAAE,OAAO,CAAC,SAAS,KAAK,WAAW,GAAG,IAAI,GAAG,CAAC,EACxE;AACL;AAEA,SAASV,iBAAgB,aAAqB;AAC5C,SAAO,IAAI,QAAiB,CAAC,SAAS,WAAW;AAC/C,UAAM,QAAQW;AAAA,MACZ;AAAA,MACA,CAAC,gBAAgB,WAAW,cAAc,MAAM,MAAM;AAAA,MACtD;AAAA,QACE,KAAK;AAAA,QACL,OAAO;AAAA,MACT;AAAA,IACF;AACA,UAAM,KAAK,SAAS,MAAM;AAC1B,UAAM,KAAK,QAAQ,CAAC,SAAS;AAC3B,UAAI,SAAS,EAAG,SAAQ,IAAI;AAAA,eACnB,SAAS,EAAG,SAAQ,KAAK;AAAA,UAC7B,QAAO,IAAI,MAAM,+BAA+B,CAAC;AAAA,IACxD,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAASP,iBAAgB,OAAgB,MAAuB;AAC9D,SACE,iBAAiB,SACjB,UAAU,SACT,MAAgC,SAAS;AAE9C;;;AF1RA,IAAMQ,cAAa,oBAAI,IAAI,CAAC,UAAU,IAAI,CAAC;AAC3C,IAAMC,aAAY;AAClB,IAAMC,oBAAmB;AACzB,IAAMC,mBAAkB;AACxB,IAAMC,gBAAe;AACrB,IAAMC,aAAY;AAClB,IAAMC,aAAY;AAClB,IAAM,cAAc;AACpB,IAAMC,gBAAe;AAEd,IAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgD3B,eAAsB,iBAAiB,SASN;AAC/B,MACE,QAAQ,KAAK,WAAW,KACxB,QAAQ,KAAK,KAAK,CAAC,QAAQP,YAAW,IAAI,GAAG,CAAC,GAC9C;AACA,WAAO,EAAE,UAAU,GAAG,QAAQ,YAAY;AAAA,EAC5C;AACA,MAAI,QAAQ,KAAK,KAAK,CAAC,QAAQQ,WAAU,GAAG,EAAE,CAAC,MAAM,OAAO,GAAG;AAC7D,WAAOC,YAAW,mDAAmD;AAAA,EACvE;AAEA,MAAI,QAAQ,KAAK,CAAC,MAAM,WAAW;AACjC,QAAI;AACF,gBAAU;AAAA,QACR,GAAG;AAAA,QACH,MAAM,MAAM,2BAA2B,SAAS,UAAU,QAAQ,IAAI;AAAA,MACxE;AAAA,IACF,SAAS,OAAO;AACd,aAAO;AAAA,QACL,UAAU;AAAA,QACV,QACE,iBAAiB,QACb,MAAM,UACN;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,QAAM,CAAC,YAAY,GAAGC,KAAI,IAAI,QAAQ;AACtC,MAAI,eAAe,WAAW;AAC5B,WAAOC,mBAAkB,EAAE,GAAG,SAAS,MAAAD,MAAK,CAAC;AAAA,EAC/C;AACA,MAAI,eAAe,eAAe;AAChC,WAAOE,uBAAsB,EAAE,GAAG,SAAS,MAAAF,MAAK,CAAC;AAAA,EACnD;AACA,MAAI,eAAe,cAAc;AAC/B,WAAOG,sBAAqB,EAAE,GAAG,SAAS,MAAAH,OAAM,gBAAgB,QAAQ,CAAC;AAAA,EAC3E;AACA,MAAI,eAAe,uBAAuB;AACxC,WAAOG,sBAAqB;AAAA,MAC1B,GAAG;AAAA,MACH,MAAAH;AAAA,MACA,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AACA,MACE,eAAe,eACf,eAAe,iBACf,eAAe,YACf,eAAe,WACf;AACA,WAAO,mBAAmB,EAAE,GAAG,SAAS,MAAAA,OAAM,WAAW,WAAW,CAAC;AAAA,EACvE;AACA,SAAOD,YAAW,gCAAgC;AACpD;AAEA,eAAeE,mBAAkB,SAOA;AAC/B,QAAM,SAAS,QAAQ,KAAK,CAAC;AAC7B,MAAI,CAAC,UAAU,CAAC,CAAC,UAAU,QAAQ,UAAU,KAAK,EAAE,SAAS,MAAM,GAAG;AACpE,WAAOF,YAAW,wCAAwC;AAAA,EAC5D;AACA,QAAM,SAASK,mBAAkB,QAAQ,QAAQ,KAAK,MAAM,CAAC,CAAC;AAC9D,MAAI,CAAC,OAAO,GAAI,QAAO,OAAO;AAC9B,MAAI,CAAC,QAAQ,WAAW;AACtB,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,MAAI;AACF,UAAM,aAAa,2BAA2B,QAAQ,GAAG;AACzD,UAAM,QAAQ,MAAMC,sBAAqB,OAAO,EAAE,QAAQ;AAAA,MACxD,UAAU;AAAA,MACV,QAAQ,CAAC,wBAAwB;AAAA,IACnC,CAAC;AACD,IAAAC,cAAa,OAAO,wBAAwB;AAC5C,UAAM,SAAS,4BAA4B;AAAA,MACzC;AAAA,MACA,WAAW,QAAQ;AAAA,IACrB,CAAC;AAED,QAAI,WAAW,QAAQ;AACrB,YAAMC,YAAW,MAAM,OAAO,aAAa,EAAE,OAAO,MAAM,YAAY,CAAC;AACvE,MAAAC,4BAA2BD,WAAU,MAAM,MAAM,cAAc;AAC/D,aAAO;AAAA,QACL,UAAU;AAAA,QACV,QAAQ,OAAO,OACXE,mBAAkB,EAAE,UAAAF,UAAS,CAAC,IAC9BG,yBAAwBH,SAAQ;AAAA,MACtC;AAAA,IACF;AAEA,QAAI,WAAW,UAAU;AACvB,YAAMI,WAAU,MAAM,OAAO,cAAc;AAAA,QACzC,MAAM,OAAO;AAAA,QACb,MAAM,OAAO;AAAA,QACb,OAAO,MAAM;AAAA,MACf,CAAC;AACD,MAAAH,4BAA2B,CAACG,QAAO,GAAG,MAAM,MAAM,cAAc;AAChE,aAAO;AAAA,QACL,UAAU;AAAA,QACV,QAAQ,OAAO,OACXF,mBAAkB,EAAE,SAAAE,SAAQ,CAAC,IAC7B;AAAA,UACE;AAAA,UACA,YAAYA,SAAQ,IAAI;AAAA,UACxB,SAASA,SAAQ,IAAI;AAAA,UACrB,mCAAmCA,SAAQ,IAAI;AAAA,QACjD,EAAE,KAAK,IAAI;AAAA,MACjB;AAAA,IACF;AAEA,UAAM,YAAY,MAAM;AAAA,MACtB,QAAQ,OAAO,QAAQ,IAAI;AAAA,IAC7B;AACA,UAAM,QAAQC,qBAAoB,OAAO;AACzC,UAAM,UAAU;AAAA,MACd,WAAW;AAAA,MACX,gBAAgB,UAAU;AAAA,MAC1B,SAAS;AAAA,IACX;AAEA,QAAI,WAAW,OAAO;AACpB,YAAML,YAAW,MAAM,OAAO,aAAa,EAAE,OAAO,MAAM,YAAY,CAAC;AACvE,MAAAC,4BAA2BD,WAAU,MAAM,MAAM,cAAc;AAC/D,YAAM,UAAUA,UAAS;AAAA,QACvB,CAACI,aAAYA,SAAQ,SAAS,OAAO;AAAA,MACvC;AACA,UAAI,QAAQ,WAAW,GAAG;AACxB,cAAM,IAAI,qBAAqB;AAAA,UAC7B,MAAM,QAAQ,WAAW,IAAI,sBAAsB;AAAA,UACnD,SACE,QAAQ,WAAW,IACf,sCACA;AAAA,UACN,QAAQ,QAAQ,WAAW,IAAI,MAAM;AAAA,QACvC,CAAC;AAAA,MACH;AACA,YAAMA,WAAU,QAAQ,CAAC;AACzB,UACE,UAAU,WAAW,YACrB,UAAU,UAAU,QAAQ,SAASA,SAAQ,QAC7C,CAAC,OAAO,SACR;AACA,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,YAAM,kBAAkB,MAAM,MAAM,KAAK,OAAO;AAChD,YAAM,MAAM,MAAM;AAAA,QAChB,GAAG;AAAA,QACH,gBAAgB,MAAM,MAAM;AAAA,QAC5B,SAAS,EAAE,IAAIA,SAAQ,IAAI,MAAMA,SAAQ,KAAK;AAAA,MAChD,CAAC;AACD,UAAI;AACF,cAAM,4BAA4B;AAAA,UAChC,kBACE,UAAU,WAAW,WAAW,UAAU,WAAW;AAAA,UACvD,SAAS,EAAE,MAAMA,SAAQ,MAAM,MAAMA,SAAQ,KAAK;AAAA,UAClD,SAAS,UAAU;AAAA,QACrB,CAAC;AAAA,MACH,SAAS,OAAO;AACd,YAAI,gBAAiB,OAAM,MAAM,MAAM,eAAe;AAAA,YACjD,OAAM,MAAM,OAAO,OAAO;AAC/B,cAAM;AAAA,MACR;AACA,YAAME,UAAS;AAAA,QACb,WAAW;AAAA,QACX,gBAAgB,MAAM,MAAM;AAAA,QAC5B,SAAAF;AAAA,QACA,eAAeG,OAAK;AAAA,UAClB,UAAU;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,QACL,UAAU;AAAA,QACV,QAAQ,OAAO,OACXL,mBAAkBI,OAAM,IACxB;AAAA,UACE;AAAA,UACA,YAAYF,SAAQ,IAAI;AAAA,UACxB,cAAcE,QAAO,aAAa;AAAA,QACpC,EAAE,KAAK,IAAI;AAAA,MACjB;AAAA,IACF;AAEA,QAAI,UAAU,WAAW,WAAW;AAClC,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,UAAM,UAAU,MAAM,MAAM,KAAK,OAAO;AACxC,QACE,CAAC,WACD,QAAQ,mBAAmB,MAAM,MAAM,kBACvC,QAAQ,QAAQ,SAAS,UAAU,UAAU,QAAQ,MACrD;AACA,YAAM,IAAI;AAAA,QACR,UACI,qCACA;AAAA,QACJ,UACI,mEACA;AAAA,MACN;AAAA,IACF;AACA,UAAM,WAAW,MAAM,OAAO,aAAa,EAAE,OAAO,MAAM,YAAY,CAAC;AACvE,IAAAL,4BAA2B,UAAU,MAAM,MAAM,cAAc;AAC/D,UAAM,UAAU,SAAS;AAAA,MACvB,CAAC,cAAc,UAAU,OAAO,QAAQ,QAAQ;AAAA,IAClD;AACA,QAAI,CAAC,WAAW,QAAQ,SAAS,QAAQ,QAAQ,MAAM;AACrD,YAAM,IAAI,qBAAqB;AAAA,QAC7B,MAAM;AAAA,QACN,SAAS;AAAA,QACT,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AACA,UAAM,SAAS;AAAA,MACb,WAAW;AAAA,MACX,WAAW;AAAA,MACX,gBAAgB,QAAQ;AAAA,MACxB;AAAA,MACA,gBAAgB,UAAU;AAAA,IAC5B;AACA,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ,OAAO,OACXC,mBAAkB,MAAM,IACxB;AAAA,QACE;AAAA,QACA,YAAY,QAAQ,IAAI;AAAA,QACxB,iBAAiB,QAAQ,cAAc;AAAA,QACvC,QAAQ,UAAU;AAAA,MACpB,EAAE,KAAK,IAAI;AAAA,IACjB;AAAA,EACF,SAAS,OAAO;AACd,WAAOM,oBAAmB,KAAK;AAAA,EACjC;AACF;AAEA,eAAeb,uBAAsB,SAOJ;AAC/B,QAAM,CAAC,QAAQ,GAAGF,KAAI,IAAI,QAAQ;AAClC,MACE,CAAC,UACD,CAAC,CAAC,QAAQ,UAAU,UAAU,QAAQ,QAAQ,EAAE,SAAS,MAAM,GAC/D;AACA,WAAOD,YAAW,4CAA4C;AAAA,EAChE;AACA,QAAM,SAASiB,uBAAsB,QAAQhB,KAAI;AACjD,MAAI,CAAC,OAAO,GAAI,QAAO,OAAO;AAC9B,SAAO,oBAAoB,SAAS,OAAO,EAAE,QAAQ,QAAQ,MAAM;AACjE,UAAM,gBAAgB;AAAA,MACpB,WAAW,QAAQ;AAAA,MACnB,OAAO,QAAQ;AAAA,IACjB;AACA,QAAI,WAAW,QAAQ;AACrB,YAAM,eAAe,MAAM,OAAO,iBAAiB,aAAa;AAChE,aAAO;AAAA,QACL,UAAU;AAAA,QACV,QAAQ,OAAO,OACXS,mBAAkB,EAAE,aAAa,CAAC,IAClC;AAAA,UACE;AAAA,UACA,iBAAiB,aAAa,MAAM;AAAA,UACpC,GAAG,aAAa,IAAI,CAAC,EAAE,MAAAQ,OAAM,KAAK,MAAM,KAAKA,KAAI,KAAK,IAAI,EAAE;AAAA,QAC9D,EAAE,KAAK,IAAI;AAAA,MACjB;AAAA,IACF;AACA,UAAM,cACJ,WAAW,WACP,MAAM,OAAO,kBAAkB;AAAA,MAC7B,GAAG;AAAA,MACH,MAAM,OAAO;AAAA,MACb,MAAM,OAAO;AAAA,IACf,CAAC,IACD,WAAW,WACT,MAAM,OAAO,kBAAkB;AAAA,MAC7B,GAAG;AAAA,MACH,iBAAiB,OAAO;AAAA,MACxB,MAAM,OAAO;AAAA,IACf,CAAC,IACD,WAAW,SACT,MAAM,OAAO,gBAAgB;AAAA,MAC3B,GAAG;AAAA,MACH,uBAAuB,OAAO;AAAA,MAC9B,MAAM,OAAO;AAAA,MACb,MAAM,OAAO;AAAA,IACf,CAAC,IACD;AACV,QAAI,WAAW,UAAU;AACvB,YAAM,SAAS,MAAM,OAAO,kBAAkB;AAAA,QAC5C,GAAG;AAAA,QACH,iBAAiB,OAAO;AAAA,MAC1B,CAAC;AACD,aAAO;AAAA,QACL,UAAU;AAAA,QACV,QAAQ,OAAO,OACXR,mBAAkB,EAAE,aAAa,OAAO,iBAAiB,OAAO,CAAC,IACjE,6BAA6B,OAAO,eAAe;AAAA,MACzD;AAAA,IACF;AACA,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ,OAAO,OACXA,mBAAkB,EAAE,YAAY,CAAC,IACjC,6BAA6B,YAAa,IAAI,IAAI,WAAW,SAAS,WAAW,WAAW,WAAW,YAAY,SAAS;AAAA,IAClI;AAAA,EACF,CAAC;AACH;AAEA,SAASO,uBACP,QACAhB,OAU4C;AAC5C,QAAM,WACJ,WAAW,WACP,CAACJ,YAAWD,UAAS,IACrB,WAAW,WACT,CAACH,mBAAkBG,UAAS,IAC5B,WAAW,SACT,CAAC,aAAaC,YAAWD,UAAS,IAClC,WAAW,WACT,CAACH,iBAAgB,IACjB,CAAC;AACb,QAAM,UAAU,oBAAI,IAAI,CAACD,YAAW,GAAG,QAAQ,CAAC;AAChD,QAAM,QAAQ,oBAAI,IAA2B;AAC7C,WAAS,QAAQ,GAAG,QAAQS,MAAK,QAAQ,SAAS,GAAG;AACnD,UAAM,CAAC,MAAM,WAAW,IAAIF,WAAUE,MAAK,KAAK,CAAC;AACjD,QAAI,CAAC,QAAQ,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,GAAG;AACzC,aAAO,EAAE,OAAOD,YAAW,wBAAwB,IAAI,EAAE,GAAG,IAAI,MAAM;AAAA,IACxE;AACA,QAAI,SAASR,YAAW;AACtB,UAAI,gBAAgB,QAAW;AAC7B,eAAO;AAAA,UACL,OAAOQ,YAAW,iCAAiC;AAAA,UACnD,IAAI;AAAA,QACN;AAAA,MACF;AACA,YAAM,IAAI,MAAM,IAAI;AACpB;AAAA,IACF;AACA,UAAM,QAAQ,eAAeC,MAAK,QAAQ,CAAC;AAC3C,QAAI,CAAC,SAAS,MAAM,WAAW,IAAI,GAAG;AACpC,aAAO,EAAE,OAAOD,YAAW,GAAG,IAAI,oBAAoB,GAAG,IAAI,MAAM;AAAA,IACrE;AACA,UAAM,IAAI,MAAM,MAAM,KAAK,CAAC;AAC5B,QAAI,gBAAgB,OAAW,UAAS;AAAA,EAC1C;AACA,aAAW,QAAQ,UAAU;AAC3B,QAAI,CAAC,MAAM,IAAI,IAAI;AACjB,aAAO,EAAE,OAAOA,YAAW,GAAG,IAAI,eAAe,GAAG,IAAI,MAAM;AAAA,EAClE;AACA,QAAM,kBAAkB,yBAAyB,OAAOP,iBAAgB;AACxE,QAAM,aAAa,yBAAyB,OAAO,WAAW;AAC9D,QAAMyB,QAAO,yBAAyB,OAAOrB,UAAS;AACtD,MACE,CAAC,iBAAiB,YAAYqB,KAAI,EAAE;AAAA,IAClC,CAAC,UAAU,SAAS,CAAC,uBAAuB,KAAK;AAAA,EACnD,GACA;AACA,WAAO,EAAE,OAAOlB,YAAW,kCAAkC,GAAG,IAAI,MAAM;AAAA,EAC5E;AACA,QAAM,OAAO,yBAAyB,OAAOJ,UAAS;AACtD,MAAI,QAAQ,KAAK,SAAS;AACxB,WAAO,EAAE,OAAOI,YAAW,oBAAoB,GAAG,IAAI,MAAM;AAC9D,SAAO;AAAA,IACL,GAAI,kBAAkB,EAAE,gBAAgB,IAAI,CAAC;AAAA,IAC7C,MAAM,MAAM,IAAIR,UAAS;AAAA,IACzB,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,IACvB,IAAI;AAAA,IACJ,GAAI0B,QAAO,EAAE,MAAAA,MAAK,IAAI,CAAC;AAAA,IACvB,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;AAAA,EACrC;AACF;AAEA,eAAed,sBAAqB,SAUH;AAC/B,QAAM,SAAS,QAAQ,KAAK,CAAC;AAC7B,MAAI,CAAC,UAAU,CAAC,CAAC,SAAS,QAAQ,UAAU,QAAQ,EAAE,SAAS,MAAM,GAAG;AACtE,WAAOJ;AAAA,MACL,yBAAyB,QAAQ,mBAAmB,UAAU,eAAe,qBAAqB;AAAA,IACpG;AAAA,EACF;AACA,QAAM,SAASmB;AAAA,IACb;AAAA,IACA,QAAQ,KAAK,MAAM,CAAC;AAAA,IACpB,QAAQ;AAAA,EACV;AACA,MAAI,CAAC,OAAO,GAAI,QAAO,OAAO;AAE9B,QAAM,UAAU,MAAMC,iCAAgC;AAAA,IACpD,GAAG;AAAA,IACH,SAAS,OAAO;AAAA,EAClB,CAAC;AACD,MAAI,CAAC,QAAQ,GAAI,QAAO,QAAQ;AAEhC,MAAI;AACF,QAAI,WAAW,QAAQ;AACrB,YAAM,cACJ,QAAQ,mBAAmB,WAErB,MAAM,QAAQ,OAAO,gBAAgB;AAAA,QACnC,iBAAiB,OAAO;AAAA,QACxB,WAAW,QAAQ;AAAA,QACnB,OAAO,QAAQ;AAAA,MACjB,CAAC,GACD,UAEA,MAAM,QAAQ,OAAO,wBAAwB;AAAA,QAC3C,iBAAiB,OAAO;AAAA,QACxB,WAAW,QAAQ;AAAA,QACnB,OAAO,QAAQ;AAAA,MACjB,CAAC,GACD;AACR,YAAM,SAAS;AAAA,QACb;AAAA,QACA,aAAa,OAAO;AAAA,MACtB;AACA,aAAO;AAAA,QACL,UAAU;AAAA,QACV,QAAQ,OAAO,OACXV,mBAAkB,MAAM,IACxBW,4BAA2B;AAAA,UACzB,GAAG;AAAA,UACH,gBAAgB,QAAQ;AAAA,QAC1B,CAAC;AAAA,MACP;AAAA,IACF;AAEA,QAAI,WAAW,UAAU;AACvB,YAAMC,cACJ,QAAQ,mBAAmB,UACvB,MAAM,QAAQ,OAAO,iBAAiB;AAAA,QACpC,cAAc,OAAO;AAAA,QACrB,iBAAiB,OAAO;AAAA,QACxB,WAAW,QAAQ;AAAA,QACnB,OAAO,QAAQ;AAAA,MACjB,CAAC,IACD,MAAM,QAAQ,OAAO,yBAAyB;AAAA,QAC5C,cAAc,OAAO;AAAA,QACrB,iBAAiB,OAAO;AAAA,QACxB,WAAW,QAAQ;AAAA,QACnB,OAAO,QAAQ;AAAA,MACjB,CAAC;AACP,YAAM,SAAS;AAAA,QACb,YAAAA;AAAA,QACA,aAAa,OAAO;AAAA,QACpB,SAAS;AAAA,MACX;AACA,aAAO;AAAA,QACL,UAAU;AAAA,QACV,QAAQ,OAAO,OACXZ,mBAAkB,MAAM,IACxB,iBAAiB,oBAAoB,QAAQ,cAAc,CAAC;AAAA,cAAqCY,YAAW,EAAE;AAAA,eAAkB,OAAO,eAAe;AAAA,MAC5J;AAAA,IACF;AAEA,QAAI,QAAQ,mBAAmB,SAAS;AACtC,YAAMC,uBACJ,WAAW,YAEL,MAAM,QAAQ,OAAO,gBAAgB;AAAA,QACnC,iBAAiB,OAAO;AAAA,QACxB,WAAW,QAAQ;AAAA,QACnB,OAAO,QAAQ;AAAA,MACjB,CAAC,GACD,OAAO,OAAO,CAACD,gBAAeA,YAAW,WAAW,QAAQ,IAC9D,CAAC;AACP,YAAME,YAAW,MAAM,QAAQ,OAAO,gBAAgB;AAAA,QACpD,iBAAiB,OAAO;AAAA,QACxB,MAAM,OAAO;AAAA,QACb,WAAW,QAAQ;AAAA,QACnB,OAAO,QAAQ;AAAA,MACjB,CAAC;AACD,YAAM,EAAE,OAAO,GAAGF,YAAW,IAAIE;AACjC,YAAMC,UAAS,MAAM,+BAA+B;AAAA,QAClD;AAAA,QACA,YAAAH;AAAA,QACA,gBAAgB,QAAQ;AAAA,QACxB,iBAAiB,OAAO;AAAA,QACxB,cAAc,QAAQ;AAAA,QACtB,MAAM,OAAO;AAAA,QACb,QAAQ;AAAA,QACR,cAAc,QAAQ;AAAA,MACxB,CAAC;AACD,UAAI,WAAW,UAAU;AACvB,cAAM,QAAQ;AAAA,UACZC,qBAAoB;AAAA,YAAI,CAAC,uBACvB,QAAQ,OAAO,iBAAiB;AAAA,cAC9B,cAAc,mBAAmB;AAAA,cACjC,iBAAiB,OAAO;AAAA,cACxB,WAAW,QAAQ;AAAA,cACnB,OAAO,QAAQ;AAAA,YACjB,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AACA,aAAOE;AAAA,IACT;AAEA,UAAM,sBACJ,WAAW,YAEL,MAAM,QAAQ,OAAO,wBAAwB;AAAA,MAC3C,iBAAiB,OAAO;AAAA,MACxB,WAAW,QAAQ;AAAA,MACnB,OAAO,QAAQ;AAAA,IACjB,CAAC,GACD,YAAY,OAAO,CAACH,gBAAeA,YAAW,WAAW,QAAQ,IACnE,CAAC;AACP,UAAM,WAAW,MAAM,QAAQ,OAAO,wBAAwB;AAAA,MAC5D,iBAAiB,OAAO;AAAA,MACxB,MAAM,OAAO;AAAA,MACb,WAAW,QAAQ;AAAA,MACnB,OAAO,QAAQ;AAAA,IACjB,CAAC;AACD,UAAM,EAAE,YAAY,QAAQ,GAAG,WAAW,IAAI;AAC9C,UAAM,SAAS,MAAM,+BAA+B;AAAA,MAClD;AAAA,MACA;AAAA,MACA,gBAAgB,QAAQ;AAAA,MACxB,iBAAiB,OAAO;AAAA,MACxB,cAAc,QAAQ;AAAA,MACtB,MAAM,OAAO;AAAA,MACb;AAAA,MACA,cAAc,QAAQ;AAAA,IACxB,CAAC;AACD,QAAI,WAAW,UAAU;AACvB,YAAM,QAAQ;AAAA,QACZ,oBAAoB;AAAA,UAAI,CAAC,uBACvB,QAAQ,OAAO,yBAAyB;AAAA,YACtC,cAAc,mBAAmB;AAAA,YACjC,iBAAiB,OAAO;AAAA,YACxB,WAAW,QAAQ;AAAA,YACnB,OAAO,QAAQ;AAAA,UACjB,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAOI,uBAAsB,KAAK;AAAA,EACpC;AACF;AAEA,eAAe,+BAA+B,SASb;AAC/B,QAAM,QAAQ,aAAa,QAAQ;AAAA,IACjC,YAAY,QAAQ;AAAA,IACpB,iBAAiB,QAAQ;AAAA,IACzB,cAAc,QAAQ;AAAA,EACxB,CAAC;AACD,QAAM,qBACJ,QAAQ,mBAAmB,UACvB,qCACA;AACN,QAAM,YAAY;AAAA,IAChB;AAAA,IACA,GAAI,QAAQ,mBAAmB,UAC3B,EAAE,qBAAqB,8BAA8B,IACrD,CAAC;AAAA,EACP;AACA,QAAM,SAAS;AAAA,IACb,YAAY,QAAQ;AAAA,IACpB,aAAa,QAAQ;AAAA,IACrB;AAAA,IACA,WAAW,QAAQ,WAAW,UAAU,WAAW;AAAA,EACrD;AACA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ,QAAQ,OACZhB,mBAAkB,MAAM,IACxB;AAAA,MACE,iBAAiB,oBAAoB,QAAQ,cAAc,CAAC,eAAe,OAAO,SAAS;AAAA,MAC3F,eAAe,QAAQ,WAAW,EAAE;AAAA,MACpC,gBAAgB,QAAQ,eAAe;AAAA,MACvC,wBAAwB,kBAAkB;AAAA,MAC1C,QAAQ,mBAAmB,UACvB,yBAAyB,6BAA6B,KACtD;AAAA,IACN,EACG,OAAO,CAAC,SAAyB,QAAQ,IAAI,CAAC,EAC9C,KAAK,IAAI;AAAA,EAClB;AACF;AAEA,eAAeU,iCAAgC,SAoB7C;AACA,MAAI;AACF,UAAM,QAAQ,MAAM,uBAAuB,OAAO;AAClD,QAAI,UAAU,OAAO;AACrB,QAAI,CAAC,SAAS;AACZ,YAAM,YAAY,MAAM;AAAA,QACtB,QAAQ,OAAO,QAAQ,IAAI;AAAA,MAC7B;AACA,UAAI,UAAU,WAAW;AACvB,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,QACF;AACF,gBAAU,UAAU;AAAA,IACtB;AACA,UAAM,eAAe,QAAQ,UACzB,OACE,QAAQ,mBAAmB,UACtB,QAAQ,iCACP,4CACD,QAAQ,yCACP,mDACN,EAAE,aAAa,QAAQ,CAAC,IAC1B;AACJ,UAAM,UAAU,MAAM,kBAAkB,SAAS,yBAAyB;AAC1E,QAAI,CAAC,QAAQ,GAAI,QAAO;AACxB,WAAO;AAAA,MACL,YAAY,QAAQ;AAAA,MACpB,QAAQ,4BAA4B;AAAA,QAClC,YAAY,QAAQ;AAAA,QACpB,WAAW,QAAQ;AAAA,MACrB,CAAC;AAAA,MACD,OAAO,QAAQ;AAAA,MACf,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;AAAA,MACvC,IAAI;AAAA,MACJ,WAAW,QAAQ;AAAA,IACrB;AAAA,EACF,SAAS,OAAO;AACd,WAAO,EAAE,OAAOM,uBAAsB,KAAK,GAAG,IAAI,MAAM;AAAA,EAC1D;AACF;AAEA,eAAe,mBAAmB,SAQD;AAC/B,QAAM,SAASC,YAAW,QAAQ,IAAI;AACtC,MAAI,CAAC,OAAO,GAAI,QAAO3B,YAAW,OAAO,KAAK;AAC9C,MAAI,OAAO,YAAY,SAAS,GAAG;AACjC,WAAOA;AAAA,MACL,wBAAwB,QAAQ,SAAS;AAAA,IAC3C;AAAA,EACF;AACA,QAAM,kBAAkB,OAAO,MAAM,IAAIP,iBAAgB;AACzD,MAAI,CAAC,gBAAiB,QAAOO,YAAW,4BAA4B;AACpE,MAAI,CAAC,uBAAuB,eAAe,GAAG;AAC5C,WAAOA,YAAW,iDAAiD;AAAA,EACrE;AAEA,SAAO,oBAAoB,SAAS,OAAO,EAAE,QAAQ,QAAQ,MAAM;AACjE,UAAM,WACJ,QAAQ,cAAc,YAClB,MAAM,OAAO,QAAQ;AAAA,MACnB;AAAA,MACA,WAAW,QAAQ;AAAA,MACnB,OAAO,QAAQ;AAAA,IACjB,CAAC,IACD,QAAQ,cAAc,cACpB,MAAM,OAAO,UAAU;AAAA,MACrB;AAAA,MACA,WAAW,QAAQ;AAAA,MACnB,OAAO,QAAQ;AAAA,IACjB,CAAC,IACD,MAAM,OAAO,YAAY;AAAA,MACvB;AAAA,MACA,WAAW,QAAQ;AAAA,MACnB,OAAO,QAAQ;AAAA,IACjB,CAAC;AACT,UAAM,SAAS;AAAA,MACb,aAAa;AAAA,MACb,SAAS,QAAQ;AAAA,MACjB,GAAI,QAAQ,cAAc,YACtB,EAAE,QAAQ,SAAS,IACnB,QAAQ,cAAc,cACpB,EAAE,WAAW,SAAS,IACtB,EAAE,aAAa,SAAS;AAAA,IAChC;AACA,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ,OAAO,OACXU,mBAAkB,MAAM,IACxB;AAAA,QACE,QAAQ,cAAc,YAClB,qCACA,iBAAiB,QAAQ,SAAS;AAAA,QACtC,gBAAgB,eAAe;AAAA,QAC/B,QAAQ,QAAQ,OACZ,YAAY,QAAQ,QAAQ,IAAI,KAChC;AAAA,MACN,EACG,OAAO,CAAC,SAAyB,QAAQ,IAAI,CAAC,EAC9C,KAAK,IAAI;AAAA,IAClB;AAAA,EACF,CAAC;AACH;AAEA,eAAe,oBACb,SAOA,KAI8B;AAC9B,QAAM,UAAU,MAAM,kBAAkB,OAAO;AAC/C,MAAI,CAAC,QAAQ,GAAI,QAAO,QAAQ;AAChC,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ;AAAA,IACV;AACF,MAAI;AACF,WAAO,MAAM,IAAI;AAAA,MACf,QAAQ,4BAA4B;AAAA,QAClC,YAAY,QAAQ;AAAA,QACpB,WAAW,QAAQ;AAAA,MACrB,CAAC;AAAA,MACD;AAAA,IACF,CAAC;AAAA,EACH,SAAS,OAAO;AACd,WAAO,iBAAiB,uBACpB,EAAE,UAAU,GAAG,QAAQ,qBAAqB,MAAM,OAAO,GAAG,IAC5D,EAAE,UAAU,GAAG,QAAQ,gCAAgC;AAAA,EAC7D;AACF;AAEA,eAAe,kBACb,SAOA,gBAAgB,0BACQ;AACxB,MAAI,CAAC,QAAQ,WAAW;AACtB,WAAO;AAAA,MACL,OAAO;AAAA,QACL,UAAU;AAAA,QACV,QAAQ;AAAA,MACV;AAAA,MACA,IAAI;AAAA,IACN;AAAA,EACF;AACA,MAAI;AACF,UAAM,SAAS,MAAM,qBAAqB,SAAS,QAAQ;AAC3D,QAAI,QAAQ;AACV,YAAMkB,SAAQ,MAAMtB,sBAAqB,OAAO,EAAE,QAAQ;AAAA,QACxD,UAAU;AAAA,QACV,QAAQ,CAAC,aAAa;AAAA,MACxB,CAAC;AACD,MAAAC,cAAaqB,QAAO,aAAa;AACjC,UAAIA,OAAM,MAAM,mBAAmB,OAAO,SAAS,QAAQ;AACzD,cAAM,IAAI,mBAAmB;AAAA,UAC3B,MAAM;AAAA,UACN,SACE;AAAA,QACJ,CAAC;AACH,aAAO;AAAA,QACL,YAAY,OAAO,IAAI;AAAA,QACvB,YAAYA,OAAM;AAAA,QAClB,IAAI;AAAA,QACJ,SAAS;AAAA,UACP,IAAI,OAAO;AAAA,UACX,MAAM,OAAO,SAAS,QAAQ;AAAA,UAC9B,MAAM,OAAO,SAAS,QAAQ;AAAA,QAChC;AAAA,QACA,WAAW,OAAO;AAAA,QAClB,SAAS,OAAO;AAAA,MAClB;AAAA,IACF;AAEA,UAAM,YAAY,MAAM;AAAA,MACtB,QAAQ,OAAO,QAAQ,IAAI;AAAA,IAC7B;AACA,QAAI,UAAU,WAAW,WAAW;AAClC,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,UAAM,aAAa,2BAA2B,QAAQ,GAAG;AACzD,UAAM,UAAU,MAAMf,qBAAoB,OAAO,EAAE,KAAK;AAAA,MACtD,WAAW;AAAA,MACX,gBAAgB,UAAU;AAAA,MAC1B,SAAS;AAAA,IACX,CAAC;AACD,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,UAAM,QAAQ,MAAMP,sBAAqB,OAAO,EAAE,QAAQ;AAAA,MACxD,UAAU;AAAA,MACV,QAAQ,CAAC,aAAa;AAAA,IACxB,CAAC;AACD,IAAAC,cAAa,OAAO,aAAa;AACjC,QACE,MAAM,MAAM,mBAAmB,QAAQ,kBACvC,QAAQ,QAAQ,SAAS,UAAU,UAAU,QAAQ,MACrD;AACA,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,MACL;AAAA,MACA,YAAY,MAAM;AAAA,MAClB,IAAI;AAAA,MACJ,SAAS;AAAA,QACP,IAAI,QAAQ,QAAQ;AAAA,QACpB,MAAM,UAAU,UAAU,QAAQ;AAAA,QAClC,MAAM,QAAQ,QAAQ;AAAA,MACxB;AAAA,MACA,WAAW,QAAQ,QAAQ;AAAA,MAC3B,SAAS,UAAU;AAAA,IACrB;AAAA,EACF,SAAS,OAAO;AACd,QAAI,iBAAiB,mBAAoB,QAAOsB,iBAAgB,KAAK;AACrE,WAAO,EAAE,OAAOb,oBAAmB,KAAK,GAAG,IAAI,MAAM;AAAA,EACvD;AACF;AAEA,SAASa,iBACP,OACuC;AACvC,MAAI,iBAAiB,oBAAoB;AACvC,WAAO;AAAA,MACL,OAAO;AAAA,QACL,UAAU;AAAA,QACV,QAAQ;AAAA,UACN;AAAA,UACA,MAAM,SAAS,WAAW,MAAM,MAAM,KAAK;AAAA,UAC3C,SAAS,MAAM,IAAI;AAAA,UACnB,MAAM;AAAA,QACR,EACG,OAAO,CAAC,SAAyB,QAAQ,IAAI,CAAC,EAC9C,KAAK,IAAI;AAAA,MACd;AAAA,MACA,IAAI;AAAA,IACN;AAAA,EACF;AACA,SAAO;AAAA,IACL,OAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ;AAAA,IACV;AAAA,IACA,IAAI;AAAA,EACN;AACF;AAEA,SAASxB,mBACP,QACAJ,OAS4C;AAC5C,QAAM,QAAQ,oBAAI,IAA2B;AAC7C,QAAM,cAAwB,CAAC;AAC/B,QAAM,UAAU,oBAAI,IAAI;AAAA,IACtBT;AAAA,IACA,GAAI,WAAW,WAAW,CAACI,YAAWC,UAAS,IAAI,CAAC;AAAA,IACpD,GAAI,WAAW,QAAQ,CAACC,aAAY,IAAI,CAAC;AAAA,EAC3C,CAAC;AACD,QAAM,UAAU,oBAAI,IAAI,CAACN,YAAWM,aAAY,CAAC;AACjD,WAAS,QAAQ,GAAG,QAAQG,MAAK,QAAQ,SAAS,GAAG;AACnD,UAAM,MAAMA,MAAK,KAAK;AACtB,QAAI,CAAC,IAAI,WAAW,IAAI,GAAG;AACzB,kBAAY,KAAK,GAAG;AACpB;AAAA,IACF;AACA,UAAM,CAAC,MAAM,WAAW,IAAIF,WAAU,GAAG;AACzC,QAAI,CAAC,QAAQ,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,GAAG;AACzC,aAAO,EAAE,OAAOC,YAAW,wBAAwB,IAAI,EAAE,GAAG,IAAI,MAAM;AAAA,IACxE;AACA,QAAI,QAAQ,IAAI,IAAI,GAAG;AACrB,UAAI,gBAAgB,QAAW;AAC7B,eAAO;AAAA,UACL,OAAOA,YAAW,GAAG,IAAI,2BAA2B;AAAA,UACpD,IAAI;AAAA,QACN;AAAA,MACF;AACA,YAAM,IAAI,MAAM,IAAI;AACpB;AAAA,IACF;AACA,UAAM,QAAQ,eAAeC,MAAK,QAAQ,CAAC;AAC3C,QAAI,CAAC,SAAS,MAAM,WAAW,IAAI,GAAG;AACpC,aAAO,EAAE,OAAOD,YAAW,GAAG,IAAI,oBAAoB,GAAG,IAAI,MAAM;AAAA,IACrE;AACA,UAAM,IAAI,MAAM,MAAM,KAAK,CAAC;AAC5B,QAAI,gBAAgB,OAAW,UAAS;AAAA,EAC1C;AAEA,MAAI,WAAW,OAAO;AACpB,QAAI,YAAY,WAAW,KAAK,CAAC,mBAAmB,YAAY,CAAC,CAAE,GAAG;AACpE,aAAO;AAAA,QACL,OAAOA;AAAA,UACL;AAAA,QACF;AAAA,QACA,IAAI;AAAA,MACN;AAAA,IACF;AACA,WAAO;AAAA,MACL,MAAM,MAAM,IAAIR,UAAS;AAAA,MACzB,IAAI;AAAA,MACJ,SAAS,MAAM,IAAIM,aAAY;AAAA,MAC/B,MAAM,YAAY,CAAC;AAAA,IACrB;AAAA,EACF;AACA,MAAI,YAAY,SAAS,GAAG;AAC1B,WAAO;AAAA,MACL,OAAOE,YAAW,wBAAwB,YAAY,CAAC,CAAC,EAAE;AAAA,MAC1D,IAAI;AAAA,IACN;AAAA,EACF;AACA,MAAI,WAAW,UAAU;AACvB,WAAO,EAAE,MAAM,MAAM,IAAIR,UAAS,GAAG,IAAI,MAAM,SAAS,MAAM;AAAA,EAChE;AACA,QAAM0B,QAAO,yBAAyB,OAAOrB,UAAS;AACtD,QAAM,OAAO,yBAAyB,OAAOD,UAAS;AACtD,MAAI,CAACsB,SAAQ,CAAC,mBAAmBA,KAAI,GAAG;AACtC,WAAO;AAAA,MACL,OAAOlB,YAAW,uCAAuC;AAAA,MACzD,IAAI;AAAA,IACN;AAAA,EACF;AACA,MAAI,CAAC,QAAQ,KAAK,SAAS,KAAK;AAC9B,WAAO;AAAA,MACL,OAAOA,YAAW,uCAAuC;AAAA,MACzD,IAAI;AAAA,IACN;AAAA,EACF;AACA,SAAO;AAAA,IACL,MAAM,MAAM,IAAIR,UAAS;AAAA,IACzB;AAAA,IACA,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,MAAA0B;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,OAAwB;AAClD,SACE,MAAM,UAAU,KAChB,MAAM,UAAU,OAChB,6BAA6B,KAAK,KAAK;AAE3C;AAEA,SAASC,sBACP,QACAlB,OACA,gBAU4C;AAC5C,QAAM,WAAW,WAAW,WAAW,WAAW;AAClD,QAAM,UAAU,WAAW;AAC3B,QAAM,UAAU,oBAAI,IAAI;AAAA,IACtBR;AAAA,IACAD;AAAA,IACA,GAAI,WAAW,CAACG,eAAcC,UAAS,IAAI,CAAC;AAAA,IAC5C,GAAI,UAAU,CAACF,gBAAe,IAAI,CAAC;AAAA,EACrC,CAAC;AACD,QAAM,eAAe,oBAAI,IAAI,CAACF,YAAWG,aAAY,CAAC;AACtD,QAAM,QAAQ,oBAAI,IAA2B;AAC7C,QAAM,cAAwB,CAAC;AAE/B,WAAS,QAAQ,GAAG,QAAQM,MAAK,QAAQ,SAAS,GAAG;AACnD,UAAM,MAAMA,MAAK,KAAK;AACtB,QAAI,CAAC,IAAI,WAAW,IAAI,GAAG;AACzB,kBAAY,KAAK,GAAG;AACpB;AAAA,IACF;AACA,UAAM,CAAC,UAAU,WAAW,IAAIF,WAAU,GAAG;AAC7C,QAAI,CAAC,QAAQ,IAAI,QAAQ,GAAG;AAC1B,aAAO;AAAA,QACL,OAAOC,YAAW,wBAAwB,QAAQ,EAAE;AAAA,QACpD,IAAI;AAAA,MACN;AAAA,IACF;AACA,QAAI,MAAM,IAAI,QAAQ,GAAG;AACvB,aAAO;AAAA,QACL,OAAOA,YAAW,uBAAuB,QAAQ,EAAE;AAAA,QACnD,IAAI;AAAA,MACN;AAAA,IACF;AACA,QAAI,aAAa,IAAI,QAAQ,GAAG;AAC9B,UAAI,gBAAgB,QAAW;AAC7B,eAAO;AAAA,UACL,OAAOA,YAAW,GAAG,QAAQ,2BAA2B;AAAA,UACxD,IAAI;AAAA,QACN;AAAA,MACF;AACA,YAAM,IAAI,UAAU,IAAI;AACxB;AAAA,IACF;AACA,UAAM,QAAQ,eAAeC,MAAK,QAAQ,CAAC;AAC3C,QAAI,CAAC,SAAS,MAAM,WAAW,IAAI,GAAG;AACpC,aAAO;AAAA,QACL,OAAOD,YAAW,GAAG,QAAQ,oBAAoB;AAAA,QACjD,IAAI;AAAA,MACN;AAAA,IACF;AACA,UAAM,IAAI,UAAU,KAAK;AACzB,QAAI,gBAAgB,OAAW,UAAS;AAAA,EAC1C;AAEA,MAAI,YAAY,SAAS,GAAG;AAC1B,WAAO;AAAA,MACL,OAAOA,YAAW,wBAAwB,YAAY,CAAC,CAAC,EAAE;AAAA,MAC1D,IAAI;AAAA,IACN;AAAA,EACF;AACA,QAAM,kBAAkB,yBAAyB,OAAOP,iBAAgB;AACxE,MAAI,CAAC,iBAAiB;AACpB,WAAO;AAAA,MACL,OAAOO,YAAW,4BAA4B;AAAA,MAC9C,IAAI;AAAA,IACN;AAAA,EACF;AACA,MAAI,CAAC,uBAAuB,eAAe,GAAG;AAC5C,WAAO;AAAA,MACL,OAAOA,YAAW,iDAAiD;AAAA,MACnE,IAAI;AAAA,IACN;AAAA,EACF;AACA,MAAI,YAAY,CAAC,MAAM,IAAIL,aAAY,GAAG;AACxC,WAAO;AAAA,MACL,OAAOK,YAAW,6CAA6C;AAAA,MAC/D,IAAI;AAAA,IACN;AAAA,EACF;AACA,QAAM,eAAe,yBAAyB,OAAON,gBAAe;AACpE,MAAI,WAAW,CAAC,cAAc;AAC5B,WAAO;AAAA,MACL,OAAOM,YAAW,sCAAsC;AAAA,MACxD,IAAI;AAAA,IACN;AAAA,EACF;AACA,QAAM,OAAO,yBAAyB,OAAOJ,UAAS;AACtD,MAAI,gBAAgB,aAAa,SAAS,KAAK;AAC7C,WAAO;AAAA,MACL,OAAOI,YAAW,0BAA0B;AAAA,MAC5C,IAAI;AAAA,IACN;AAAA,EACF;AACA,MAAI,QAAQ,KAAK,UAAU,mBAAmB,aAAa,MAAM,MAAM;AACrE,WAAO;AAAA,MACL,OAAOA,YAAW,oBAAoB;AAAA,MACtC,IAAI;AAAA,IACN;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;AAAA,IACvC;AAAA,IACA,SAAS;AAAA,IACT,MAAM,MAAM,IAAIR,UAAS;AAAA,IACzB,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,IACvB,IAAI;AAAA,EACN;AACF;AAEA,SAAS,yBACP,OACA,UACoB;AACpB,QAAM,QAAQ,MAAM,IAAI,QAAQ;AAChC,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,IAAI,MAAM,KAAK,IAAI;AACpE;AAEA,SAASkC,uBAAsB,OAAqC;AAClE,MAAI,iBAAiB,oBAAoB;AACvC,WAAOG,iBAAgB,KAAK,EAAE;AAAA,EAChC;AACA,MAAI,iBAAiB,oCAAoC;AACvD,WAAO,EAAE,UAAU,GAAG,QAAQ,MAAM,QAAQ;AAAA,EAC9C;AACA,MAAI,iBAAiB,sBAAsB;AACzC,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ;AAAA,QACN;AAAA,QACA,MAAM,SAAS,WAAW,MAAM,MAAM,KAAK;AAAA,QAC3C,SAAS,MAAM,IAAI;AAAA,MACrB,EACG,OAAO,CAAC,SAAyB,QAAQ,IAAI,CAAC,EAC9C,KAAK,IAAI;AAAA,IACd;AAAA,EACF;AACA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ;AAAA,EACV;AACF;AAEA,SAASb,oBAAmB,OAAqC;AAC/D,MAAI,iBAAiB,mBAAoB,QAAOa,iBAAgB,KAAK,EAAE;AACvE,MAAI,iBAAiB,sBAAsB;AACzC,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ;AAAA,QACN;AAAA,QACA,MAAM,SAAS,WAAW,MAAM,MAAM,KAAK;AAAA,QAC3C,SAAS,MAAM,IAAI;AAAA,MACrB,EACG,OAAO,CAAC,SAAyB,QAAQ,IAAI,CAAC,EAC9C,KAAK,IAAI;AAAA,IACd;AAAA,EACF;AACA,MACE,iBAAiB,+BACjB,iBAAiB,4BACjB,iBAAiB,qBACjB;AACA,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ;AAAA,QACN;AAAA,QACA,SAAS,MAAM,IAAI;AAAA,QACnB,MAAM;AAAA,MACR,EAAE,KAAK,IAAI;AAAA,IACb;AAAA,EACF;AACA,SAAO,EAAE,UAAU,GAAG,QAAQ,wCAAwC;AACxE;AAEA,SAASvB,sBAAqB,SAIL;AACvB,SACE,QAAQ,wBACR,iCAAiC;AAAA,IAC/B,KAAK,QAAQ;AAAA,IACb,WAAW,QAAQ;AAAA,EACrB,CAAC;AAEL;AAEA,SAASO,qBAAoB,SAGL;AACtB,SACE,QAAQ,uBACR,IAAI;AAAA,IACFE,OAAK;AAAA,MACH,wBAAwB,EAAE,KAAK,QAAQ,IAAI,CAAC;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AAEJ;AAEA,SAASR,cACP,OACA,OACM;AACN,MACE,MAAM,MAAM,aAAa,mBACzB,MAAM,MAAM,OAAO,WAAW,KAC9B,MAAM,MAAM,OAAO,CAAC,MAAM,OAC1B;AACA,UAAM,IAAI,mBAAmB;AAAA,MAC3B,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF;AAEA,SAASE,4BACP,UACA,gBACM;AACN,MAAI,SAAS,KAAK,CAAC,YAAY,QAAQ,mBAAmB,cAAc,GAAG;AACzE,UAAM,IAAI,qBAAqB;AAAA,MAC7B,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF;AAEA,SAASE,yBAAwB,UAAyC;AACxE,SAAO;AAAA,IACL;AAAA,IACA,aAAa,SAAS,MAAM;AAAA,IAC5B,GAAG,SAAS;AAAA,MACV,CAAC,YAAY,KAAK,QAAQ,IAAI,KAAK,QAAQ,IAAI,KAAK,QAAQ,EAAE;AAAA,IAChE;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,SAASU,4BAA2B,OAIjC;AACD,SAAO;AAAA,IACL,iBAAiB,oBAAoB,MAAM,cAAc,CAAC;AAAA,IAC1D,gBAAgB,MAAM,WAAW;AAAA,IACjC,gBAAgB,MAAM,YAAY,MAAM;AAAA,IACxC,GAAG,MAAM,YAAY;AAAA,MACnB,CAAC,eACC,KAAK,WAAW,EAAE,KAAK,WAAW,IAAI,KAAK,WAAW,MAAM;AAAA,IAChE;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,oBAAoB,gBAAsC;AACjE,SAAO,mBAAmB,UAAU,UAAU;AAChD;AAEA,SAASM,YAAW1B,OAOa;AAC/B,QAAM,QAAQ,oBAAI,IAAoB;AACtC,QAAM,cAAwB,CAAC;AAC/B,MAAI,OAAO;AACX,WAAS,QAAQ,GAAG,QAAQA,MAAK,QAAQ,SAAS,GAAG;AACnD,UAAM,MAAMA,MAAK,KAAK;AACtB,QAAI,CAAC,IAAI,WAAW,IAAI,GAAG;AACzB,kBAAY,KAAK,GAAG;AACpB;AAAA,IACF;AACA,UAAM,CAAC,UAAU,WAAW,IAAIF,WAAU,GAAG;AAC7C,QAAI,aAAaP,YAAW;AAC1B,UAAI,gBAAgB;AAClB,eAAO,EAAE,OAAO,mCAAmC,IAAI,MAAM;AAC/D,aAAO;AACP;AAAA,IACF;AACA,QAAI,aAAaC;AACf,aAAO,EAAE,OAAO,wBAAwB,QAAQ,IAAI,IAAI,MAAM;AAChE,UAAM,QAAQ,eAAeQ,MAAK,QAAQ,CAAC;AAC3C,QAAI,CAAC,SAAS,MAAM,WAAW,IAAI;AACjC,aAAO,EAAE,OAAO,mCAAmC,IAAI,MAAM;AAC/D,UAAM,IAAI,UAAU,KAAK;AACzB,QAAI,gBAAgB,OAAW,UAAS;AAAA,EAC1C;AACA,SAAO,EAAE,OAAO,MAAM,IAAI,MAAM,YAAY;AAC9C;AAEA,SAASF,WAAU,KAA2C;AAC5D,QAAM,iBAAiB,IAAI,QAAQ,GAAG;AACtC,SAAO,mBAAmB,KACtB,CAAC,KAAK,MAAS,IACf,CAAC,IAAI,MAAM,GAAG,cAAc,GAAG,IAAI,MAAM,iBAAiB,CAAC,CAAC;AAClE;AAEA,SAASW,mBAAkB,OAAwB;AACjD,SAAO,KAAK,UAAU,sBAAsB,KAAK,GAAG,MAAM,CAAC;AAC7D;AAEA,SAAS,sBAAsB,OAAyB;AACtD,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,IAAI,qBAAqB;AAChE,MAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO;AACxD,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,KAAK,EAAE;AAAA,MAAQ,CAAC,CAAC,KAAK,WAAW,MAC9C,CAAC,SAAS,UAAU,WAAW,eAAe,EAAE;AAAA,QAC9C,IAAI,YAAY;AAAA,MAClB,IACI,CAAC,IACD,CAAC,CAAC,KAAK,sBAAsB,WAAW,CAAC,CAAC;AAAA,IAChD;AAAA,EACF;AACF;AAEA,SAASV,YAAW,SAAsC;AACxD,SAAO,EAAE,UAAU,GAAG,QAAQ,GAAG,OAAO;AAAA;AAAA,EAAO,WAAW,GAAG;AAC/D;;;AGl8CA,SAAS,aAAA8B,kBAAiB;AAenB,IAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoB5B,eAAsBC,mBACpB,SACwB;AACxB,MACE,CAAC,QAAQ,KAAK,UACd,QAAQ,KAAK,KAAK,CAAC,QAAQ,QAAQ,YAAY,QAAQ,IAAI;AAE3D,WAAO,EAAE,UAAU,GAAG,QAAQ,aAAa;AAC7C,MAAI;AACF,UAAM,CAAC,QAAQ,GAAGC,KAAI,IAAI,QAAQ;AAClC,QAAI,WAAW;AACb,aAAO,MAAMC,uBAAsB,EAAE,GAAG,SAAS,MAAAD,MAAK,CAAC;AACzD,QACE,CAAC,CAAC,QAAQ,UAAU,OAAO,UAAU,WAAW,QAAQ,EAAE;AAAA,MACxD;AAAA,IACF;AAEA,YAAM,IAAI,MAAM,0BAA0B;AAC5C,UAAM,SAASE,WAAU;AAAA,MACvB,MAAAF;AAAA,MACA,kBAAkB;AAAA,MAClB,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,MAAM,EAAE,MAAM,UAAU;AAAA,QACxB,GAAI,WAAW,YAAY,WAAW,WAClC;AAAA,UACE,MAAM,EAAE,MAAM,SAAkB;AAAA,UAChC,MAAM,EAAE,MAAM,SAAkB;AAAA,UAChC,KAAK,EAAE,MAAM,SAAkB;AAAA,UAC/B,GAAI,WAAW,WACX,EAAE,QAAQ,EAAE,MAAM,UAAmB,UAAU,KAAK,EAAE,IACtD,CAAC;AAAA,QACP,IACA,CAAC;AAAA,QACL,GAAI,WAAW,YACX,EAAE,UAAU,EAAE,MAAM,SAAkB,EAAE,IACxC,CAAC;AAAA,MACP;AAAA,IACF,CAAC;AACD,QACE,OAAO,YAAY,YAClB,WAAW,SAAS,WAAW,YAAY,IAAI;AAEhD,YAAM,IAAI,MAAM,+BAA+B;AACjD,UAAM,EAAE,KAAK,MAAM,IAAI,qBAAqB,OAAO;AACnD,QAAI;AACJ,QAAI;AACJ,QAAI,WAAW,QAAQ;AACrB,YAAM,WAAW,MAAM,IAAI,KAAK;AAChC,eAAS,EAAE,SAAS;AACpB,gBAAU,SAAS,SACf,SACG,IAAI,CAAC,YAAY,GAAG,QAAQ,IAAI,IAAK,QAAQ,IAAI,IAAK,QAAQ,EAAE,EAAE,EAClE,KAAK,IAAI,IACZ;AAAA,IACN,WAAW,WAAW,UAAU;AAC9B,UAAI,CAAC,OAAO,OAAO,QAAQ,CAAC,OAAO,OAAO;AACxC,cAAM,IAAI,MAAM,4CAA4C;AAC9D,YAAM,UAAU,MAAM,IAAI,OAAO;AAAA,QAC/B,MAAM,OAAO,OAAO;AAAA,QACpB,MAAM,OAAO,OAAO;AAAA,QACpB,GAAI,OAAO,OAAO,MACd,EAAE,YAAY,OAAO,OAAO,IAAc,IAC1C,CAAC;AAAA,QACL,SAAS,MAAM,QAAQ,OAAO,OAAO,MAAM,IACvC,OAAO,OAAO,SACd,CAAC;AAAA,MACP,CAAC;AACD,eAAS,EAAE,QAAQ;AACnB,gBAAU,WAAW,QAAQ,IAAI;AAAA,sCAA0C,QAAQ,IAAI;AAAA,IACzF,WAAW,WAAW,OAAO;AAC3B,YAAM,WAAW,MAAM,IAAI,KAAK,GAAG;AAAA,QACjC,CAACG,aACCA,SAAQ,OAAO,OAAO,YAAY,CAAC,KACnCA,SAAQ,SAAS,OAAO,YAAY,CAAC;AAAA,MACzC;AACA,UAAI,QAAQ,WAAW;AACrB,cAAM,IAAI;AAAA,UACR,QAAQ,SACJ,6DACA;AAAA,QACN;AACF,YAAM,UAAU,QAAQ,CAAC;AACzB,YAAM,MAAM,MAAM;AAAA,QAChB,WAAW,IAAI;AAAA,QACf,gBAAgB,MAAM,mBAAmB,QAAQ,OAAO,QAAQ,IAAI,CAAC;AAAA,QACrE,SAAS;AAAA,QACT,gBAAgB,QAAQ;AAAA,QACxB,SAAS,EAAE,IAAI,QAAQ,IAAI,MAAM,QAAQ,KAAK;AAAA,MAChD,CAAC;AACD,eAAS,EAAE,QAAQ;AACnB,gBAAU,YAAY,QAAQ,IAAI;AAAA;AAAA,IACpC,OAAO;AACL,YAAM,UAAU,MAAM,kBAAkB,OAAO;AAC/C,UAAI,CAAC;AACH,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AACF,UAAI,WAAW,QAAQ;AACvB,UAAI,WAAW,UAAU;AACvB,YACE,CAAC,OAAO,OAAO,QACf,CAAC,OAAO,OAAO,QACf,OAAO,OAAO,QAAQ;AAEtB,gBAAM,IAAI,MAAM,2CAA2C;AAC7D,cAAM,UAAU,SAAS;AACzB,cAAM,IAAI,OAAO,QAAQ,IAAI;AAAA,UAC3B,MAAO,OAAO,OAAO,QAAmB,QAAQ;AAAA,UAChD,MAAO,OAAO,OAAO,QAAmB,QAAQ;AAAA,UAChD,SAAS,QAAQ;AAAA,UACjB,YACE,OAAO,OAAO,QAAQ,SAClB,QAAQ,aAAa,KAAK,CAAC,SAAS,KAAK,SAAS,YAAY,GAC1D,MACH,OAAO,OAAO,OAAkB;AAAA,QACzC,CAAC;AACD,mBAAW,MAAM,IAAI,IAAI,QAAQ,IAAI,QAAQ,YAAY,IAAI;AAC7D,cAAM,QAAQ,MAAM,MAAM;AAAA,UACxB,GAAG,QAAQ;AAAA,UACX,SAAS,EAAE,IAAI,SAAS,QAAQ,IAAI,MAAM,SAAS,QAAQ,KAAK;AAAA,QAClE,CAAC;AAAA,MACH;AACA,UAAI,WAAW,WAAW;AACxB,cAAM,UAAU,OAAO,YAAY,CAAC;AACpC,YAAI,CAAC,iBAAiB,SAAS,OAAO;AACpC,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AACF,mBAAW,MAAM,IAAI;AAAA,UACnB,SAAS,QAAQ;AAAA,UACjB;AAAA,UACA,OAAO,OAAO;AAAA,UACd,QAAQ,YAAY;AAAA,QACtB;AAAA,MACF;AACA,eAAS;AACT,gBAAU,GAAG,aAAa,SAAS,OAAO,CAAC,SAAM,QAAQ,YAAY,IAAI;AAAA,EAAK,SAAS,SAAS,IAAI,CAAC,YAAY,GAAG,QAAQ,OAAO,KAAK,QAAQ,aAAa,WAAW,gBAAgB,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,IACxM;AACA,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ,OAAO,OAAO,OAAO,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI;AAAA,IACjE;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,UAAU,iBAAiB,qBAAqB,IAAI;AAAA,MACpD,QACE,iBAAiB,QAAQ,MAAM,UAAU;AAAA,IAC7C;AAAA,EACF;AACF;AACA,SAAS,aAAa,SAAwB;AAC5C,SAAO,GAAG,QAAQ,IAAI,KAAK,QAAQ,IAAI;AACzC;AAEA,eAAeF,uBACb,SACwB;AACxB,QAAM,CAAC,QAAQ,GAAGD,KAAI,IAAI,QAAQ;AAClC,MACE,CAAC,CAAC,QAAQ,UAAU,WAAW,aAAa,OAAO,QAAQ,EAAE;AAAA,IAC3D;AAAA,EACF;AAEA,UAAM,IAAI,MAAM,sCAAsC;AACxD,QAAM,EAAE,aAAa,OAAO,IAAIE,WAAU;AAAA,IACxC,MAAAF;AAAA,IACA,kBAAkB;AAAA,IAClB,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,MAAM,EAAE,MAAM,UAAU;AAAA,MACxB,GAAI,WAAW,YAAY,WAAW,WAClC;AAAA,QACE,MAAM,EAAE,MAAM,SAAkB;AAAA,QAChC,GAAI,WAAW,WACX,EAAE,MAAM,EAAE,MAAM,SAAkB,EAAE,IACpC,CAAC;AAAA,QACL,KAAK,EAAE,MAAM,SAAkB;AAAA,MACjC,IACA,CAAC;AAAA,MACL,GAAI,WAAW,YACX;AAAA,QACE,aAAa,EAAE,MAAM,SAAkB;AAAA,QACvC,UAAU,EAAE,MAAM,SAAkB;AAAA,MACtC,IACA,CAAC;AAAA,IACP;AAAA,EACF,CAAC;AACD,MACE,YAAY,YACX,WAAW,aACZ,WAAW,eACX,WAAW,SACX,WAAW,WACP,IACA;AAEJ,UAAM,IAAI,MAAM,2CAA2C;AAC7D,MAAI,WAAW,aAAa,CAAC,OAAO,QAAQ,CAAC,OAAO;AAClD,UAAM,IAAI,MAAM,gDAAgD;AAClE,QAAM,UAAU,YAAY,CAAC;AAC7B,OACG,WAAW,aAAa,WAAW,gBACpC,CAAC,iBAAiB,SAAS,OAAO;AAElC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AACF,MAAI,WAAW,aAAa,CAAC,OAAO;AAClC,UAAM,IAAI,MAAM,yDAAyD;AAC3E,QAAM,UAAU,MAAM;AAAA,IACpB;AAAA,IACA,WAAW,QAAQ,eAAe;AAAA,EACpC;AACA,MAAI,CAAC;AACH,UAAM,IAAI,MAAM,mDAAmD;AACrE,QAAM,EAAE,QAAQ,IAAI,QAAQ;AAC5B,MAAI;AACJ,MAAI,WAAW,OAAO;AACpB,UAAM,cAAc,QAAQ,aAAa;AAAA,MACvC,CAAC,SAAS,KAAK,SAAS,YAAY,CAAC;AAAA,IACvC;AACA,QAAI,CAAC;AACH,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AACF,UAAM,QAAQ,MAAM,MAAM;AAAA,MACxB,GAAG,QAAQ;AAAA,MACX,iBAAiB,YAAY;AAAA,IAC/B,CAAC;AACD,aAAS,EAAE,SAAS,EAAE,IAAI,QAAQ,IAAI,MAAM,QAAQ,KAAK,GAAG,YAAY;AAAA,EAC1E,WAAW,WAAW,UAAU;AAC9B,UAAM,cAAc,QAAQ,aAAa;AAAA,MACvC,CAAC,SAAS,KAAK,SAAS,YAAY,CAAC;AAAA,IACvC;AACA,QAAI,CAAC;AACH,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AACF,QAAI,CAAC,OAAO,QAAQ,OAAO,QAAQ;AACjC,YAAM,IAAI,MAAM,mCAAmC;AACrD,aAAS;AAAA,MACP,SAAS,MAAM,QAAQ,IAAI,kBAAkB,QAAQ,IAAI,YAAY,IAAI;AAAA,QACvE,MAAO,OAAO,QAAmB,YAAY;AAAA,QAC7C,KACE,OAAO,QAAQ,SACV,YAAY,OAAO,OACnB,OAAO,OAAkB;AAAA,MAClC,CAAC;AAAA,IACH;AAAA,EACF,WAAW,WAAW;AACpB,aAAS;AAAA,MACP,cAAc,QAAQ;AAAA,MACtB,UAAU,QAAQ,SAAS,SAAS,IAAI,CAAC,EAAE,SAAAI,UAAS,WAAW,OAAO;AAAA,QACpE,SAAAA;AAAA,QACA,cAAc,YAAY,gBAAgB,CAAC;AAAA,MAC7C,EAAE;AAAA,IACJ;AAAA,WACO,WAAW;AAClB,aAAS;AAAA,MACP,SAAS,MAAM,QAAQ,IAAI,kBAAkB,QAAQ,IAAI;AAAA,QACvD,MAAM,OAAO;AAAA,QACb,MAAM,OAAO;AAAA,QACb,GAAI,OAAO,MAAM,EAAE,KAAK,OAAO,IAAc,IAAI,CAAC;AAAA,MACpD,CAAC;AAAA,IACH;AAAA,WACO,WAAW;AAClB,aAAS;AAAA,MACP,cAAc,MAAM,QAAQ,IAAI;AAAA,QAC9B,QAAQ;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,OACG;AACH,UAAM,cAAc,QAAQ,aAAa;AAAA,MACvC,CAAC,SAAS,KAAK,SAAS,OAAO;AAAA,IACjC;AACA,QAAI,CAAC;AACH,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AACF,aAAS,MAAM,QAAQ,IAAI;AAAA,MACzB,QAAQ;AAAA,MACR;AAAA,MACA,YAAY;AAAA,MACZ,OAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,EAAE,UAAU,GAAG,QAAQ,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE;AAChE;;;ACpUA,SAAS,YAAAC,YAAU,YAAY;AAC/B,OAAOC,YAAU;AACjB,SAAS,aAAAC,kBAAiB;AAC1B,SAAS,KAAAC,WAAS;;;ACHlB,SAAS,KAAAC,WAAS;AAElB,IAAM,UAAU;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACO,IAAM,uBAAiD;AAAA,EAC5D,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,cAAc,CAAC,eAAe,MAAM,QAAQ;AAAA,EAC5C,oBAAoB,CAAC,eAAe,YAAY,UAAU;AAC5D;AAEA,IAAM,eAAeA,IAAE,OAAO;AAAA,EAC5B,UAAUA,IACP,KAAK;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC,EACA,SAAS;AAAA,EACZ,OAAOA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA,EAC3C,UAAUA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA,EAC9C,aAAaA,IAAE,OAAO,EAAE,KAAK,EAAE,SAAS;AAAA,EACxC,QAAQA,IAAE,OAAO,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA,EACrC,OAAOA,IACJ,KAAK;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC,EACA,SAAS;AAAA,EACZ,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA,EACzC,MAAMA,IACH,KAAK;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC,EACA,SAAS;AAAA,EACZ,QAAQA,IAAE,KAAK,CAAC,OAAO,IAAI,CAAC,EAAE,SAAS;AAAA,EACvC,QAAQA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,SAAS;AAC/C,CAAC;AAGM,SAAS,oBACd,OACA,QACe;AACf,MAAI,CAAC,qBAAqB,KAAK,EAAG,QAAO;AACzC,QAAM,QAAQ,IAAI,gBAAgB;AAClC,MAAI,UAAU,gBAAgB,UAAU,oBAAoB;AAC1D,UAAM,OAAO,UAAU,eAAe,CAAC,IAAI,IAAI,CAAC,YAAY,UAAU;AACtE,eAAW,OAAO,MAAM;AACtB,UAAI,CAACA,IAAE,OAAO,EAAE,KAAK,EAAE,UAAU,OAAO,GAAG,CAAC,EAAE;AAC5C,cAAM,IAAI,MAAM,SAAS,GAAG,mCAAmC;AAAA,IACnE;AACA,QAAI,OAAO,WAAW,QAAW;AAC/B,UAAI,CAACA,IAAE,OAAO,EAAE,KAAK,EAAE,UAAU,OAAO,MAAM,EAAE;AAC9C,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AACF,YAAM,IAAI,UAAU,OAAO,MAAgB;AAAA,IAC7C;AACA,UAAM,SACJ,UAAU,eACN,WAAW,mBAAmB,OAAO,EAAY,CAAC,KAClD,iBAAiB,mBAAmB,OAAO,UAAU,CAAW,CAAC,IAAI,mBAAmB,OAAO,UAAU,CAAW,CAAC;AAC3H,WAAO,GAAG,MAAM,GAAG,MAAM,OAAO,IAAI,KAAK,KAAK,EAAE;AAAA,EAClD;AACA,QAAM,SAAS,aAAa,UAAU,MAAM;AAC5C,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,OAAO,OAAO,MAAM,OAAO,CAAC,GAAG,KAAK,CAAC;AAC3C,UAAM,IAAI;AAAA,MACR,aAAa,OAAO,IAAI,CAAC;AAAA,IAC3B;AAAA,EACF;AACA,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,IAAI,GAAG;AACtD,QAAI,UAAU;AACZ,YAAM,IAAI,QAAQ,cAAc,aAAa,KAAK,KAAK;AAAA,EAC3D;AACA,SAAO,IAAI,KAAK,GAAG,MAAM,OAAO,IAAI,KAAK,KAAK,EAAE;AAClD;AAEO,SAAS,wBACd,OACoB;AACpB,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,CAAC,cAAc,KAAK,KAAK,KAAK,CAAC,OAAO,cAAc,OAAO,KAAK,CAAC;AACnE,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AACF,SAAO,OAAO,KAAK;AACrB;;;ADlGO,IAAM,eAAwC;AAAA,EACnD,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBR,OAAO;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,EA2BP,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWhB;AAEA,eAAsB,kBACpB,SACA,SACwB;AACxB,MACE,CAAC,QAAQ,KAAK,UACd,QAAQ,KAAK,SAAS,QAAQ,KAC9B,QAAQ,KAAK,SAAS,IAAI;AAE1B,WAAO,EAAE,UAAU,GAAG,QAAQ,aAAa,OAAO,EAAE;AACtD,MAAI;AACF,UAAM,EAAE,aAAa,OAAO,IAAIC,WAAU;AAAA,MACxC,MAAM,QAAQ;AAAA,MACd,kBAAkB;AAAA,MAClB,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,MAAM,EAAE,MAAM,UAAU;AAAA,QACxB,OAAO,EAAE,MAAM,SAAS;AAAA,QACxB,aAAa,EAAE,MAAM,SAAS;AAAA,QAC9B,cAAc,EAAE,MAAM,SAAS;AAAA,QAC/B,OAAO,EAAE,MAAM,SAAS;AAAA,QACxB,QAAQ,EAAE,MAAM,SAAS;AAAA,QACzB,SAAS,EAAE,MAAM,SAAS;AAAA,QAC1B,SAAS,EAAE,MAAM,SAAS;AAAA,QAC1B,aAAa,EAAE,MAAM,SAAS;AAAA,QAC9B,QAAQ,EAAE,MAAM,SAAS;AAAA,QACzB,KAAK,EAAE,MAAM,SAAS;AAAA,QACtB,SAAS,EAAE,MAAM,SAAS;AAAA,QAC1B,UAAU,EAAE,MAAM,SAAS;AAAA,QAC3B,OAAO,EAAE,MAAM,SAAS;AAAA,QACxB,UAAU,EAAE,MAAM,SAAS;AAAA,QAC3B,aAAa,EAAE,MAAM,SAAS;AAAA,QAC9B,QAAQ,EAAE,MAAM,SAAS;AAAA,QACzB,OAAO,EAAE,MAAM,SAAS;AAAA,QACxB,MAAM,EAAE,MAAM,SAAS;AAAA,QACvB,MAAM,EAAE,MAAM,SAAS;AAAA,QACvB,QAAQ,EAAE,MAAM,SAAS;AAAA,QACzB,IAAI,EAAE,MAAM,SAAS;AAAA,QACrB,YAAY,EAAE,MAAM,SAAS;AAAA,QAC7B,YAAY,EAAE,MAAM,SAAS;AAAA,QAC7B,0BAA0B,EAAE,MAAM,SAAS;AAAA,MAC7C;AAAA,IACF,CAAC;AACD,UAAM,CAAC,QAAQ,SAAS,IAAI;AAC5B,UAAM,QAAQ,YAAY,KAAK,GAAG;AAClC,UAAM,UAAqD;AAAA,MACzD,QAAQ;AAAA,QACN,QAAQ,CAAC;AAAA,QACT,cAAc,CAAC;AAAA,QACf,QAAQ,CAAC;AAAA,QACT,UAAU,CAAC,OAAO;AAAA,QAClB,mBAAmB,CAAC,WAAW,eAAe,QAAQ;AAAA,QACtD,QAAQ,CAAC,OAAO,SAAS;AAAA,QACzB,SAAS,CAAC,OAAO;AAAA,QACjB,aAAa,CAAC;AAAA,QACd,cAAc,CAAC,OAAO;AAAA,QACtB,SAAS,CAAC,OAAO;AAAA,QACjB,WAAW,CAAC,YAAY;AAAA,MAC1B;AAAA,MACA,OAAO;AAAA,QACL,QAAQ,CAAC;AAAA,QACT,cAAc,CAAC;AAAA,QACf,QAAQ,CAAC,aAAa;AAAA,QACtB,GAAG;AAAA,QACH,GAAG,OAAO;AAAA,UACR,CAAC,gBAAgB,eAAe,EAAE;AAAA,YAAQ,CAAC,YACzC,CAAC,QAAQ,UAAU,QAAQ,SAAS,EAAE,IAAI,CAAC,cAAc;AAAA,cACvD,GAAG,OAAO,IAAI,SAAS;AAAA,cACvB,cAAc,SAAS,CAAC,eAAe,OAAO,IAAI,CAAC,aAAa;AAAA,YAClE,CAAC;AAAA,UACH;AAAA,QACF;AAAA,QACA,yBAAyB,CAAC,eAAe,wBAAwB;AAAA,MACnE;AAAA,MACA,cAAc;AAAA,QACZ,QAAQ,CAAC;AAAA,QACT,SAAS,CAAC;AAAA,QACV,UAAU,CAAC,SAAS,QAAQ;AAAA,QAC5B,sBAAsB,CAAC,SAAS;AAAA,MAClC;AAAA,IACF;AACA,UAAM,QAAQ,QAAQ,OAAO,EAAE,KAAK;AACpC,QAAI,CAAC;AACH,YAAM,IAAI;AAAA,QACR,WAAW,OAAO,4BAA4B,OAAO;AAAA,MACvD;AACF,QACE,OAAO,KAAK,MAAM,EAAE;AAAA,MAClB,CAAC,SAAS,SAAS,UAAU,CAAC,MAAM,SAAS,IAAI;AAAA,IACnD;AAEA,YAAM,IAAI,MAAM,qDAAqD;AACvE,QAAI,MAAM,SAAS,OAAO,KAAK,CAAC,OAAO;AACrC,YAAM,IAAI,MAAM,8CAA8C;AAChE,QAAI,MAAM,SAAS,SAAS,KAAK,CAAC,OAAO;AACvC,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AACF,UAAM,iBACJ,YAAY,UAAU,oBAAoB,OAAO,MAAM,IAAI;AAC7D,UAAM,uBAAuB;AAAA,MAC3B,OAAO,wBAAwB;AAAA,IACjC;AACA,UAAM,UAAU,qBAAqB,OAAO;AAC5C,UAAM,SACJ,YAAY,iBACR,OACA,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA,OAAO;AAAA,IACT;AACN,QAAI,YAAY,kBAAkB,CAAC;AACjC,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AACF,UAAM,WAAW,UAAU,OAAO;AAClC,mBAAe,QACb,QACA,SAAS,OACT,MACA,OACkB;AAClB,YAAM,WACJ,SAAS,GAAG,OAAO,cAAc,WAAW,QAAQ,SAAS,OAAO;AACtE,YAAM,QAAQ,MAAM,QAAQ,OAAO,QAAQ;AAAA,QACzC;AAAA,QACA,QAAQ,CAAC,QAAQ;AAAA,MACnB,CAAC;AACD,UACE,MAAM,MAAM,aAAa,YACzB,MAAM,MAAM,OAAO,WAAW,KAC9B,MAAM,MAAM,OAAO,CAAC,MAAM,YACzB,UACC,MAAM,MAAM,mBAAmB,OAAO,SAAS,QAAQ;AAEzD,cAAM,IAAI,mBAAmB;AAAA,UAC3B,MAAM;AAAA,UACN,SACE;AAAA,QACJ,CAAC;AACH,UAAI,CAAC,QAAQ;AACX,cAAM,IAAI,MAAM,mCAAmC;AACrD,YAAM,WAAW,MAAM,QAAQ;AAAA,QAC7B,GAAG,QAAQ,IAAI,MAAM,QAAQ,OAAO,MAAM,MAAM;AAAA,QAChD;AAAA,UACE;AAAA,UACA,SAAS;AAAA,YACP,QAAQ;AAAA,YACR,eAAe,UAAU,MAAM,WAAW;AAAA,YAC1C,GAAI,SAAS,SACT,CAAC,IACD,EAAE,gBAAgB,mBAAmB;AAAA,UAC3C;AAAA,UACA,GAAI,SAAS,SAAY,CAAC,IAAI,EAAE,MAAM,KAAK,UAAU,IAAI,EAAE;AAAA,UAC3D,QAAQ,YAAY,QAAQ,GAAM;AAAA,QACpC;AAAA,MACF;AACA,YAAMC,UAAS,MAAM,SAAS,KAAK;AACnC,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,QAAQC,IACX,OAAO;AAAA,UACN,OAAOA,IAAE,OAAO,EAAE,MAAMA,IAAE,OAAO,GAAG,SAASA,IAAE,OAAO,EAAE,IAAI,GAAG,EAAE,CAAC;AAAA,QACpE,CAAC,EACA,UAAUD,OAAM;AACnB,cAAM,IAAI,mBAAmB;AAAA,UAC3B,MAAM,MAAM,UACR,MAAM,KAAK,MAAM,OACjB;AAAA,UACJ,SAAS,MAAM,UACX,MAAM,KAAK,MAAM,UACjB;AAAA,UACJ,QAAQ,SAAS;AAAA,QACnB,CAAC;AAAA,MACH;AACA,aAAOA;AAAA,IACT;AACA,mBAAe,YAAY;AACzB,UAAI,CAAC,OAAO;AACV,cAAM,IAAI,MAAM,8CAA8C;AAChE,YAAM,WAAWE,OAAK,QAAQ,QAAQ,OAAO,QAAQ,IAAI,GAAG,OAAO,KAAK;AACxE,YAAM,OAAO,MAAM,KAAK,QAAQ;AAChC,UAAI,CAAC,KAAK,OAAO,KAAK,KAAK,OAAO,MAAM;AACtC,cAAM,IAAI,MAAM,sCAAsC;AACxD,aAAO,KAAK,MAAM,MAAMC,WAAS,UAAU,MAAM,CAAC;AAAA,IACpD;AACA,UAAM,OAAO,SACT,UAAU,mBAAmB,OAAO,UAAU,CAAC,KAC/C;AACJ,QAAI;AACJ,QAAI,YAAY,UAAU;AACxB,UAAI,WAAW,YAAY,YAAY,WAAW;AAChD,iBAAS,MAAM,QAAQ,IAAI;AAAA,eACpB,WAAW,SAAU,UAAS,MAAM,QAAQ,GAAG,IAAI,SAAS;AAAA,eAC5D,WAAW,YAAY;AAC9B,iBAAS,MAAM;AAAA,UACb,GAAG,IAAI;AAAA,UACP;AAAA,UACA,MAAM,UAAU;AAAA,UAChB;AAAA,QACF;AACA,cAAM,aAAaF,IAChB,OAAO;AAAA,UACN,OAAOA,IAAE,QAAQ;AAAA,UACjB,qBAAqBA,IAAE,QAAQ,EAAE,SAAS;AAAA,QAC5C,CAAC,EACA,MAAM,MAAM;AACf,YAAI,CAAC,WAAW,SAAS,WAAW,wBAAwB;AAC1D,iBAAO,EAAE,UAAU,GAAG,QAAQ,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE;AAAA,MAClE,WAAW,WAAW;AACpB,iBAAS,MAAM,QAAQ,GAAG,IAAI,YAAY,QAAQ,MAAM,UAAU,CAAC;AAAA,eAC5D,WAAW,WAAW;AAC7B,cAAM,QAAQ,IAAI,gBAAgB;AAClC,mBAAW,OAAO,CAAC,WAAW,eAAe,QAAQ;AACnD,cAAI,OAAO,GAAG,EAAG,OAAM,IAAI,KAAK,OAAO,GAAG,CAAC;AAC7C,iBAAS,MAAM,QAAQ,GAAG,IAAI,YAAY,KAAK,EAAE;AAAA,MACnD,WAAW,WAAW,UAAU;AAC9B,cAAM;AAAA,UACJ,0BAAAG;AAAA,UACA,oBAAAC;AAAA,UACA,qBAAAC;AAAA,QACF,IAAI,MAAM;AACV,cAAM,cAAc,OAAO,WAAW;AACtC,YAAI,gBAAgB,cAAc,gBAAgB;AAChD,gBAAM,IAAI,MAAM,4BAA4B;AAC9C,YAAI,CAAC,OAAQ,YAAY;AACvB,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AACF,cAAM,MAAMD,oBAAmB,OAAQ,YAAY,KAAK,OAAO,GAAG;AAClE,iBAAS,MAAMC,qBAAoB;AAAA,UACjC,cAAcF,0BAAyB;AAAA,YACrC,MAAM,QAAQ,GAAG,IAAI,eAAe;AAAA,UACtC;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AACD,eAAO;AAAA,UACL,UAAW,OAA8B,WAAW,WAAW,IAAI;AAAA,UACnE,QAAQ,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,QACxC;AAAA,MACF,WAAW,WAAW;AACpB,iBAAS,MAAM,QAAQ,GAAG,IAAI,eAAe;AAAA,eAE7C,WAAW,WACX,cAAc,SACd,YAAY,WAAW,GACvB;AACA,cAAM,WAAWH,IACd,OAAO;AAAA,UACN,MAAMA,IAAE,OAAO;AAAA,UACf,UAAUA,IAAE,OAAO;AAAA,UACnB,cAAcA,IAAE,OAAO;AAAA,UACvB,OAAOA,IAAE,QAAQ;AAAA,QACnB,CAAC,EACA,MAAM,MAAM,QAAQ,IAAI,CAAC;AAC5B,iBAAS;AAAA,UACP,MAAM,SAAS;AAAA,UACf,UAAU,SAAS;AAAA,UACnB,sBAAsB,SAAS;AAAA,UAC/B,OAAO,SAAS;AAAA,QAClB;AAAA,MACF,WACE,WAAW,WACX,cAAc,UACd,YAAY,WAAW;AAEvB,iBAAS,MAAM,QAAQ,MAAM,SAAS,MAAM,UAAU,CAAC;AAAA,eAChD,WAAW,aAAa,YAAY,WAAW;AACtD,iBAAS,MAAM;AAAA,UACb,GAAG,IAAI;AAAA,UACP;AAAA,UACA,MAAM,UAAU;AAAA,UAChB;AAAA,QACF;AAAA,eACO,WAAW,eAAe,YAAY,WAAW,GAAG;AAC3D,cAAM,QAAQ,OAAO,YAAY,KAAK;AACtC,YAAI,CAAC,CAAC,KAAK,MAAM,IAAI,EAAE,SAAS,KAAK;AACnC,gBAAM,IAAI,MAAM,qCAAqC;AACvD,iBAAS,MAAM,QAAQ,GAAG,IAAI,wBAAwB,KAAK,EAAE;AAAA,MAC/D;AACE,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,IACJ,WAAW,YAAY,SAAS;AAC9B,UAAI,WAAW,YAAY,YAAY,WAAW;AAChD,iBAAS,MAAM,QAAQ,IAAI;AAAA,eACpB,WAAW,kBAAkB,YAAY,WAAW;AAC3D,iBAAS,MAAM,QAAQ,GAAG,IAAI,eAAe;AAAA,eAE7C,WAAW,YACX,WAAW,kBACX,WAAW,mBACX,mBAAmB,MACnB;AACA,cAAM,WAAWA,IACd,OAAO;AAAA,UACN,cAAcA,IAAE;AAAA,YACdA,IAAE,OAAO,EAAE,IAAIA,IAAE,OAAO,GAAG,MAAMA,IAAE,OAAO,EAAE,CAAC;AAAA,UAC/C;AAAA,QACF,CAAC,EACA,MAAM,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC;AAC9C,cAAM,cAAc,OAAQ,SAAS,QAAQ,aAAa;AAAA,UACxD,CAAC,SACC,KAAK,UAAU,OAAO,eAAe,OAAQ,YAAY;AAAA,QAC7D;AACA,cAAM,aAAa,OAAQ,SAAS,SAAS;AAAA,UAC3C,CAAC,SAAS,KAAK,YAAY;AAAA,QAC7B,EAAG;AACH,cAAM,UAAU,WAAW,aAAa;AAAA,UACtC,CAAC,SAAS,KAAK,kBAAkB,aAAa;AAAA,QAChD;AACA,YAAI,CAAC;AACH,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AACF,cAAM,UAAU,SAAS,aAAa;AAAA,UACpC,CAACM,iBAAgBA,aAAY,OAAO,QAAQ;AAAA,QAC9C;AACA,YAAI,QAAQ,WAAW;AACrB,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AACF,cAAM,OAAO,iBAAiB,mBAAmB,QAAQ,CAAC,EAAG,EAAE,CAAC;AAChE,YAAI,mBAAmB,MAAM;AAC3B,mBAAS,MAAM,QAAQ,GAAG,IAAI,GAAG,cAAc,EAAE;AAAA,QACnD,WAAW,WAAW,YAAY,YAAY,WAAW,GAAG;AAC1D,gBAAM,SAASN,IACZ,OAAO;AAAA,YACN,MAAMA,IAAE,OAAO;AAAA,cACb,IAAIA,IAAE,QAAQ,OAAQ,UAAU;AAAA,cAChC,cAAcA,IAAE;AAAA,gBACdA,IAAE,OAAO,EAAE,IAAIA,IAAE,OAAO,GAAG,UAAUA,IAAE,QAAQ,EAAE,CAAC;AAAA,cACpD;AAAA,YACF,CAAC;AAAA,UACH,CAAC,EACA,MAAM,MAAM,QAAQ,IAAI,CAAC;AAC5B,gBAAMM,eAAc,OAAO,KAAK,aAAa;AAAA,YAC3C,CAAC,SAAS,KAAK,OAAO,QAAQ,CAAC,EAAG;AAAA,UACpC;AACA,cAAI,CAACA;AACH,kBAAM,IAAI,MAAM,+CAA+C;AACjE,mBAASA,aAAY;AAAA,QACvB,WAAW,YAAY,WAAW,KAAK,cAAc;AACnD,mBAAS,MAAM,QAAQ,GAAG,IAAI,IAAI,MAAM,EAAE;AAAA,iBACnC,YAAY,WAAW,KAAK,cAAc;AACjD,mBAAS,MAAM;AAAA,YACb,GAAG,IAAI,IAAI,MAAM;AAAA,YACjB;AAAA,YACA,MAAM,UAAU;AAAA,UAClB;AAAA,iBAEA,YAAY,WAAW,MACtB,cAAc,YAAY,cAAc;AAEzC,mBAAS,MAAM;AAAA,YACb,GAAG,IAAI,IAAI,MAAM,IAAI,SAAS;AAAA,YAC9B;AAAA,YACA,yBAAyB,SAAY,CAAC,IAAI,EAAE,qBAAqB;AAAA,YACjE,cAAc,YAAY,4BAA4B;AAAA,UACxD;AAAA;AAEA,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,MACJ;AACE,cAAM,IAAI,MAAM,qDAAqD;AAAA,IACzE,OAAO;AACL,YAAM,OAAO;AACb,UAAI,WAAW,YAAY,YAAY,WAAW;AAChD,iBAAS,MAAM,QAAQ,IAAI;AAAA,eACpB,WAAW,aAAa,YAAY,WAAW;AACtD,iBAAS;AAAA,UACP,KAAK,GAAG,QAAQ,IAAI,MAAM;AAAA,UAC1B,UACE;AAAA,QACJ;AAAA,eACO,WAAW,cAAc,YAAY,WAAW,GAAG;AAC1D,cAAM,QAAQ,IAAI,gBAAgB;AAClC,YAAI,OAAO,MAAO,OAAM,IAAI,SAAS,OAAO,KAAK;AACjD,YAAI,OAAO,OAAQ,OAAM,IAAI,UAAU,OAAO,MAAM;AACpD,iBAAS,MAAM,QAAQ,GAAG,IAAI,aAAa,KAAK,EAAE;AAAA,MACpD,WACE,WAAW,iBACX,cAAc,YACd,YAAY,WAAW,KACvB,OAAO;AAEP,iBAAS,MAAM,QAAQ,GAAG,IAAI,iBAAiB,QAAQ;AAAA,UACrD,mBAAmB,OAAO;AAAA,QAC5B,CAAC;AAAA;AAED,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,IACJ;AACA,WAAO,EAAE,UAAU,GAAG,QAAQ,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE;AAAA,EAChE,SAAS,OAAO;AACd,WAAO;AAAA,MACL,UAAU,iBAAiB,qBAAqB,IAAI;AAAA,MACpD,QACE,iBAAiB,sBAChB,EAAE,iBAAiBN,IAAE,aAAa,iBAAiB,QAChD,MAAM,UACN;AAAA,IACR;AAAA,EACF;AACF;;;AEveA,SAAS,YAAAO,YAAU,QAAAC,aAAY;AAC/B,OAAOC,YAAU;AACjB,SAAS,aAAAC,kBAAiB;AAC1B,SAAS,KAAAC,WAAS;AASX,IAAM,iBAAiB;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;AA+B9B,IAAM,aAAaC,IAChB,OAAO;AAAA,EACN,MAAMA,IACH,OAAO,EACP,MAAM,yBAAyB,EAC/B,OAAO,CAAC,MAAM,MAAM,cAAc,CAAC,EAAE,WAAW,SAAS,CAAC;AAAA,EAC7D,OAAOA,IAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE;AAAA,EACtC,YAAYA,IACT;AAAA,IACCA,IAAE,OAAO,EAAE,MAAM,yBAAyB;AAAA,IAC1CA,IACG;AAAA,MACCA,IACG,OAAO,EACP,IAAI,CAAC,EACL,IAAI,EAAE,EACN,MAAM,uBAAuB;AAAA,IAClC,EACC,IAAI,CAAC,EACL,IAAI,EAAE;AAAA,EACX,EACC,OAAO,CAAC,MAAM,OAAO,KAAK,CAAC,EAAE,UAAU,CAAC;AAC7C,CAAC,EACA,OAAO;AACV,IAAM,WAAWA,IAAE,OAAO;AAAA,EACxB,IAAIA,IAAE,OAAO;AAAA,EACb,gBAAgBA,IAAE,OAAO;AAAA,EACzB,MAAMA,IAAE,OAAO;AAAA,EACf,MAAMA,IAAE,OAAO;AAAA,EACf,QAAQA,IAAE,OAAO,EAAE,IAAI;AAAA,EACvB,WAAWA,IAAE,OAAO;AAAA,EACpB,UAAUA,IAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EACpC,SAASA,IAAE,QAAQ;AAAA,EACnB,cAAcA,IAAE,QAAQ;AAAA,EACxB,iBAAiBA,IAAE,QAAQ;AAC7B,CAAC;AACD,IAAM,WAAW;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,IAAM,WAAW;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,IAAM,OAAO,CAAC,OAAgC,SAC5C,OAAO;AAAA,EACL,KACG,OAAO,CAAC,QAAQ,OAAO,OAAO,OAAO,GAAG,CAAC,EACzC,IAAI,CAAC,QAAQ,CAAC,KAAK,MAAM,GAAG,CAAC,CAAC;AACnC;AAEF,eAAsB,oBACpB,SACwB;AACxB,MACE,CAAC,QAAQ,KAAK,UACd,QAAQ,KAAK,KAAK,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,SAAS,CAAC,CAAC;AAErD,WAAO,EAAE,UAAU,GAAG,QAAQ,eAAe;AAC/C,QAAM,OAAO,QAAQ,KAAK,SAAS,QAAQ;AAC3C,MAAI;AACF,UAAM,EAAE,aAAa,OAAO,IAAIC,WAAU;AAAA,MACxC,MAAM,QAAQ;AAAA,MACd,QAAQ;AAAA,MACR,kBAAkB;AAAA,MAClB,SAAS;AAAA,QACP,MAAM,EAAE,MAAM,UAAU;AAAA,QACxB,aAAa,EAAE,MAAM,SAAS;AAAA,QAC9B,MAAM,EAAE,MAAM,SAAS;AAAA,QACvB,OAAO,EAAE,MAAM,SAAS;AAAA,QACxB,SAAS,EAAE,MAAM,SAAS;AAAA,QAC1B,UAAU,EAAE,MAAM,SAAS;AAAA,QAC3B,UAAU,EAAE,MAAM,SAAS;AAAA,QAC3B,SAAS,EAAE,MAAM,SAAS;AAAA,QAC1B,iBAAiB,EAAE,MAAM,SAAS;AAAA,QAClC,oBAAoB,EAAE,MAAM,SAAS;AAAA,QACrC,MAAM,EAAE,MAAM,SAAS;AAAA,MACzB;AAAA,IACF,CAAC;AACD,UAAM,QAAQ,YAAY,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,GAC5C,SAAS,YAAY,CAAC;AACxB,UAAM,aAGF;AAAA,MACF,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE;AAAA,MAC7B,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE;AAAA,MACnC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,SAAS,WAAW,UAAU,EAAE;AAAA,MACnE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,UAAU,EAAE;AAAA,MACpD,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE;AAAA,MACtC,gBAAgB;AAAA,QACd,MAAM;AAAA,QACN,OAAO,CAAC,YAAY,WAAW,iBAAiB,kBAAkB;AAAA,QAClE,OAAO;AAAA,MACT;AAAA,MACA,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE;AAAA,MACpC,kBAAkB,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE;AAAA,MACvC,iBAAiB;AAAA,QACf,MAAM;AAAA,QACN,OAAO,CAAC,MAAM;AAAA,QACd,OAAO;AAAA,MACT;AAAA,MACA,kBAAkB,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE;AAAA,MACvC,oBAAoB;AAAA,QAClB,MAAM;AAAA,QACN,OAAO,CAAC,MAAM;AAAA,QACd,OAAO;AAAA,MACT;AAAA,MACA,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE;AAAA,MACnC,gBAAgB;AAAA,QACd,MAAM;AAAA,QACN,OAAO,CAAC,MAAM;AAAA,QACd,OAAO;AAAA,MACT;AAAA,MACA,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,OAAO,0BAA0B;AAAA,MACxE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE;AAAA,MACrC,kBAAkB;AAAA,QAChB,MAAM;AAAA,QACN,OAAO,CAAC,MAAM;AAAA,QACd,OAAO;AAAA,MACT;AAAA,MACA,mBAAmB;AAAA,QACjB,MAAM;AAAA,QACN,OAAO,CAAC;AAAA,QACR,OAAO;AAAA,MACT;AAAA,MACA,sBAAsB;AAAA,QACpB,MAAM;AAAA,QACN,OAAO,CAAC;AAAA,QACR,OAAO;AAAA,MACT;AAAA,IACF;AACA,UAAM,YAAY,WAAW,KAAK;AAClC,QACE,CAAC,aACD,YAAY,WAAW,UAAU,QACjC,OAAO,KAAK,MAAM,EAAE;AAAA,MAClB,CAAC,QAAQ,CAAC,CAAC,QAAQ,eAAe,GAAG,UAAU,KAAK,EAAE,SAAS,GAAG;AAAA,IACpE;AAEA,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AACF,QAAI,OAAO,QAAQ,CAAC,CAAC,KAAK,KAAK,IAAI,EAAE,SAAS,OAAO,IAAI;AACvD,YAAM,IAAI,MAAM,wBAAwB;AAC1C,QAAI,OAAO,WAAW,CAAC,0BAA0B,KAAK,OAAO,OAAO;AAClE,YAAM,IAAI,MAAM,+CAA+C;AACjE,QAAI,OAAO,SAAU,CAAAD,IAAE,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,QAAQ;AAC5D,UAAM,UAAU,UAAU,gBACxB,WAAW,YAAY,CAAC,MAAM,UAC9B,UAAU,YAAY,CAAC,MAAM;AAC/B,QAAI;AACJ,QAAI,SAAS;AACX,UAAI,CAAC,kBAAkB,KAAK,OAAO,YAAY,EAAE;AAC/C,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AACF,aAAO,EAAE,UAAU,OAAO,OAAO,QAAQ,EAAE;AAC3C,iBAAW,CAAC,MAAM,GAAG,KAAK;AAAA,QACxB,CAAC,WAAW,SAAS;AAAA,QACrB,CAAC,iBAAiB,cAAc;AAAA,QAChC,CAAC,oBAAoB,iBAAiB;AAAA,MACxC,GAAY;AACV,YAAI,OAAO,IAAI,MAAM,OAAW;AAChC,YAAI,CAAC,CAAC,QAAQ,OAAO,EAAE,SAAS,OAAO,IAAI,CAAE;AAC3C,gBAAM,IAAI,MAAM,SAAS,IAAI,cAAc;AAC7C,aAAK,GAAG,IAAI,OAAO,IAAI,MAAM;AAAA,MAC/B;AACA,UAAI,OAAO,KAAK,IAAI,EAAE,SAAS;AAC7B,cAAM,IAAI,MAAM,yCAAyC;AAAA,IAC7D,WAAW,UAAU;AACnB,UAAI,CAAC,OAAO;AACV,cAAM,IAAI,MAAM,kDAAkD;AACpE,YAAM,WAAWE,OAAK,QAAQ,QAAQ,OAAO,QAAQ,IAAI,GAAG,OAAO,IAAI;AACvE,WAAK,MAAMC,MAAK,QAAQ,GAAG,OAAO;AAChC,cAAM,IAAI,MAAM,wCAAwC;AAC1D,YAAM,OAAO,MAAMC,WAAS,UAAU,MAAM;AAC5C,UAAI,OAAO,WAAW,IAAI,IAAI;AAC5B,cAAM,IAAI,MAAM,wCAAwC;AAC1D,UAAI;AACJ,UAAI;AACF,qBAAa,KAAK,MAAM,IAAI;AAAA,MAC9B,QAAQ;AACN,cAAM,IAAI,MAAM,yCAAyC;AAAA,MAC3D;AACA,aAAOJ,IAAE,OAAOA,IAAE,QAAQ,CAAC,EAAE,MAAM,UAAU;AAC7C,UAAI,WAAW,SAAU,QAAO,WAAW,MAAM,IAAI;AAAA,IACvD,WAAW,QAAS,QAAO,EAAE,IAAIA,IAAE,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC,CAAC,EAAE;AACzE,UAAM,UAAU,MAAM;AAAA,MACpB;AAAA,MACA;AAAA,MACA,OAAO;AAAA,IACT;AACA,QAAI,CAAC;AACH,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AACF,UAAM,UAAU,qBAAqB,OAAO,GAC1C,QAAQ,UAAU,SAAS;AAC7B,UAAM,QAAQ,MAAM,QAAQ,OAAO,QAAQ;AAAA,MACzC,UAAU;AAAA,MACV,QAAQ,CAAC,KAAK;AAAA,IAChB,CAAC;AACD,QACE,MAAM,MAAM,aAAa,sBACzB,MAAM,MAAM,OAAO,WAAW,KAC9B,MAAM,MAAM,OAAO,CAAC,MAAM,SAC1B,MAAM,MAAM,mBAAmB,QAAQ,SAAS,QAAQ;AAExD,YAAM,IAAI,mBAAmB;AAAA,QAC3B,MAAM;AAAA,QACN,SACE;AAAA,MACJ,CAAC;AACH,UAAM,QAAQ,IAAI,gBAAgB;AAClC,eAAW,OAAO,CAAC,QAAQ,SAAS,WAAW,UAAU;AACvD,UAAI,OAAO,GAAG,EAAG,OAAM,IAAI,KAAK,OAAO,GAAG,CAAC;AAC7C,UAAM,SACJ,WAAW,aACP,aAAa,KAAK,KAClB,UACE,cACA,YAAY,UACV,IAAI,MAAM,KACV,UAAU,uBACR,gBACA,IAAI,KAAK;AACrB,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,mCAAmC;AACrD,UAAM,WAAW,MAAM,QAAQ;AAAA,MAC7B,GAAG,QAAQ,IAAI,MAAM,+BAA+B,mBAAmB,QAAQ,UAAU,CAAC,GAAG,MAAM;AAAA,MACnG;AAAA,QACE,QAAQ,UACJ,UACA,UACE,WACA,UAAU,QACR,SACA;AAAA,QACR,SAAS;AAAA,UACP,QAAQ;AAAA,UACR,eAAe,UAAU,MAAM,WAAW;AAAA,UAC1C,GAAI,OAAO,EAAE,gBAAgB,mBAAmB,IAAI,CAAC;AAAA,QACvD;AAAA,QACA,GAAI,OAAO,EAAE,MAAM,KAAK,UAAU,IAAI,EAAE,IAAI,CAAC;AAAA,QAC7C,QAAQ,YAAY,QAAQ,GAAK;AAAA,MACnC;AAAA,IACF;AACA,UAAM,QAAiB,MAAM,SAAS,KAAK;AAC3C,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,QAAQA,IACX,OAAO;AAAA,QACN,OAAOA,IAAE,OAAO,EAAE,MAAMA,IAAE,OAAO,GAAG,SAASA,IAAE,OAAO,EAAE,IAAI,GAAG,EAAE,CAAC;AAAA,MACpE,CAAC,EACA,UAAU,KAAK;AAClB,YAAM,IAAI,mBAAmB;AAAA,QAC3B,MAAM,MAAM,UACR,MAAM,KAAK,MAAM,OACjB;AAAA,QACJ,SAAS,MAAM,UACX,MAAM,KAAK,MAAM,UACjB;AAAA,QACJ,QAAQ,SAAS;AAAA,MACnB,CAAC;AAAA,IACH;AACA,UAAM,SAASA,IACZ,OAAO;AAAA,MACN,iBAAiBA,IAAE,QAAQ,CAAC;AAAA,MAC5B,YAAYA,IAAE,QAAQ,QAAQ,UAAU;AAAA,IAC1C,CAAC,EACA,YAAY,EACZ,MAAM,KAAK;AACd,QAAI;AACJ,QAAI,SAAS;AACX,YAAM,QAAQ,SAAS,MAAM,MAAM;AACnC,UACE,MAAM,OAAO,QAAQ,cACrB,MAAM,mBAAmB,QAAQ,SAAS,QAAQ,kBAClD,MAAM,aAAa,OAAO,OAAO,QAAQ,IAAI,KAC7C,OAAO,QAAQ,IAAK,EAAE;AAAA,QACpB,CAAC,CAAC,KAAK,GAAG,MACR,QAAQ,cAAc,MAAM,GAAyB,MAAM;AAAA,MAC/D;AAEA,cAAM,IAAI,MAAM,8CAA8C;AAChE,eAAS;AAAA,IACX,WAAW,UAAU;AACnB,UAAI,WAAW,UAAU;AACvB,iBAAS,WAAW;AAAA,UAClB,KAAK,QAAQ,CAAC,QAAQ,SAAS,YAAY,CAAC;AAAA,QAC9C;AACA,YAAI,KAAK,UAAU,MAAM,MAAM,KAAK,UAAU,IAAI;AAChD,gBAAM,IAAI,MAAM,iDAAiD;AAAA,MACrE;AACE,iBAAS;AAAA,UACP,IAAIA,IAAE,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,EAAE;AAAA,UACrC,GAAG;AAAA,YACD;AAAA,YACA,WAAW,cACP,CAAC,SAAS,UAAU,UAAU,UAAU,IACxC,WAAW,UACT,CAAC,SAAS,OAAO,IACjB,CAAC,SAAS,OAAO;AAAA,UACzB;AAAA,QACF;AAAA,IACJ,WAAW;AACT,eAAS,EAAE,UAAUA,IAAE,QAAQ,IAAI,EAAE,MAAM,OAAO,QAAQ,EAAE;AAAA,aACrD,UAAU;AACjB,eAAS,EAAE,OAAOA,IAAE,QAAQ,UAAU,EAAE,MAAM,OAAO,KAAK,EAAE;AAAA,aACrD,WAAW,WAAY,UAAS,KAAK,QAAQ,QAAQ;AAAA,SACzD;AACH,YAAM,WAAW,SAAS,MAAM,OAAO,QAAQ;AAC/C,UACE,SAAS,OAAO,QAAQ,cACxB,SAAS,mBAAmB,QAAQ,SAAS,QAAQ;AAErD,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AACF,UAAI,WAAW;AACb,iBAAS;AAAA,UACP;AAAA,UACA,gBAAgB,OAAO;AAAA,UACvB,eAAeA,IACZ,OAAO;AAAA,YACN,eAAeA,IAAE,KAAK;AAAA,cACpB;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF,CAAC;AAAA,UACH,CAAC,EACA,MAAM,OAAO,aAAa,EAAE;AAAA,QACjC;AAAA,eACO,UAAU,gBAAiB,UAAS;AAAA,eACpC,WAAW;AAClB,iBAAS;AAAA,UACP;AAAA,UACA,cAAcA,IAAE,OAAO,EAAE,MAAM,OAAO,YAAY;AAAA,UAClD,eAAe,OAAO;AAAA,QACxB;AAAA,eACO,WAAW,UAAU;AAC5B,cAAM,cAAcA,IAAE,MAAM,UAAU,EAAE,MAAM,OAAO,WAAW;AAChE,YAAI,UAAU,kBAAkB;AAC9B,gBAAM,aAAa,YAAY,KAAK,CAAC,MAAM,EAAE,SAAS,YAAY,CAAC,CAAC;AACpE,cAAI,CAAC;AACH,kBAAM,IAAI;AAAA,cACR;AAAA,YACF;AACF,mBAAS;AAAA,YACP,MAAM,WAAW;AAAA,YACjB,YAAY,iCAAiC,KAAK,UAAU,WAAW,IAAI,CAAC,KAAK,KAAK,UAAU,OAAO,YAAY,OAAO,QAAQ,WAAW,UAAU,EAAE,IAAI,CAAC,CAAC,KAAKK,OAAM,MAAM,CAAC,KAAKA,QAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAAA,YACnM,UACE;AAAA,UACJ;AAAA,QACF,MAAO,UAAS,EAAE,aAAa,aAAa,OAAO,YAAY;AAAA,MACjE;AACE,iBACE,WAAW,WACP,KAAK,QAAQ,QAAQ,IACrB,EAAE,CAAC,MAAM,GAAGL,IAAE,MAAMA,IAAE,QAAQ,CAAC,EAAE,MAAM,OAAO,MAAM,CAAC,EAAE;AAAA,IACjE;AACA,WAAO,EAAE,UAAU,GAAG,QAAQ,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE;AAAA,EAChE,SAAS,OAAO;AACd,UAAM,QACJ,iBAAiB,qBACb,EAAE,MAAM,MAAM,MAAM,SAAS,MAAM,QAAQ,IAC3C;AAAA,MACE,MAAM;AAAA,MACN,SACE,iBAAiBA,IAAE,WACf,2EACA,iBAAiB,QACf,MAAM,UACN;AAAA,IACV;AACN,WAAO;AAAA,MACL,UAAU,iBAAiB,qBAAqB,IAAI;AAAA,MACpD,GAAI,OACA,EAAE,QAAQ,KAAK,UAAU,EAAE,MAAM,CAAC,EAAE,IACpC,EAAE,QAAQ,MAAM,QAAQ;AAAA,IAC9B;AAAA,EACF;AACF;;;ACxcA,SAAS,aAAAM,kBAAiB;AAC1B,OAAOC,YAAU;AACjB,SAAS,aAAAC,kBAAiB;AAC1B,SAAS,KAAAC,WAAS;;;ACHlB,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,aAAAC,kBAAiB;AAC1B,OAAOC,YAAU;AACjB,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,aAAAC,kBAAiB;AAC1B,SAAS,KAAAC,WAAS;AASX,IAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAahC,eAAsB,yBACpB,SACwB;AACxB,MAAI;AACJ,MAAI;AACF,UAAM,EAAE,QAAQ,YAAY,IAAIC,WAAU;AAAA,MACxC,MAAM,QAAQ,KAAK,MAAM,CAAC;AAAA,MAC1B,QAAQ;AAAA,MACR,kBAAkB;AAAA,MAClB,SAAS;AAAA,QACP,MAAM,EAAE,MAAM,UAAU;AAAA,QACxB,aAAa,EAAE,MAAM,SAAS;AAAA,QAC9B,OAAO,EAAE,MAAM,SAAS;AAAA,QACxB,KAAK,EAAE,MAAM,UAAU,UAAU,KAAK;AAAA,QACtC,QAAQ,EAAE,MAAM,SAAS;AAAA,QACzB,mBAAmB,EAAE,MAAM,SAAS;AAAA,QACpC,SAAS,EAAE,MAAM,SAAS;AAAA,QAC1B,QAAQ,EAAE,MAAM,SAAS;AAAA,QACzB,QAAQ,EAAE,MAAM,SAAS;AAAA,MAC3B;AAAA,IACF,CAAC;AACD,UAAM,SAAS,YAAY,CAAC,KAAK;AACjC,UAAM,KAAK,YAAY,CAAC;AACxB,UAAM,aAAgE;AAAA,MACpE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,OAAO,UAAU,iBAAiB,EAAE;AAAA,MACrE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE;AAAA,MACnC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE;AAAA,MAChC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE;AAAA,MACpC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE;AAAA,MAC7B,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,QAAQ,EAAE;AAAA,MAC7C,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,QAAQ,EAAE;AAAA,IACjD;AACA,UAAM,YAAY,WAAW,MAAM;AACnC,QACE,CAAC,aACD,YAAY,WAAW,UAAU,QACjC,OAAO,KAAK,MAAM,EAAE;AAAA,MAClB,CAAC,QAAQ,CAAC,CAAC,eAAe,QAAQ,GAAG,UAAU,KAAK,EAAE,SAAS,GAAG;AAAA,IACpE;AAEA,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AACF,QAAI,OAAO,UAAU,CAAC,CAAC,UAAU,SAAS,EAAE,SAAS,OAAO,MAAM;AAChE,YAAM,IAAI,MAAM,iCAAiC;AACnD,QACE,WAAW,UACV,CAAC,OAAO,SAAS,CAAC,OAAO,KAAK,UAAU,OAAO,IAAI,SAAS;AAE7D,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AACF,QACG,WAAW,aAAa,OAAO,KAAK,WAAW,KAC/C,WAAW,UAAU,OAAO,OAAO,OAAO,IAAI,WAAW;AAE1D,YAAM,IAAI,MAAM,6CAA6C;AAC/D,eAAW,SAAS,OAAO,OAAO,CAAC,GAAG;AACpC,YAAM,MAAM,IAAI,IAAI,KAAK;AACzB,UACE,CAAC,CAAC,SAAS,QAAQ,EAAE,SAAS,IAAI,QAAQ,KAC1C,IAAI,YACJ,IAAI,YACJ,IAAI,QACJ,MAAM,SAAS;AAEf,cAAM,IAAI,MAAM,mCAAmC;AAAA,IACvD;AACA,UAAM,UAAU,OAAO,OAAO,WAAW,GAAG;AAC5C,QAAI,CAAC,OAAO,UAAU,OAAO,KAAK,UAAU,KAAK,UAAU;AACzD,YAAM,IAAI,MAAM,+CAA+C;AACjE,QACE,WAAW,aACV,CAAC,OAAO,UAAU,CAAC,CAAC,OAAO,MAAM,EAAE,SAAS,OAAO,UAAU,EAAE;AAEhE,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AACF,QAAI,WAAW,OAAO;AACpB,uBAAiB,OAAO,iBAAiB,KAAKC,YAAW;AACzD,UAAI,CAAC,2BAA2B,KAAK,cAAc;AACjD,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,IACJ;AACA,UAAM,UAAU,MAAM;AAAA,MACpB;AAAA,MACA;AAAA,MACA,OAAO;AAAA,IACT;AACA,QAAI,CAAC;AACH,YAAM,IAAI,MAAM,wDAAwD;AAC1E,UAAM,UAAU,qBAAqB,OAAO;AAC5C,UAAM,UAAU,CAAC,OAAO,QAAQ,EAAE,SAAS,MAAM;AACjD,UAAM,QAAQ,UAAU,qBAAqB;AAC7C,UAAM,cAAcC,IACjB,OAAO;AAAA,MACN,IAAIA,IAAE,OAAO;AAAA,MACb,YAAYA,IAAE,QAAQ,QAAQ,UAAU;AAAA,MACxC,gBAAgBA,IAAE,QAAQ,QAAQ,SAAS,QAAQ,cAAc;AAAA,MACjE,eAAeA,IAAE,OAAO;AAAA,MACxB,OAAOA,IAAE,KAAK;AAAA,QACZ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,MACD,QAAQA,IAAE,KAAK,CAAC,UAAU,SAAS,CAAC;AAAA,MACpC,MAAMA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE;AAAA,IACzC,CAAC,EACA,YAAY;AACf,UAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAI,OAAO,OAAQ,OAAM,IAAI,UAAU,OAAO,MAAM;AACpD,QAAI,CAAC,WAAW,OAAO,MAAM,CAAC,EAAG,OAAM,IAAI,WAAW,OAAO,IAAI,CAAC,CAAC;AACnE,UAAM,SAAS,KACX,IAAI,mBAAmB,EAAE,CAAC,GAAG,WAAW,WAAW,YAAY,WAAW,WAAW,YAAY,EAAE,KACnG;AACJ,QAAI,WAAW,SAAU,OAAM,IAAI,UAAU,OAAO,MAAO;AAC3D,UAAM,WAAW,KAAK,IAAI,IAAI,UAAU;AACxC,WAAO,MAAM;AACX,YAAM,QAAQ,MAAM,QAAQ,OAAO,QAAQ;AAAA,QACzC,UAAU;AAAA,QACV,QAAQ,CAAC,KAAK;AAAA,MAChB,CAAC;AACD,UACE,MAAM,MAAM,aAAa,gBACzB,MAAM,MAAM,mBACV,QAAQ,SAAS,QAAQ,kBAC3B,MAAM,MAAM,OAAO,WAAW,KAC9B,MAAM,MAAM,OAAO,CAAC,MAAM;AAE1B,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AACF,UAAI,CAAC,QAAQ;AACX,cAAM,IAAI,MAAM,mCAAmC;AACrD,YAAM,WAAW,MAAM,QAAQ;AAAA,QAC7B,GAAG,QAAQ,IAAI,MAAM,yBAAyB,mBAAmB,QAAQ,UAAU,CAAC,kBAAkB,MAAM,IAAI,KAAK;AAAA,QACrH;AAAA,UACE,QAAQ,UAAU,SAAS;AAAA,UAC3B,SAAS;AAAA,YACP,QAAQ;AAAA,YACR,eAAe,UAAU,MAAM,WAAW;AAAA,YAC1C,GAAI,WAAW,QAAQ,EAAE,gBAAgB,mBAAmB,IAAI,CAAC;AAAA,UACnE;AAAA,UACA,GAAI,WAAW,QACX;AAAA,YACE,MAAM,KAAK,UAAU;AAAA,cACnB,SAAS,OAAO;AAAA,cAChB,MAAM,OAAO;AAAA,cACb,QAAQ,OAAO,UAAU;AAAA,cACzB;AAAA,YACF,CAAC;AAAA,UACH,IACA,CAAC;AAAA,UACL,QAAQ,YAAY,QAAQ,GAAK;AAAA,QACnC;AAAA,MACF;AACA,UAAI,WAAW,YAAY,SAAS,IAAI;AACtC,YACE,EAAE,oBAAoB,aACtB,SAAS,QAAQ,IAAI,kBAAkB,MAAM,MAC7C,CAAC,SAAS,QACP,IAAI,cAAc,GACjB;AAAA,UACA,OAAO,WAAW,QAAQ,aAAa;AAAA,QACzC;AAEF,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AACF,cAAM,OAAO,MAAM,SAAS,KAAK;AACjC,YAAI,OAAO,WAAW,QAAQ;AAC5B,gBAAM,SAASA,IACZ,OAAO;AAAA,YACN,iBAAiBA,IAAE,QAAQ,CAAC;AAAA,YAC5B,OAAO;AAAA,YACP,OAAOA,IAAE,MAAMA,IAAE,QAAQ,CAAC;AAAA,UAC5B,CAAC,EACA,MAAM,KAAK,MAAM,IAAI,CAAC;AACzB,cAAI,OAAO,MAAM,OAAO;AACtB,kBAAM,IAAI;AAAA,cACR;AAAA,YACF;AAAA,QACJ;AACA,cAAM,SAASC,OAAK;AAAA,UAClB,QAAQ,OAAO,QAAQ,IAAI;AAAA,UAC3B,OAAO;AAAA,QACT;AACA,cAAMC,WAAU,QAAQ,MAAM,EAAE,MAAM,MAAM,MAAM,IAAM,CAAC;AACzD,eAAO;AAAA,UACL,UAAU;AAAA,UACV,QAAQ,KAAK;AAAA,YACX,EAAE,SAAS,IAAI,QAAQ,QAAQ,OAAO,OAAO;AAAA,YAC7C;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,YAAM,OAAgB,MAAM,SAAS,KAAK;AAC1C,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,QAAQF,IACX,OAAO;AAAA,UACN,OAAOA,IAAE,OAAO,EAAE,MAAMA,IAAE,OAAO,GAAG,SAASA,IAAE,OAAO,EAAE,IAAI,GAAG,EAAE,CAAC;AAAA,QACpE,CAAC,EACA,UAAU,IAAI;AACjB,cAAM,IAAI,mBAAmB;AAAA,UAC3B,MAAM,MAAM,UAAU,MAAM,KAAK,MAAM,OAAO;AAAA,UAC9C,SAAS,MAAM,UACX,MAAM,KAAK,MAAM,UACjB;AAAA,UACJ,QAAQ,SAAS;AAAA,QACnB,CAAC;AAAA,MACH;AACA,YAAM,SAASA,IACZ,OAAO,EAAE,iBAAiBA,IAAE,QAAQ,CAAC,EAAE,CAAC,EACxC,YAAY,EACZ,MAAM,IAAI;AACb,UAAI,WAAW,SAAU,CAAAA,IAAE,QAAQ,IAAI,EAAE,MAAM,OAAO,SAAS;AAAA,eACtD,WAAW,OAAO;AACzB,cAAM,WAAW,YAAY,MAAM,OAAO,KAAK;AAC/C,cAAM,YAAY,CAAC,QAAgB;AACjC,gBAAM,QAAQ,IAAI,IAAI,GAAG;AACzB,gBAAM,OAAO;AACb,iBAAO,MAAM;AAAA,QACf;AACA,YACE,SAAS,kBAAkB,OAAO,SAClC,SAAS,YAAY,OAAO,UAAU,aACtC,KAAK,UAAU,CAAC,GAAG,IAAI,IAAI,SAAS,KAAK,IAAI,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,MAC9D,KAAK,UAAU,CAAC,GAAG,IAAI,IAAI,OAAO,IAAK,IAAI,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC;AAEhE,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,MACJ,OAAO;AACL,QAAAA,IAAE,QAAQ,QAAQ,UAAU,EAAE,MAAM,OAAO,UAAU;AACrD,QAAAA,IAAE,MAAM,WAAW,EAAE,MAAM,OAAO,OAAO;AACzC,cAAM,WAAW,YAAY,SAAS,EAAE,MAAM,OAAO,KAAK;AAC1D,YAAI,MAAM,UAAU,OAAO;AACzB,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,MACJ;AACA,YAAM,QAAQ,OAAO,QAAQ,YAAY,MAAM,OAAO,KAAK,IAAI;AAC/D,UACE,WAAW,UACX,CAAC,SACD,CAAC,CAAC,UAAU,SAAS,EAAE,SAAS,MAAM,KAAK;AAE3C,eAAO;AAAA,UACL,UAAU;AAAA,UACV,QAAQ,KAAK;AAAA,YACX,EAAE,GAAG,QAAQ,GAAI,iBAAiB,EAAE,eAAe,IAAI,CAAC,EAAG;AAAA,YAC3D;AAAA,YACA;AAAA,UACF;AAAA,QACF;AACF,UAAI,KAAK,IAAI,KAAK;AAChB,eAAO;AAAA,UACL,UAAU;AAAA,UACV,QAAQ,KAAK,UAAU,EAAE,GAAG,QAAQ,UAAU,KAAK,GAAG,MAAM,CAAC;AAAA,QAC/D;AACF,YAAMG,YAAW,KAAK,IAAI,KAAM,KAAK,IAAI,GAAG,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC;AAAA,IACrE;AAAA,EACF,SAAS,OAAO;AACd,UAAM,QAAQ;AAAA,MACZ,MACE,iBAAiB,qBAAqB,MAAM,OAAO;AAAA,MACrD,SACE,iBAAiBH,IAAE,WACf,kDACA,iBAAiB,QACf,MAAM,UACN;AAAA,IACV;AACA,WAAO;AAAA,MACL,UAAU,iBAAiB,qBAAqB,IAAI;AAAA,MACpD,GAAI,QAAQ,KAAK,SAAS,QAAQ,IAC9B;AAAA,QACE,QAAQ,KAAK,UAAU;AAAA,UACrB;AAAA,UACA,GAAI,iBAAiB,EAAE,eAAe,IAAI,CAAC;AAAA,QAC7C,CAAC;AAAA,MACH,IACA;AAAA,QACE,QAAQ,GAAG,MAAM,OAAO,GAAG,iBAAiB,eAAe,cAAc,KAAK,EAAE;AAAA,MAClF;AAAA,IACN;AAAA,EACF;AACF;;;ADhTO,IAAM,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBtB,iBAAiB,KAAK,EAAE,MAAM,MAAM,EAAE,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQxC,iBAAiB,KAAK,EAAE,MAAM,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,MAAM,CAAC;AAE7D,eAAsB,cACpB,SACwB;AACxB,MACE,CAAC,QAAQ,KAAK,UACd,QAAQ,KAAK,KAAK,CAAC,QAAQ,CAAC,UAAU,IAAI,EAAE,SAAS,GAAG,CAAC;AAEzD,WAAO,EAAE,UAAU,GAAG,QAAQ,SAAS;AACzC,MAAI,QAAQ,KAAK,CAAC,MAAM;AACtB,WAAO,yBAAyB,OAAO;AACzC,QAAM,OAAO,QAAQ,KAAK,SAAS,QAAQ;AAC3C,MAAI;AACF,UAAM,EAAE,aAAa,OAAO,IAAII,WAAU;AAAA,MACxC,MAAM,QAAQ;AAAA,MACd,QAAQ;AAAA,MACR,kBAAkB;AAAA,MAClB,SAAS;AAAA,QACP,MAAM,EAAE,MAAM,UAAU;AAAA,QACxB,aAAa,EAAE,MAAM,SAAS;AAAA,QAC9B,OAAO,EAAE,MAAM,SAAS;AAAA,QACxB,KAAK,EAAE,MAAM,SAAS;AAAA,QACtB,MAAM,EAAE,MAAM,SAAS;AAAA,QACvB,QAAQ,EAAE,MAAM,SAAS;AAAA,QACzB,UAAU,EAAE,MAAM,SAAS;AAAA,QAC3B,OAAO,EAAE,MAAM,SAAS;AAAA,QACxB,MAAM,EAAE,MAAM,SAAS;AAAA,QACvB,OAAO,EAAE,MAAM,SAAS;AAAA,QACxB,SAAS,EAAE,MAAM,SAAS;AAAA,QAC1B,SAAS,EAAE,MAAM,SAAS;AAAA,QAC1B,MAAM,EAAE,MAAM,SAAS;AAAA,QACvB,UAAU,EAAE,MAAM,SAAS;AAAA,QAC3B,aAAa,EAAE,MAAM,SAAS;AAAA,QAC9B,UAAU,EAAE,MAAM,SAAS;AAAA,QAC3B,UAAU,EAAE,MAAM,SAAS;AAAA,QAC3B,MAAM,EAAE,MAAM,SAAS;AAAA,QACvB,QAAQ,EAAE,MAAM,SAAS;AAAA,QACzB,QAAQ,EAAE,MAAM,SAAS;AAAA,MAC3B;AAAA,IACF,CAAC;AACD,UAAM,QAAQ,YAAY,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG;AAC9C,UAAM,SAAS,YAAY,CAAC;AAC5B,UAAM,aAAgE;AAAA,MACpE,QAAQ,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE;AAAA,MAC7B,iBAAiB,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE;AAAA,MACtC,gBAAgB;AAAA,QACd,OAAO,CAAC,WAAW,WAAW,QAAQ,YAAY,UAAU;AAAA,QAC5D,MAAM;AAAA,MACR;AAAA,MACA,uBAAuB,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE;AAAA,MAC5C,sBAAsB,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE;AAAA,MAC3C,8BAA8B,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE;AAAA,MACnD,qBAAqB;AAAA,QACnB,OAAO,CAAC,WAAW,eAAe,YAAY,YAAY,UAAU;AAAA,QACpE,MAAM;AAAA,MACR;AAAA,MACA,QAAQ;AAAA,QACN,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,MAAM;AAAA,MACR;AAAA,MACA,aAAa,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE;AAAA,MAClC,cAAc,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE;AAAA,MACnC,cAAc,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE;AAAA,MACnC,gBAAgB,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE;AAAA,MACrC,OAAO,EAAE,OAAO,CAAC,SAAS,OAAO,SAAS,MAAM,GAAG,MAAM,EAAE;AAAA,MAC3D,QAAQ,EAAE,OAAO,CAAC,SAAS,QAAQ,MAAM,GAAG,MAAM,EAAE;AAAA,MACpD,SAAS,EAAE,OAAO,CAAC,SAAS,SAAS,MAAM,GAAG,MAAM,EAAE;AAAA,MACtD,SAAS,EAAE,OAAO,CAAC,SAAS,KAAK,GAAG,MAAM,EAAE;AAAA,MAC5C,gBAAgB;AAAA,QACd,OAAO,CAAC,SAAS,OAAO,QAAQ,UAAU,UAAU;AAAA,QACpD,MAAM;AAAA,MACR;AAAA,MACA,iBAAiB;AAAA,QACf,OAAO,CAAC,SAAS,OAAO,QAAQ,UAAU,UAAU;AAAA,QACpD,MAAM;AAAA,MACR;AAAA,IACF;AACA,UAAM,YAAY,WAAW,KAAK;AAClC,QACE,CAAC,aACD,YAAY,WAAW,UAAU,QACjC,OAAO,KAAK,MAAM,EAAE;AAAA,MAClB,CAAC,QAAQ,CAAC,CAAC,QAAQ,eAAe,GAAG,UAAU,KAAK,EAAE,SAAS,GAAG;AAAA,IACpE;AAEA,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AACF,QAAI,WAAW,cAAc,CAAC,OAAO,SAAS,CAAC,OAAO;AACpD,YAAM,IAAI,MAAM,qCAAqC;AACvD,QACE,WAAW,WACX,CAAC,SAAS,OAAO,QAAQ,UAAU,UAAU,EAAE;AAAA,MAC7C,CAAC,QAAQ,CAAC,OAAO,GAA0B;AAAA,IAC7C;AAEA,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AACF,QAAI,OAAO,QAAQ,CAAC,kBAAkB,KAAK,OAAO,IAAI;AACpD,YAAM,IAAI,MAAM,6BAA6B;AAC/C,QAAI,OAAO,YAAY,CAAC,aAAa,KAAK,OAAO,QAAQ;AACvD,YAAM,IAAI,MAAM,8BAA8B;AAChD,QACE,OAAO,WACN,OAAO,OAAO,KAAK,EAAE,SAAS,KAAK,OAAO,OAAO,SAAS;AAE3D,YAAM,IAAI,MAAM,4CAA4C;AAC9D,UAAM,kBAAkB,WAAW,YAAY,OAAO,SAAS;AAC/D,QACE,OAAO,SACP,EACE,kBACI,CAAC,YAAY,eAAe,YAAY,UAAU,IAClD,CAAC,OAAO,YAAY,iBAAiB,YAAY,eAAe,GACpE,SAAS,OAAO,KAAK;AAEvB,YAAM,IAAI,MAAM,wDAAwD;AAC1E,UAAM,aAAa,CAAC,YAAY,eAAe,EAAE,SAAS,UAAU,EAAE;AACtE,UAAM,UAAU,cAAc,YAAY,CAAC,MAAM;AACjD,QACE,YACC,CAAC,OAAO,YAAY,CAAC,CAAC,QAAQ,OAAO,EAAE,SAAS,OAAO,WAAW,EAAE;AAErE,YAAM,IAAI,MAAM,uDAAuD;AACzE,QAAI,UAAU,gBAAgB;AAC5B,UACE,CAAC,WAAW,KAAK,OAAO,WAAW,EAAE,KACrC,CAAC,6BAA6B,KAAK,OAAO,QAAQ,EAAE,KACpD,CAAC,OAAO;AAER,cAAM,IAAI,MAAM,oDAA+C;AACjE,UAAI;AACF,YAAI,KAAK,eAAe,MAAM,EAAE,UAAU,OAAO,SAAS,CAAC;AAAA,MAC7D,QAAQ;AACN,cAAM,IAAI,MAAM,6BAA6B;AAAA,MAC/C;AAAA,IACF;AACA,QACE,UAAU,wBACT,CAAC,CAAC,SAAS,SAAS,EAAE,SAAS,OAAO,YAAY,EAAE,KACnD,CAAC,CAAC,QAAQ,OAAO,EAAE,SAAS,OAAO,YAAY,EAAE,KAChD,OAAO,YAAY,UAAU,CAAC,OAAO;AAExC,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AACF,QACE,WAAW,aACV,CAAC,OAAO,SACP,CAAC,CAAC,SAAS,UAAU,SAAS,EAAE,SAAS,OAAO,QAAQ,EAAE,KAC1D,CAAC,CAAC,OAAO,MAAM,EAAE,SAAS,OAAO,UAAU,EAAE,KAC7C,CAAC,OAAO;AAEV,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AACF,QACE,OAAO,YACP,CAAC,CAAC,SAAS,WAAW,QAAQ,EAAE,SAAS,OAAO,QAAQ;AAExD,YAAM,IAAI,MAAM,4BAA4B;AAC9C,UAAM,UAAU,MAAM;AAAA,MACpB;AAAA,MACA;AAAA,MACA,OAAO;AAAA,IACT;AACA,QAAI,CAAC;AACH,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AACF,UAAM,UAAU,qBAAqB,OAAO;AAC5C,UAAM,oBAAoB,UAAU;AACpC,UAAM,UACJ,qBACA,WACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,SAAS,KAAK;AAClB,UAAM,QAAQ,oBACV,4BACA,UACE,WAAW,aACT,uBACA,4BACF,CAAC,UACC,uBACA,WAAW,UACT,qBACA;AACV,UAAM,QAAQ,MAAM,QAAQ,OAAO,QAAQ;AAAA,MACzC,UAAU;AAAA,MACV,QAAQ,CAAC,KAAK;AAAA,IAChB,CAAC;AACD,QACE,MAAM,MAAM,aAAa,gBACzB,MAAM,MAAM,OAAO,WAAW,KAC9B,MAAM,MAAM,OAAO,CAAC,MAAM,SAC1B,MAAM,MAAM,mBAAmB,QAAQ,SAAS,QAAQ;AAExD,YAAM,IAAI,mBAAmB;AAAA,QAC3B,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC;AACH,UAAM,QAAQ,IAAI,gBAAgB;AAClC,eAAW,CAAC,MAAM,IAAI,KAAK;AAAA,MACzB,CAAC,SAAS,OAAO;AAAA,MACjB,CAAC,QAAQ,MAAM;AAAA,MACf,CAAC,SAAS,GAAG;AAAA,MACb,CAAC,OAAO,SAAS;AAAA,MACjB,CAAC,QAAQ,MAAM;AAAA,MACf,CAAC,SAAS,QAAQ;AAAA,MAClB,CAAC,QAAQ,MAAM;AAAA,MACf,CAAC,UAAU,QAAQ;AAAA,MACnB,CAAC,YAAY,UAAU;AAAA,IACzB;AACE,UAAI,OAAO,IAAI,KAAK,CAAC,QAAS,OAAM,IAAI,MAAM,OAAO,IAAI,CAAC;AAC5D,QAAI,mBAAmB,OAAO,OAAO;AACnC,YAAM,OAAO,QAAQ;AACrB,YAAM,IAAI,SAAS,OAAO,KAAK;AAAA,IACjC;AACA,QAAI,UAAU,aAAc,OAAM,IAAI,SAAS,YAAY,CAAC,CAAE;AAC9D,UAAM,SAAS,oBACX,0BACA,aACE,UACE,IAAI,MAAM,KACV,UAAU,+BACR,kBACA,gBACJ,WAAW,WACT,WAAW,KAAK,KAChB,UAAU,cACR,YACA,UAAU,iBACR,WAAW,mBAAmB,YAAY,CAAC,CAAE,CAAC,YAC9C,WAAW,YACT,cACA,WAAW,UACT,kBACA,IAAI,KAAK;AACzB,UAAM,OAAO,oBACT,EAAE,gBAAgB,YAAY,CAAC,EAAE,IACjC,UAAU,iBACR;AAAA,MACE,SAAS,OAAO,YAAY;AAAA,MAC5B,SAAS,OAAO,OAAO,OAAO;AAAA,MAC9B,MAAM,OAAO;AAAA,MACb,UAAU,OAAO;AAAA,MACjB,kBAAkB,OAAO,OAAO,QAAQ;AAAA,IAC1C,IACA,UAAU,sBACR;AAAA,MACE,SAAS,OAAO,YAAY;AAAA,MAC5B,aAAa,OAAO,eAAe;AAAA,MACnC,iBAAiB,OAAO;AAAA,MACxB,iBAAiB,OAAO,aAAa;AAAA,MACrC,kBAAkB,OAAO,OAAO,QAAQ;AAAA,IAC1C,IACA,WAAW,YACT,EAAE,SAAS,OAAO,OAAO,MAAM,CAAC,OAAO,GAAG,EAAE,IAC5C,WAAW,UACT;AAAA,MACE,SAAS,OAAO;AAAA,MAChB,KAAK,OAAO;AAAA,MACZ,QAAQ,OAAO;AAAA,MACf,QAAQ,OAAO;AAAA,MACf,kBAAkB,OAAO,OAAO,QAAQ;AAAA,MACxC,SAAS,YAAY,CAAC,MAAM;AAAA,IAC9B,IACA;AACZ,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,mCAAmC;AACrD,UAAM,WAAW,MAAM,QAAQ;AAAA,MAC7B,GAAG,QAAQ,IAAI,MAAM,yBAAyB,mBAAmB,QAAQ,UAAU,CAAC,GAAG,MAAM;AAAA,MAC7F;AAAA,QACE,QAAQ,UAAU,UAAU,UAAU,SAAS;AAAA,QAC/C,SAAS;AAAA,UACP,QAAQ;AAAA,UACR,eAAe,UAAU,MAAM,WAAW;AAAA,UAC1C,GAAI,OAAO,EAAE,gBAAgB,mBAAmB,IAAI,CAAC;AAAA,QACvD;AAAA,QACA,GAAI,OAAO,EAAE,MAAM,KAAK,UAAU,IAAI,EAAE,IAAI,CAAC;AAAA,QAC7C,QAAQ,YAAY,QAAQ,GAAK;AAAA,MACnC;AAAA,IACF;AACA,QAAI,WAAW,YAAY,SAAS,IAAI;AACtC,UAAI,EAAE,oBAAoB;AACxB,cAAM,IAAI,MAAM,kDAAkD;AACpE,YAAM,OAAO,OAAO,WAAW,QAAQ,aAAa;AACpD,YAAM,OAAO,OAAO,SAAS,QAAQ,IAAI,mBAAmB,CAAC;AAC7D,UACE,SAAS,QAAQ,IAAI,gBAAgB,MAAM,OAAO,SAClD,CAAC,SAAS,QAAQ,IAAI,cAAc,GAAG,WAAW,IAAI,KACtD,CAAC,SAAS,QAAQ,IAAI,mBAAmB,KACzC,CAAC,OAAO,cAAc,IAAI,KAC1B,OAAO;AAEP,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AACF,YAAM,OAAO,MAAM,SAAS,KAAK;AACjC,UAAI,OAAO,WAAW;AACpB,QAAAC,IAAE,OAAO;AAAA,UACP,iBAAiBA,IAAE,QAAQ,CAAC;AAAA,UAC5B,OAAOA,IAAE,OAAO;AAAA,YACd,IAAIA,IAAE,QAAQ,OAAO,KAAM;AAAA,YAC3B,YAAYA,IAAE,QAAQ,QAAQ,UAAU;AAAA,UAC1C,CAAC;AAAA,UACD,MAAMA,IAAE,QAAQ,OAAO,IAAK;AAAA,UAC5B,WAAWA,IAAE,QAAQ,IAAI;AAAA,UACzB,MAAMA,IAAE,MAAMA,IAAE,QAAQ,CAAC,EAAE,OAAO,IAAI;AAAA,QACxC,CAAC,EAAE,MAAM,KAAK,MAAM,IAAI,CAAC;AAC3B,YAAM,SAASC,OAAK,QAAQ,QAAQ,OAAO,QAAQ,IAAI,GAAG,OAAO,MAAO;AACxE,YAAMC,WAAU,QAAQ,MAAM,EAAE,MAAM,MAAM,MAAM,IAAM,CAAC;AACzD,aAAO;AAAA,QACL,UAAU;AAAA,QACV,QAAQ,KAAK;AAAA,UACX;AAAA,YACE,SAAS,OAAO;AAAA,YAChB,MAAM,OAAO;AAAA,YACb,QAAQ,OAAO;AAAA,YACf;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,UAAM,OAAgB,MAAM,SAAS,KAAK;AAC1C,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,SAASF,IACZ,OAAO;AAAA,QACN,OAAOA,IAAE,OAAO,EAAE,MAAMA,IAAE,OAAO,GAAG,SAASA,IAAE,OAAO,EAAE,IAAI,GAAG,EAAE,CAAC;AAAA,MACpE,CAAC,EACA,UAAU,IAAI;AACjB,YAAM,IAAI,mBAAmB;AAAA,QAC3B,MAAM,OAAO,UAAU,OAAO,KAAK,MAAM,OAAO;AAAA,QAChD,SAAS,OAAO,UACZ,OAAO,KAAK,MAAM,UAClB;AAAA,QACJ,QAAQ,SAAS;AAAA,MACnB,CAAC;AAAA,IACH;AACA,UAAM,SAASA,IACZ,OAAO,EAAE,iBAAiBA,IAAE,QAAQ,CAAC,EAAE,CAAC,EACxC,YAAY,EACZ,MAAM,IAAI;AACb,QAAI,YAAY;AACd,MAAAA,IAAE,QAAQ,QAAQ,UAAU,EAAE,MAAM,OAAO,UAAU;AACrD,YAAM,WAAWA,IAAE,OAAO;AAAA,QACxB,SAASA,IAAE,QAAQ;AAAA,QACnB,SAASA,IAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,QACtC,MAAMA,IAAE,OAAO;AAAA,QACf,UAAUA,IAAE,OAAO;AAAA,QACnB,UAAUA,IAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC;AAAA,QAChC,WAAWA,IAAE,OAAO,EAAE,SAAS;AAAA,MACjC,CAAC;AACD,YAAM,oBAAoBA,IAAE,OAAO;AAAA,QACjC,SAASA,IAAE,QAAQ;AAAA,QACnB,iBAAiBA,IAAE,KAAK,CAAC,SAAS,SAAS,CAAC;AAAA,QAC5C,iBAAiBA,IAAE,QAAQ;AAAA,QAC3B,UAAUA,IAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC;AAAA,QAChC,eAAeA,IAAE,OAAO,EAAE,SAAS;AAAA,MACrC,CAAC;AACD,UAAI,mBAAmB;AACrB,QAAAA,IAAE,QAAQ,IAAI,EAAE,MAAM,OAAO,WAAW;AACxC,QAAAA,IAAE,QAAQ,YAAY,CAAC,CAAE,EAAE,MAAM,OAAO,cAAc;AAAA,MACxD,WAAW,UAAU;AACnB,QAAAA,IAAE,OAAO;AAAA,UACP,YAAYA,IAAE;AAAA,YACZA,IAAE,OAAO;AAAA,cACP,aAAaA,IAAE,OAAO;AAAA,cACtB,OAAOA,IAAE,OAAO;AAAA,cAChB,cAAcA,IAAE,QAAQ,WAAW;AAAA,YACrC,CAAC;AAAA,UACH;AAAA,QACF,CAAC,EAAE,MAAM,MAAM;AAAA,eACR,SAAS;AAChB,cAAM,QACJ,WAAW,aACP,SAAS,MAAM,OAAO,QAAQ,IAC9B,kBAAkB,MAAM,OAAO,KAAK;AAC1C,YACE,MAAM,aAAa,OAAO,OAAO,QAAQ,IAAI,KAC7C,MAAM,aAAa,OAAO,YAAY;AAEtC,gBAAM,IAAI,MAAM,8CAA8C;AAAA,MAClE,OAAO;AACL,iBAAS,MAAM,OAAO,QAAQ;AAC9B,0BAAkB,MAAM,OAAO,KAAK;AAAA,MACtC;AAAA,IACF,WAAW,CAAC,SAAS;AACnB,YAAM,YAAYA,IACf,OAAO;AAAA,QACN,UAAUA,IAAE,OAAO;AAAA,UACjB,IAAIA,IAAE,QAAQ,QAAQ,UAAU;AAAA,UAChC,gBAAgBA,IAAE,QAAQ,QAAQ,SAAS,QAAQ,cAAc;AAAA,QACnE,CAAC;AAAA,QACD,QAAQA,IAAE,MAAMA,IAAE,OAAO,EAAE,IAAIA,IAAE,OAAO,EAAE,CAAC,EAAE,YAAY,CAAC;AAAA,QAC1D,OAAOA,IACJ,OAAO;AAAA,UACN,IAAIA,IAAE,OAAO;AAAA,UACb,YAAYA,IAAE,QAAQ,QAAQ,UAAU;AAAA,QAC1C,CAAC,EACA,YAAY,EACZ,SAAS;AAAA,QACZ,OAAOA,IAAE,MAAMA,IAAE,QAAQ,CAAC;AAAA,QAC1B,QAAQA,IAAE,MAAMA,IAAE,QAAQ,CAAC;AAAA,QAC3B,SAASA,IAAE,MAAMA,IAAE,QAAQ,CAAC;AAAA,QAC5B,cAAcA,IAAE,OAAO;AAAA,QACvB,cAAcA,IAAE,MAAMA,IAAE,QAAQ,CAAC;AAAA,MACnC,CAAC,EACA,YAAY,EACZ,MAAM,MAAM;AACf,YAAM,WAAW,MAAM,IAAI,OAAO;AAClC,UAAI,YAAY,UAAU,OAAO,OAAO;AACtC,cAAM,IAAI,MAAM,sDAAsD;AAAA,IAC1E,WAAW,OAAO;AAChB,MAAAA,IAAE,OAAO;AAAA,QACP,IAAIA,IAAE,OAAO;AAAA,QACb,YAAYA,IAAE,QAAQ,QAAQ,UAAU;AAAA,QACxC,gBAAgBA,IAAE,QAAQ,QAAQ,SAAS,QAAQ,cAAc;AAAA,QACjE,OAAOA,IAAE,QAAQ,QAAQ;AAAA,MAC3B,CAAC,EAAE,MAAM,OAAO,KAAK;AAAA,aACd,UAAU,eAAgB,CAAAA,IAAE,QAAQ,IAAI,EAAE,MAAM,OAAO,SAAS;AAAA,aAChE,WAAW;AAClB,MAAAA,IAAE,OAAO;AAAA,QACP,KAAKA,IAAE,QAAQ,OAAO,GAAI;AAAA,QAC1B,QAAQA,IAAE,QAAQ,OAAO,IAAK;AAAA,QAC9B,SAASA,IAAE,QAAQ,YAAY,CAAC,MAAM,QAAQ;AAAA,QAC9C,UAAUA,IAAE,QAAQ,OAAO,OAAO,QAAQ,IAAI,CAAC;AAAA,MACjD,CAAC,EAAE,MAAM,OAAO,WAAW;AAAA,QACxB,OAAM,IAAI,MAAM,+CAA+C;AACpE,WAAO,EAAE,UAAU,GAAG,QAAQ,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE;AAAA,EAChE,SAAS,OAAO;AACd,UAAM,QAAQ;AAAA,MACZ,MACE,iBAAiB,qBAAqB,MAAM,OAAO;AAAA,MACrD,SACE,iBAAiBA,IAAE,WACf,kDACA,iBAAiB,QACf,MAAM,UACN;AAAA,IACV;AACA,WAAO;AAAA,MACL,UAAU,iBAAiB,qBAAqB,IAAI;AAAA,MACpD,GAAI,OACA,EAAE,QAAQ,KAAK,UAAU,EAAE,MAAM,CAAC,EAAE,IACpC,EAAE,QAAQ,MAAM,QAAQ;AAAA,IAC9B;AAAA,EACF;AACF;;;AEzeA,IAAM,CAAC,SAAS,GAAG,IAAI,IAAI,QAAQ,KAAK,MAAM,CAAC;AAC/C,IAAMG,cAAa,oBAAI,IAAI,CAAC,UAAU,IAAI,CAAC;AAC3C,IAAM,gBAAgB,oBAAI,IAAI,CAAC,aAAa,IAAI,CAAC;AACjD,IAAM,2BAA2B,oBAAI,IAAI;AAAA,EACvC,CAAC,MAAM,OAAO,EAAE,KAAK,GAAG;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAI,CAAC,WAAW,YAAY,YAAY,YAAY,MAAM;AACxD,gBAAc;AACd,UAAQ,WAAW;AACrB,WAAW,cAAc,IAAI,OAAO,GAAG;AACrC,UAAQ,IAAI,oBAAoB,EAAE,OAAO;AACzC,UAAQ,WAAW;AACrB,OAAO;AACL,QAAM,SAAS,MAAM,gBAAgB,oBAAoB,GAAG,SAAS,IAAI;AACzE,MAAI,QAAQ;AACV,uBAAmB,MAAM;AAAA,EAC3B,WACE,yBAAyB,IAAI,OAAO,KACpC,oBAAoB,OAAO,GAC3B;AACA,kCAA8B;AAC9B,YAAQ,WAAW,cAAc;AAAA,EACnC,OAAO;AACL,YAAQ,MAAM,yBAAyB;AACvC,YAAQ,MAAM,EAAE;AAChB,kBAAc;AACd,YAAQ,WAAW,cAAc;AAAA,EACnC;AACF;AAEA,SAAS,sBAAsB;AAC7B,SAAO,sBAAsB;AAAA,IAC3B,WAAW,CAACC,UACV,oBAAoB;AAAA,MAClB,MAAAA;AAAA,MACA,KAAK,QAAQ,IAAI;AAAA,MACjB,KAAK,QAAQ;AAAA,MACb,WAAW,WAAW;AAAA,IACxB,CAAC;AAAA,IACH,KAAK,CAACA,UACJ,cAAc;AAAA,MACZ,MAAAA;AAAA,MACA,KAAK,QAAQ,IAAI;AAAA,MACjB,KAAK,QAAQ;AAAA,MACb,WAAW,WAAW;AAAA,IACxB,CAAC;AAAA,IACH,gBAAgB;AAAA,IAChB,SAAS,CAACA,UACRC,mBAAkB;AAAA,MAChB,MAAAD;AAAA,MACA,KAAK,QAAQ,IAAI;AAAA,MACjB,KAAK,QAAQ;AAAA,MACb,WAAW,WAAW;AAAA,IACxB,CAAC;AAAA,IACH,QAAQ,CAACA,UACP,kBAAkB,UAAU;AAAA,MAC1B,MAAAA;AAAA,MACA,KAAK,QAAQ,IAAI;AAAA,MACjB,KAAK,QAAQ;AAAA,MACb,WAAW,WAAW;AAAA,IACxB,CAAC;AAAA,IACH,OAAO,CAACA,UACN,kBAAkB,SAAS;AAAA,MACzB,MAAAA;AAAA,MACA,KAAK,QAAQ,IAAI;AAAA,MACjB,KAAK,QAAQ;AAAA,MACb,WAAW,WAAW;AAAA,IACxB,CAAC;AAAA,IACH,cAAc,CAACA,UACb,kBAAkB,gBAAgB;AAAA,MAChC,MAAAA;AAAA,MACA,KAAK,QAAQ,IAAI;AAAA,MACjB,KAAK,QAAQ;AAAA,MACb,WAAW,WAAW;AAAA,IACxB,CAAC;AAAA,IACH,MAAM,OAAOA,UACX;AAAA,MACE,MAAM,eAAe;AAAA,QACnB,MAAAA;AAAA,QACA,KAAK,QAAQ;AAAA,QACb,WAAW,WAAW;AAAA,MACxB,CAAC;AAAA,IACH;AAAA,IACF,OAAO,OAAOA,UACZ;AAAA,MACE,MAAM,gBAAgB;AAAA,QACpB,MAAAA;AAAA,QACA,KAAK,QAAQ,IAAI;AAAA,QACjB,KAAK,QAAQ;AAAA,QACb,WAAW,WAAW;AAAA,MACxB,CAAC;AAAA,IACH;AAAA,IACF,OAAO,OAAOA,UACZ;AAAA,MACE,MAAM,gBAAgB;AAAA,QACpB,MAAAA;AAAA,QACA,KAAK,QAAQ,IAAI;AAAA,QACjB,KAAK,QAAQ;AAAA,QACb,WAAW,WAAW;AAAA,MACxB,CAAC;AAAA,IACH;AAAA,IACF,QAAQ,OAAOA,UACb;AAAA,MACE,MAAM,iBAAiB;AAAA,QACrB,MAAAA;AAAA,QACA,KAAK,QAAQ,IAAI;AAAA,QACjB,KAAK,QAAQ;AAAA,QACb,WAAW,WAAW;AAAA,MACxB,CAAC;AAAA,IACH;AAAA,EACJ,CAAC;AACH;AAEA,eAAe,eAAeA,OAAwC;AACpE,MAAIA,MAAK,KAAK,CAAC,QAAQD,YAAW,IAAI,GAAG,CAAC,GAAG;AAC3C,WAAO,EAAE,UAAU,cAAc,SAAS,QAAQ,gBAAgB,EAAE;AAAA,EACtE;AAEA,QAAM,kBAAkBC,MAAK,OAAO,CAAC,QAAQ,QAAQ,QAAQ;AAC7D,MAAI,gBAAgB,SAAS,GAAG;AAC9B,WAAO;AAAA,MACL,UAAU,cAAc;AAAA,MACxB,QAAQ;AAAA;AAAA,EAAwC,gBAAgB,CAAC;AAAA,IACnE;AAAA,EACF;AAEA,QAAM,SAAS,wBAAwB;AAAA,IACrC,KAAK,QAAQ,IAAI;AAAA,IACjB,KAAK,QAAQ;AAAA,IACb,iBAAiB,oBAAoB;AAAA,EACvC,CAAC;AAED,SAAO;AAAA,IACL,UAAU,cAAc;AAAA,IACxB,QAAQ,KAAK,UAAU,MAAM,QAAQ,MAAM,CAAC;AAAA,EAC9C;AACF;AAEA,SAAS,mBAAmB,QAA6B;AACvD,MAAI,OAAO,QAAQ;AACjB,YAAQ,IAAI,OAAO,MAAM;AAAA,EAC3B;AAEA,MAAI,OAAO,QAAQ;AACjB,YAAQ,MAAM,OAAO,MAAM;AAAA,EAC7B;AAEA,UAAQ,WAAW,OAAO;AAC5B;AAEA,SAAS,oBAAoB,aAA8B;AACzD,SACE,oBAAoB,KAAK,WAAW,KACpC,wBAAwB,KAAK,WAAW;AAE5C;AAEA,SAAS,gCAAsC;AAC7C,UAAQ,MAAM,sDAAsD;AACpE,UAAQ,MAAM,EAAE;AAChB,gBAAc;AAChB;AAEA,SAAS,gBAAsB;AAC7B,UAAQ,IAAI;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,CA2Bb;AACD;AAEA,SAAS,kBAA0B;AACjC,SAAO;AAAA;AAAA;AAAA;AAIT;","names":["z","path","path","os","z","z","path","os","createHash","path","z","randomUUID","chmod","lstat","mkdir","readFile","rename","rm","writeFile","path","isNodeErrorCode","z","path","createHash","lstat","realpath","path","assertDirectory","safeLstat","isNodeErrorCode","z","z","path","path","args","slug","path","z","path","z","createHash","readFile","rename","writeFile","path","z","path","z","createHash","readFile","writeFile","rename","projectSlug","path","z","path","z","codec","mapReferenceError","project","path","createHash","randomBytes","os","z","z","args","os","displayName","randomBytes","createHash","command","args","readFile","path","z","z","requestJson","randomUUID","chmod","lstat","readFile","rename","rm","writeFile","path","isNodeErrorCode","HELP_FLAGS","z","args","usageError","filters","project","output","path","response","credential","grant","slug","readFile","path","path","commandError","readFile","z","z","deploymentResponseSchema","readFile","createHash","lstat","readFile","realpath","os","path","z","z","path","realpath","os","lstat","readFile","createHash","createHash","randomUUID","mkdir","readFile","rename","rm","writeFile","path","createHash","lstat","readFile","path","createHash","readFile","path","mkdir","randomUUID","checksum","rm","rename","writeFile","mkdir","readFile","writeFile","path","readFile","path","writeFile","path","packageName","mkdir","writeFile","fg","readFile","path","fg","readFile","path","fg","path","fg","path","fg","readFile","path","path","readFile","PLAYWRIGHT_SPEC_FILE","fg","spawn","createRequire","path","spawn","access","readFile","path","fileExists","access","readFile","path","filenames","command","args","spawn","createRequire","path","path","path","HELP_FLAGS","command","args","runProjectCommand","usageError","projectBindingStore","path","project","slug","commandError","path","z","requestJson","environmentCollectionPath","credentialCollectionPath","buildApiUrl","spawn","randomUUID","chmod","lstat","readFile","rename","rm","writeFile","path","path","assertSafeProjectRoot","isDotenvIgnored","readSafeDotenv","writeCredentialAtomically","lstat","isNodeErrorCode","readFile","randomUUID","writeFile","chmod","rename","rm","spawn","HELP_FLAGS","JSON_FLAG","ENVIRONMENT_FLAG","CREDENTIAL_FLAG","INSTALL_FLAG","NAME_FLAG","SLUG_FLAG","REPLACE_FLAG","splitFlag","usageError","args","runProjectCommand","runEnvironmentCommand","runCredentialCommand","parseProjectFlags","serviceGrantProvider","requireGrant","projects","requireProjectOrganization","stringifySafeJson","formatProjectListOutput","project","projectBindingStore","output","path","formatProjectError","parseEnvironmentFlags","slug","parseCredentialFlags","loadCredentialManagementContext","formatCredentialListOutput","credential","previousCredentials","exchange","result","formatCredentialError","parseFlags","grant","formatAuthError","parseArgs","runProjectCommand","args","runEnvironmentCommand","parseArgs","project","service","readFile","path","parseArgs","z","z","parseArgs","result","z","path","readFile","VerificationInstallation","verificationTarget","verifyCookieWebsite","environment","readFile","stat","path","parseArgs","z","z","parseArgs","path","stat","readFile","values","writeFile","path","parseArgs","z","randomUUID","writeFile","path","setTimeout","parseArgs","z","parseArgs","randomUUID","z","path","writeFile","setTimeout","parseArgs","z","path","writeFile","HELP_FLAGS","args","runProjectCommand"]}
|