@siteoshq/cli 2.0.0 → 2.1.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 +9 -4
- package/dist/cli.js +281 -188
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
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/adapters/node-json-document-store.ts","../src/core/adapters/node-repository-root.ts","../src/environment-slug.ts","../src/projects/project-api.ts","../src/pulse/config.ts","../src/pulse/errors.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/package-metadata.ts","../src/pulse-command.ts","../src/core/errors.ts","../src/pulse/api-client.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/siteos-search-api.ts","../src/siteos-search-credential.ts","../src/search-command.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-research-command.ts","../src/services/seo-report-client.ts","../src/services/seo-gsc-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 type { ProjectBindingStore } from \"./core/ports/project-binding-store.js\";\nimport { readLocalCommonProject } from \"./projects/project-context.js\";\n\nimport {\n findRepositoryRoot,\n RepositoryRootError,\n} from \"./core/adapters/node-repository-root.js\";\nimport { CONFIG_FILE, loadChecksConfigSnapshot } from \"./pulse/config.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 pulse: ProductProjectDiagnostic;\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 pulse = repositoryRoot\n ? await inspectPulse(repositoryRoot)\n : { path: path.join(cwd, CONFIG_FILE), status: \"missing\" as const };\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 = project.status === \"selected\";\n\n return {\n checks: {\n configHome: { path: configHome, status: \"ok\" },\n pulse,\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 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","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 { isValidEnvironmentSlug } from \"../environment-slug.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), \"projects.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 = environmentSlug ?? binding.environmentSlug;\n if (!selectedSlug)\n throw new SiteOSAuthApiError({\n code: \"PROJECT_ENVIRONMENT_REQUIRED\",\n message:\n \"Select an environment with `siteos project environment use <slug>`.\",\n });\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 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 if (slug && !isValidEnvironmentSlug(slug))\n throw new Error(\"--environment must be a valid environment slug.\");\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 JsonDocumentCodec,\n JsonDocumentSnapshot,\n JsonDocumentStore,\n} from \"../ports/json-document-store.js\";\nimport type {\n ProjectBinding,\n ProjectBindingLocator,\n ProjectBindingStore,\n} from \"../ports/project-binding-store.js\";\nimport {\n JsonDocumentStoreError,\n NodeJsonDocumentStore,\n} from \"./node-json-document-store.js\";\n\nconst projectBindingSchema = z\n .object({\n service: z.literal(\"project\"),\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(locator: ProjectBindingLocator): Promise<ProjectBinding | 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: ProjectBinding): Promise<ProjectBinding> {\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: ProjectBindingLocator): 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(locator: ProjectBindingLocator): 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: ProjectBindingLocator,\n): Promise<ProjectBindingLocator> {\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 Project binding is invalid.\",\n );\n }\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n throw new ProjectBindingStoreError(\n \"PROJECT_BINDINGS_INVALID\",\n \"The 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 \"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 \"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 \"Project bindings are invalid.\",\n );\n }\n }\n return new ProjectBindingStoreError(\n \"PROJECT_BINDINGS_UNAVAILABLE\",\n \"Project bindings could not be accessed.\",\n );\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","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 { 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 { 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});\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 environmentVariables: z\n .array(\n z\n .string()\n .regex(/^[A-Z][A-Z0-9_]{0,63}$/)\n .refine(\n (name) =>\n !/^(?:SITEOS_|PLAYWRIGHT_|DOCKER_|NODE_|NPM_|PNPM_|LD_|DYLD_)/.test(\n name,\n ) &&\n ![\n \"PATH\",\n \"HOME\",\n \"TMPDIR\",\n \"TMP\",\n \"TEMP\",\n \"CI\",\n \"DATABASE_URL\",\n \"RUNNER_SHARED_SECRET\",\n ].includes(name) &&\n !name.endsWith(\"_DATABASE_URL\") &&\n !name.endsWith(\"_R2_ACCESS_KEY_ID\") &&\n !name.endsWith(\"_R2_SECRET_ACCESS_KEY\"),\n \"This name is reserved by Pulse.\",\n ),\n )\n .max(50)\n .refine(\n (names) => new Set(names).size === names.length,\n \"Variable names must be unique.\",\n )\n .optional(),\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 })\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 });\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 { 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.\nA personal organization is set up automatically on first sign-in.\n\nManual organization creation is team administration, available only to verified @pixelpoint.io accounts.`;\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 { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n commonEnvironmentArguments,\n commonServiceContext,\n readLocalCommonProject,\n} from \"./projects/project-context.js\";\n\nimport { Ajv } from \"ajv\";\nimport addFormats from \"ajv-formats\";\nimport { z } from \"zod\";\n\nimport { createSiteOSServiceGrantProvider } from \"./auth/adapters/siteos-service-grant-provider.js\";\nimport type { ServiceGrantProvider } from \"./auth/application/service-grant-provider.js\";\nimport { ProjectBindingStoreError } 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 { isValidEnvironmentSlug } from \"./environment-slug.js\";\nimport { SiteOSAuthApiError } from \"./siteos-auth-api.js\";\nimport {\n createSiteOSFormsApiClient,\n formsSubmissionStatusSchema,\n SiteOSFormsApiError,\n} from \"./siteos-forms-api.js\";\nimport {\n prepareSiteOSFormsCredentialInstallation,\n SITEOS_FORMS_DEPLOYMENT_KEY_ENV,\n SITEOS_FORMS_SUBMISSION_CREDENTIAL_ENV,\n SiteOSFormsCredentialStorageError,\n type SiteOSFormsCredentialInstallation,\n} from \"./siteos-forms-credential.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 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 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 environmentSlug: 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 environmentSlug: 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 selectedEnvironment?: string;\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 const environmentFlags = args.flatMap((arg) =>\n arg.startsWith(\"--environment=\") ? [\"--environment\", arg.slice(14)] : [arg],\n );\n const environmentIndex = environmentFlags.indexOf(\"--environment\");\n options = {\n ...options,\n selectedEnvironment:\n environmentIndex >= 0\n ? environmentFlags[environmentIndex + 1]\n : undefined,\n };\n if ([\"project\", \"environment\"].includes(args[0] ?? \"\"))\n return usageError(\n \"Use `siteos project` to manage Projects and environments.\",\n );\n\n if (args[0] === \"deploy\")\n return runDeployment({ ...options, args: args.slice(1) });\n\n if (args[0] !== \"submit\") {\n try {\n args = await commonEnvironmentArguments(options, \"forms\", args);\n } catch (error) {\n if (error instanceof SiteOSAuthApiError)\n return formatAuthError(error).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] === \"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 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 siteos project 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 runCredentialCommand(options: {\n deployment?: boolean;\n args: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n selectedEnvironment?: string;\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 selectedEnvironment?: string;\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 if (!local)\n throw new SiteOSAuthApiError({\n code: \"PROJECT_REQUIRED\",\n message: \"Select a Project with `siteos project use <id-or-slug>`.\",\n });\n const rootDir = local.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 selectedEnvironment?: string;\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(\n options,\n \"forms\",\n options.selectedEnvironment,\n );\n if (!common)\n throw new SiteOSAuthApiError({\n code: \"PROJECT_REQUIRED\",\n message: \"Select a Project with `siteos project use <id-or-slug>`.\",\n });\n {\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 environmentSlug: common.environment.slug,\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 } catch (error) {\n return { error: formatManagementContextError(error), ok: false };\n }\n}\n\nasync function runDefinitionCommand(options: {\n args: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n selectedEnvironment?: string;\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 siteos project 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 selectedEnvironment?: string;\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 selectedEnvironment?: string;\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 selectedEnvironment?: string;\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 selectedEnvironment?: string;\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 selectedEnvironment?: string;\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 && common.binding.environmentSlug)\n return {\n apiBaseUrl: common.api.origin,\n commonProjectId: common.binding.project.id,\n environmentSlug: common.binding.environmentSlug,\n ok: true,\n organization: { id: common.binding.organizationId },\n project: { slug: common.binding.project.slug },\n credential,\n };\n throw new SiteOSAuthApiError({\n code: \"PROJECT_REQUIRED\",\n message: \"Select a Project with `siteos project use <id-or-slug>`.\",\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 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 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 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 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 selectedEnvironment?: string;\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 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 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 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 environmentSlug: 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;\n if (!projectId) {\n return undefined;\n }\n\n const url = new URL(\n `/projects/${encodeURIComponent(commonProjectId)}/forms?env=${encodeURIComponent(input.context.environmentSlug)}`,\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 selectedEnvironment?: string;\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 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();\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 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 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 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 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 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","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 path from \"node:path\";\nimport { parseArgs } from \"node:util\";\nimport {\n commonServiceContext,\n readCommonProject,\n} from \"./projects/project-context.js\";\n\nimport { createSiteOSServiceGrantProvider } from \"./auth/adapters/siteos-service-grant-provider.js\";\nimport type { ServiceGrantProvider } from \"./auth/application/service-grant-provider.js\";\nimport { ProjectBindingStoreError } 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 } from \"./pulse/api-client.js\";\nimport { createDeploymentBundle } from \"./pulse/bundle.js\";\nimport { loadChecksConfigSnapshot } from \"./pulse/config.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 { 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 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 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\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 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 projectRoot = path.resolve(options.cwd ?? process.cwd());\n const repositoryRoot = await findRepositoryRoot(projectRoot);\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,\n });\n if (values[\"dry-run\"]) {\n return success(\n values.json,\n { dryRun: true, manifest },\n [\n `Bundle: ${path.relative(projectRoot, manifest.archivePath)}`,\n `Checksum: ${manifest.checksum}`,\n `Files: ${manifest.fileCount}`,\n \"Dry run complete; nothing was uploaded.\",\n ].join(\"\\n\"),\n );\n }\n\n if (!common)\n throw new CliError(\n \"PROJECT_REQUIRED\",\n \"Select a Project with `siteos project use <id-or-slug>` before deploying.\",\n );\n const apiOrigin = common.api.origin;\n const grant = await acquirePulseGrant(options);\n const client = createPulseApiClient({\n apiOrigin,\n fetchImpl: options.fetchImpl,\n });\n const snapshot = await loadChecksConfigSnapshot(projectRoot);\n const selected = await requireSelectedProject({\n options,\n apiOrigin,\n client,\n grant,\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(projectRoot, 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 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 { project };\n }\n throw new CliError(\n \"PROJECT_REQUIRED\",\n \"Select a Project with `siteos project use <id-or-slug>` before deploying.\",\n );\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 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 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().nullable().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_AUTH_BASE_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 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 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, 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 { 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 });\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 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]);\n// Advisory only: computed names and destructuring still require explicit declarations.\nconst ENVIRONMENT_PATTERN =\n /\\bprocess\\.env(?:\\.([A-Z][A-Z0-9_]*)\\b|\\[\\s*[\"']([A-Z][A-Z0-9_]*)[\"']\\s*\\])/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 const name = match[1] ?? match[2];\n if (name && name !== \"PLAYWRIGHT_BASE_URL\") {\n environmentVariables.add(name);\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 { 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 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\"];\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 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 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 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 {\n commonEnvironmentArguments,\n commonServiceContext,\n readLocalCommonProject,\n} from \"./projects/project-context.js\";\n\nimport { createSiteOSServiceGrantProvider } from \"./auth/adapters/siteos-service-grant-provider.js\";\nimport type { ServiceGrantProvider } from \"./auth/application/service-grant-provider.js\";\nimport { ProjectBindingStoreError } 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 { isValidEnvironmentSlug } from \"./environment-slug.js\";\nimport { SiteOSAuthApiError } from \"./siteos-auth-api.js\";\nimport type { SiteOSSearchCredentialMetadata } from \"./siteos-search-api.js\";\nimport {\n createSiteOSSearchApiClient,\n SiteOSSearchApiError,\n type FetchLike,\n} from \"./siteos-search-api.js\";\nimport {\n prepareSiteOSSearchCredentialInstallation,\n prepareSiteOSSearchIndexingCredentialInstallation,\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\";\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 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 selectedEnvironment?: string;\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 const environmentFlags = options.args.flatMap((arg) =>\n arg.startsWith(\"--environment=\") ? [\"--environment\", arg.slice(14)] : [arg],\n );\n const environmentIndex = environmentFlags.indexOf(\"--environment\");\n options = {\n ...options,\n selectedEnvironment:\n environmentIndex >= 0\n ? environmentFlags[environmentIndex + 1]\n : undefined,\n };\n if ([\"project\", \"environment\"].includes(options.args[0] ?? \"\"))\n return usageError(\n \"Use `siteos project` to manage Projects and environments.\",\n );\n\n {\n try {\n options = {\n ...options,\n args: await commonEnvironmentArguments(options, \"search\", options.args),\n };\n } catch (error) {\n if (error instanceof SiteOSAuthApiError)\n return formatAuthError(error).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 === \"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 runCredentialCommand(options: {\n args: string[];\n credentialKind: \"indexing\" | \"query\";\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n selectedEnvironment?: string;\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 selectedEnvironment?: string;\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 if (!local)\n throw new SiteOSAuthApiError({\n code: \"PROJECT_REQUIRED\",\n message: \"Select a Project with `siteos project use <id-or-slug>`.\",\n });\n const rootDir = local.rootDir;\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 selectedEnvironment?: string;\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 selectedEnvironment?: string;\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 selectedEnvironment?: string;\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(\n options,\n \"search\",\n options.selectedEnvironment,\n );\n if (!common)\n throw new SiteOSAuthApiError({\n code: \"PROJECT_REQUIRED\",\n message: \"Select a Project with `siteos project use <id-or-slug>`.\",\n });\n {\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 } 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 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 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 selectedEnvironment?: string;\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 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 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 { 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 PROJECT_SERVICES,\n type CommonProject,\n type ProjectService,\n} from \"./project-api.js\";\nimport {\n commonProjectRuntime,\n readCommonProject,\n type ProjectCommandOptions,\n} from \"./project-context.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> [--environment <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 === \"use\"\n ? { environment: { type: \"string\" as const } }\n : {}),\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 const environment = project.environments.find(\n (item) => item.slug === (parsed.values.environment ?? \"production\"),\n );\n if (!environment)\n throw new Error(\n \"Select an available Project environment with --environment <slug>.\",\n );\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 environmentSlug: environment.slug,\n });\n result = { project, environment };\n message = `Selected ${project.name} / ${environment.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\" ? positionals[0] : 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 readCommonProject,\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 terms show [--json]\n siteos cookie terms accept --version <reviewed-version> --confirm [--json]\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 read and explicitly accept Cookie service terms before siteos project connect cookie.\nAccept only after an organization owner or admin has reviewed and authorized that exact version.\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 confirm: { type: \"boolean\" },\n version: { type: \"string\" },\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 \"terms show\": [],\n \"terms accept\": [\"version\", \"confirm\"],\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 isCookieTerms = service === \"cookie\" && action === \"terms\";\n if (\n isCookieTerms &&\n subaction === \"accept\" &&\n (!values.version || !values.confirm)\n )\n throw new Error(\n \"Read siteos cookie terms show, then explicitly pass --version <reviewed-version> --confirm.\",\n );\n const runtime = commonProjectRuntime(options);\n const common =\n service === \"integrations\"\n ? null\n : isCookieTerms\n ? await readCommonProject(options).then((context) =>\n context ? { ...context, resourceId: \"\" } : null,\n )\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 (isCookieTerms)\n result =\n subaction === \"show\"\n ? await request(\"/terms\")\n : await request(\"/terms\", \"POST\", {\n version: values.version,\n accepted: true,\n });\n else 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>] [--filters <json>] [--environment <slug>] [--json]\n siteos analytics realtime [--country <ISO|unknown>] [--campaign <id>] [--filters <json>] [--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 filters: { 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: {\n args: 1,\n flags: [\"days\", \"event\", \"country\", \"campaign\", \"filters\"],\n },\n realtime: { args: 1, flags: [\"country\", \"campaign\", \"filters\"] },\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 [\n \"days\",\n \"event\",\n \"country\",\n \"campaign\",\n \"filters\",\n ] 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 RESEARCH_HELP,\n runSeoResearchCommand,\n} from \"./seo-research-command.js\";\nimport { GSC_HELP, runSeoGscCommand } from \"./seo-gsc-command.js\";\nimport {\n PERFORMANCE_HELP,\n runSeoPerformanceCommand,\n} from \"./seo-performance-command.js\";\nexport const SEO_HELP = `SEO/GEO: audit your website and research search-engine and AI visibility in the selected Project environment.\n\nSite Audit checks public HTML, canonical, robots.txt, sitemap and technical GEO signals.\nPerformance measures selected pages with Lighthouse and compares response/rendered HTML.\nResearch covers keywords, rankings, competitors, backlinks, Brand lookup and Prompt checks.\nGSC Insights reads your connected property's Google Search Console data; other research needs no GSC.\nTechnical GEO checks crawler policies, content, snippets and structured-data syntax/shape.\nThese checks do not measure autonomous agent journeys or guarantee AI inclusion or citations.\nThe service is named SEO/GEO in the application; its command remains siteos seo.\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${RESEARCH_HELP.trim().split(\"\\n\\n\")[0]}\n${GSC_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${RESEARCH_HELP.trim().split(\"\\n\\n\").slice(1).join(\"\\n\\n\")}\n${GSC_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 if (options.args[0] === \"research\") return runSeoResearchCommand(options);\n if (options.args[0] === \"gsc\") return runSeoGscCommand(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 { setTimeout } from \"node:timers/promises\";\nimport { isDeepStrictEqual, parseArgs } from \"node:util\";\nimport { z } from \"zod\";\nimport type { CommandResult } from \"../core/command-result.js\";\nimport type { ProjectCommandOptions } from \"../projects/project-context.js\";\nimport {\n readSeoInput,\n seoReportClient,\n seoReportFailure,\n versionedReport,\n writeSeoReport,\n} from \"./seo-report-client.js\";\n\nexport const RESEARCH_HELP = `\n siteos seo research summary [--environment <slug>] [--json]\n siteos seo research status --kind <kind> [--environment <slug>] [--json]\n siteos seo research history --kind <kind> [--environment <slug>] [--json]\n siteos seo research show <run-id> [--environment <slug>] [--json]\n siteos seo research plan --input <request.json> [--environment <slug>] [--json]\n siteos seo research run --input <request.json> [--idempotency-key <key>] [--environment <slug>] [--json]\n siteos seo research wait <run-id> [--timeout <seconds>] [--environment <slug>] [--json]\n siteos seo research cancel <run-id> [--environment <slug>] [--json]\n siteos seo research export <run-id> --format <json|csv> --output <new-file> [--environment <slug>] [--json]\n siteos seo research serp show <run-id> --keyword <word> [--environment <slug>] [--json]\n siteos seo research serp ensure <run-id> --keyword <word> [--environment <slug>] [--json]\n siteos seo research serp wait <run-id> --keyword <word> [--timeout <seconds>] [--environment <slug>] [--json]\n siteos seo research serp export <run-id> --keyword <word> --format <json|csv> --output <new-file> [--environment <slug>] [--json]\n siteos seo research saved list --kind <kind> [--environment <slug>] [--json]\n siteos seo research saved save --input <request.json> --name <name> [--id <saved-id>] [--environment <slug>] [--json]\n siteos seo research saved remove <saved-id> [--environment <slug>] [--json]\n\nResearch kinds: keywords, domain, rankings, backlinks, brand, ai-visibility.\nDomain Overview: {\"kind\":\"domain\",\"target\":\"example.com\",\"country\":\"US\",\"language\":\"en\"}.\nDomain collects summary, ranking keywords, top pages and competitors. The legacy competitors kind retains its two-part plan; domain history includes those reports.\nRequest JSON: {\"kind\":\"keywords\",\"target\":\"example.com\",\"keywords\":[\"website analytics\"],\"country\":\"US\",\"language\":\"en\"}.\nRankings accepts up to 10 keywords and 5 competitors. AI visibility requires brand, prompt and platforms.\nMarkets: US, GB, ES, DE, FR, CA, AU. Languages: en, es, de, fr, pt, it, nl, ru.\nPlatforms: chat_gpt, claude, gemini, perplexity. Brand lookup uses brandPlatform chat_gpt|google and brandMatch domain|brand.\nPlan validates the request and shows planned parts and available research credits without enqueueing work.\nRun consumes Organization research credits through the same worker as the interface. Preserve the retry key after an uncertain response.\nSERP ensure collects one saved organic snapshot for a keyword returned by the selected completed Keyword Research report. It uses research credits once; repeating the same report/word returns the saved job, including failures. Show/wait/export only read and never spend. New reports can collect fresh snapshots.\nHistory returns the latest 30 checks per kind; show/export can address older retained run IDs. Saved checks are limited to 100 per resource.\nWait defaults to 120 seconds (maximum 900); exit 3 means still pending, exit 4 means failed or cancelled. Partial evidence stays accessible.\nExports preserve scope, dates and partial state. CSV stores one dataset row as JSON per row, including failed parts; it never converts missing metrics to zero.\n`;\nconst kinds = [\n \"keywords\",\n \"rankings\",\n \"competitors\",\n \"backlinks\",\n \"brand\",\n \"ai-visibility\",\n] as const;\nconst requestSchema = z\n .object({\n kind: z\n .enum([\"domain\", ...kinds])\n .transform((kind) => (kind === \"domain\" ? \"competitors\" : kind)),\n target: z.string().min(1).max(253),\n })\n .passthrough();\nconst runStates = z.enum([\n \"queued\",\n \"running\",\n \"completed\",\n \"partial\",\n \"failed\",\n \"cancelled\",\n]);\nconst csvCell = (value: unknown) => {\n let text =\n value == null\n ? \"\"\n : typeof value === \"object\"\n ? JSON.stringify(value)\n : String(value);\n if (/^[\\s]*[=+@-]/u.test(text) || /^[\\t\\r\\n]/u.test(text)) text = `'${text}`;\n return `\"${text.replaceAll('\"', '\"\"')}\"`;\n};\nexport async function runSeoResearchCommand(\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 kind: { type: \"string\" },\n keyword: { type: \"string\" },\n input: { type: \"string\" },\n name: { type: \"string\" },\n id: { type: \"string\" },\n \"idempotency-key\": { type: \"string\" },\n timeout: { type: \"string\" },\n format: { type: \"string\" },\n output: { type: \"string\" },\n },\n });\n const action = [\"saved\", \"serp\"].includes(positionals[0] ?? \"\")\n ? positionals.slice(0, 2).join(\" \")\n : (positionals[0] ?? \"\");\n const id = positionals[action.includes(\" \") ? 2 : 1];\n const operations: Record<string, { args: number; flags: string[] }> = {\n \"serp show\": { args: 3, flags: [\"keyword\"] },\n \"serp ensure\": { args: 3, flags: [\"keyword\"] },\n \"serp wait\": { args: 3, flags: [\"keyword\", \"timeout\"] },\n \"serp export\": { args: 3, flags: [\"keyword\", \"format\", \"output\"] },\n summary: { args: 1, flags: [] },\n status: { args: 1, flags: [\"kind\"] },\n history: { args: 1, flags: [\"kind\"] },\n show: { args: 2, flags: [] },\n plan: { args: 1, flags: [\"input\"] },\n run: { args: 1, flags: [\"input\", \"idempotency-key\"] },\n wait: { args: 2, flags: [\"timeout\"] },\n cancel: { args: 2, flags: [] },\n export: { args: 2, flags: [\"format\", \"output\"] },\n \"saved list\": { args: 2, flags: [\"kind\"] },\n \"saved save\": { args: 2, flags: [\"input\", \"name\", \"id\"] },\n \"saved remove\": { args: 3, flags: [] },\n };\n const operation = operations[action];\n if (\n !operation ||\n operation.args !== positionals.length ||\n Object.keys(values).some(\n (key) => ![\"json\", \"environment\", ...operation.flags].includes(key),\n )\n )\n throw new Error(\n \"Invalid research operation or flags. Run siteos seo --help.\",\n );\n if (\n action.startsWith(\"serp \") &&\n (!values.keyword?.trim() || values.keyword.length > 200)\n )\n throw new Error(\n \"Provide --keyword with 1 to 200 characters from the selected keyword report.\",\n );\n if (values.kind === \"domain\") values.kind = \"competitors\";\n if (\n operation.flags.includes(\"kind\") &&\n !kinds.includes(values.kind as (typeof kinds)[number])\n )\n throw new Error(\"Choose a documented --kind.\");\n if (operation.flags.includes(\"input\") && !values.input)\n throw new Error(\"Provide --input with a research request JSON file.\");\n if (\n action === \"saved save\" &&\n (!values.name?.trim() || values.name.length > 100)\n )\n throw new Error(\"Use --name with 1 to 100 characters.\");\n if (values.id && values.id.length > 100)\n throw new Error(\"The saved ID is too long.\");\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 [\"export\", \"serp export\"].includes(action) &&\n (!values.output || ![\"json\", \"csv\"].includes(values.format ?? \"\"))\n )\n throw new Error(\n \"Export requires --format json|csv and --output for a new file.\",\n );\n let input: unknown;\n if (values.input) {\n input = await readSeoInput(options.cwd, values.input);\n if (!requestSchema.safeParse(input).success)\n throw new Error(\n \"The request file needs a research kind and target domain. Run siteos seo --help.\",\n );\n }\n if (action === \"run\") {\n idempotencyKey = values[\"idempotency-key\"] ?? randomUUID();\n if (!/^[a-zA-Z0-9_-]{8,100}$/u.test(idempotencyKey))\n throw new Error(\n \"Use an idempotency key of 8 to 100 letters, digits, underscores or hyphens.\",\n );\n }\n const client = await seoReportClient(options, values.environment);\n const resourceSchema = z\n .object({\n id: z.literal(client.resourceId),\n organizationId: z.literal(client.organizationId),\n })\n .passthrough();\n const runSchema = z\n .object({\n id: z.string(),\n resourceId: z.literal(client.resourceId),\n organizationId: z.literal(client.organizationId),\n websiteUrl: z.string(),\n request: requestSchema,\n state: runStates,\n createdAt: z.string(),\n finishedAt: z.string().nullable(),\n parts: z.array(\n z\n .object({\n key: z.string(),\n state: z.enum([\"completed\", \"failed\"]),\n error: z.string().nullable(),\n dataset: z.record(z.unknown()).nullable(),\n observedAt: z.string(),\n })\n .passthrough(),\n ),\n })\n .passthrough();\n const get = async (suffix: string, scope = \"read\", body?: unknown) =>\n versionedReport.parse(\n await (\n await client.request(\n `/research${suffix}`,\n `seo:research:${scope}`,\n body,\n )\n ).json(),\n );\n const query = `?kind=${encodeURIComponent(values.kind ?? \"rankings\")}`;\n let record: Record<string, unknown>;\n if (action.startsWith(\"serp \")) {\n const snapshotSchema = z\n .object({\n id: z.string(),\n organizationId: z.literal(client.organizationId),\n resourceId: z.literal(client.resourceId),\n sourceRunId: z.literal(id!),\n request: requestSchema,\n keywordKey: z.literal(\n values\n .keyword!.normalize(\"NFKC\")\n .trim()\n .toLowerCase()\n .replace(/\\s+/gu, \" \"),\n ),\n state: z.enum([\n \"queued\",\n \"running\",\n \"completed\",\n \"failed\",\n \"cancelled\",\n ]),\n dataset: z\n .object({\n type: z.literal(\"serp\"),\n keyword: z.string(),\n country: z.string(),\n language: z.string(),\n device: z.enum([\"desktop\", \"mobile\"]),\n observedAt: z.string(),\n rows: z.array(\n z.object({\n position: z.number(),\n title: z.string(),\n url: z.string(),\n domain: z.string(),\n description: z.string(),\n }),\n ),\n })\n .nullable(),\n })\n .passthrough();\n const suffix = `/runs/${encodeURIComponent(id!)}/serp`;\n const read = () =>\n get(`${suffix}?keyword=${encodeURIComponent(values.keyword!)}`);\n record =\n action === \"serp ensure\"\n ? await get(suffix, \"run\", { keyword: values.keyword })\n : await read();\n const deadline = Date.now() + timeout * 1000;\n let snapshot =\n record.serp == null ? null : snapshotSchema.parse(record.serp);\n if (action === \"serp ensure\" && !snapshot)\n throw new Error(\n \"The server did not return the admitted SERP snapshot.\",\n );\n while (\n action === \"serp wait\" &&\n snapshot &&\n [\"queued\", \"running\"].includes(snapshot.state)\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(2000, Math.max(0, deadline - Date.now())));\n record = await read();\n snapshot =\n record.serp == null ? null : snapshotSchema.parse(record.serp);\n }\n if (action === \"serp export\") {\n if (!snapshot)\n throw new Error(\"No saved SERP exists for this report and keyword.\");\n const data = snapshot.dataset;\n const content =\n values.format === \"json\"\n ? JSON.stringify(record, null, 2)\n : [\n [\n \"report_id\",\n \"keyword\",\n \"country\",\n \"language\",\n \"device\",\n \"state\",\n \"observed_at\",\n \"error\",\n \"position\",\n \"title\",\n \"url\",\n \"description\",\n ],\n ...(data?.rows.length ? data.rows : [null]).map((row) => [\n id,\n values.keyword,\n data?.country,\n data?.language,\n data?.device,\n snapshot.state,\n data?.observedAt,\n snapshot.error,\n row?.position,\n row?.title,\n row?.url,\n row?.description,\n ]),\n ]\n .map((row) => row.map(csvCell).join(\",\"))\n .join(\"\\r\\n\");\n const output = await writeSeoReport(options, values.output!, content);\n record = {\n contractVersion: 1,\n runId: id,\n keyword: values.keyword,\n state: snapshot.state,\n format: values.format,\n output,\n };\n }\n return {\n exitCode:\n action === \"serp wait\" &&\n (!snapshot || [\"failed\", \"cancelled\"].includes(snapshot.state))\n ? 4\n : 0,\n stdout: JSON.stringify(record, null, 2),\n };\n }\n if (action === \"plan\" || action === \"run\" || action === \"saved save\") {\n const plan = await get(\"/plan\", \"read\", input);\n resourceSchema.parse(plan.resource);\n const canonical = requestSchema.parse(plan.request);\n if (canonical.kind !== requestSchema.parse(input).kind)\n throw new Error(\"The plan does not match the requested research kind.\");\n // Use the original request on admission: validation cannot silently retarget a paid check.\n if (action === \"run\") {\n record = await get(\"/runs\", \"run\", { request: input, idempotencyKey });\n const run = runSchema.parse(record.run);\n if (!isDeepStrictEqual(run.request, plan.request))\n throw new Error(\n \"The admitted check does not match the validated research request.\",\n );\n record = { ...record, idempotencyKey };\n } else if (action === \"saved save\") {\n record = await get(\"/saved\", \"write\", {\n request: input,\n name: values.name!.trim(),\n ...(values.id ? { id: values.id } : {}),\n });\n const saved = z\n .object({\n id: z.string(),\n name: z.literal(values.name!.trim()),\n request: requestSchema,\n })\n .parse(record.saved);\n if (\n (values.id && saved.id !== values.id) ||\n !isDeepStrictEqual(saved.request, plan.request)\n )\n throw new Error(\n \"The saved check does not match the requested settings.\",\n );\n } else record = plan;\n } else if (action === \"cancel\" || action === \"saved remove\") {\n record = await get(\n `/${action === \"cancel\" ? \"runs\" : \"saved\"}/${encodeURIComponent(id!)}/${action === \"cancel\" ? \"cancel\" : \"remove\"}`,\n action === \"cancel\" ? \"run\" : \"write\",\n {},\n );\n z.literal(true).parse(\n record[action === \"cancel\" ? \"cancelled\" : \"removed\"],\n );\n } else if (action === \"summary\") {\n record = await get(\"/summary\");\n resourceSchema.parse(record.resource);\n z.array(z.object({ kind: z.enum(kinds), summary: z.unknown() })).parse(\n record.checks,\n );\n } else if ([\"status\", \"history\", \"saved list\"].includes(action)) {\n const view = await get(query);\n resourceSchema.parse(view.resource);\n const runs = z.array(runSchema).parse(view.runs);\n const saved = z\n .array(\n z\n .object({\n id: z.string(),\n name: z.string(),\n request: requestSchema,\n })\n .passthrough(),\n )\n .parse(view.saved);\n if (\n runs.some((r) => r.request.kind !== values.kind) ||\n saved.some((r) => r.request.kind !== values.kind)\n )\n throw new Error(\n \"The response does not match the requested research kind.\",\n );\n if (view.run != null) {\n const selected = runSchema.parse(view.run);\n if (selected.request.kind !== values.kind)\n throw new Error(\"The selected report has a different research kind.\");\n }\n record = {\n contractVersion: 1,\n resource: view.resource,\n kind: values.kind,\n ...(action === \"history\"\n ? { runs, limit: 30 }\n : action === \"saved list\"\n ? { saved, limit: 100 }\n : { connection: view.connection, run: view.run }),\n };\n } else {\n const deadline = Date.now() + timeout * 1000;\n while (true) {\n record = await get(`/runs/${encodeURIComponent(id!)}`);\n resourceSchema.parse(record.resource);\n const run = runSchema.parse(record.run);\n if (run.id !== id)\n throw new Error(\n \"The response does not match the selected research check.\",\n );\n if (record.previous) runSchema.parse(record.previous);\n if (action !== \"wait\" || ![\"queued\", \"running\"].includes(run.state))\n break;\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 if (action === \"export\") {\n const run = runSchema.parse(record.run);\n const parts = run.parts.length\n ? run.parts\n : [\n {\n key: null,\n state: null,\n observedAt: null,\n error: run.error,\n dataset: null,\n },\n ];\n const rows = parts.flatMap((part) => {\n const dataset = part.dataset;\n const entries =\n dataset && Array.isArray(dataset.rows) ? dataset.rows : [dataset];\n return (entries.length ? entries : [null]).map((row) => [\n run.id,\n run.websiteUrl,\n run.request.kind,\n run.request.target,\n run.createdAt,\n run.state,\n run.error,\n part.key,\n part.state,\n part.observedAt,\n part.error,\n dataset?.type,\n run.request,\n dataset\n ? Object.fromEntries(\n Object.entries(dataset).filter(([key]) => key !== \"rows\"),\n )\n : null,\n row,\n ]);\n });\n const content =\n values.format === \"json\"\n ? JSON.stringify(record, null, 2)\n : [\n [\n \"run_id\",\n \"website_url\",\n \"kind\",\n \"target\",\n \"created_at\",\n \"run_state\",\n \"run_error\",\n \"part\",\n \"part_state\",\n \"observed_at\",\n \"error\",\n \"dataset_type\",\n \"request_json\",\n \"dataset_metadata_json\",\n \"data_json\",\n ],\n ...rows,\n ]\n .map((row) => row.map(csvCell).join(\",\"))\n .join(\"\\r\\n\");\n const output = await writeSeoReport(options, values.output!, content);\n record = {\n contractVersion: 1,\n runId: id,\n state: run.state,\n format: values.format,\n output,\n };\n }\n if (\n action === \"wait\" &&\n [\"failed\", \"cancelled\"].includes(runSchema.parse(record.run).state)\n )\n return { exitCode: 4, stdout: JSON.stringify(record, null, 2) };\n }\n return { exitCode: 0, stdout: JSON.stringify(record, null, 2) };\n } catch (cause) {\n return seoReportFailure(\n cause,\n options.args.includes(\"--json\"),\n idempotencyKey,\n );\n }\n}\n","import { open, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\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 async function seoReportClient(\n options: ProjectCommandOptions,\n environment?: string,\n) {\n const context = await commonServiceContext(options, \"seo\", environment);\n if (!context)\n throw new Error(\"Select a SiteOS Project with siteos project use first.\");\n const runtime = commonProjectRuntime(options);\n return {\n resourceId: context.resourceId,\n organizationId: context.overview.project.organizationId,\n async request(\n suffix: string,\n scope: string,\n body?: unknown,\n ): Promise<Response> {\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 SiteOSAuthApiError({\n code: \"AUTH_INVALID_RESPONSE\",\n message: \"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)}${suffix}`,\n {\n method: body === undefined ? \"GET\" : \"POST\",\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(30000),\n },\n );\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(await response.json());\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 if (!(response instanceof Response))\n throw new Error(\"The API transport does not support SEO reports.\");\n return response;\n },\n };\n}\nexport type SeoReportClient = Awaited<ReturnType<typeof seoReportClient>>;\nexport const versionedReport = z\n .object({ contractVersion: z.literal(1) })\n .passthrough();\nexport async function readSeoInput(\n cwd: string | undefined,\n filename: string,\n): Promise<unknown> {\n const file = await open(path.resolve(cwd ?? process.cwd(), filename), \"r\");\n try {\n const stat = await file.stat();\n if (!stat.isFile() || stat.size > 32000)\n throw new Error(\"Use a JSON request file of at most 32,000 bytes.\");\n const buffer = Buffer.alloc(32001);\n let bytes = 0;\n while (bytes < buffer.length) {\n const read = await file.read(buffer, bytes, buffer.length - bytes, null);\n if (!read.bytesRead) break;\n bytes += read.bytesRead;\n }\n if (bytes > 32000)\n throw new Error(\"Use a JSON request file of at most 32,000 bytes.\");\n try {\n return JSON.parse(buffer.subarray(0, bytes).toString(\"utf8\"));\n } catch {\n throw new Error(\"The request file must contain valid JSON.\");\n }\n } finally {\n await file.close();\n }\n}\nexport async function writeSeoReport(\n options: ProjectCommandOptions,\n filename: string,\n content: string,\n) {\n const output = path.resolve(options.cwd ?? process.cwd(), filename);\n await writeFile(output, content, { flag: \"wx\", mode: 0o600 });\n return output;\n}\nexport function seoReportFailure(\n cause: unknown,\n json: boolean,\n idempotencyKey?: string,\n): CommandResult {\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 ? {\n stdout: JSON.stringify({\n error,\n ...(idempotencyKey ? { idempotencyKey } : {}),\n }),\n }\n : {\n stderr: `${error.message}${idempotencyKey ? ` Retry key: ${idempotencyKey}` : \"\"}`,\n }),\n };\n}\n","import { parseArgs } from \"node:util\";\nimport { z } from \"zod\";\nimport type { CommandResult } from \"../core/command-result.js\";\nimport type { ProjectCommandOptions } from \"../projects/project-context.js\";\nimport {\n seoReportClient,\n seoReportFailure,\n versionedReport,\n writeSeoReport,\n} from \"./seo-report-client.js\";\n\nexport const GSC_HELP = `\n siteos seo gsc status [--environment <slug>] [--json]\n siteos seo gsc report [--dataset <pages|queries>] [--query <text>] [--filter <all|issues|declining>] [--sort <clicks|change|impressions>] [--page <number>] [--url <page-url>] [--environment <slug>] [--json]\n siteos seo gsc export --format <json|csv> --output <new-file> [--dataset <pages|queries>] [--query <text>] [--filter <all|issues|declining>] [--sort <clicks|change|impressions>] [--environment <slug>] [--json]\n siteos seo gsc sync [--environment <slug>] [--json]\n siteos seo gsc bind --connection <id> --property <site-url> --website <environment-url> --revision <number> [--environment <slug>] [--json]\n siteos seo gsc disconnect --revision <number> [--environment <slug>] [--json]\n\nGSC Insights reads saved Google Search Console reports; it requires a connected property for this environment.\nStatus lists the property directory, binding, latest synchronization and report freshness. Connect Google OAuth interactively in SiteOS first.\nReport defaults to all pages and shows 25 rows per page, measured totals and coverage. --url includes the selected page and its query evidence.\nExport includes every matching row of the selected saved comparison (up to 20,000), with report dates and truncation metadata; --page is not an export filter.\nSync queues the existing background worker and does not wait for completion. Read status until the returned run finishes.\nBind/disconnect require a current revision and separate settings authority. Disconnect removes only this environment binding, not the Google account.\n`;\nexport async function runSeoGscCommand(\n options: ProjectCommandOptions & { args: string[] },\n): Promise<CommandResult> {\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 dataset: { type: \"string\" },\n query: { type: \"string\" },\n filter: { type: \"string\" },\n sort: { type: \"string\" },\n page: { type: \"string\" },\n url: { type: \"string\" },\n format: { type: \"string\" },\n output: { type: \"string\" },\n connection: { type: \"string\" },\n property: { type: \"string\" },\n website: { type: \"string\" },\n revision: { type: \"string\" },\n },\n });\n const action = positionals[0] ?? \"\";\n const operations: Record<string, string[]> = {\n status: [],\n report: [\"dataset\", \"query\", \"filter\", \"sort\", \"page\", \"url\"],\n export: [\"dataset\", \"query\", \"filter\", \"sort\", \"format\", \"output\"],\n sync: [],\n bind: [\"connection\", \"property\", \"website\", \"revision\"],\n disconnect: [\"revision\"],\n };\n if (\n !operations[action] ||\n positionals.length !== 1 ||\n Object.keys(values).some(\n (key) => ![\"json\", \"environment\", ...operations[action]!].includes(key),\n )\n )\n throw new Error(\"Invalid GSC operation or flags. Run siteos seo --help.\");\n if (values.dataset && ![\"pages\", \"queries\"].includes(values.dataset))\n throw new Error(\"Use --dataset pages or queries.\");\n if (\n values.filter &&\n ![\"all\", \"issues\", \"declining\"].includes(values.filter)\n )\n throw new Error(\"Use --filter all, issues or declining.\");\n if (\n values.sort &&\n ![\"clicks\", \"change\", \"impressions\"].includes(values.sort)\n )\n throw new Error(\"Use --sort clicks, change or impressions.\");\n if (\n values.page &&\n (!/^[1-9]\\d{0,3}$/u.test(values.page) || Number(values.page) > 4000)\n )\n throw new Error(\"Use a page number between 1 and 4000.\");\n if ((values.query?.length ?? 0) > 160 || (values.url?.length ?? 0) > 2048)\n throw new Error(\"The report filter is too long.\");\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 (\n [\"bind\", \"disconnect\"].includes(action) &&\n (!/^\\d{1,9}$/u.test(values.revision ?? \"\") ||\n (action === \"disconnect\" && Number(values.revision) < 1))\n )\n throw new Error(\n \"Use the current binding --revision (0 only before the first binding).\",\n );\n if (\n action === \"bind\" &&\n (!values.connection || !values.property || !values.website)\n )\n throw new Error(\n \"Binding requires --connection, --property, --website and --revision.\",\n );\n const client = await seoReportClient(options, values.environment);\n const query = new URLSearchParams({\n dataset: values.dataset ?? \"pages\",\n filter: values.filter ?? \"all\",\n });\n for (const [flag, key] of [\n [\"query\", \"q\"],\n [\"sort\", \"sort\"],\n [\"page\", \"page\"],\n [\"url\", \"pageUrl\"],\n [\"format\", \"format\"],\n ] as const)\n if (values[flag]) query.set(key, values[flag]);\n const writing = [\"sync\", \"bind\", \"disconnect\"].includes(action);\n const suffix =\n action === \"bind\"\n ? \"/binding\"\n : writing\n ? `/${action}`\n : action === \"export\"\n ? `/export?${query}`\n : `?${query}`;\n const body =\n action === \"bind\"\n ? {\n connectionId: values.connection,\n siteUrl: values.property,\n websiteUrl: values.website,\n expectedRevision: Number(values.revision),\n }\n : action === \"disconnect\"\n ? { expectedRevision: Number(values.revision) }\n : writing\n ? {}\n : undefined;\n const response = await client.request(\n `/search-console${suffix}`,\n `seo:search:${action === \"sync\" ? \"sync\" : writing ? \"write\" : \"read\"}`,\n body,\n );\n const runSchema = z\n .object({\n id: z.string(),\n resourceId: z.literal(client.resourceId),\n organizationId: z.literal(client.organizationId),\n websiteUrl: z.string(),\n siteUrl: z.string(),\n state: z.enum([\n \"queued\",\n \"running\",\n \"completed\",\n \"partial\",\n \"failed\",\n \"cancelled\",\n ]),\n dates: z.unknown(),\n })\n .passthrough();\n const bindingSchema = z\n .object({\n resourceId: z.literal(client.resourceId),\n organizationId: z.literal(client.organizationId),\n websiteUrl: z.string(),\n siteUrl: z.string(),\n revision: z.number().int().positive(),\n })\n .passthrough();\n const metrics = z\n .object({\n clicks: z.number(),\n impressions: z.number(),\n ctr: z.number(),\n position: z.number(),\n })\n .passthrough()\n .nullable();\n const validateView = (data: unknown) => {\n const record = versionedReport.parse(data);\n z.literal(client.resourceId).parse(record.resourceId);\n bindingSchema.nullable().parse(record.binding);\n runSchema.nullable().parse(record.latest);\n runSchema.nullable().parse(record.report);\n z.array(\n z\n .object({ key: z.string(), current: metrics, previous: metrics })\n .passthrough(),\n ).parse(record.rows);\n z.number().int().nonnegative().parse(record.total);\n z.literal(values.dataset ?? \"pages\").parse(record.dataset);\n return record;\n };\n if (action === \"export\") {\n const rows = Number(response.headers.get(\"X-SEO-Export-Rows\"));\n const reportId = response.headers.get(\"X-SEO-Search-Id\");\n const truncated = response.headers.get(\"X-SEO-Export-Truncated\");\n if (\n response.headers.get(\"X-SEO-Resource-Id\") !== client.resourceId ||\n !reportId ||\n !response.headers.has(\"X-SEO-Export-Rows\") ||\n !Number.isSafeInteger(rows) ||\n rows < 0 ||\n ![\"true\", \"false\"].includes(truncated ?? \"\") ||\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 this SEO resource.\",\n );\n const text = await response.text();\n if (values.format === \"json\") {\n const report = validateView(JSON.parse(text));\n z.literal(reportId).parse(runSchema.parse(report.report).id);\n z.array(z.unknown()).length(rows).parse(report.rows);\n z.literal(truncated === \"true\").parse(report.truncated);\n }\n const output = await writeSeoReport(options, values.output!, text);\n return {\n exitCode: 0,\n stdout: JSON.stringify(\n {\n contractVersion: 1,\n resourceId: client.resourceId,\n reportId,\n rows,\n truncated: truncated === \"true\",\n format: values.format,\n output,\n },\n null,\n 2,\n ),\n };\n }\n const record = versionedReport.parse(await response.json());\n if (action === \"disconnect\") z.literal(true).parse(record.unbound);\n else if (writing) {\n runSchema.parse(record.run);\n if (action === \"bind\") {\n const binding = bindingSchema.parse(record.binding);\n if (\n binding.siteUrl !== values.property ||\n binding.websiteUrl !== values.website ||\n binding.revision !== Number(values.revision) + 1\n )\n throw new Error(\n \"The saved binding does not match the requested property and revision.\",\n );\n }\n } else validateView(record);\n return { exitCode: 0, stdout: JSON.stringify(record, null, 2) };\n } catch (cause) {\n return seoReportFailure(cause, options.args.includes(\"--json\"));\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 SEO/GEO audits, keyword research and AI visibility reports.\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","createHash","readFile","rename","writeFile","path","z","path","z","createHash","readFile","writeFile","rename","path","createHash","randomBytes","os","z","z","args","os","displayName","randomBytes","createHash","command","args","readFile","path","z","z","z","z","requestJson","randomUUID","chmod","lstat","readFile","rename","rm","writeFile","path","isNodeErrorCode","HELP_FLAGS","z","args","HELP_FLAGS","usageError","filters","output","credential","path","readFile","path","path","commandError","readFile","z","z","deploymentResponseSchema","readFile","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","usageError","path","commandError","z","z","requestJson","credentialCollectionPath","buildApiUrl","environmentCollectionPath","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","HELP_FLAGS","splitFlag","usageError","formatAuthError","args","runCredentialCommand","parseCredentialFlags","loadCredentialManagementContext","stringifySafeJson","formatCredentialListOutput","credential","previousCredentials","exchange","result","formatCredentialError","parseFlags","ENVIRONMENT_FLAG","serviceGrantProvider","requireGrant","JSON_FLAG","INSTALL_FLAG","NAME_FLAG","CREDENTIAL_FLAG","parseArgs","args","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","setTimeout","parseArgs","z","writeFile","path","z","z","path","stat","writeFile","z","parseArgs","randomUUID","setTimeout","parseArgs","z","parseArgs","z","record","randomUUID","writeFile","path","setTimeout","parseArgs","z","parseArgs","randomUUID","z","path","writeFile","setTimeout","parseArgs","z","path","writeFile","HELP_FLAGS","args"]}
|
|
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/adapters/node-json-document-store.ts","../src/core/adapters/node-repository-root.ts","../src/environment-slug.ts","../src/projects/project-api.ts","../src/pulse/config.ts","../src/pulse/errors.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/package-metadata.ts","../src/pulse-command.ts","../src/core/errors.ts","../src/pulse/api-client.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/siteos-search-api.ts","../src/siteos-search-credential.ts","../src/search-command.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-repair-command.ts","../src/services/seo-report-client.ts","../src/services/seo-command.ts","../src/services/seo-research-command.ts","../src/services/seo-gsc-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 type { ProjectBindingStore } from \"./core/ports/project-binding-store.js\";\nimport { readLocalCommonProject } from \"./projects/project-context.js\";\n\nimport {\n findRepositoryRoot,\n RepositoryRootError,\n} from \"./core/adapters/node-repository-root.js\";\nimport { CONFIG_FILE, loadChecksConfigSnapshot } from \"./pulse/config.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 pulse: ProductProjectDiagnostic;\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 pulse = repositoryRoot\n ? await inspectPulse(repositoryRoot)\n : { path: path.join(cwd, CONFIG_FILE), status: \"missing\" as const };\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 = project.status === \"selected\";\n\n return {\n checks: {\n configHome: { path: configHome, status: \"ok\" },\n pulse,\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 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","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 { isValidEnvironmentSlug } from \"../environment-slug.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), \"projects.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 = environmentSlug ?? binding.environmentSlug;\n if (!selectedSlug)\n throw new SiteOSAuthApiError({\n code: \"PROJECT_ENVIRONMENT_REQUIRED\",\n message:\n \"Select an environment with `siteos project environment use <slug>`.\",\n });\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 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 if (slug && !isValidEnvironmentSlug(slug))\n throw new Error(\"--environment must be a valid environment slug.\");\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 JsonDocumentCodec,\n JsonDocumentSnapshot,\n JsonDocumentStore,\n} from \"../ports/json-document-store.js\";\nimport type {\n ProjectBinding,\n ProjectBindingLocator,\n ProjectBindingStore,\n} from \"../ports/project-binding-store.js\";\nimport {\n JsonDocumentStoreError,\n NodeJsonDocumentStore,\n} from \"./node-json-document-store.js\";\n\nconst projectBindingSchema = z\n .object({\n service: z.literal(\"project\"),\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(locator: ProjectBindingLocator): Promise<ProjectBinding | 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: ProjectBinding): Promise<ProjectBinding> {\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: ProjectBindingLocator): 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(locator: ProjectBindingLocator): 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: ProjectBindingLocator,\n): Promise<ProjectBindingLocator> {\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 Project binding is invalid.\",\n );\n }\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n throw new ProjectBindingStoreError(\n \"PROJECT_BINDINGS_INVALID\",\n \"The 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 \"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 \"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 \"Project bindings are invalid.\",\n );\n }\n }\n return new ProjectBindingStoreError(\n \"PROJECT_BINDINGS_UNAVAILABLE\",\n \"Project bindings could not be accessed.\",\n );\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","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 { 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 { 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});\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 environmentVariables: z\n .array(\n z\n .string()\n .regex(/^[A-Z][A-Z0-9_]{0,63}$/)\n .refine(\n (name) =>\n !/^(?:SITEOS_|PLAYWRIGHT_|DOCKER_|NODE_|NPM_|PNPM_|LD_|DYLD_)/.test(\n name,\n ) &&\n ![\n \"PATH\",\n \"HOME\",\n \"TMPDIR\",\n \"TMP\",\n \"TEMP\",\n \"CI\",\n \"DATABASE_URL\",\n \"RUNNER_SHARED_SECRET\",\n ].includes(name) &&\n !name.endsWith(\"_DATABASE_URL\") &&\n !name.endsWith(\"_R2_ACCESS_KEY_ID\") &&\n !name.endsWith(\"_R2_SECRET_ACCESS_KEY\"),\n \"This name is reserved by Pulse.\",\n ),\n )\n .max(50)\n .refine(\n (names) => new Set(names).size === names.length,\n \"Variable names must be unique.\",\n )\n .optional(),\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 })\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 });\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 { 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.\nA personal organization is set up automatically on first sign-in.\n\nManual organization creation is team administration, available only to verified @pixelpoint.io accounts.`;\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 { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n commonEnvironmentArguments,\n commonServiceContext,\n readLocalCommonProject,\n} from \"./projects/project-context.js\";\n\nimport { Ajv } from \"ajv\";\nimport addFormats from \"ajv-formats\";\nimport { z } from \"zod\";\n\nimport { createSiteOSServiceGrantProvider } from \"./auth/adapters/siteos-service-grant-provider.js\";\nimport type { ServiceGrantProvider } from \"./auth/application/service-grant-provider.js\";\nimport { ProjectBindingStoreError } 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 { isValidEnvironmentSlug } from \"./environment-slug.js\";\nimport { SiteOSAuthApiError } from \"./siteos-auth-api.js\";\nimport {\n createSiteOSFormsApiClient,\n formsSubmissionStatusSchema,\n SiteOSFormsApiError,\n} from \"./siteos-forms-api.js\";\nimport {\n prepareSiteOSFormsCredentialInstallation,\n SITEOS_FORMS_DEPLOYMENT_KEY_ENV,\n SITEOS_FORMS_SUBMISSION_CREDENTIAL_ENV,\n SiteOSFormsCredentialStorageError,\n type SiteOSFormsCredentialInstallation,\n} from \"./siteos-forms-credential.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 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 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 environmentSlug: 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 environmentSlug: 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 selectedEnvironment?: string;\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 const environmentFlags = args.flatMap((arg) =>\n arg.startsWith(\"--environment=\") ? [\"--environment\", arg.slice(14)] : [arg],\n );\n const environmentIndex = environmentFlags.indexOf(\"--environment\");\n options = {\n ...options,\n selectedEnvironment:\n environmentIndex >= 0\n ? environmentFlags[environmentIndex + 1]\n : undefined,\n };\n if ([\"project\", \"environment\"].includes(args[0] ?? \"\"))\n return usageError(\n \"Use `siteos project` to manage Projects and environments.\",\n );\n\n if (args[0] === \"deploy\")\n return runDeployment({ ...options, args: args.slice(1) });\n\n if (args[0] !== \"submit\") {\n try {\n args = await commonEnvironmentArguments(options, \"forms\", args);\n } catch (error) {\n if (error instanceof SiteOSAuthApiError)\n return formatAuthError(error).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] === \"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 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 siteos project 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 runCredentialCommand(options: {\n deployment?: boolean;\n args: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n selectedEnvironment?: string;\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 selectedEnvironment?: string;\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 if (!local)\n throw new SiteOSAuthApiError({\n code: \"PROJECT_REQUIRED\",\n message: \"Select a Project with `siteos project use <id-or-slug>`.\",\n });\n const rootDir = local.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 selectedEnvironment?: string;\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(\n options,\n \"forms\",\n options.selectedEnvironment,\n );\n if (!common)\n throw new SiteOSAuthApiError({\n code: \"PROJECT_REQUIRED\",\n message: \"Select a Project with `siteos project use <id-or-slug>`.\",\n });\n {\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 environmentSlug: common.environment.slug,\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 } catch (error) {\n return { error: formatManagementContextError(error), ok: false };\n }\n}\n\nasync function runDefinitionCommand(options: {\n args: string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n selectedEnvironment?: string;\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 siteos project 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 selectedEnvironment?: string;\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 selectedEnvironment?: string;\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 selectedEnvironment?: string;\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 selectedEnvironment?: string;\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 selectedEnvironment?: string;\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 && common.binding.environmentSlug)\n return {\n apiBaseUrl: common.api.origin,\n commonProjectId: common.binding.project.id,\n environmentSlug: common.binding.environmentSlug,\n ok: true,\n organization: { id: common.binding.organizationId },\n project: { slug: common.binding.project.slug },\n credential,\n };\n throw new SiteOSAuthApiError({\n code: \"PROJECT_REQUIRED\",\n message: \"Select a Project with `siteos project use <id-or-slug>`.\",\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 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 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 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 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 selectedEnvironment?: string;\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 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 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 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 environmentSlug: 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;\n if (!projectId) {\n return undefined;\n }\n\n const url = new URL(\n `/projects/${encodeURIComponent(commonProjectId)}/forms?env=${encodeURIComponent(input.context.environmentSlug)}`,\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 selectedEnvironment?: string;\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 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();\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 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 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 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 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 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","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 path from \"node:path\";\nimport { parseArgs } from \"node:util\";\nimport {\n commonServiceContext,\n readCommonProject,\n} from \"./projects/project-context.js\";\n\nimport { createSiteOSServiceGrantProvider } from \"./auth/adapters/siteos-service-grant-provider.js\";\nimport type { ServiceGrantProvider } from \"./auth/application/service-grant-provider.js\";\nimport { ProjectBindingStoreError } 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 } from \"./pulse/api-client.js\";\nimport { createDeploymentBundle } from \"./pulse/bundle.js\";\nimport { loadChecksConfigSnapshot } from \"./pulse/config.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 { 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 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 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\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 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 projectRoot = path.resolve(options.cwd ?? process.cwd());\n const repositoryRoot = await findRepositoryRoot(projectRoot);\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,\n });\n if (values[\"dry-run\"]) {\n return success(\n values.json,\n { dryRun: true, manifest },\n [\n `Bundle: ${path.relative(projectRoot, manifest.archivePath)}`,\n `Checksum: ${manifest.checksum}`,\n `Files: ${manifest.fileCount}`,\n \"Dry run complete; nothing was uploaded.\",\n ].join(\"\\n\"),\n );\n }\n\n if (!common)\n throw new CliError(\n \"PROJECT_REQUIRED\",\n \"Select a Project with `siteos project use <id-or-slug>` before deploying.\",\n );\n const apiOrigin = common.api.origin;\n const grant = await acquirePulseGrant(options);\n const client = createPulseApiClient({\n apiOrigin,\n fetchImpl: options.fetchImpl,\n });\n const snapshot = await loadChecksConfigSnapshot(projectRoot);\n const selected = await requireSelectedProject({\n options,\n apiOrigin,\n client,\n grant,\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(projectRoot, 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 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 { project };\n }\n throw new CliError(\n \"PROJECT_REQUIRED\",\n \"Select a Project with `siteos project use <id-or-slug>` before deploying.\",\n );\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 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 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().nullable().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_AUTH_BASE_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 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 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, 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 { 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 });\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 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]);\n// Advisory only: computed names and destructuring still require explicit declarations.\nconst ENVIRONMENT_PATTERN =\n /\\bprocess\\.env(?:\\.([A-Z][A-Z0-9_]*)\\b|\\[\\s*[\"']([A-Z][A-Z0-9_]*)[\"']\\s*\\])/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 const name = match[1] ?? match[2];\n if (name && name !== \"PLAYWRIGHT_BASE_URL\") {\n environmentVariables.add(name);\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 { 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 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\"];\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 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 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 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 {\n commonEnvironmentArguments,\n commonServiceContext,\n readLocalCommonProject,\n} from \"./projects/project-context.js\";\n\nimport { createSiteOSServiceGrantProvider } from \"./auth/adapters/siteos-service-grant-provider.js\";\nimport type { ServiceGrantProvider } from \"./auth/application/service-grant-provider.js\";\nimport { ProjectBindingStoreError } 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 { isValidEnvironmentSlug } from \"./environment-slug.js\";\nimport { SiteOSAuthApiError } from \"./siteos-auth-api.js\";\nimport type { SiteOSSearchCredentialMetadata } from \"./siteos-search-api.js\";\nimport {\n createSiteOSSearchApiClient,\n SiteOSSearchApiError,\n type FetchLike,\n} from \"./siteos-search-api.js\";\nimport {\n prepareSiteOSSearchCredentialInstallation,\n prepareSiteOSSearchIndexingCredentialInstallation,\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\";\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 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 selectedEnvironment?: string;\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 const environmentFlags = options.args.flatMap((arg) =>\n arg.startsWith(\"--environment=\") ? [\"--environment\", arg.slice(14)] : [arg],\n );\n const environmentIndex = environmentFlags.indexOf(\"--environment\");\n options = {\n ...options,\n selectedEnvironment:\n environmentIndex >= 0\n ? environmentFlags[environmentIndex + 1]\n : undefined,\n };\n if ([\"project\", \"environment\"].includes(options.args[0] ?? \"\"))\n return usageError(\n \"Use `siteos project` to manage Projects and environments.\",\n );\n\n {\n try {\n options = {\n ...options,\n args: await commonEnvironmentArguments(options, \"search\", options.args),\n };\n } catch (error) {\n if (error instanceof SiteOSAuthApiError)\n return formatAuthError(error).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 === \"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 runCredentialCommand(options: {\n args: string[];\n credentialKind: \"indexing\" | \"query\";\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n selectedEnvironment?: string;\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 selectedEnvironment?: string;\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 if (!local)\n throw new SiteOSAuthApiError({\n code: \"PROJECT_REQUIRED\",\n message: \"Select a Project with `siteos project use <id-or-slug>`.\",\n });\n const rootDir = local.rootDir;\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 selectedEnvironment?: string;\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 selectedEnvironment?: string;\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 selectedEnvironment?: string;\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(\n options,\n \"search\",\n options.selectedEnvironment,\n );\n if (!common)\n throw new SiteOSAuthApiError({\n code: \"PROJECT_REQUIRED\",\n message: \"Select a Project with `siteos project use <id-or-slug>`.\",\n });\n {\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 } 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 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 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 selectedEnvironment?: string;\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 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 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 { 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 PROJECT_SERVICES,\n type CommonProject,\n type ProjectService,\n} from \"./project-api.js\";\nimport {\n commonProjectRuntime,\n readCommonProject,\n type ProjectCommandOptions,\n} from \"./project-context.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> [--environment <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 === \"use\"\n ? { environment: { type: \"string\" as const } }\n : {}),\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 const environment = project.environments.find(\n (item) => item.slug === (parsed.values.environment ?? \"production\"),\n );\n if (!environment)\n throw new Error(\n \"Select an available Project environment with --environment <slug>.\",\n );\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 environmentSlug: environment.slug,\n });\n result = { project, environment };\n message = `Selected ${project.name} / ${environment.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\" ? positionals[0] : 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 readCommonProject,\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 terms show [--json]\n siteos cookie terms accept --version <reviewed-version> --confirm [--json]\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 read and explicitly accept Cookie service terms before siteos project connect cookie.\nAccept only after an organization owner or admin has reviewed and authorized that exact version.\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 confirm: { type: \"boolean\" },\n version: { type: \"string\" },\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 \"terms show\": [],\n \"terms accept\": [\"version\", \"confirm\"],\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 isCookieTerms = service === \"cookie\" && action === \"terms\";\n if (\n isCookieTerms &&\n subaction === \"accept\" &&\n (!values.version || !values.confirm)\n )\n throw new Error(\n \"Read siteos cookie terms show, then explicitly pass --version <reviewed-version> --confirm.\",\n );\n const runtime = commonProjectRuntime(options);\n const common =\n service === \"integrations\"\n ? null\n : isCookieTerms\n ? await readCommonProject(options).then((context) =>\n context ? { ...context, resourceId: \"\" } : null,\n )\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 (isCookieTerms)\n result =\n subaction === \"show\"\n ? await request(\"/terms\")\n : await request(\"/terms\", \"POST\", {\n version: values.version,\n accepted: true,\n });\n else 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>] [--filters <json>] [--environment <slug>] [--json]\n siteos analytics realtime [--country <ISO|unknown>] [--campaign <id>] [--filters <json>] [--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 filters: { 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: {\n args: 1,\n flags: [\"days\", \"event\", \"country\", \"campaign\", \"filters\"],\n },\n realtime: { args: 1, flags: [\"country\", \"campaign\", \"filters\"] },\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 [\n \"days\",\n \"event\",\n \"country\",\n \"campaign\",\n \"filters\",\n ] 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 { parseArgs } from \"node:util\";\nimport { z } from \"zod\";\nimport type { CommandResult } from \"../core/command-result.js\";\nimport type { ProjectCommandOptions } from \"../projects/project-context.js\";\nimport {\n seoReportClient,\n seoReportFailure,\n versionedReport,\n} from \"./seo-report-client.js\";\n\nexport async function runSeoRepairCommand(\n options: ProjectCommandOptions & { args: string[] },\n): Promise<CommandResult> {\n const json = options.args.includes(\"--json\");\n try {\n const { positionals, values } = parseArgs({\n args: options.args,\n allowPositionals: true,\n strict: true,\n options: {\n json: { type: \"boolean\" },\n environment: { type: \"string\" },\n resource: { type: \"string\" },\n audit: { type: \"string\" },\n url: { type: \"string\", multiple: true },\n rule: { type: \"string\" },\n },\n });\n const recheck = positionals[0] === \"recheck\";\n if (\n positionals.length !== 1 ||\n (!recheck && positionals[0] !== \"repair\") ||\n (recheck && values.rule)\n )\n throw new Error(\n \"Use siteos seo repair or siteos seo recheck with documented flags.\",\n );\n if (\n !values.audit ||\n values.audit.length > 160 ||\n !values.url?.length ||\n values.url.length > 20\n )\n throw new Error(\n \"Choose a source --audit and between 1 and 20 --url values.\",\n );\n if (values.rule && values.rule.length > 120)\n throw new Error(\"Use a documented rule ID.\");\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 client = await seoReportClient(options, values.environment);\n if (values.resource && client.resourceId !== values.resource)\n throw new Error(\n \"The selected Project environment does not match --resource. Select the environment from the repair brief first.\",\n );\n const urls = [...new Set(values.url)];\n const response = recheck\n ? await client.request(\"/rechecks\", \"seo:audits:write\", {\n auditId: values.audit,\n urls,\n })\n : await client.request(\"/repair-brief\", \"seo:workspace:read\", {\n audit: values.audit,\n urls,\n ...(values.rule ? { rule: values.rule } : {}),\n });\n const record = versionedReport.parse(await response.json());\n if (recheck) {\n z.object({\n id: z.string(),\n resourceId: z.literal(client.resourceId),\n organizationId: z.literal(client.organizationId),\n state: z.literal(\"queued\"),\n }).parse(record.audit);\n return { exitCode: 0, stdout: JSON.stringify(record, null, 2) };\n }\n const brief = z\n .object({\n schemaVersion: z.literal(1),\n context: z.object({\n auditId: z.literal(values.audit),\n resourceId: z.literal(client.resourceId),\n organizationId: z.literal(client.organizationId),\n selectedUrls: z.array(z.string()).min(1).max(20),\n ruleId: z.literal(values.rule ?? null),\n }),\n evidence: z\n .array(\n z.object({\n url: z.string(),\n findings: z.array(z.unknown()).max(12),\n }),\n )\n .min(1)\n .max(20),\n suggestedGroups: z.array(z.unknown()),\n verificationCommand: z.string().min(1),\n text: z.string().min(1),\n })\n .parse(record);\n const canonical = (value: string) => {\n const url = new URL(value);\n url.hash = \"\";\n return url.href;\n };\n const expected = new Set(urls.map(canonical));\n if (\n brief.context.selectedUrls.length !== expected.size ||\n new Set(brief.context.selectedUrls).size !== expected.size ||\n brief.context.selectedUrls.some((url) => !expected.has(url)) ||\n brief.evidence.length !== expected.size ||\n new Set(brief.evidence.map((page) => page.url)).size !== expected.size ||\n brief.evidence.some((page) => !expected.has(page.url))\n )\n throw new Error(\"The repair brief does not match the selected URLs.\");\n return {\n exitCode: 0,\n stdout: json ? JSON.stringify(record, null, 2) : brief.text,\n };\n } catch (cause) {\n return seoReportFailure(cause, json);\n }\n}\n","import { open, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\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 async function seoReportClient(\n options: ProjectCommandOptions,\n environment?: string,\n) {\n const context = await commonServiceContext(options, \"seo\", environment);\n if (!context)\n throw new Error(\"Select a SiteOS Project with siteos project use first.\");\n const runtime = commonProjectRuntime(options);\n return {\n resourceId: context.resourceId,\n organizationId: context.overview.project.organizationId,\n async request(\n suffix: string,\n scope: string,\n body?: unknown,\n ): Promise<Response> {\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 SiteOSAuthApiError({\n code: \"AUTH_INVALID_RESPONSE\",\n message: \"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)}${suffix}`,\n {\n method: body === undefined ? \"GET\" : \"POST\",\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(30000),\n },\n );\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(await response.json());\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 if (!(response instanceof Response))\n throw new Error(\"The API transport does not support SEO reports.\");\n return response;\n },\n };\n}\nexport type SeoReportClient = Awaited<ReturnType<typeof seoReportClient>>;\nexport const versionedReport = z\n .object({ contractVersion: z.literal(1) })\n .passthrough();\nexport async function readSeoInput(\n cwd: string | undefined,\n filename: string,\n): Promise<unknown> {\n const file = await open(path.resolve(cwd ?? process.cwd(), filename), \"r\");\n try {\n const stat = await file.stat();\n if (!stat.isFile() || stat.size > 32000)\n throw new Error(\"Use a JSON request file of at most 32,000 bytes.\");\n const buffer = Buffer.alloc(32001);\n let bytes = 0;\n while (bytes < buffer.length) {\n const read = await file.read(buffer, bytes, buffer.length - bytes, null);\n if (!read.bytesRead) break;\n bytes += read.bytesRead;\n }\n if (bytes > 32000)\n throw new Error(\"Use a JSON request file of at most 32,000 bytes.\");\n try {\n return JSON.parse(buffer.subarray(0, bytes).toString(\"utf8\"));\n } catch {\n throw new Error(\"The request file must contain valid JSON.\");\n }\n } finally {\n await file.close();\n }\n}\nexport async function writeSeoReport(\n options: ProjectCommandOptions,\n filename: string,\n content: string,\n) {\n const output = path.resolve(options.cwd ?? process.cwd(), filename);\n await writeFile(output, content, { flag: \"wx\", mode: 0o600 });\n return output;\n}\nexport function seoReportFailure(\n cause: unknown,\n json: boolean,\n idempotencyKey?: string,\n): CommandResult {\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 ? {\n stdout: JSON.stringify({\n error,\n ...(idempotencyKey ? { idempotencyKey } : {}),\n }),\n }\n : {\n stderr: `${error.message}${idempotencyKey ? ` Retry key: ${idempotencyKey}` : \"\"}`,\n }),\n };\n}\n","import { runSeoRepairCommand } from \"./seo-repair-command.js\";\nimport { 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 RESEARCH_HELP,\n runSeoResearchCommand,\n} from \"./seo-research-command.js\";\nimport { GSC_HELP, runSeoGscCommand } from \"./seo-gsc-command.js\";\nimport {\n PERFORMANCE_HELP,\n runSeoPerformanceCommand,\n} from \"./seo-performance-command.js\";\nexport const SEO_HELP = `SEO/GEO: audit your website and research search-engine and AI visibility in the selected Project environment.\n\nSite Audit checks public HTML, canonical, robots.txt, sitemap and technical GEO signals.\nPerformance measures selected pages with Lighthouse and compares response/rendered HTML.\nResearch covers keywords, rankings, competitors, backlinks, Brand lookup and Prompt checks.\nGSC Insights reads your connected property's Google Search Console data; other research needs no GSC.\nTechnical GEO checks crawler policies, content, snippets and structured-data syntax/shape.\nThese checks do not measure autonomous agent journeys or guarantee AI inclusion or citations.\nThe service is named SEO/GEO in the application; its command remains siteos seo.\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 repair --audit <id> --url <url> [--url <url>...] [--rule <id>] [--resource <expected-id>] [--environment <slug>] [--json]\n siteos seo recheck --audit <id> --url <url> [--url <url>...] [--resource <expected-id>] [--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${RESEARCH_HELP.trim().split(\"\\n\\n\")[0]}\n${GSC_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.\nRepair reads a bounded brief for selected saved evidence; it does not start work.\nRecheck accepts 1–20 URLs observed in the source audit. Cross-page rules require a full audit.\n--resource verifies the selected environment binding before requesting a brief or recheck.\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${RESEARCH_HELP.trim().split(\"\\n\\n\").slice(1).join(\"\\n\\n\")}\n${GSC_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 if (options.args[0] === \"research\") return runSeoResearchCommand(options);\n if (options.args[0] === \"gsc\") return runSeoGscCommand(options);\n if ([\"repair\", \"recheck\"].includes(options.args[0] ?? \"\"))\n return runSeoRepairCommand(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 \"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 (\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 [\"audit run\", \"audit cancel\", \"issue ignore\", \"issue restore\"].includes(\n route,\n );\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 === \"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 === \"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 { setTimeout } from \"node:timers/promises\";\nimport { isDeepStrictEqual, parseArgs } from \"node:util\";\nimport { z } from \"zod\";\nimport type { CommandResult } from \"../core/command-result.js\";\nimport type { ProjectCommandOptions } from \"../projects/project-context.js\";\nimport {\n readSeoInput,\n seoReportClient,\n seoReportFailure,\n versionedReport,\n writeSeoReport,\n} from \"./seo-report-client.js\";\n\nexport const RESEARCH_HELP = `\n siteos seo research summary [--environment <slug>] [--json]\n siteos seo research status --kind <kind> [--environment <slug>] [--json]\n siteos seo research history --kind <kind> [--environment <slug>] [--json]\n siteos seo research show <run-id> [--environment <slug>] [--json]\n siteos seo research plan --input <request.json> [--environment <slug>] [--json]\n siteos seo research run --input <request.json> [--idempotency-key <key>] [--environment <slug>] [--json]\n siteos seo research wait <run-id> [--timeout <seconds>] [--environment <slug>] [--json]\n siteos seo research cancel <run-id> [--environment <slug>] [--json]\n siteos seo research export <run-id> --format <json|csv> --output <new-file> [--environment <slug>] [--json]\n siteos seo research serp show <run-id> --keyword <word> [--environment <slug>] [--json]\n siteos seo research serp ensure <run-id> --keyword <word> [--environment <slug>] [--json]\n siteos seo research serp wait <run-id> --keyword <word> [--timeout <seconds>] [--environment <slug>] [--json]\n siteos seo research serp export <run-id> --keyword <word> --format <json|csv> --output <new-file> [--environment <slug>] [--json]\n siteos seo research saved list --kind <kind> [--environment <slug>] [--json]\n siteos seo research saved save --input <request.json> --name <name> [--id <saved-id>] [--environment <slug>] [--json]\n siteos seo research saved remove <saved-id> [--environment <slug>] [--json]\n\nResearch kinds: keywords, domain, rankings, backlinks, brand, ai-visibility.\nDomain Overview: {\"kind\":\"domain\",\"target\":\"example.com\",\"country\":\"US\",\"language\":\"en\"}.\nDomain collects summary, ranking keywords, top pages and competitors. The legacy competitors kind retains its two-part plan; domain history includes those reports.\nRequest JSON: {\"kind\":\"keywords\",\"target\":\"example.com\",\"keywords\":[\"website analytics\"],\"country\":\"US\",\"language\":\"en\"}.\nRankings accepts up to 10 keywords and 5 competitors. AI visibility requires brand, prompt and platforms.\nMarkets: US, GB, ES, DE, FR, CA, AU. Languages: en, es, de, fr, pt, it, nl, ru.\nPlatforms: chat_gpt, claude, gemini, perplexity. Brand lookup uses brandPlatform chat_gpt|google and brandMatch domain|brand.\nPlan validates the request and shows planned parts and available research credits without enqueueing work.\nRun consumes Organization research credits through the same worker as the interface. Preserve the retry key after an uncertain response.\nSERP ensure collects one saved organic snapshot for a keyword returned by the selected completed Keyword Research report. It uses research credits once; repeating the same report/word returns the saved job, including failures. Show/wait/export only read and never spend. New reports can collect fresh snapshots.\nHistory returns the latest 30 checks per kind; show/export can address older retained run IDs. Saved checks are limited to 100 per resource.\nWait defaults to 120 seconds (maximum 900); exit 3 means still pending, exit 4 means failed or cancelled. Partial evidence stays accessible.\nExports preserve scope, dates and partial state. CSV stores one dataset row as JSON per row, including failed parts; it never converts missing metrics to zero.\n`;\nconst kinds = [\n \"keywords\",\n \"rankings\",\n \"competitors\",\n \"backlinks\",\n \"brand\",\n \"ai-visibility\",\n] as const;\nconst requestSchema = z\n .object({\n kind: z\n .enum([\"domain\", ...kinds])\n .transform((kind) => (kind === \"domain\" ? \"competitors\" : kind)),\n target: z.string().min(1).max(253),\n })\n .passthrough();\nconst runStates = z.enum([\n \"queued\",\n \"running\",\n \"completed\",\n \"partial\",\n \"failed\",\n \"cancelled\",\n]);\nconst csvCell = (value: unknown) => {\n let text =\n value == null\n ? \"\"\n : typeof value === \"object\"\n ? JSON.stringify(value)\n : String(value);\n if (/^[\\s]*[=+@-]/u.test(text) || /^[\\t\\r\\n]/u.test(text)) text = `'${text}`;\n return `\"${text.replaceAll('\"', '\"\"')}\"`;\n};\nexport async function runSeoResearchCommand(\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 kind: { type: \"string\" },\n keyword: { type: \"string\" },\n input: { type: \"string\" },\n name: { type: \"string\" },\n id: { type: \"string\" },\n \"idempotency-key\": { type: \"string\" },\n timeout: { type: \"string\" },\n format: { type: \"string\" },\n output: { type: \"string\" },\n },\n });\n const action = [\"saved\", \"serp\"].includes(positionals[0] ?? \"\")\n ? positionals.slice(0, 2).join(\" \")\n : (positionals[0] ?? \"\");\n const id = positionals[action.includes(\" \") ? 2 : 1];\n const operations: Record<string, { args: number; flags: string[] }> = {\n \"serp show\": { args: 3, flags: [\"keyword\"] },\n \"serp ensure\": { args: 3, flags: [\"keyword\"] },\n \"serp wait\": { args: 3, flags: [\"keyword\", \"timeout\"] },\n \"serp export\": { args: 3, flags: [\"keyword\", \"format\", \"output\"] },\n summary: { args: 1, flags: [] },\n status: { args: 1, flags: [\"kind\"] },\n history: { args: 1, flags: [\"kind\"] },\n show: { args: 2, flags: [] },\n plan: { args: 1, flags: [\"input\"] },\n run: { args: 1, flags: [\"input\", \"idempotency-key\"] },\n wait: { args: 2, flags: [\"timeout\"] },\n cancel: { args: 2, flags: [] },\n export: { args: 2, flags: [\"format\", \"output\"] },\n \"saved list\": { args: 2, flags: [\"kind\"] },\n \"saved save\": { args: 2, flags: [\"input\", \"name\", \"id\"] },\n \"saved remove\": { args: 3, flags: [] },\n };\n const operation = operations[action];\n if (\n !operation ||\n operation.args !== positionals.length ||\n Object.keys(values).some(\n (key) => ![\"json\", \"environment\", ...operation.flags].includes(key),\n )\n )\n throw new Error(\n \"Invalid research operation or flags. Run siteos seo --help.\",\n );\n if (\n action.startsWith(\"serp \") &&\n (!values.keyword?.trim() || values.keyword.length > 200)\n )\n throw new Error(\n \"Provide --keyword with 1 to 200 characters from the selected keyword report.\",\n );\n if (values.kind === \"domain\") values.kind = \"competitors\";\n if (\n operation.flags.includes(\"kind\") &&\n !kinds.includes(values.kind as (typeof kinds)[number])\n )\n throw new Error(\"Choose a documented --kind.\");\n if (operation.flags.includes(\"input\") && !values.input)\n throw new Error(\"Provide --input with a research request JSON file.\");\n if (\n action === \"saved save\" &&\n (!values.name?.trim() || values.name.length > 100)\n )\n throw new Error(\"Use --name with 1 to 100 characters.\");\n if (values.id && values.id.length > 100)\n throw new Error(\"The saved ID is too long.\");\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 [\"export\", \"serp export\"].includes(action) &&\n (!values.output || ![\"json\", \"csv\"].includes(values.format ?? \"\"))\n )\n throw new Error(\n \"Export requires --format json|csv and --output for a new file.\",\n );\n let input: unknown;\n if (values.input) {\n input = await readSeoInput(options.cwd, values.input);\n if (!requestSchema.safeParse(input).success)\n throw new Error(\n \"The request file needs a research kind and target domain. Run siteos seo --help.\",\n );\n }\n if (action === \"run\") {\n idempotencyKey = values[\"idempotency-key\"] ?? randomUUID();\n if (!/^[a-zA-Z0-9_-]{8,100}$/u.test(idempotencyKey))\n throw new Error(\n \"Use an idempotency key of 8 to 100 letters, digits, underscores or hyphens.\",\n );\n }\n const client = await seoReportClient(options, values.environment);\n const resourceSchema = z\n .object({\n id: z.literal(client.resourceId),\n organizationId: z.literal(client.organizationId),\n })\n .passthrough();\n const runSchema = z\n .object({\n id: z.string(),\n resourceId: z.literal(client.resourceId),\n organizationId: z.literal(client.organizationId),\n websiteUrl: z.string(),\n request: requestSchema,\n state: runStates,\n createdAt: z.string(),\n finishedAt: z.string().nullable(),\n parts: z.array(\n z\n .object({\n key: z.string(),\n state: z.enum([\"completed\", \"failed\"]),\n error: z.string().nullable(),\n dataset: z.record(z.unknown()).nullable(),\n observedAt: z.string(),\n })\n .passthrough(),\n ),\n })\n .passthrough();\n const get = async (suffix: string, scope = \"read\", body?: unknown) =>\n versionedReport.parse(\n await (\n await client.request(\n `/research${suffix}`,\n `seo:research:${scope}`,\n body,\n )\n ).json(),\n );\n const query = `?kind=${encodeURIComponent(values.kind ?? \"rankings\")}`;\n let record: Record<string, unknown>;\n if (action.startsWith(\"serp \")) {\n const snapshotSchema = z\n .object({\n id: z.string(),\n organizationId: z.literal(client.organizationId),\n resourceId: z.literal(client.resourceId),\n sourceRunId: z.literal(id!),\n request: requestSchema,\n keywordKey: z.literal(\n values\n .keyword!.normalize(\"NFKC\")\n .trim()\n .toLowerCase()\n .replace(/\\s+/gu, \" \"),\n ),\n state: z.enum([\n \"queued\",\n \"running\",\n \"completed\",\n \"failed\",\n \"cancelled\",\n ]),\n dataset: z\n .object({\n type: z.literal(\"serp\"),\n keyword: z.string(),\n country: z.string(),\n language: z.string(),\n device: z.enum([\"desktop\", \"mobile\"]),\n observedAt: z.string(),\n rows: z.array(\n z.object({\n position: z.number(),\n title: z.string(),\n url: z.string(),\n domain: z.string(),\n description: z.string(),\n }),\n ),\n })\n .nullable(),\n })\n .passthrough();\n const suffix = `/runs/${encodeURIComponent(id!)}/serp`;\n const read = () =>\n get(`${suffix}?keyword=${encodeURIComponent(values.keyword!)}`);\n record =\n action === \"serp ensure\"\n ? await get(suffix, \"run\", { keyword: values.keyword })\n : await read();\n const deadline = Date.now() + timeout * 1000;\n let snapshot =\n record.serp == null ? null : snapshotSchema.parse(record.serp);\n if (action === \"serp ensure\" && !snapshot)\n throw new Error(\n \"The server did not return the admitted SERP snapshot.\",\n );\n while (\n action === \"serp wait\" &&\n snapshot &&\n [\"queued\", \"running\"].includes(snapshot.state)\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(2000, Math.max(0, deadline - Date.now())));\n record = await read();\n snapshot =\n record.serp == null ? null : snapshotSchema.parse(record.serp);\n }\n if (action === \"serp export\") {\n if (!snapshot)\n throw new Error(\"No saved SERP exists for this report and keyword.\");\n const data = snapshot.dataset;\n const content =\n values.format === \"json\"\n ? JSON.stringify(record, null, 2)\n : [\n [\n \"report_id\",\n \"keyword\",\n \"country\",\n \"language\",\n \"device\",\n \"state\",\n \"observed_at\",\n \"error\",\n \"position\",\n \"title\",\n \"url\",\n \"description\",\n ],\n ...(data?.rows.length ? data.rows : [null]).map((row) => [\n id,\n values.keyword,\n data?.country,\n data?.language,\n data?.device,\n snapshot.state,\n data?.observedAt,\n snapshot.error,\n row?.position,\n row?.title,\n row?.url,\n row?.description,\n ]),\n ]\n .map((row) => row.map(csvCell).join(\",\"))\n .join(\"\\r\\n\");\n const output = await writeSeoReport(options, values.output!, content);\n record = {\n contractVersion: 1,\n runId: id,\n keyword: values.keyword,\n state: snapshot.state,\n format: values.format,\n output,\n };\n }\n return {\n exitCode:\n action === \"serp wait\" &&\n (!snapshot || [\"failed\", \"cancelled\"].includes(snapshot.state))\n ? 4\n : 0,\n stdout: JSON.stringify(record, null, 2),\n };\n }\n if (action === \"plan\" || action === \"run\" || action === \"saved save\") {\n const plan = await get(\"/plan\", \"read\", input);\n resourceSchema.parse(plan.resource);\n const canonical = requestSchema.parse(plan.request);\n if (canonical.kind !== requestSchema.parse(input).kind)\n throw new Error(\"The plan does not match the requested research kind.\");\n // Use the original request on admission: validation cannot silently retarget a paid check.\n if (action === \"run\") {\n record = await get(\"/runs\", \"run\", { request: input, idempotencyKey });\n const run = runSchema.parse(record.run);\n if (!isDeepStrictEqual(run.request, plan.request))\n throw new Error(\n \"The admitted check does not match the validated research request.\",\n );\n record = { ...record, idempotencyKey };\n } else if (action === \"saved save\") {\n record = await get(\"/saved\", \"write\", {\n request: input,\n name: values.name!.trim(),\n ...(values.id ? { id: values.id } : {}),\n });\n const saved = z\n .object({\n id: z.string(),\n name: z.literal(values.name!.trim()),\n request: requestSchema,\n })\n .parse(record.saved);\n if (\n (values.id && saved.id !== values.id) ||\n !isDeepStrictEqual(saved.request, plan.request)\n )\n throw new Error(\n \"The saved check does not match the requested settings.\",\n );\n } else record = plan;\n } else if (action === \"cancel\" || action === \"saved remove\") {\n record = await get(\n `/${action === \"cancel\" ? \"runs\" : \"saved\"}/${encodeURIComponent(id!)}/${action === \"cancel\" ? \"cancel\" : \"remove\"}`,\n action === \"cancel\" ? \"run\" : \"write\",\n {},\n );\n z.literal(true).parse(\n record[action === \"cancel\" ? \"cancelled\" : \"removed\"],\n );\n } else if (action === \"summary\") {\n record = await get(\"/summary\");\n resourceSchema.parse(record.resource);\n z.array(z.object({ kind: z.enum(kinds), summary: z.unknown() })).parse(\n record.checks,\n );\n } else if ([\"status\", \"history\", \"saved list\"].includes(action)) {\n const view = await get(query);\n resourceSchema.parse(view.resource);\n const runs = z.array(runSchema).parse(view.runs);\n const saved = z\n .array(\n z\n .object({\n id: z.string(),\n name: z.string(),\n request: requestSchema,\n })\n .passthrough(),\n )\n .parse(view.saved);\n if (\n runs.some((r) => r.request.kind !== values.kind) ||\n saved.some((r) => r.request.kind !== values.kind)\n )\n throw new Error(\n \"The response does not match the requested research kind.\",\n );\n if (view.run != null) {\n const selected = runSchema.parse(view.run);\n if (selected.request.kind !== values.kind)\n throw new Error(\"The selected report has a different research kind.\");\n }\n record = {\n contractVersion: 1,\n resource: view.resource,\n kind: values.kind,\n ...(action === \"history\"\n ? { runs, limit: 30 }\n : action === \"saved list\"\n ? { saved, limit: 100 }\n : { connection: view.connection, run: view.run }),\n };\n } else {\n const deadline = Date.now() + timeout * 1000;\n while (true) {\n record = await get(`/runs/${encodeURIComponent(id!)}`);\n resourceSchema.parse(record.resource);\n const run = runSchema.parse(record.run);\n if (run.id !== id)\n throw new Error(\n \"The response does not match the selected research check.\",\n );\n if (record.previous) runSchema.parse(record.previous);\n if (action !== \"wait\" || ![\"queued\", \"running\"].includes(run.state))\n break;\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 if (action === \"export\") {\n const run = runSchema.parse(record.run);\n const parts = run.parts.length\n ? run.parts\n : [\n {\n key: null,\n state: null,\n observedAt: null,\n error: run.error,\n dataset: null,\n },\n ];\n const rows = parts.flatMap((part) => {\n const dataset = part.dataset;\n const entries =\n dataset && Array.isArray(dataset.rows) ? dataset.rows : [dataset];\n return (entries.length ? entries : [null]).map((row) => [\n run.id,\n run.websiteUrl,\n run.request.kind,\n run.request.target,\n run.createdAt,\n run.state,\n run.error,\n part.key,\n part.state,\n part.observedAt,\n part.error,\n dataset?.type,\n run.request,\n dataset\n ? Object.fromEntries(\n Object.entries(dataset).filter(([key]) => key !== \"rows\"),\n )\n : null,\n row,\n ]);\n });\n const content =\n values.format === \"json\"\n ? JSON.stringify(record, null, 2)\n : [\n [\n \"run_id\",\n \"website_url\",\n \"kind\",\n \"target\",\n \"created_at\",\n \"run_state\",\n \"run_error\",\n \"part\",\n \"part_state\",\n \"observed_at\",\n \"error\",\n \"dataset_type\",\n \"request_json\",\n \"dataset_metadata_json\",\n \"data_json\",\n ],\n ...rows,\n ]\n .map((row) => row.map(csvCell).join(\",\"))\n .join(\"\\r\\n\");\n const output = await writeSeoReport(options, values.output!, content);\n record = {\n contractVersion: 1,\n runId: id,\n state: run.state,\n format: values.format,\n output,\n };\n }\n if (\n action === \"wait\" &&\n [\"failed\", \"cancelled\"].includes(runSchema.parse(record.run).state)\n )\n return { exitCode: 4, stdout: JSON.stringify(record, null, 2) };\n }\n return { exitCode: 0, stdout: JSON.stringify(record, null, 2) };\n } catch (cause) {\n return seoReportFailure(\n cause,\n options.args.includes(\"--json\"),\n idempotencyKey,\n );\n }\n}\n","import { parseArgs } from \"node:util\";\nimport { z } from \"zod\";\nimport type { CommandResult } from \"../core/command-result.js\";\nimport type { ProjectCommandOptions } from \"../projects/project-context.js\";\nimport {\n seoReportClient,\n seoReportFailure,\n versionedReport,\n writeSeoReport,\n} from \"./seo-report-client.js\";\n\nexport const GSC_HELP = `\n siteos seo gsc status [--environment <slug>] [--json]\n siteos seo gsc report [--dataset <pages|queries>] [--query <text>] [--filter <all|issues|declining>] [--sort <clicks|change|impressions>] [--page <number>] [--url <page-url>] [--environment <slug>] [--json]\n siteos seo gsc export --format <json|csv> --output <new-file> [--dataset <pages|queries>] [--query <text>] [--filter <all|issues|declining>] [--sort <clicks|change|impressions>] [--environment <slug>] [--json]\n siteos seo gsc sync [--environment <slug>] [--json]\n siteos seo gsc bind --connection <id> --property <site-url> --website <environment-url> --revision <number> [--environment <slug>] [--json]\n siteos seo gsc disconnect --revision <number> [--environment <slug>] [--json]\n\nGSC Insights reads saved Google Search Console reports; it requires a connected property for this environment.\nStatus lists the property directory, binding, latest synchronization and report freshness. Connect Google OAuth interactively in SiteOS first.\nReport defaults to all pages and shows 25 rows per page, measured totals and coverage. --url includes the selected page and its query evidence.\nExport includes every matching row of the selected saved comparison (up to 20,000), with report dates and truncation metadata; --page is not an export filter.\nSync queues the existing background worker and does not wait for completion. Read status until the returned run finishes.\nBind/disconnect require a current revision and separate settings authority. Disconnect removes only this environment binding, not the Google account.\n`;\nexport async function runSeoGscCommand(\n options: ProjectCommandOptions & { args: string[] },\n): Promise<CommandResult> {\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 dataset: { type: \"string\" },\n query: { type: \"string\" },\n filter: { type: \"string\" },\n sort: { type: \"string\" },\n page: { type: \"string\" },\n url: { type: \"string\" },\n format: { type: \"string\" },\n output: { type: \"string\" },\n connection: { type: \"string\" },\n property: { type: \"string\" },\n website: { type: \"string\" },\n revision: { type: \"string\" },\n },\n });\n const action = positionals[0] ?? \"\";\n const operations: Record<string, string[]> = {\n status: [],\n report: [\"dataset\", \"query\", \"filter\", \"sort\", \"page\", \"url\"],\n export: [\"dataset\", \"query\", \"filter\", \"sort\", \"format\", \"output\"],\n sync: [],\n bind: [\"connection\", \"property\", \"website\", \"revision\"],\n disconnect: [\"revision\"],\n };\n if (\n !operations[action] ||\n positionals.length !== 1 ||\n Object.keys(values).some(\n (key) => ![\"json\", \"environment\", ...operations[action]!].includes(key),\n )\n )\n throw new Error(\"Invalid GSC operation or flags. Run siteos seo --help.\");\n if (values.dataset && ![\"pages\", \"queries\"].includes(values.dataset))\n throw new Error(\"Use --dataset pages or queries.\");\n if (\n values.filter &&\n ![\"all\", \"issues\", \"declining\"].includes(values.filter)\n )\n throw new Error(\"Use --filter all, issues or declining.\");\n if (\n values.sort &&\n ![\"clicks\", \"change\", \"impressions\"].includes(values.sort)\n )\n throw new Error(\"Use --sort clicks, change or impressions.\");\n if (\n values.page &&\n (!/^[1-9]\\d{0,3}$/u.test(values.page) || Number(values.page) > 4000)\n )\n throw new Error(\"Use a page number between 1 and 4000.\");\n if ((values.query?.length ?? 0) > 160 || (values.url?.length ?? 0) > 2048)\n throw new Error(\"The report filter is too long.\");\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 (\n [\"bind\", \"disconnect\"].includes(action) &&\n (!/^\\d{1,9}$/u.test(values.revision ?? \"\") ||\n (action === \"disconnect\" && Number(values.revision) < 1))\n )\n throw new Error(\n \"Use the current binding --revision (0 only before the first binding).\",\n );\n if (\n action === \"bind\" &&\n (!values.connection || !values.property || !values.website)\n )\n throw new Error(\n \"Binding requires --connection, --property, --website and --revision.\",\n );\n const client = await seoReportClient(options, values.environment);\n const query = new URLSearchParams({\n dataset: values.dataset ?? \"pages\",\n filter: values.filter ?? \"all\",\n });\n for (const [flag, key] of [\n [\"query\", \"q\"],\n [\"sort\", \"sort\"],\n [\"page\", \"page\"],\n [\"url\", \"pageUrl\"],\n [\"format\", \"format\"],\n ] as const)\n if (values[flag]) query.set(key, values[flag]);\n const writing = [\"sync\", \"bind\", \"disconnect\"].includes(action);\n const suffix =\n action === \"bind\"\n ? \"/binding\"\n : writing\n ? `/${action}`\n : action === \"export\"\n ? `/export?${query}`\n : `?${query}`;\n const body =\n action === \"bind\"\n ? {\n connectionId: values.connection,\n siteUrl: values.property,\n websiteUrl: values.website,\n expectedRevision: Number(values.revision),\n }\n : action === \"disconnect\"\n ? { expectedRevision: Number(values.revision) }\n : writing\n ? {}\n : undefined;\n const response = await client.request(\n `/search-console${suffix}`,\n `seo:search:${action === \"sync\" ? \"sync\" : writing ? \"write\" : \"read\"}`,\n body,\n );\n const runSchema = z\n .object({\n id: z.string(),\n resourceId: z.literal(client.resourceId),\n organizationId: z.literal(client.organizationId),\n websiteUrl: z.string(),\n siteUrl: z.string(),\n state: z.enum([\n \"queued\",\n \"running\",\n \"completed\",\n \"partial\",\n \"failed\",\n \"cancelled\",\n ]),\n dates: z.unknown(),\n })\n .passthrough();\n const bindingSchema = z\n .object({\n resourceId: z.literal(client.resourceId),\n organizationId: z.literal(client.organizationId),\n websiteUrl: z.string(),\n siteUrl: z.string(),\n revision: z.number().int().positive(),\n })\n .passthrough();\n const metrics = z\n .object({\n clicks: z.number(),\n impressions: z.number(),\n ctr: z.number(),\n position: z.number(),\n })\n .passthrough()\n .nullable();\n const validateView = (data: unknown) => {\n const record = versionedReport.parse(data);\n z.literal(client.resourceId).parse(record.resourceId);\n bindingSchema.nullable().parse(record.binding);\n runSchema.nullable().parse(record.latest);\n runSchema.nullable().parse(record.report);\n z.array(\n z\n .object({ key: z.string(), current: metrics, previous: metrics })\n .passthrough(),\n ).parse(record.rows);\n z.number().int().nonnegative().parse(record.total);\n z.literal(values.dataset ?? \"pages\").parse(record.dataset);\n return record;\n };\n if (action === \"export\") {\n const rows = Number(response.headers.get(\"X-SEO-Export-Rows\"));\n const reportId = response.headers.get(\"X-SEO-Search-Id\");\n const truncated = response.headers.get(\"X-SEO-Export-Truncated\");\n if (\n response.headers.get(\"X-SEO-Resource-Id\") !== client.resourceId ||\n !reportId ||\n !response.headers.has(\"X-SEO-Export-Rows\") ||\n !Number.isSafeInteger(rows) ||\n rows < 0 ||\n ![\"true\", \"false\"].includes(truncated ?? \"\") ||\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 this SEO resource.\",\n );\n const text = await response.text();\n if (values.format === \"json\") {\n const report = validateView(JSON.parse(text));\n z.literal(reportId).parse(runSchema.parse(report.report).id);\n z.array(z.unknown()).length(rows).parse(report.rows);\n z.literal(truncated === \"true\").parse(report.truncated);\n }\n const output = await writeSeoReport(options, values.output!, text);\n return {\n exitCode: 0,\n stdout: JSON.stringify(\n {\n contractVersion: 1,\n resourceId: client.resourceId,\n reportId,\n rows,\n truncated: truncated === \"true\",\n format: values.format,\n output,\n },\n null,\n 2,\n ),\n };\n }\n const record = versionedReport.parse(await response.json());\n if (action === \"disconnect\") z.literal(true).parse(record.unbound);\n else if (writing) {\n runSchema.parse(record.run);\n if (action === \"bind\") {\n const binding = bindingSchema.parse(record.binding);\n if (\n binding.siteUrl !== values.property ||\n binding.websiteUrl !== values.website ||\n binding.revision !== Number(values.revision) + 1\n )\n throw new Error(\n \"The saved binding does not match the requested property and revision.\",\n );\n }\n } else validateView(record);\n return { exitCode: 0, stdout: JSON.stringify(record, null, 2) };\n } catch (cause) {\n return seoReportFailure(cause, options.args.includes(\"--json\"));\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 SEO/GEO audits, keyword research and AI visibility reports.\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","createHash","readFile","rename","writeFile","path","z","path","z","createHash","readFile","writeFile","rename","path","createHash","randomBytes","os","z","z","args","os","displayName","randomBytes","createHash","command","args","readFile","path","z","z","z","z","requestJson","randomUUID","chmod","lstat","readFile","rename","rm","writeFile","path","isNodeErrorCode","HELP_FLAGS","z","args","HELP_FLAGS","usageError","filters","output","credential","path","readFile","path","path","commandError","readFile","z","z","deploymentResponseSchema","readFile","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","usageError","path","commandError","z","z","requestJson","credentialCollectionPath","buildApiUrl","environmentCollectionPath","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","HELP_FLAGS","splitFlag","usageError","formatAuthError","args","runCredentialCommand","parseCredentialFlags","loadCredentialManagementContext","stringifySafeJson","formatCredentialListOutput","credential","previousCredentials","exchange","result","formatCredentialError","parseFlags","ENVIRONMENT_FLAG","serviceGrantProvider","requireGrant","JSON_FLAG","INSTALL_FLAG","NAME_FLAG","CREDENTIAL_FLAG","parseArgs","args","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","parseArgs","z","writeFile","path","z","z","path","stat","writeFile","parseArgs","z","writeFile","path","parseArgs","z","randomUUID","setTimeout","parseArgs","z","z","parseArgs","randomUUID","setTimeout","parseArgs","z","parseArgs","z","record","randomUUID","writeFile","path","setTimeout","parseArgs","z","parseArgs","randomUUID","z","path","writeFile","setTimeout","parseArgs","z","path","writeFile","HELP_FLAGS","args"]}
|